前言
我之前写了篇很简单的去描述了MLSQL Cluster 路由策略。有朋友就问,有没有一个更清晰一点的设计说明。这篇内容就是为这个目标而写的。
场景
脱离场景说设计就是扯淡。所以,MLSQL Cluster适用的场景是是什么呢?
- 不同业务线需要不同的MLSQL Engine.
- 同一个业务线也可能需要多个MLSQL Engine
- 同一个业务可能需要多个MLSQL Engine 做负载均衡或者高可用
这就意味着,企业必然存在着部署多个MLSQL Engine的实例的诉求,并且根据需要,提供不同的组合方式。
设计
要管理多个MLSQL Engine,首先需要把MLSQL Engine信息注册到MLSQL Cluster。
一般而言可以让MLSQL Engine启动时注册自己,然后MLSQL Cluster 可以读取这些MLSQL Engine注册的信息。目前MLSQL Engine支持注册到ZK, 可以在启动时通过参数:
代码语言:javascript复制-streaming.zk.conf_root_dir [zk path]
-streaming.zk.servers [your zk address]
不过目前MLSQL CLuster 还没有实现去读取ZK。 MLSQL 初期采用了一个侵入式更小更灵活的办法,就是用户自己填写MLSQL Engine信息。
MLSQL Cluster 提供了一套接口管理MLSQL Engine信息。大家可以通过http://127.0.0.1:8080/openapi/ui/spec/
查看该接口信息。
前面我们讲到的是如何注册MLSQL Engine到MLSQL Cluster,现在,我们假设有A,B 两个业务。A 需要 Engine1,Engine2,Engine3 三个MLSQL Engine, B则需要Engine4,Engine5。 这时候可以使用MLSQL Cluster 接口手动添加这些Engine 实例。然后我们给Engine1-3 打上标签a, 给Egnine4-5 打上标签b.
打开http://127.0.0.1:8080/openapi/ui/spec/
,然后查找 /backend/add 接口:
image.png
看到有三个参数,所以比如添加Engine1的时候,可以这么做:
代码语言:javascript复制curl -XPOST "http://127.0.0.1:8080/backend/add" -d '
url=127....9002
&name=Engine1
&tag=a
'
其他类似。
接着A业务就可以的接口就可以调用Cluster了。怎么调用呢? 我们查找下 /run/script
image.png
该接口参数特别多,但是关键的其实就是sql和tags和proxyStrategy。 当业务A请求时,tags需要设置为a,这样MLSQL Cluster 就会按默认的proxyStrategy 策略对Engine1-3进行负载均衡,而不会去使用Engine4-5。
MLSQL Console 是如何对接MLSQL Cluster?
在 team/cluster 页面,我们看MSLQL Console 是如何添加Backend的:
image.png
在MLSQL Console里,tag会被自动生成,生成规则为 teamName_roleName。 也就是说,你添加一个backend的时候,必须选择将这个backend添加到一个Team里,然后一个或者多个Role下。
接着在你使用的时候,系统必须确定当前你是在什么team的什么role,这样MLSQL Cluster才能判断该使用哪些Engine.
image.png