赞
踩
在很早之前搭建过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
两者的配置文件是相同的,因为为了方便后续操作。
注意点:
启动完成后使用navicate进行尝试连接,是完全可以的
尝试启动成功后接下来进行主从复制搭建,需要更改对应的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上,感兴趣的可以试试。
自此操作完成!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。