在很早之前搭建过Mysql的主从,但是当时年幼无知,没有想到过高可用怎么保证,这两天在复习以前的笔记的时候,无意中看到了Mysql之keepalived的文章,自己就想着实践一下,于是就有了这篇文章。
文章大体分为两部分:1.主从搭建,2.keepalived集成。
两台机器:
10.211.55.5-master
10.211.55.6-slave
mysql镜像:arm64v8/mysql
版本:8.0.32(推荐用5.x的版本)
注意点: 作者的电脑是mac os m1 pro,和windows的芯片架构完全不一致,这里用的是 arm64V8,读者是windows的话请去hub.docker下载对应的镜像。
小白也能看懂!
废话不多说,下面就正式开始!
10.211.55.5-master 机器下面的 docker-compose.yaml
version: '2'
services:
mysql5:
image: arm64v8/mysql
container_name: mysql8
restart: always
volumes:
- /root/docker/mysql/8.x/conf:/etc/mysql/conf.d
- /root/docker/mysql/8.x/data:/var/lib/mysql
- /root/docker/mysql/8.x/my.cnf:/etc/mysql/my.cnf # 映射配置文件
environment:
MYSQL_ROOT_PASSWORD: "721000"
ports:
- 3306:3306
10.211.55.6-slave 机器下面的 docker-compose.yaml
version: '2'
services:
mysql5:
image: arm64v8/mysql
container_name: mysql8
restart: always
volumes:
- /root/docker/mysql/8.x/conf:/etc/mysql/conf.d
- /root/docker/mysql/8.x/data:/var/lib/mysql
- /root/docker/mysql/8.x/my.cnf:/etc/mysql/my.cnf # 映射配置文件
environment:
MYSQL_ROOT_PASSWORD: "721000"
ports:
- 3306:3306
两者的配置文件是相同的,因为为了方便后续操作。
注意点:
尝试启动成功后接下来进行主从复制搭建,需要更改对应的mysql配置文件:
10.211.55.5-master
# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/8.0/en/server-configuration-defaults.html
[mysqld]
skip-host-cache
skip-name-resolve
datadir=/var/lib/mysql
socket=/var/run/mysqld/mysqld.sock
secure-file-priv=/var/lib/mysql-files
user=mysql
pid-file=/var/run/mysqld/mysqld.pid
# 下面的这几个是需要我们手动配置的
log-error=/var/lib/mysql/mysql_log/error.log # mysql的日志
log-bin=mysql-bin # 配置binlog,通过binlog将两个mysql同步
server-id=1 # 配置本台机器mysql的id,必须要唯一
max_connections=1000
[client]
socket=/var/run/mysqld/mysqld.sock
!includedir /etc/mysql/conf.d/
配置了 log-error,log-bin,server-id,上面也有对应的解释。
10.211.55.6-slave
# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/8.0/en/server-configuration-defaults.html
[mysqld]
skip-host-cache
skip-name-resolve
datadir=/var/lib/mysql
socket=/var/run/mysqld/mysqld.sock
secure-file-priv=/var/lib/mysql-files
user=mysql
pid-file=/var/run/mysqld/mysqld.pid
binlog_do_db=test # 需要同步的数据库名字,这个数据库要提前建好
log-error=/var/lib/mysql/mysql_log/error.log # mysql的日志
log-bin=mysql-bin # 配置binlog,通过binlog将两个mysql同步
server-id=2 # 配置本台机器mysql的id
max_connections=1000
[client]
socket=/var/run/mysqld/mysqld.sock
!includedir /etc/mysql/conf.d/
配置了 binlog_do_db,log-error,log-bin,server-id,上面也有对应的解释。
配置完成后,直接重启docker容器,验证配置是否生效:
分别在两台机器上的mysql中执行:
show variables like '%server_id%';
看一下是不是我们配置中指定的。
mysql启动要是报错了,可以查看指定的error.log文件,看看报错原因是什么,手动解决一下报错。
以上做完后,就可以做主从的配置了:
1.在master上执行:
show master status;
2.在slave上执行:
change master to master_host='10.211.55.5',master_user='root',master_password='721000',
master_log_file='mysql-bin.000013',master_log_pos=157;
然后开始同步:
start slave; # 开始同步master的日志内容
SHOW SLAVE STATUS; # 查看状态
这两个为Yes就代表配置成功。
测试: 在master test库中建立一张user表,slave上自动就出现了。
如果你做到了这一步就说明你成功了!
可能遇到的错误:
同步不成功,可能是master上表里面有数据了,才开始同步。
只需要先将master,slave上的日志进行重置,在重新执行上面的流程一遍即可。
# 重置master上的所有的日志,注意是重置所有的,也可以删除指定的日志
reset master;
# 重置slave上的所有的日志
reset slave
至此主从已经完成,整个流程不算是多麻烦。
Keepalived是Linux下一个轻量级的高可用解决方案。
官网地址:https://www.keepalived.org
安装命令:
yum install -y gcc gcc-c++ wget popt-devel openssl openssl-devel
yum install -y libnl libnl-devel libnl3 libnl3-devel
yum install -y libnfnetlink-devel
./configure --prefix=/usr/local/keepalived --sysconf=/etc
make && make install
配置文件位置:/etc/keepalived
启动位置:/usr/local/keepalived/sbin/keepalived
keepalived 日志: tail -22f /var/log/messages | grep Keepalived
主要是创建 keepalived.conf配置文件:
1.master 上配置文件:
global_defs {
router_id MYSQL-1
}
vrrp_script check_mysql {
script "/etc/keepalived/bin/check_mysql.sh"
interval 22
weight 2
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 100
advert_int 1
nopreempt
authentication {
auth_type PASS
auth_pass 721000
}
virtual_ipaddress {
10.211.55.8
}
track_script {
check_mysql
}
}
virtual_server 10.211.55.8 3306 {
delay_loop 2
lb_algo rr
lb_kind DR
persistence_timeout 50
protocol TCP
real_server 10.211.55.5 3306 {
weight 3
notify_stop /etc/keepalived/bin/shutdown.sh
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 3306
}
}
}
注释版:
global_defs {
router_id MYSQL-1 //表示运行keepalived服务器的一个标识
}
// 定义自动核对mysql的脚本
vrrp_script check_mysql {
script "/etc/keepalived/bin/check_mysql.sh"
interval 22
weight 2
}
vrrp_instance VI_1 {
state BACKUP //指定keepalived的角色, 两台配置此处均是BACKUP,设为BACKUP将根据优先级决定主或从
interface eth0 //指定HA监测网络的接口
virtual_router_id 51 /虚拟路由标识,这个标识是一个数字(取值在0-255之间,用来区分多个instance的VRRP组播),同一个vrrp实例使用唯一的标识,确保和master2相同,同网内不同集群此项必须不同,否则发生冲突。
priority 100 //用来选举master的,要成为master,该项取值范围是1-255(在此范围之外会被识别成默认值100),此处master2上设置为50
advert_int 1 //发VRRP包的时间间隔,即多久进行一次master选举(可以认为是健康查检时间间隔)
nopreempt //不抢占,即允许一个priority比较低的节点作为master,即使有priority更高的节点启动
authentication {
//认证区域,认证类型有PASS和HA(IPSEC),推荐使用PASS(密码只识别前8位)
auth_type PASS
auth_pass 721000
}
virtual_ipaddress {
// 指定vip地址
10.211.55.8
}
track_script {
//指定核对的脚本,check_mysql是上述自定义的
check_mysql
}
}
virtual_server 10.211.55.8 3306 {
delay_loop 2 //设置运行情况检查时间,单位是秒
lb_algo rr //设置后端调度算法,这里设置为rr,即轮询算法
lb_kind DR //设置LVS实现负载均衡的机制,有NAT、TUN、DR三个模式可选
persistence_timeout 50 //会话保持时间,单位是秒。这个选项对动态网页是非常有用的,为集群系统中的session共享提供了一个很好的解决方案。有了这个会话保持功能,用户的请求会被一直分发到某个服务节点,直到超过这个会话的保持时间。
protocol TCP //指定转发协议类型,有TCP和UDP两种
real_server 10.211.55.5 3306 {
weight 3 //配置服务节点的权值,权值大小用数字表示,数字越大,权值越高,设置权值大小为了区分不同性能的服务器
notify_stop /etc/keepalived/bin/shutdown.sh //检测到mysql服务down后执行的脚本,在一些版本中叫notify_down
TCP_CHECK {
connect_timeout 3 //连接超时时间
nb_get_retry 3 //重连次数
delay_before_retry 3 //重连间隔时间
connect_port 3306 //健康检查端口
}
}
}
不能用注释版,直接用没注释的放在/etc/keepalived目录下面即可。
直接启动 keepalived,ip add 一下就能看到配置的虚拟ip了。
用navicate去连接也是可以的。
1.slave 上配置文件:
与master差不多,需要改一点配置:
global_defs {
router_id MYSQL-2
}
vrrp_script check_mysql {
script "/etc/keepalived/bin/check_mysql.sh"
interval 22
weight 2
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 50
advert_int 1
nopreempt
authentication {
auth_type PASS
auth_pass 721000
}
virtual_ipaddress {
10.211.55.8
}
track_script {
check_mysql
}
}
virtual_server 10.211.55.8 3306 {
delay_loop 2
lb_algo rr
lb_kind DR
persistence_timeout 50
protocol TCP
real_server 10.211.55.6 3306 {
weight 3
notify_stop /etc/keepalived/bin/shutdown.sh
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 3306
}
}
}
注释版:
global_defs {
router_id MYSQL-2 //表示运行keepalived服务器的一个标识
}
// 定义自动核对mysql的脚本
vrrp_script check_mysql {
script "/etc/keepalived/bin/check_mysql.sh"
interval 22
weight 2
}
vrrp_instance VI_1 {
state BACKUP //指定keepalived的角色, 两台配置此处均是BACKUP,设为BACKUP将根据优先级决定主或从
interface eth0 //指定HA监测网络的接口
virtual_router_id 51 /虚拟路由标识,这个标识是一个数字(取值在0-255之间,用来区分多个instance的VRRP组播),同一个vrrp实例使用唯一的标识,确保和master2相同,同网内不同集群此项必须不同,否则发生冲突。
priority 50 //用来选举master的,要成为master,该项取值范围是1-255(在此范围之外会被识别成默认值100),此处master2上设置为50
advert_int 1 //发VRRP包的时间间隔,即多久进行一次master选举(可以认为是健康查检时间间隔)
nopreempt //不抢占,即允许一个priority比较低的节点作为master,即使有priority更高的节点启动
authentication {
//认证区域,认证类型有PASS和HA(IPSEC),推荐使用PASS(密码只识别前8位)
auth_type PASS
auth_pass 721000
}
virtual_ipaddress {
// 指定vip地址
10.211.55.8
}
track_script {
//指定核对的脚本,check_mysql是上述自定义的
check_mysql
}
}
virtual_server 10.211.55.8 3306 {
delay_loop 2 //设置运行情况检查时间,单位是秒
lb_algo rr //设置后端调度算法,这里设置为rr,即轮询算法
lb_kind DR //设置LVS实现负载均衡的机制,有NAT、TUN、DR三个模式可选
persistence_timeout 50 //会话保持时间,单位是秒。这个选项对动态网页是非常有用的,为集群系统中的session共享提供了一个很好的解决方案。有了这个会话保持功能,用户的请求会被一直分发到某个服务节点,直到超过这个会话的保持时间。
protocol TCP //指定转发协议类型,有TCP和UDP两种
real_server 10.211.55.6 3306 {
weight 3 //配置服务节点的权值,权值大小用数字表示,数字越大,权值越高,设置权值大小为了区分不同性能的服务器
notify_stop /etc/keepalived/bin/shutdown.sh //检测到mysql服务down后执行的脚本,在一些版本中叫notify_down
TCP_CHECK {
connect_timeout 3 //连接超时时间
nb_get_retry 3 //重连次数
delay_before_retry 3 //重连间隔时间
connect_port 3306 //健康检查端口
}
}
}
两个脚本:
check_mysql.sh
#!/bin/bash
MYSQL_HOST=127.0.0.1
MYSQL_USER=root
MYSQL_PASSWORD=721000
mysql -h $MYSQL_HOST -u $MYSQL_USER -p$MYSQL_PASSWORD -e "show status;" >/dev/null 2>&1
if [ $? == 0 ]
then
echo " $host mysql login successfully "
exit 0
else
service keepalived stop
exit 2
fi
shutdown.sh
echo "MYSQL DOWN..."
service keepalived stop
注意: 这个脚本的执行是在本机上执行的,而mysql是在容器中运行的,所以我们要在本机上去安装mysql的客户端,yum install mysql 即可。
如果读者是mysql8的话,安装的mysql客户端是5.x的话,登录时会报错加密规则错误,解决办法:
ALTER USER ‘root’@‘%’ IDENTIFIED WITH mysql_native_password BY ‘721000’;
flush privileges;
slave配置完成后,也直接启动即可。
slave这里是看不到虚拟vip的,如果能看到说明失败了,可以尝试把防火墙关闭:systemctl stop firewalld。
ok,到这里 keepalived就搭建完了,下面我们只需要连接这个配置的同一个虚拟ip即可。
navicate去连接过后,在这个vip上插入一条数据后,slave中也同步到了这条数据。
当停掉一台mysql会自动切换到另外一台mysql上,感兴趣的可以试试。
自此操作完成!