ShardingSphere-Proxy5支持集群模式搭建。搭建集群时推荐使用Zookeeper作为注册中心,这是官方集成的注册中心。也可以使用其它如:consul、nacol等,但需要自己引入依赖。
Zookeeper安装
环境准备
Zookeeper需要jre环境。
单机模式部署
解压安装包,修改配置
解压Zookeeper安装包,进入conf文件夹,复制zoo-sample.cfg为zoo.cfg,zoo.cfg是Zookeeper的配置文件。
修改配置文件
# 作为 Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔
tickTime=2000
# LF初始通信时限,集群中的follower服务器(F)与leader服务器(L)之间初始连接时能容忍的最多心跳数(tickTime的数量)
initLimit=10
# LF同步通信时限,集群中的follower服务器与leader服务器之间请求和应答之间能容忍的最多心跳数(tickTime的数量)
syncLimit=5
# Zookeeper 保存数据的目录,默认情况下,Zookeeper 将写数据的日志文件也保存在这个目录里
dataDir=../data
# Zookeeper服务端口
clientPort=2181
# server.N = YYY:A:B,其中N表示服务器编号,YYY表示服务器的IP地址,A为LF通信端口,表示该服务器与集群中的leader交换的信息的端口。B为选举端口,表示选举新leader时服务器间相互通信的端口(当leader挂掉时,其余服务器会相互通信,选择出新的leader)。一般来说,集群中每个服务器的A端口都是一样,每个服务器的B端口也是一样。但是当所采用的为伪集群时,IP地址都一样,只能时A端口和B端口不一样
server.4=127.0.0.1:2888:3888
启动Zookeeper
在bin目录下执行zkServer.cmd命令
测试
在bin目录下打开一个新窗口,通过zkCli.cmd连接Zookeeper服务。
# 连接服务
zkCli.cmd -server 127.0.0.1:2181
# 查询节点命令:ls path [watch]。path:查询节点的路径,'/'指根目录;watch:表示是否开启监控,监控 path 下的子节点变化(NodeChildrenChanged,NodeDeleted)
ls /
# 注册节点创建。-s:表示创建一个顺序节点;-e:表示创建一个临时节点;path:表示要创建的节点路径名;data:表示要创建的节点数据;acl:表示要创建的节点的访问控制列表。可以不写,默认为 world:anyone:cdrwa。
create [-s] [-e] path data acl
ShardingSphere-proxy集群配置
配置文件修改
修改配置文件server.yml,添加Zookeeper集群相关配置。
mode:
type: Cluster # 运行模式类型,可选配置:Memory(内存)、Standalone(单机)、Cluster(集群)
repository:
type: ZooKeeper # 持久化仓库类型,官方推荐Zookeeper。
props:
namespace: demoNode # 注册中心命名空间
server-lists: localhost:2181 # 注册中心连接地址,多个地址用逗号隔开
retryIntervalMilliseconds: 500 # 重试间隔毫秒数
timeToLiveSeconds: 60 # 临时数据失效的秒数
maxRetries: 3 # 客户端连接最大重试次数
operationTimeoutMilliseconds: 500 # 客户端操作超时的毫秒数
overwrite: true # 是否使用本地配置覆盖持久化配置
保存配置文件重启。
验证集群
使用Zookeeper工具查看是否存在上面配置的demoNode节点,存在则集群配置成功。
如下图所示,已经存在demoNode节点,并且worker_id节点下显示已经有一个服务注册进来了。
客户端透明高可用
接入Zookeeper后,ShardingProxy并不能实现客户端透明高可用,只能实现集群内各个proxy配置共享。如果要配置客户端透明的高可用,还需要使用nginx、haproxy、keeplive等类似的中间件。、
使用nginx做负载均衡
nginx可以用做mysql的代理,因此也可以代理ShardingSphere-proxy。
修改nignx配置文件
在nginx配置文件中添加如下配置
#四层负载,四层的负载不在http模块里面,他是和http模块同级别的
stream {
upstream mysql {
server 127.0.0.1:3307 weight=9; #后端数据库的ip和端口,如果进行了域名解析,直接写域名就好
server 127.0.0.1:3308;
}
server {
listen 33306; #如果监听3306,远程登录的时候不用加-p参数
proxy_connect_timeout 10s;
proxy_timeout 30s;
proxy_pass mysql;
}
}
添加完配置后重启nginx。通过33306端口连接ShardingSphere-proxy,可以成功连接则代理成功。
Zookeeper接入认证
ShardingSphere-proxy可以采用Zookeeper的digest认证方式对节点加密
修改配置添加认证
修改server.yml,添加digest配置项
mode:type: Cluster # 运行模式类型,可选配置:Memory(内存)、Standalone(单机)、Cluster(集群) repository:type: ZooKeeper # 持久化仓库类型,官方推荐Zookeeper。 props:namespace: demoNode # 注册中心命名空间 server-lists: localhost:2181# 注册中心连接地址,多个地址用逗号隔开 retryIntervalMilliseconds:500# 重试间隔毫秒数 timeToLiveSeconds:60# 临时数据失效的秒数 maxRetries:3# 客户端连接最大重试次数 operationTimeoutMilliseconds:500# 客户端操作超时的毫秒数 digest: abc # 接入认证;digest认证是需要配置用户名密码,但这里好像只需要配置密码,而且实际上在Zookeeper中查看认证信息时,这里配置的是用户。注意:加密一旦配置无法修改,如果要修改只能通过Zookeeper删除节点,再重建overwrite:true# 是否使用本地配置覆盖持久化配置
修改完成后重启,这时使用Zookeeper工具查看节点,这时候demoNode节点已经无法查看了,这时因为工具已经没有权限查看。可以用Zookeeper命令行工具添加认证,就可以查看。
查看添加了认证信息的节点
127.0.0.1:2181 $ ls2 /demoNode
Authentication is not valid : /demoNode #此时无权限访问
127.0.0.1:2181 $ addauth digest abc #添加认证用户,这里不需要密码,具体原因未知
127.0.0.1:2181 $ ls2 /demoNode #有认证信息可以成功访问
[rules, metadata, nodes, props, worker_id]cZxid = 0x302
ctime = Wed Oct 26 10:04:34 CST 2022
mZxid = 0x302
mtime = Wed Oct 26 10:04:34 CST 2022
pZxid = 0x322
cversion = 5
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 5
127.0.0.1:2181 $ getAcl /demoNode #查看详细的认证信息,下面可以看到abc实际上是用户,而不是密码
'digest,'abc:E5BHDAna9MYXnBl+auvpghycqS0=
: cdrwa
版权归原作者 图图e 所有, 如有侵权,请联系我们删除。