罪恶克星 发表于 2025-1-26 05:36:10

Mariadb keepalived + 双主

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
查看当前实例网口

ip addr
修改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效果
# 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效果
# 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
# 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
# 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
# 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: bogus VRRP packet received on eth0 !!!
Keepalived_vrrp: VRRP_Instance(VI-kube-master) ignoring received advertisment...
Keepalived_vrrp: ip address associated with VRID not present in received packet : 192.168.5.81
Keepalived_vrrp: 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企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: Mariadb keepalived + 双主