如何对我们的数据层做一个高可用?我想这应该是我们实际开发中面对服务器的扩容经常会遇到,看下面这张架构图,就是一个典型的对myCat做一个高可用的架构。至于mysql层面,我们可以做一个主从,当然需要使用专门的中间件进行管理,例如MHA的使用,这里不是我们今天的重点。我们需要说的是Mycat高可用的架构设计
架构设计简述:
首先我们会有两个【MyCat】的服务节点,然后中间通过【zookeeper】同步多个【MyCat】节点的配置信息,起到一个注册中心中间件的作用。然后我们多个【MyCat】之间的请求又该是如何做到负载均衡的呢?这个时候就需要引入【Haproxy】,【Haproxy】就是一个代理层,主要作用就是对我们的【MyCat】做一个负载均衡,并且监控所有【MyCat】节点的可用性,当有一个节点不可用,【Haproxy】便将其剔除集群。当然为了保证我们【Haproxy】的高可用性,上面我们还引用了【keepalived】组件,对我们的【Haproxy】集群做一个监控,并且提供一个虚拟IP来访问Haproxy,让Haproxy达到高可用的一个目的。以上便是我们MyCat的一个高可用集群设计,如何搭建?下面我们来一步步实现。
简单看一下我们四个服务器所有配置信息
一.Zookeeper集群搭建
1)首先需要搭建我们的Zookeeper集群,由上图得知需要在节点1,节点2,节点3上分别安装zookeeper,并建立起这至少三个节点的集群,下载zookeeper
wget https://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz
2)拷贝到其他两台节点上
scp zookeeper-3.4.14.tar.gz root@192.168.124.39:/root
scp zookeeper-3.4.14.tar.gz root@192.168.124.40:/root
3)三台服务器分别解压我们下载好的压缩包,并移动到我们的/use/local目录下,改名为zookeeper
tar -zxvf zookeeper-3.4.14.tar.gz
mv zookeeper-3.4.14 /usr/local/
mv zookeeper-3.4.14/ zookeeper
4)分别进去我们的/zookeeper/conf目录下,将zookeeper默认的配置文件名字做一个修改
cd /usr/local/zookeeper/conf
mv zoo_sample.cfg zoo.cfg
5)在zookeeper的目录下创建一个data目录用来存放zookeeper的数据,并给每一个节点生成一个标识
节点1(192.168.124.38)
mkdir data
echo 0 > data/myid
节点2(192.168.124.39)
mkdir data
echo 1 > data/myid
节点3(192.168.124.40)
mkdir data
echo 2 > data/myid
6)修改我们zookeeper的配置文件,做一个集群的配置
vim zoo.cfg
#指明我们刚才新建的data目录地址
dataDir=/usr/local/zookeeper/data
#配置我们三个节点集群
server.0=192.168.124.38:2888:3888
server.1=192.168.124.39:2888:3888
server.2=192.168.124.40:2888:3888
7)分别启动我们三个节点的zookeeper
bin/zkServer.sh start
然后分别查看一下我们zookeeper是否启动成功
bin/zkServer.sh status
至此我们的zookeeper集群搭建完毕
二)初始化MyCat数据到Zookeeper集群中
1)进入我们MyCat的安装目录
cd /usr/local/mycat/conf
2)将我们之前章节讲的(垂直分库,水平分库,ER分片)用到的配置文件拷贝到zkconf目录下
cp schema.xml server.xml rule.xml sequence_conf.properties zkconf/
会提示是否覆盖,直接覆盖
3)然后执行我们mycat安装目录下bin目录下的【init_zk_data.sh】脚本
bin/init_zk_data.sh
这里需要注意的是,可能在执行的时候会报这个错误
我们可以打开文件
vim init_zk_data.sh
然后【:set ff】,若结果显示fileformat=dos
,是文件格式的问题
解决:
vim init_zk_data.sh
:set fileformat=unix
然后保存退出即可
如下图标识初始化完成
4)登陆zookeeper客户端,查看一下我们mycat的信息是否已经同步到zookeeper中
cd usr/local/zookeeper/
bin/zkCli.sh
查看我们的【schema】
ls /mycat/mycat-cluster-1/schema
查看我们的【dataHost】节点内容
get /mycat/mycat-cluster-1/schema/dataHost
可以看到我们的配置信息已经同步过来了
三)配置MyCat支持ZK启动
因为我们这里的zookeeper是用来同步多个mycat之间的配置信息的,所以在我们的节点4上还需要安装一台MyCat。具体安装过程这里不再重复,详细可以看【MyCat的安装】
1)修改我们节点1中的【myid.properties】配置文件,这个文件就是启动MyCat支持Zookeeper的一个配置文件
#是否启用zk
loadZk=true
#zk的集群
zkURL=192.168.124.38:2181,192.168.124.39:2181,192.168.124.39:2181
#集群名称
clusterId=mycat-cluster-1
#mycat节点名称
myid=mycat_01
#mycat的节点数
clusterSize=2
#mycat配置的节点
clusterNodes=mycat_01,mycat_04
type=server
boosterDataHosts=dataHost1
同样,我们的节点4中对应的文件也做相同的配置
loadZk=true
zkURL=192.168.124.38:2181,192.168.124.39:2181,192.168.124.39:2181
clusterId=mycat-cluster-1
myid=mycat_04
clusterSize=2
clusterNodes=mycat_01,mycat_04
type=server
boosterDataHosts=dataHost1
节点4因为我们是新安装的mycat,所有配置都没有做过任何改动。但是当我们分别启动节点1和节点4的MyCat之后,发现节点4新安装的mycat的所有配置文件信息已经有了
证明我们的zookeeper集群已经将mycat的所有信息进行了节点之间的同步,这一步算是完成。
四)Haproxy的安装配置对MyCat的负载均衡支持
1)首先分别在我们的节点1和节点4安装我们的Haproxy(根据我们的架构图,我们是需要在两台机器上进行安装的部署的,基本都一致,下面演示只演示一台的安装部署)
yum install haproxy -y
显示已经安装完毕
2)对我们的Haproxy的配置文件做一下配置
vim /etc/haproxy/haproxy.cfg
listen admin_status
bind 0.0.0.0:48800 ##VIP
stats uri /admin-status ##统计页面
stats auth admin:admin
listen allmycat_service
bind 0.0.0.0:8096 ##转发到mycat的应用端口,即mycat的服务端口
mode tcp
option tcplog
option httpchk OPTIONS * HTTP/1.1\r\nHost:\ www
balance roundrobin
server mycat_01 192.168.124.38:8066 check port 48700 inter 5s rise 2 fall 3
server mycat_04 192.168.124.41:8066 check port 48700 inter 5s rise 2 fall 3
listen allmycat_admin
bind 0.0.0.0:8097 ##转发到mycat的管理端口,及mycat的管理控制台端口
mode tcp
option tcplog
option httpchk OPTIONS * HTTP/1.1\r\nHost:\ www
balance roundrobin
server mycat_01 192.168.124.38:9066 check port 48700 inter 5s rise 2 fall 3
server mycat_04 192.168.124.41:9066 check port 48700 inter 5s rise 2 fall 3
3)因为我们上面的配置用到48700端口,来对我们后端mycat做监控,所以这时候我们需要安装另外一个服务来启动这个端口,这个服务便是【xinetd】,就是一个网络的守护进程的服务,可以通过它简单的实现一个服务,并通过这个服务达到启动端口的目的
yum install xinetd -y
3)然后到我们的相应的目录下创建一个文件叫做【mycatchk】
cd /etc/xinetd.d
vim mycatchk
文件内容如下:
service mycatchk
{
flags = REUSE
socket_type = stream
port = 48700
wait = no
user = root
server =/usr/local/bin/mycat_status
log_on_failure += USERID
disable = no
}
4)在 /usr/local/bin 下创建一个脚本【mycat_status】
vim /usr/local/bin/mycat_status
脚本内容如下:
mycat=`/usr/local/mycat/bin/mycat status |grep 'not running'| wc -l`
if [ "$mycat" = "0" ];
then
/bin/echo -en "HTTP/1.1 200 OK\r\n"
/bin/echo -en "Content-Type: text/plain\r\n"
/bin/echo -en "Connection: close\r\n"
/bin/echo -en "Content-Length: 40\r\n"
/bin/echo -en "\r\n"
/bin/echo -en "MyCAT Cluster Node is synced.\r\n"
exit 0
else
/bin/echo -en "HTTP/1.1 503 Service Unavailable\r\n"
/bin/echo -en "Content-Type: text/plain\r\n"
/bin/echo -en "Connection: close\r\n"
/bin/echo -en "Content-Length: 44\r\n"
/bin/echo -en "\r\n"
/bin/echo -en "MyCAT Cluster Node is not synced.\r\n"
exit 1
fi
然后授权
chmod a+x /usr/local/bin/mycat_status
在当前安装的haproxy节点下执行脚本
/usr/local/bin/mycat_status
可以看到返回成功
5)然后配置我们etc/services文件
vim /etc/services
找到最后一行配置如下:
mycatchk 48700/tcp # mycatchk
6)启动我们的xinted服务
systemctl start xinetd.service
7)查看一下我们启动的服务
netstat -nltp | grep 48700
启动成功
8)绑定虚拟网卡(两个节点只需要绑定一台即可,这里演示绑定节点1)
先查看一下本机的 ifconfig
所以绑定
ifconfig eno16777736:1 192.168.124.10/24
再次查看
9)启动我们的haproxy
haproxy -f /etc/haproxy/haproxy.cfg
后台查看一下我们的进程,启动成功
至此我们的haproxy安装完毕,两个节点需要进行同样的操作
10)先简单校验一下我们的安装的haproxy是否成功。刚才我们绑定了虚拟IP192.168.124.10,管理端口是8096.
四台服务器我们随意找一个节点进行登陆
mysql -uroot -p -h192.168.124.10 -P8096
登陆成功,显示出了我们配置的逻辑库。至此根据我们文章开头机构描述我们两台Haproxy安装完毕。
五)安装KeepAlived
上面我们绑定了虚拟IP(192.168.124.10),只是对其中的一台做了绑定,因为同一时刻只会有一台Haproxy对外提供服务。而我们安装的Keepalived是会监控我们两台Haproxy,当其中一台绑定虚拟IP的节点挂掉之后,就会立刻切换到另外一台可用的服务上
1)安装我们的keepalived
yum install keepalived -y
2)修改配置文件
vim /etc/keepalived/keepalived.conf
! Configuration Fileforkeepalived
vrrp_script chk_http_port {
script"/etc/keepalived/check_haproxy.sh"
interval 2
weight 2
}
vrrp_instance VI_1 {
#我们主节点配置为MASTER,从节点就需要配置为BACKUP
state MASTER
interface eno16777736
virtual_router_id 51
#主节点优先级高一些,从节点优先级低一些(例如100)
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
chk_http_port
}
virtual_ipaddress {
192.168.124.10 dev eno16777736 scope global
}
}
3)当前目录创建我们上面配置文件中提到的脚本【check_haproxy.sh】
#!/bin/bash
STARTHAPROXY="/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg"
STOPKEEPALIVED="/etc/init.d/keepalived stop"
#STOPKEEPALIVED="/usr/bin/systemctl stop keepalived"
LOGFILE="/var/log/keepalived-haproxy-state.log"
echo "[check_haproxy status]" >> $LOGFILE
A=`ps -C haproxy --no-header |wc -l`
echo "[check_haproxy status]" >> $LOGFILE
date >> $LOGFILE
if [ $A -eq 0 ];then
echo $STARTHAPROXY >> $LOGFILE
$STARTHAPROXY >> $LOGFILE 2>&1
sleep 5
fi
if [ `ps -C haproxy --no-header |wc -l` -eq 0 ];then
exit 0
else
exit 1
fi
4)启动keepalived
/etc/init.d/keepalived start
5)两台都安装好之后,我们可以模拟故障,当其中的一台Haproxy挂掉之后,虚拟IP是否可以转移到我们另外一台可用的Haproxy服务上。当我们实际停止节点1的Haproxy的时候,发现已经故障转移,转移到我们的节点4上,我们对外开放的mycat服务依然可以访问,真正做到mycat的高可用
至此我们MyCat集群架构的高可用方案讲解完毕