马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
Mariadb keepalived + 双主
说明:采取keepalived+双主模型对mariadb服务器做高可用,在双主的底子上,Keepalived可以分别实时监听AB,负责检测服务器的状态,当A宕机后,主动将流量切换到B,也可采取keepalived+主从,按场景选择,这里以双主为例
节点范例IPPORT主节点192.168.5.813306主节点192.168.5.823306keepalived192.168.5.81、192.168.5.82 81、82分别安装keepalived
- yum -y install keepalived
复制代码 设置为开机启动
- systemctl enable keepalived
复制代码 查看当前实例网口
修改keepalived设置信息
- vim /etc/keepalived/keepalived.conf # 安装完keepalived后自动生成的配置文件
复制代码 设置方式有两种
- 基于virtual_server
- 基于virtual_script
基于virtual_server
81 keepalived.conf 设置文件内容如下
- ! Configuration File for keepalived
- global_defs {
- notification_email {
- linxuekai@datapp.com.cn #提醒邮箱
- }
- smtp_server 127.0.0.1
- smtp_connect_timeout 30
- router_id cluster1
- }
- vrrp_instance VI_1 {
- state BACKUP #keepalived的角色,有 MASTER|BACKUP,设为BACKUP将根据优先级决定主从,两台都设置BACKUP
- interface ens160 #实例运行所要用到的网络接口
- virtual_router_id 51 #实例所属的VRRP路由器ID
- priority 100 #实例在VRRP路由器中的优先级
- advert_int 1 #以秒为单位指定通告的间隔时间(设置为1)
- nopreempt #不抢占,即允许一个priority较低的节点作为master(即使有priority更高的节点启动),一般只在优先级高的机器上配置
- authentication { #标识VRRP认证定义块
- auth_type PASS #指定要使用哪种身份认证,认证类型分为 PASS|AH(IPSEC)
- auth_pass 1111 #指定要使用的密码字符串
- }
- virtual_ipaddress { #标识VRRP VIP定义块
- 192.168.5.100 #VIP IP
- }
- }
- virtual_server 192.168.5.100 3306{ #标识虚拟服务器定义块
- delay_loop 6 #以秒为单位指定检查之间的间隔时间
- #lb_algo rr #选择一个特定的调度程序 (rr|wrr|lc|wlc… ),rr为默认,轮询算法
- #lb_kind NAT #选择一个特定的转发方法,设置LVS实现负载均衡的机制,模式包含 NAT|DR|TUN
- persistence_timeout 50 #为持久连接指定超时时间
- protocol TCP 指定协议类型( TCP|UDP )
- real_server 192.168.5.81 3306{ #指定一个真实服务器成员
- weight3 #为真实服务器指定负载均衡的权重,数字越大,权重越高,可通过大小区分设置不同性能的服务器
- notify_down /etc/keepalived/bin/chk_mariadb.sh #检测到realserver的服务down后执行的脚本
- TCP_CHECK { #使用TCP连接检查真实服务器的可用性
- connect_timeout 3 #指定连接远程服务器的超时时间
- nb_get_retry 3 #重连次数
- delay_before_retry 3 #重连间隔时间
- connect_port 3306 #指定连接远程服务器的TCP端口
- }
- }
- }
复制代码 82 keepalived.conf 设置文件内容如下
- ! Configuration File for keepalived
- global_defs {
- notification_email {
- linxuekai@datapp.com.cn #提醒邮箱
- }
- smtp_server 127.0.0.1
- smtp_connect_timeout 30
- router_id cluster1
- }
- vrrp_instance VI_1 {
- state BACKUP
- interface ens160
- virtual_router_id 51
- priority 90 #与81不同
- #nopreempt #与81不同
- advert_int
- authentication {
- auth_type PASS
- auth_pass 1111
- }
- virtual_ipaddress {
- 192.168.5.100
- }
- }
- virtual_server 192.168.5.100 3306{
- delay_loop 6
- #lb_algo rr #选择一个特定的调度程序 (rr|wrr|lc|wlc… ),rr为默认,轮询算法
- #lb_kind NAT #选择一个特定的转发方法,设置LVS实现负载均衡的机制,模式包含 NAT|DR|TUN
- persistence_timeout 50
- protocol TCP 指定协议类型( TCP|UDP )
- real_server 192.168.5.82 3306{ #修改为82ip
- weight3
- notify_down /etc/keepalived/bin/chk_mariadb.sh #检测到realserver的服务down后执行的脚本
- TCP_CHECK {
- connect_timeout 3
- nb_get_retry 3
- delay_before_retry 3
- connect_port 3306
- }
- }
- }
复制代码 基于virtual_script
81、82 keepalived.conf 设置文件内容如下
- global_defs {
- notification_email {
- linxuekai@datapp.com.cn #提醒邮箱
- }
- smtp_server 127.0.0.1
- smtp_connect_timeout 30
- router_id cluster1
- }
- vrrp_script chk_mariadb {
- script "/etc/keepalived/bin/chk_mariadb.sh" #脚本监测
- interval 2 #脚本执行间隔,每2s检测一次
- weight -10 #脚本结果导致的优先级变更,检测失败(脚本返回非0)则优先级 -10
- fall 2 #检测连续2次失败才算确定是真失败。会用weight减少优先级(1-255之间)
- rise 1 #检测1次成功就算成功。但不修改优先级
- }
- vrrp_instance VI_MARIADB {
- state BACKUP
- interface ens160
- virtual_router_id 52
- priority 100
- advert_int 1
- nopreempt
- authentication {
- auth_type PASS
- auth_pass 1111
- }
- virtual_ipaddress {
- 192.168.5.100
- }
- track_script {
- chk_mariadb #指定上述定义脚本
- }
- }
复制代码 添加检测脚本
作用:是当mariadb停止工作时主动关闭本机的keeplived,从而实现将故障主机踢出热备组,因每台机器上keepalived只添加了本机为realserver,所以当mysqld正常启动后,我们还需要手动启动keepalived服务
以下步调81、82均需要设置执行
添加脚本
- vi /etc/keepalived/bin/chk_mariadb.sh
复制代码 chk_mariadb.sh内容如下
- #!/bin/bash
- counter=$(netstat -na|grep "LISTEN"|grep "3306"|wc -l)
- if [ "${counter}" -eq 0 ]; then
- systemctl stop keepalived
- fi
复制代码 赋予脚本可执行权限
- chmod+x /etc/keepalived/bin/chk_mariadb.sh
复制代码 启动mariadb和keepalived
- systemctl start mariadb
- systemctl start keepalived
复制代码 查看VIP(集群虚拟IP)的控制权
81、82分别执行
- ip addr
- show dev ens160 #ens160为网卡,替换成本身的即可
复制代码 81效果
- [root@cluster1 keepalived]# ip addr
- show dev ens1602: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000 link/ether 00:0c:29:35:67:6e brd ff:ff:ff:ff:ff:ff inet 192.168.5.81/24 brd 192.168.5.255 scope global noprefixroute ens160 valid_lft forever preferred_lft forever inet 192.168.5.100/32 scope global ens160 valid_lft forever preferred_lft forever inet6 fe80::d9de:308c:f3c9:b7c6/64 scope link noprefixroute valid_lft forever preferred_lft forever
复制代码 82效果
- [root@cluster2 keepalived]# ip addr
- show dev ens1602: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000 link/ether 00:0c:29:1e:40:1a brd ff:ff:ff:ff:ff:ff inet 192.168.5.82/24 brd 192.168.5.255 scope global noprefixroute ens160 valid_lft forever preferred_lft forever inet6 fe80::c5c:81d6:44fe:672c/64 scope link noprefixroute valid_lft forever preferred_lft forever
复制代码 可以看出81是master,82是slave
验证keepalived康健检查
停止81节点的mariadb,观察keepalived是否会触发bash脚本
- systemctl stop mariadb
- ps -ef | grep keepalived #可以看到脚本触发,keepalived停止运行
复制代码 查看81
- [root@cluster1 keepalived]# ip addr
- show dev ens1602: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000 link/ether 00:0c:29:35:67:6e brd ff:ff:ff:ff:ff:ff inet 192.168.5.81/24 brd 192.168.5.255 scope global noprefixroute ens160 valid_lft forever preferred_lft forever inet6 fe80::d9de:308c:f3c9:b7c6/64 scope link noprefixroute valid_lft forever preferred_lft forever
复制代码 查看82
- [root@cluster2 keepalived]# ip addr
- show dev ens1602: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000 link/ether 00:0c:29:1e:40:1a brd ff:ff:ff:ff:ff:ff inet 192.168.5.82/24 brd 192.168.5.255 scope global noprefixroute ens160 valid_lft forever preferred_lft forever inet 192.168.5.100/32 scope global ens160 #vip ip由81切换到了82 valid_lft forever preferred_lft forever inet6 fe80::c5c:81d6:44fe:672c/64 scope link noprefixroute valid_lft forever preferred_lft forever
复制代码 上述效果可以说明在81master服务器的mariadb服务发生故障时,81主机触发了脚本,发生了主动故障切换
重新启动81节点的mariadb和keepalived
- systemctl start mariadb
- systemctl start keepalived
复制代码 查看81
- [root@cluster1 keepalived]# ip addr
- show dev ens1602: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000 link/ether 00:0c:29:35:67:6e brd ff:ff:ff:ff:ff:ff inet 192.168.5.81/24 brd 192.168.5.255 scope global noprefixroute ens160 valid_lft forever preferred_lft forever inet6 fe80::d9de:308c:f3c9:b7c6/64 scope link noprefixroute valid_lft forever preferred_lft forever
复制代码 说明设置的 nopreempt 生效,82仍旧是master,81抢不回去master的权利了,在生产环境中添加不抢占设置,保证了聚集稳定性,只有当82的服务宕机时,81才会再次成为master,否则它永久只能当82的备份。(注:nopreempt一样平常是在优先级高的mariadb上设置)
keepalived常见命令
日记
- systemctl status keepalived.service -l
-
- journalctl -u keepalived.service -f
-
- tail -22f /var/log/messages | grep Keepalived
复制代码 服务
- systemctl stop keepalived
-
- systemctl start keepalived
-
- systemctl restart keepalived
- systemctl status keepalived
复制代码 查看当前vip对应节点
- # 查看VIP是否在筛选效果中ip addr
- show|grep "scope global"# 或者 ip addr
- show|grep {vip}
复制代码 标题排查
virtual_router_id 同网段重复,日记报错如下:
- Keepalived_vrrp[8548]: bogus VRRP packet received on eth0 !!!
- Keepalived_vrrp[8548]: VRRP_Instance(VI-kube-master) ignoring received advertisment...
- Keepalived_vrrp[8548]: ip address associated with VRID not present in received packet : 192.168.5.81
- Keepalived_vrrp[8548]: one or more VIP associated with VRID mismatch actual MASTER advert
复制代码 解决方法:
同一网段内LB节点设置的 virtual_router_id 值有重复了,选择一个不重复的0~255之间的值,可以用以下命令查看已存在的vrid
- tcpdump -nn -i any net 224.0.0.0/8 #需要tcpdump,没有则安装 yum install tcpdump
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |