文章目录
前文回顾:
《Mycat分布式数据库架构》之原理及架构
《Mycat分布式数据库架构》之搭建详解
《Mycat分布式数据库架构》之配置详解
《Mycat分布式数据库架构》之数据切分和读写分离
《Mycat分布式数据库架构》之故障切换
《Mycat分布式数据库架构》之数据切分实战
《Mycat分布式数据库架构》之全局自增ID
《Mycat分布式数据库架构》之ER分片
前面我们部署的架构中mycat还存在单点问题,当部署mycat那台主机挂了之后,程序便无法访问,所以我们至少还需要增加一个mycat节点,当有多个mycat节点之后就有了新的问题,那就是多个mycat之间的配置是如何同步的呢,所以需要引入zookeeper,通过zookeeper集群来存储mycat的配置。
而多个mycat之间需要进行负载均衡,则在mycat之上又需要引入Haproxy这个组件,Haproxy是一个代理层,主要作用是可以对mycat服务器进行负载均衡。同时为了保证Haproxy的高可用性,需要引入keepalived这个组件。
1 解决mycat单点问题
1.1 部署zookeeper集群
由于zookeeper集群建议至少有3个节点,虽然2个节点的集群就能运行,但是容错性为0,具体演示环境如下:
主机名 | ip | 角色 | 数据库名 |
---|---|---|---|
node-1 | 192.168.157.129 | Oracle,zookeeper,Mycat | hr |
node-2 | 192.168.157.130 | Oracle,zookeeper | human_res |
node-3 | 192.168.157.131 | Oracle,zookeeper | human_res |
node-4 | 192.168.157.132 | Oracle,Mycat | human_res |
这里在节点1、节点2和节点3中部署zookeeper,组成一个zookeeper集群。并且需要在节点1和节点4中安装mycat,节点1中我们已经安装了mycat,所以在节点4中再安装一个mycat,安装方法同理。
1.1.1 下载zookeeper
下载地址:https://downloads.apache.org/zookeeper/,这里需要特别注意的是,从版本3.5.5开始,带有bin名称的包才是可以直接运行使用的,需重新下载压缩包,比如下面这个版本应该下载带有bin名称的。
下载到节点1上后copy一份到其他2个节点中,如下:
[root@oraserver ~]# ls
anaconda-ks.cfg apache-zookeeper-3.5.7-bin.tar.gz data Desktop Documents Downloads initial-setup-ks.cfg Music Pictures Public Templates Videos
[root@oraserver ~]# scp apache-zookeeper-3.5.7-bin.tar.gz root@192.168.157.130:/root
1.1.2 解压
tar zxf apache-zookeeper-3.5.7-bin.tar.gz
解压之后,进入conf目录,将zoo_sample.cfg复制并重命名为zoo.cfg,如下
[root@oraserver apache-zookeeper-3.5.7-bin]# cd conf
[root@oraserver conf]# ls
configuration.xsl log4j.properties zoo_sample.cfg
[root@oraserver conf]# cp zoo_sample.cfg zoo.cfg
[root@oraserver conf]# ls
configuration.xsl log4j.properties zoo.cfg zoo_sample.cfg
接下来我们在安装目录也就是apache-zookeeper-3.5.7-bin目录中新建一个data目录,如下
mkdir data
按照如上方式分别在三个节点上进行安装,然后给每一个节点生成一个节点标识,比如第一个节点,就echo一个0到data目录下的myid文件中
echo 0 > data/myid
第二个节点就echo一个1在data下的myid中
echo 1 > data/myid
第三个节点就echo一个2在data下的myid中
echo 2 > data/myid
1.1.3 分别修改三个节点的zoo.cfg配置
cd conf
vi zoo.cfg
修改配置内容,其中dataDir属性为你的myid文件路径,server.0、server.1和server.2中的012需要和你集群各节点myid的内容相同,如下:
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=/root/data/apache-zookeeper-3.5.7-bin/data
# the port at which the clients will connect
clientPort=2181
server.0=192.168.157.129:2888:3888
server.1=192.168.157.130:2888:3888
server.2=192.168.157.131:2888:3888
1.1.4 开放zookeeper的对应端口
永久性添加2181,2888,3888端口
firewall-cmd --add-port=2181/tcp --permanent --zone=public
firewall-cmd --add-port=2888/tcp --permanent --zone=public
firewall-cmd --add-port=3888/tcp --permanent --zone=public
重启防火墙(修改配置后要重启防火墙)
firewall-cmd --reload
1.1.5 启动zookeeper集群
分别启动3个zookeeper,如下
cd bin
./zkServer.sh start
查看集群状态,其中
节点1(182.168.157.129)如下
[root@oraserver apache-zookeeper-3.5.7-bin]# bin/zkServer.sh status
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /root/data/apache-zookeeper-3.5.7-bin/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Mode: follower
节点2(182.168.157.130)如下
[root@localhost apache-zookeeper-3.5.7-bin]# bin/zkServer.sh status
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /root/data/apache-zookeeper-3.5.7-bin/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Mode: leader
节点3(182.168.157.131)如下
[root@localhost apache-zookeeper-3.5.7-bin]# bin/zkServer.sh status
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /root/data/apache-zookeeper-3.5.7-bin/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Mode: follower
可以看到节点2作为了leader的角色,这其实和启动zookeeper的先后顺序有关。
1.2 初始化Mycat配置到zookeeper集群
1.2.1 初始化zookeeper中的数据
mycat为我们提供了一个很方便的工具,在mycat的bin目录下有一个shell脚本,就是init_zk_data.sh,如下
[root@oraserver mycat]# cd bin
[root@oraserver bin]# ls
dataMigrate.sh init_zk_data.sh mycat rehash.sh startup_nowrap.sh wrapper-linux-ppc-64 wrapper-linux-x86-32 wrapper-linux-x86-64
[root@oraserver bin]# more init_zk_data.sh
这个脚本就是用来向zookeeper集群中初始化mycat的数据的,它通过读取mycat的conf目录下的配置文件,并初始化到zookeeper集群中。
首先我们需要将mycat的配置文件server.xml、schema.xml,rule.xml和sequence_db_conf.properties复制到zkconf目录下,init_zk_data.sh这个脚本就是通过读取zkconf目录下的配置文件来初始化集群的。
cp server.xml schema.xml rule.xml sequence_db_conf.properties zkconf/
复制之后,运行init_zk_data.sh这个脚本。
[root@oraserver mycat]# bin/init_zk_data.sh
o2020-02-29 02:46:25 INFO JAVA_CMD=/bin/java
o2020-02-29 02:46:25 INFO Start to initialize /mycat of ZooKeeper
o2020-02-29 02:46:32 INFO Done
1.2.2 连接zookeeper节点
接下来进去zookeeper目录的bin目录中,使用zkCli.sh这个脚本来连接到当前这个zookeeper节点,如下
cd bin
./zkCli.sh
可以查看节点中mycat的一些配置信息,如下所示。
WatchedEvent state:SyncConnected type:None path:null
[zk: localhost:2181(CONNECTED) 1] ls /mycat
[mycat-cluster-1]
[zk: localhost:2181(CONNECTED) 0] ls /mycat/mycat-cluster-1
[cache, line, rules, schema, sequences, server]
[zk: localhost:2181(CONNECTED) 1] ls /mycat/mycat-cluster-1/schema
[dataHost, dataNode, schema]
[zk: localhost:2181(CONNECTED) 2] get /mycat/mycat-cluster-1/schema/dataHost
[{"balance":1,"maxCon":1000,"minCon":10,"name":"host01","writeType":0,"switchType":1,"slaveThreshold":100,"dbType":"oracle","dbDriver":"jdbc","heartbeat":"select 1 from dual","writeHost":[{"host":"192.168.157.130","url":"jdbc:oracle:thin:@192.168.157.130:1521:humanres","password":"human","user":"human"}]},{"balance":1,"maxCon":1000,"minCon":10,"name":"host02","writeType":0,"switchType":1,"slaveThreshold":100,"dbType":"oracle","dbDriver":"jdbc","heartbeat":"select 1 from dual","writeHost":[{"host":"192.168.157.129","url":"jdbc:oracle:thin:@192.168.157.129:1521:hr","password":"human","user":"human"}]}]
[zk: localhost:2181(CONNECTED) 3]
查看其余两个节点,mycat的配置内容相同,证明我们已经实现了mycat配置内容向zookeeper集群的同步。
1.3 配置mycat支持zookeeper启动
这一步的作用就是使得mycat可以通过zookeeper来启动,主要通过配置mycat的conf目录下的myid.properties文件实现。
cd conf
vi myid.properties
我们在节点1和节点4中安装了mycat,其中节点1(192.168.157.129)中配置为如下
loadZk=true
zkURL=192.168.157.129:2181,192.168.157.132
clusterId=mycat-cluster-1
myid=mycat_01
clusterSize=2
clusterNodes=mycat_01,mycat_04
#server booster ; booster install on db same server,will reset all minCon to 2
type=server
boosterDataHosts=dataHost1
节点4(192.168.157.132)中配置为如下
loadZk=true
zkURL=192.168.157.129:2181,192.168.157.132
clusterId=mycat-cluster-1
myid=mycat_04
clusterSize=2
clusterNodes=mycat_01,mycat_04
#server booster ; booster install on db same server,will reset all minCon to 2
type=server
boosterDataHosts=dataHost1
然后重启mycat
mycat stop
mycat start
然后查看节点4中的mycat各项配置已经发生改变,和节点1一样,这些信息就是从zookeeper集群中同步过来的,之后我们只需要对zookeeper集群中配置文件做修改,就可同步到节点1和节点4中了,就保证了mycat各个节点的配置是一致的。
更多技术干货,请持续关注程序员大佬超。
原创不易,转载请注明出处。