一、Mysql前置知识点
1.1 MySQL主从复制的工作过程
1.2 主从复制的过程
-
mysql主数据库将处理的事务(增、删、改、查)存放到二进制日志文件(mysql-bin-000001),通知存储引擎将数据存储到磁盘中。
-
master的dump线程监听slave的I/O线程的请求,将二进制日志文件更新的数据发送给slave的I/O线程。
-
slave的工作线程(I/O线程),会将master更新的数据复制存放到slave的中继日志文件中,然后由slave中的sql线程进行读取数据,并将数据存放到自己的二进制(类似)文件中,与master的数据保持一致。
1.3 主从复制核心内容
-
两个日志文件
-
二进制日志文件(master,xxx-bin.00001)
-
中继日志文件(slave,xxx-relay-bin.00001)
-
-
三个线程
-
dump线程(master):监听slave的I/O线程请求,将master中二进制日志文件中更新的数据发送给slave的I/O线程。
-
I/O线程(slave):将更新的数据存放到slave的中继日志文件中。
-
sql线程(slave):读取中继日志文件中的数据,并将数据存放到自己的二进制(类似)文件中,与master数据保持一致性。
-
1.4 GTID
- (Global Transaction ID)是全局事务ID,当在主库上提交事务或者被从库应用时,可以定位和追踪每一个事务,比如主库新事务都有一个全局ID,即使此事务被同步到任何从库上并应用都会标记着这个事务
- GTID的组成: server_uuid:transaction_id,平时看到的gtid_executed或者Executed_Gtid_Set实际是个集合,m-n的方式,代表执行了事务m 到 事务n 这些ID
- 有了GTID对数据库分布式会有很大的帮助。尤其是复杂主从关系,我们可以省去手工去找偏移量,而是通过CHANGE MASTER TO MASTER_HOST=‘xxx’, MASTER_AUTO_POSITION=1即可方便的搭建从库,在故障修复中也可以采用MASTER_AUTO_POSITION=‘X’的方式。
- MySQL Server在写binlog的时候,会先写一个特殊的Binlog Event,类型为GTID_Event,指定下一个事务的GTID,然后再写事务的Binlog,主从同步时GTID_Event和事务的Binlog都会传递到从库,在从库应用Relay Log,从库在执行的时候也是用同样的GTID写binlog。
二、集群环境介绍
2.1 节点信息表:
序号 | 主机类型 | 主机名 | IP地址 | Keepalive | 软件版本 |
---|---|---|---|---|---|
1 | Master_01 主节点 | master01 | 172.16.40.71 | 172.16.40.222 | mysql 5.7 |
2 | Master_02 主节点 | master02 | 172.16.40.72 | 172.16.40.222 | mysql 5.7 |
3 | Haproxy_01 负载均衡 | haproxy01 | 172.16.40.61 | 172.16.40.111 | haproxy1.5.18 |
4 | Haproxy_02 负载均衡 | haproxy02 | 172.16.40.62 | 172.16.40.111 | haproxy1.5.18 |
5 | Mycat_01 读写分离 | mycat01 | 172.16.40.81 | jdk1.8/mycat1.6 | |
6 | Mycat_02 读写分离 | mycat02 | 172.16.40.82 | jdk1.8/mycat1.6 | |
7 | Slave_01 从节点 | slave01 | 172.16.40.91 | mysql 5.7 | |
8 | Slave_02 从节点 | slave02 | 172.16.40.92 | mysql 5.7 | |
9 | Slave_03 从节点 | slave03 | 172.16.40.93 | mysql 5.7 | |
10 | Client 客户端 | ittools | 172.16.40.250 | mysql 5.7 |
2.2架构拓扑:
三、配置Master双主同步
3.1 全部节点都关闭防火墙及安全管理
systemctl stop firewalld
systemctl disable firewalld
setenforce 0 # 永久关闭需配置/etc/selinux/config中SELINUX=disabled,并保存重启
3.2 Master01配置
在/etc/my.cnf文件中添加以下配置项:
[mysqld]
#定义server-id,每台主机的唯一值
server-id=1
#添加主服务器开启二进制日志
log-bin=master01-bin
#复制类型使用MIXED模式
binlog_format=MIXED
#当角色为从服务器时,允许将同步到的数据更新至二进制日志中
log-slave-updates=true
# 设置单个binlog日志文件的最大容量
max_binlog_size=1024M
#设置自动删除 binlog 文件的天数
expire_logs_days=7
#开启GTID同步
gtid_mode=on
#强制事务一致,确保 GTID 的安全,在事务中就不能创建和删除临时表
enforce_gtid_consistency=on
#这个变量用于在 MySQL 重启或启动的时候寻找 GTIDs 过程中,控制 binlog 如何遍历的算法
binlog_gtid_simple_recovery=1
#自增主键步长,通常有几个主库节点就写几,避免主键冲突
auto_increment_increment=2
#设置自增主键起始值,master01节点为1,master02节点为2,以此类推
auto_increment_offset=1
保存,并重启mysql。systemctl restart mysqld
3.3 Master02配置
[mysqld]
#定义server-id,每台主机的唯一值
server-id=2
#添加主服务器开启二进制日志
log-bin=master02-bin
#复制类型使用MIXED模式
binlog_format=MIXED
#当角色为从服务器时,允许将同步到的数据更新至二进制日志中
log-slave-updates=true
# 设置单个binlog日志文件的最大容量
max_binlog_size=1024M
#设置自动删除 binlog 文件的天数
expire_logs_days=7
#开启GTID同步
gtid_mode=on
#强制事务一致,确保 GTID 的安全,在事务中就不能创建和删除临时表
enforce_gtid_consistency=on
#这个变量用于在 MySQL 重启或启动的时候寻找 GTIDs 过程中,控制 binlog 如何遍历的算法
binlog_gtid_simple_recovery=1
#自增主键步长,通常有几个主库节点就写几,避免主键冲突
auto_increment_increment=2
#设置自增主键起始值,master01节点为1,master02节点为2,以此类推
auto_increment_offset=2
master02的配置信息和master01节点的只有3点不同:
-
server-id=2
:这个是各节点在集群中的唯一标识,不能重复。 -
log-bin
:binlog日志文件的前缀名称为自定义的 -
auto_increment_offset=2
:自增初始值从1
变为2
,最终效果会变为:-
master01:1、3、5、7、9、11、13、15、17.......
-
master02:2、4、6、8、10、12、14、16、18......
-
关于 log-slave-updates=true 的说明:
保存,并重启mysql。systemctl restart mysqld
3.4 分别在master01和master02上创建用于数据同步的账号
# 创建账号
grant replication slave ON *.* to 'test'@'172.16.40.%' identified by 'test@666';
# 刷新权限
flush privileges;
3.5 配置互主同步关系
配置前 master01和master02 都重置一下binlog。
reset master;
master01配置主从,指向master02设为主库。
change master to
master_host='172.16.40.72',
master_port=3306,
master_user='test',
master_password='test@666',
master_auto_position=1;
master02配置主从,指向master01设为主库。
change master to
master_host='172.16.40.71',
master_port=3306,
master_user='test',
master_password='test@666',
master_auto_position=1;
分别启动同步任务。
start slave;
3.6 校验双主同步状态
输入 show slave status\G
查询同步状态:IO 线程和 SQL 线程都为 YES 表示同步正常,成功实现master01和master02互为主从。
查看 /var/lib/mysql
目录下的文件,可以看到2台主机都已生成relay_log中继日志文件,至此,双主同步完成。
四、部署Keepalived,实现Master双主热备
4.1下载安装keepalived
2台master主机都下载 keepalive2.3.1。
wget https://www.keepalived.org/software/keepalived-2.3.1.tar.gz
tar -xzvf keepalived-2.2.4.tar.gz
安装依赖
yum -y install gcc openssl-devel libnl3-devel ipset-devel iptables-devel libnfnetlink-devel net-snmp-devel glib2-devel
安装keepalive,设置开机自启。
cd keepalived-2.3.1
./configure --prefix=/usr/local/keepalived-2.3.1
make && make install
systemctl enable keepalived
如下图所示,代表已支持IPVS虚拟IP功能。
4.2 修改Master节点的keepalived.conf配置文件
创建并配置master01的keepalived.conf文件
mkdir /etc/keepalived
touch /etc/keepalived/keepalived.conf
global_defs {
router_id Master_01 #节点服务名称
}
vrrp_script check_run {
script "/etc/keepalived/mysql_check.sh"
interval 5 #5秒执行一次脚本
}
vrrp_instance VIP_master {
state MASTER #节点的初始状态(MASTER|BACKUP)
interface ens192 #承载VIP地址到物理接口
virtual_router_id 100 #虚拟路由器ID号,主备都一样
priority 100 #优先级,数值越大优先级越高
advert_int 1 #指定发送 VRRP 广播的间隔,默认为1s
authentication { #主备间认证信息,每个热播组保持一致
auth_type PASS #认证类型,明文
auth_pass mysql@123 #密码字串,主备都一样
}
virtual_ipaddress {
172.16.40.222/24 #VIP地址(内网地址)
}
track_script {
check_run
}
}
主库 master01 检测脚本,编辑 /etc/keepalived/mysql_check.sh 文件:
#!/bin/bash
/usr/bin/mysql -uroot -p'你自己的数据库密码' -e "show status" &>/dev/null
if [ $? -ne 0 ] ;then
systemctl stop keepalived
else
echo ok
fi
chmod u+x /etc/keepalived/mysql_check.sh
创建并配置master02的keepalive.conf文件。
mkdir /etc/keepalived
touch /etc/keepalived/keepalived.conf
global_defs {
router_id Master_02 #节点服务名称
}
vrrp_script check_run {
script "/etc/keepalived/mysql_check.sh"
interval 5 #5秒执行一次脚本
}
vrrp_instance VIP_master {
state BACKUP #节点的初始状态(MASTER|BACKUP)
interface ens192 #承载VIP地址到物理接口
virtual_router_id 100 #虚拟路由器ID号,主备都一样
priority 90 #优先级,数值越大优先级越高
advert_int 1 #指定发送 VRRP 广播的间隔,默认为1s
authentication { #主备间认证信息,每个热播组保持一致
auth_type PASS #认证类型,明文
auth_pass mysql@123 #密码字串,主备都一样
}
virtual_ipaddress {
172.16.40.222/24 #VIP地址(内网地址)
}
track_script {
check_run
}
}
主库 B 检测脚本,编辑 /etc/keepalived/mysql_check.sh 文件:
#!/bin/bash
/usr/bin/mysql -uroot -p'你自己的数据库密码' -e "show status" &>/dev/null
if [ $? -ne 0 ] ;then
systemctl stop keepalived
else
echo ok
fi
chmod u+x /etc/keepalived/mysql_check.sh
4.3 启动Keepalive并校验状态
在master01和主库master02上分别启动 keepalived。
systemctl start keepalived
可以看到master01根据配置文件获得了更高的优先级,成功的拿到了VIP地址:
-
验证一(从客户端连接VIP登录mysql,查看当前mysql实例归属;同时新建表单数据,查看双主同步效果):
select @@hostname # 查看数据库主机名
通过客户端登录VIP—Mysql,新建表单数据,查看数据是否实现双主同步
create database testdb;
create table testdb.data01(id int not null primary key auto_increment, name varchar(60), age int);
insert into testdb.data01 (name,age) values ('tom',18), ('jack',17), ('rock',16), ('james',15), ('cris',20);
校验成功,数据已在双主库中完成同步:
-
验证二(关闭master01的mysql服务,查看VIP是否自动漂移到mysql02的网卡上;同时从客户端连接VIP登录mysql,查看VIP漂移后的mysql实例归属;)
检验成功,关闭master01数据库服务后,keepalive检测脚本生效,主动关闭msater01的keepalive服务,顺利完成自动选主,VIP漂移至master02网卡上:
五、部署Slaves双主多从,主从同步
5.1 配置每台slave从机的/etc/my.cnf文件
# slave01
[mysqld]
#定义server-id,每台主机的唯一值
server-id=3
#添加主服务器开启二进制日志
log-bin=slave01-bin
#复制类型使用MIXED模式
binlog_format=MIXED
# 设置单个binlog日志文件的最大容量
max_binlog_size=1024M
#设置自动删除 binlog 文件的天数
expire_logs_days=7
#开启GTID同步
gtid_mode=on
#强制事务一致,确保 GTID 的安全,在事务中就不能创建和删除临时表
enforce_gtid_consistency=on
#这个变量用于在 MySQL 重启或启动的时候寻找 GTIDs 过程中,控制 binlog 如何遍历的算法
binlog_gtid_simple_recovery=1
# slave02
[mysqld]
#定义server-id,每台主机的唯一值
server-id=2
#添加主服务器开启二进制日志
log-bin=slave02-bin
#复制类型使用MIXED模式
binlog_format=MIXED
# 设置单个binlog日志文件的最大容量
max_binlog_size=1024M
#设置自动删除 binlog 文件的天数
expire_logs_days=7
#开启GTID同步
gtid_mode=on
#强制事务一致,确保 GTID 的安全,在事务中就不能创建和删除临时表
enforce_gtid_consistency=on
#这个变量用于在 MySQL 重启或启动的时候寻找 GTIDs 过程中,控制 binlog 如何遍历的算法
binlog_gtid_simple_recovery=1
# slave03
[mysqld]
#定义server-id,每台主机的唯一值
server-id=3
#添加主服务器开启二进制日志
log-bin=slave03-bin
#复制类型使用MIXED模式
binlog_format=MIXED
# 设置单个binlog日志文件的最大容量
max_binlog_size=1024M
#设置自动删除 binlog 文件的天数
expire_logs_days=7
#开启GTID同步
gtid_mode=on
#强制事务一致,确保 GTID 的安全,在事务中就不能创建和删除临时表
enforce_gtid_consistency=on
#这个变量用于在 MySQL 重启或启动的时候寻找 GTIDs 过程中,控制 binlog 如何遍历的算法
binlog_gtid_simple_recovery=1
保存后,分别重启3台Slave的mysql服务 systemctl restart mysqld
5.2 配置每台从机的Slave服务,校验主从同步结果
依次在3台Slave中配置数据同步账号(注意master_host为双主keepalive的VIP地址)。
change master to
master_host='172.16.40.222',
master_port=3306,
master_user='test',
master_password='test@666',
master_auto_position=1;
启动同步服务 start slave;
,查看同步状态 show slave status\G;
客户端Client通过双主虚拟VIP 172.16.40.222 登录,并写入新数据至Master上,查看每台Slave已正常完成数据同步,即双主多从部署完毕。
六、部署Mycat,配置读写分离
6.1 下载安装Mycat1.6
安装配置jdk1.8环境。
tar -zxvf jdk-8u152-linux-x64.tar.gz
mv jdk1.8.0_152 /usr/local/
echo -e 'export JAVA_HOME=/usr/local/jdk1.8.0\nexport PATH=$JAVA_HOME/bin:$PATH' >> /etc/profile
source /etc/profile
分别在Mycat01和Mycat02节点上安装Mycat1.6。下载地址:Mycat-download-old/1.6-RELEASE/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz at master · MyCATApache/Mycat-download-old · GitHub
tar -zxvf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
mv mycat /usr/local/
echo -e 'export MYCAT_HOME=/usr/local/mycat\nexport PATH=$MYCAT_HOME/bin:$PATH:$JAVA_HOME/bin' >> /etc/profile
source /etc/profile
6.2 修改Mycat配置文件
(参考:Mycat 三大配置文件详解)
修改两台Mycat节点的/usr/local/mycat/conf/server.xml,配置mycat对外连接的账户信息。schemas的值需要与schema.xml中的schemas标签值保持一致
。
<user name="root">
<property name="password">123456</property>
<property name="schemas">testdb</property>
<!-- 表级 DML 权限设置 -->
<!--
<privileges check="false">
<schema name="TESTDB" dml="0110" >
<table name="tb01" dml="0000"></table>
<table name="tb02" dml="1111"></table>
</schema>
</privileges>
-->
</user>
<user name="test">
<property name="password">test123</property>
<property name="schemas">testdb</property>
</user>
修改两台Mycat节点的/usr/local/mycat/conf/schema.xml文件,配置读写分离。
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<!-- 数据库配置 与server.xml 中的数据库对应 -->
<schema name="testdb" checkSQLschema="true" dataNode="dn_node1" sqlMaxLimit="100">
<table name="data01" primaryKey="id" dataNode="dn_node1" />
</schema>
<!-- 分片配置 -->
<dataNode name="dn_node1" dataHost="dh_host1" database="testdb" />
<!-- 物理数据库配置 -->
<dataHost name="dh_host1" maxCon="1000" minCon="10" balance="3"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM" url="172.16.40.222:3306" user="root" password="******">
<readHost host="hostS1" url="172.16.40.91:3306" user="root" password="******" />
<readHost host="hostS2" url="172.16.40.92:3306" user="root" password="******" />
<readHost host="hostS3" url="172.16.40.93:3306" user="root" password="******" />
</writeHost>
</dataHost>
</mycat:schema>
6.3 开启Mycat,并对读写分离策略进行校验
启动mycat服务。
mycat start
查看服务运行状态及端口。
从客户端分别连接2台mycat并执行SQL查询,进行读写分离验证。
读取数据:mysql -utest -ptest123 -h172.16.40.81 -P8066 -e 'select @@hostname'
,可以看到读取操作只会随机分发到3台slave从节点上执行。
写入数据:mysql -utest -ptest123 -h172.16.40.81 -P8066 -e 'insert into testdb.data01 (name,age) values (@@hostname,50)'
, 可以看到写入的操作只会在master节点上执行。
在关闭master01的mysql服务后,再次连接mycat进行数据写入,可以看到执行写入的节点已近自动变为master02了。
七、部署HAProxy负载均衡+Keepalived实现高可用
7.1 安装Haproxy和Keepalived
yum -y install haproxy keepalived
7.2 修改Haproxy配置文件
修改两台haproxy节点的/etc/haproxy/haproxy.cfg内容,配置如下:
global
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4096
user haproxy
group haproxy
daemon
stats socket /var/lib/haproxy/stats
#---------------------------------------------------------------------
defaults
log global
mode tcp
option abortonclose
option redispatch
retries 3
maxconn 2000
timeout connect 5000
timeout client 50000
timeout server 50000
#---------------------------------------------------------------------
# HAProxy的状态信息统计页面
listen admin_stats
bind :50004 # 管理页面端口号
stats uri /admin # 管理页面地址路径
stats auth admin:123456 # 管理页面登录账户密码
mode http # 所处理的模式 (tcp:四层, http:七层, health:状态检查,只会返回OK)
option httplog # 启用日志记录HTTP请求
#--------------------------------------------------------------------
listen mycat_servers
bind :50005 # Haproxy对外连接的端口号
mode tcp
option tcplog # 记录TCP请求日志
option tcpka # 在客户端和监听器之间以及HAProxy和后端服务器之间的连接上启用SO_KEEPALIVE
balance roundrobin # 定义负载均衡算法为轮询方式(leastconn:以最少连接数算法来分配请求)
server mycat01 172.16.40.81:8066 check inter 3000 rise 1 maxconn 1000 fall 3
server mycat02 172.16.40.82:8066 check inter 3000 rise 1 maxconn 1000 fall 3
# 格式:server <name> <address>[:[port]] [param*]
# serser:在后端声明一个server,只能用于listen和backend区段。
# <name>:为此服务器指定的内部名称,其将会出现在日志及警告信息中
# <address>:此服务器的IPv4地址,也支持使用可解析的主机名,但要在启动时需要解析主机名至响应的IPV4地址
# [:[port]]:指定将客户端连接请求发往此服务器时的目标端口,此为可选项
# [param*]:为此server设定的一系列参数,均为可选项,参数比较多,下面仅说明几个常用的参数:
# weight:权重,默认为1,最大值为256,0表示不参与负载均衡
# backup:设定为备用服务器,仅在负载均衡场景中的其他server均不可以启用此server
# check:启动对此server执行监控状态检查,其可以借助于额外的其他参数完成更精细的设定
# inter:设定监控状态检查的时间间隔,单位为毫秒,默认为2000,也可以使用fastinter和downinter来根据服务器端专题
#优化此事件延迟
# rise:设置server从离线状态转换至正常状态需要检查的次数(不设置的情况下,默认值为2)
# fall:设置server从正常状态转换至离线状态需要检查的次数(不设置的情况下,默认值为3)
# cookie:为指定server设定cookie值,此处指定的值将会在请求入站时被检查,第一次为此值挑选的server将会被后续的请
#求所选中,其目的在于实现持久连接的功能
# maxconn:指定此服务器接受的最大并发连接数,如果发往此服务器的连接数目高于此处指定的值,其将被放置于请求队列
#,以等待其他连接被释放
7.3 保存配置,重启Haproxy服务,并查看端口运行状态
7.4 登录Haproxy管理页面,查看后端Mycat的检测状态
7.5 验证Haproxy负载均衡策略
客户端通过HAProxy访问Mycat测试,mysql -utest -ptest123 -h172.16.40.81 -P5005 -e 'select @@hostname'
关闭后端其中一台Mycat服务,校验Haproxy是否顺利切换正常使用。
7.6 修改Keepalived配置文件
修改Haproxy01的/etc/keepalived/keepalived.conf内容:
global_defs {
router_id Haproxy_01 #节点服务名称
}
vrrp_script chk_haproxy {
script "/etc/keepalived/check_haproxy.sh"
interval 5 #5秒执行一次脚本
}
vrrp_instance VIP_Haproxy {
state MASTER #节点的初始状态(MASTER|BACKUP)
interface ens192 #承载VIP地址到物理接口
virtual_router_id 110 #虚拟路由器ID号,主备都一样
priority 100 #优先级,数值越大优先级越高
advert_int 1 #指定发送 VRRP 广播的间隔,默认为1s
authentication { #主备间认证信息,每个热播组保持一致
auth_type PASS #认证类型,明文
auth_pass haproxy@123 #密码字串,主备都一样
}
virtual_ipaddress {
172.16.40.111/24 #VIP地址(内网地址)
}
track_script {
chk_haproxy
}
}
Haproxy01状态检测脚本,编辑/etc/keepalived/check_haproxy.sh文件:
#!/bin/bash
if [ $(ps -C haproxy --no-header | wc -l) -eq 0 ]; then
/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg
fi
sleep 3
if [ $(ps -C haproxy --no-header | wc -l) -eq 0 ]; then
killall keepalived
fi
chmod +x /etc/keepalived/check_haproxy.sh
修改Haproxy02的/etc/keepalived/keepalived.conf内容:
global_defs {
router_id Haproxy_02 #节点服务名称
}
vrrp_script chk_haproxy {
script "/etc/keepalived/check_haproxy.sh"
interval 5 #5秒执行一次脚本
}
vrrp_instance VIP_Haproxy {
state BACKUP #节点的初始状态(MASTER|BACKUP)
interface ens192 #承载VIP地址到物理接口
virtual_router_id 110 #虚拟路由器ID号,主备都一样
priority 90 #优先级,数值越大优先级越高
advert_int 1 #指定发送 VRRP 广播的间隔,默认为1s
authentication { #主备间认证信息,每个热播组保持一致
auth_type PASS #认证类型,明文
auth_pass haproxy@123 #密码字串,主备都一样
}
virtual_ipaddress {
172.16.40.111/24 #VIP地址(内网地址)
}
track_script {
chk_haproxy
}
}
Haproxy02状态检测脚本,编辑/etc/keepalived/check_haproxy.sh文件:
#!/bin/bash
if [ $(ps -C haproxy --no-header | wc -l) -eq 0 ]; then
/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg
fi
sleep 3
if [ $(ps -C haproxy --no-header | wc -l) -eq 0 ]; then
killall keepalived
fi
chmod +x /etc/keepalived/check_haproxy.sh
7.7 开启Keepalived服务,校验Haproxy高可用状态
启动Keepalived,看下虚拟VIP落点。
systemctl start keepalived
systemctl status keepalived
ip addr show ens192
客户端通过HAProxy集群的VIP地址访问Mycat测试,mysql -utest -ptest123 -h172.16.40.111 -P50005 -e 'select @@hostname'
关闭Haproxy01的服务,再次从客户端连接VIP访问Mycat测试。
将Haproxy01的配置文件复原,检测脚本自动重启Haproxy01的服务,并成功复主拿到VIP。
到此,集群环境全部部署完成。