1. Keepalived + LVS (Keepalived 和 MySQL 部署在一起)
1. 1 架构设计
具体架构如下图所示:
使用两台主机实现 MySQL 半同步主从复制并使用 Keepalived + LVS 实现 MySQL的读写分离和高可用。Keepalived 这里主要用作后端服务器的健康状态检查,提供VIP,以及故障转移;LVS 提供读负载均衡。
整体架构设计原理如下:
- 后端服务器 A 和 B 实现 MySQL 半同步主从复制的主库和从库。
- 利用 Keepalived 提供两个虚拟 IP ,Write-VIP 和 Read-VIP,前者负责写入,后者负责读取,实现读写分离。
- 当服务器 A 和 B 都正常工作时,LVS 通过 Write-VIP 将写请求转发到服务器 A,通过 Read-VIP 将读请求转发给 A 和 B,实现读负载均衡。
- 当服务器 A 即 Master 发生异常时,Write-VIP 漂移到服务器 B 上,使用脚本将 B 提升为 Master 。
- 当服务器 B 即 Slave 发生异常时,Read-VIP 自动将 B 剔除,其他不变。
1.2 部署和配置
1.2.1 服务器总体部署规划
| 服务器 | 角色 | IP | VIP | | —- | —- | —- | —- | | A | Keepalived Write-VIP Master+
Keepalived Read-VIP Backup+
MySQL Master | 192.168.0.71 | Write:192.168.0.100 | | B | Keepalived Read-VIP Master+
Keepalived Write-VIP Backup
MySQL Slave | 192.168.0.72 | Read:192.168.0.200 |
1.2.2 部署过程
- 按照规划安装和配置 MySQL 的半同步主从复制,192.168.0.71 为主库,192.168.0.72 为从库。
安装 LVS 管理工具
yum -y install ipvsadm
下载安装 Keepalived 。
- Iptables 配置
由于 Keepalived + LVS 和 MySQL 部署在同一台机器上,即 LVS 的 Director 服务器和 Real Server 为一台机器的时候,会出现两台 Director 无限循环转发的情况。为了解决该问题,需要使用 Iptables 对数据包进行标记,然后让 LVS 对 fwm 进行转发,而不是直接转发 TCP。每台 Director 都标记自己发送的数据包,ipvs 只转发这些自己标记过的包,而其他 Director 服务器发送的数据包就不再转发了,直接交给上层监听程序。
生产中建议 Keepalived 放在单独的两台机器上,则不需要进行此步操作!
具体操作如下:
# 192.168.0.71 主库[root@C7-01 ~]# iptables -t mangle -I PREROUTING -d 192.168.0.100 -p tcp -m tcp --dport 3306 -m mac ! --mac-source 00:0c:29:87:7f:87 -j MARK --set-mark 0x1# 192.168.0.72 从库[root@C7-02 ~]# iptables -t mangle -I PREROUTING -d 192.168.0.100 -p tcp -m tcp --dport 3306 -m mac ! --mac-source 00:0c:29:49:f4:0b -j MARK --set-mark 0x2
其中,192.168.0.100 为Write-VIP,00:0c:29:87:7f:87 为 192.168.0.72 从库的网卡 MAC 地址,00:0c:29:49:f4:0b 为 192.168.0.71 主库的网卡 MAC 地址。
执行完上面的操作后,为了能永久保存 iptables 规则,需要将 iptables 规则保存到文件中,并开启开机自动加载:
# 保存 iptables 规则iptables-save > /etc/iptables-script# 开机自动加载 iptables 规则echo '/usr/sbin/iptables-restore /etc/iptables-script' >> /etc/rc.d/rc.local
- Keepalived 配置。
192.168.0.71 Keepalived 初始状态为 Write-VIP Master,Read-VIP Backup,这样设计的目的是同时让 192.168.0.71 和 192.168.0.72 两台机器都负责 VIP 的调度,分担压力。
另外为了方便管理,这里采用了子配置文件的方式,将两个 VIP 的配置文件单独存放。
Keepalived 主配置文件内容如下:
[root@c7-01 ~]# cat /etc/keepalived/keepalived.confglobal_defs {router_id C7-01.wuvikr.top # keepalived 主机唯一标识,建议使用当前主机名vrrp_skip_check_adv_addr # 如果收到的通告报文和上一个报文是同一个路由,则跳过检查,默认为检查所有报文vrrp_garp_interval 0 # gratuitous ARP messages 报文发送延迟,0表示不延迟vrrp_gna_interval 0 # unsolicited NA messages (不请自来)消息发送延迟vrrp_mcast_group4 224.0.0.20 # 指定组播IP地址范围:224.0.0.0到239.255.255.255,默认值:224.0.0.18}include /etc/keepalived/conf.d/*.conf
Write-VIP 子配置文件内容如下:
[root@c7-01 ~]# cat /etc/keepalived/conf.d/mysql_write.confvrrp_script mysql_check { # 配置检测脚本script "/etc/keepalived/conf.d/mysql_check.sh" # 检测脚本路径interval 1 # 检测频率weight -30 # 权重减少值fall 3 # 连续检测失败3次后才算是真的失败rise 2 # 连续检测成功2次后才算是真的成功timeout 2 # 超时时间}vrrp_instance VIP_WRITE {state MASTER # 当前节点在此虚拟路由器上的初始状态,状态为MASTER或者BACKUPinterface eth0 # 绑定当前虚拟路由器使用的物理接口,可以不和VIP在同一个网卡virtual_router_id 11 # 每个虚拟路由器惟一标识,范围:0-255,同属一个虚拟路由器的多个 keepalived 节点此值必须相同priority 100 # 当前物理节点在此虚拟路由器的优先级,范围:1-254advert_int 1 # vrrp通告的时间间隔,默认1sauthentication { # 认证机制auth_type PASS # 认证类型,可以是AH或PASS,AH为IPSEC认证(不推荐),PASS为简单密码(建议使用)auth_pass 111111 # 预共享密钥,即相互认证密码}virtual_ipaddress { # 虚拟路由IP192.168.0.100 # 指定VIP,不指定网卡,默认eth0,注意:不指定/prefix,默认为32}track_script {mysql_check # 调用前面定义的脚本}# 使用单播配置unicast_src_ip 192.168.0.71 # 本机IPunicast_peer{192.168.0.72 # 指向其他Keepalived主机IP}notify_backup "/etc/keepalived/conf.d/mysql_down.sh" # 配置触发脚本}
因为 Write-VIP 只会将请求转发到本机的 MySQL 服务,这里就没有使用 LVS 来进行转发了,简单的采用 VIP 配合检测脚本即可实现需求,检测脚本/etc/keepalived/conf.d/mysql_check.sh内容如下:
[root@c7-01 ~]# cat /etc/keepalived/conf.d/mysql_check.sh#!/bin/bash#mysqladmin -uroot -p744123 pingkillall -0 mysqld
另外,当主库宕机时,Write-VIP 会漂移到从库,此时会触发/etc/keepalived/conf.d/mysql_down.sh脚本文件来停止复制,重置 MySQL 实例的主从状态,该脚本内容如下:
#!/bin/bash. /home/mysql/.bashrcuser=rootpassword=744123log=/home/mysql/stop_slave.logecho "date '+%T %F'" >> ${log}mysql -u${user} -p${password} -e "set global read_only=OFF;stop slave;reset master;reset slave all;" >> ${log}/bin/sed -i 's#read-only#\#read-only#' /etc/my.cnf
Read-VIP 子配置文件内容如下:
[root@c7-01 ~]# cat /etc/keepalived/conf.d/mysql_read.confvrrp_instance VIP_READ {state MASTER # 当前节点在此虚拟路由器上的初始状态,状态为MASTER或者BACKUPinterface eth0 # 绑定当前虚拟路由器使用的物理接口,可以不和VIP在同一个网卡virtual_router_id 22 # 每个虚拟路由器惟一标识,范围:0-255,同属一个虚拟路由器的多个 keepalived 节点此值必须相同priority 120 # 当前物理节点在此虚拟路由器的优先级,范围:1-254advert_int 1 # vrrp通告的时间间隔,默认1sauthentication { # 认证机制auth_type PASS # 认证类型,可以是AH或PASS,AH为IPSEC认证(不推荐),PASS为简单密码(建议使用)auth_pass 222222 # 预共享密钥,即相互认证密码}virtual_ipaddress { # 虚拟路由IP192.168.0.200 # 指定VIP,不指定网卡,默认eth0,注意:不指定/prefix,默认为32}# 使用单播配置unicast_src_ip 192.168.0.71 # 本机IPunicast_peer{192.168.0.72 # 指向其他Keepalived主机IP}}virtual_server fwmark 1 { # 配置 fwmark 转发delay_loop 3 # 检查后端服务器的时间间隔lb_algo rr # 定义调度方法,rr|wrr|lc|wlc|lblc|sh|mh|dh|fo|ovf|lblcr|sed|nqlb_kind DR # LVS类型,注意要大写, NAT|DR|TUNprotocol TCP # 指定服务协议,一般默认为TCP,TCP|UDP|SCTPreal_server 192.168.0.71 3306 { # RS的IP和PORTweight 1 # 调度权重TCP_CHECK {nb_get_retry 3 # 重新连接次数delay_before_retry 3 # 重新连接间隔时间connect_port 3306 # 向当前RS的哪个PORT发起健康状态检测请求connect_timeout 3 # 客户端请求的超时时长, 等于haproxy的timeout server}}real_server 192.168.0.72 3306 {weight 1TCP_CHECK {nb_get_retry 3delay_before_retry 3connect_port 3306connect_timeout 3}}}
192.168.0.72 Keepalived 初始状态为 Write-VIP Backup,Read-VIP Master。其配置文件与 192.168.0.71 基本一致,主要区别有只是 state 和 priority 不同,另外因为 Iptables 的设置,fwmark 也不一样。
- Real Server 的网络配置
在每台机器上使用下面的脚本一键配置 Real Server,并加入开机自启动。
[root@c7-01 ~]# cat /etc/init.d/lvs_dr_rs.sh#!/bin/bashtrap "echo -e '\e[1;36mThank you for using, goodbye !\e[0m'" EXITvip=192.168.0.200mask=255.255.255.255#prefix=32dev=lo:1case $1 instart)# 禁用本地ARP请求,绑定回环地址。echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignoreecho 1 > /proc/sys/net/ipv4/conf/lo/arp_ignoreecho 2 > /proc/sys/net/ipv4/conf/all/arp_announceecho 2 > /proc/sys/net/ipv4/conf/lo/arp_announce# 在回环地址上绑定VIP,设置掩码,与Director服务器自身IP保持通信/sbin/ifconfig ${dev} ${vip} netmask ${mask} uproute add -host ${vip} dev ${dev}#ip addr add ${vip}/${prefix} dev $dev label ${dev}#ip route add ${vip} via 0.0.0.0 scope link src ${vip} dev ${dev}echo -e '\e[1;32mLVS-DR Real Server starts successfully.\n\e[0m';;stop)/sbin/ifconfig $dev down#ip addr del ${vip}/${prefix} dev ${dev}echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignoreecho 0 > /proc/sys/net/ipv4/conf/lo/arp_ignoreecho 0 > /proc/sys/net/ipv4/conf/all/arp_announceecho 0 > /proc/sys/net/ipv4/conf/lo/arp_announceecho -e '\e[1;31mLVS-DR Real Server stopped.\n\e[0m';;*)echo "Usage: $(basename $0) start|stop"exit 1;;esac# 添加执行权限[root@c7-01 ~]# chmod +x /etc/init.d/lvs_dr_rs.sh# 开机自启[root@c7-01 ~]# echo "/etc/init.d/lvs_dr_rs.sh start" >> /etc/rc.d/rc.local# 执行脚本[root@c7-01 ~]# /etc/init.d/lvs_dr_rs.sh start
执行完上面的脚本后会在本地 lo 回环网卡上添加一个 192.168.0.200/32 的虚拟 VIP ,用于 LVS DR 模型的 Director 转发。
重启 Keepalived 服务
[root@c7-01 ~]# systemctl restart keepalived.service[root@c7-02 ~]# systemctl restart keepalived.service
1.3 功能测试
1.3.1 停止 MySQL 服务,查看 vip 漂移情况
1.3.2 关闭服务器,查看 MySQL 服务情况
2. Keepalived + LVS (Keepalived 和 MySQL 分别部署)
2.1 架构设计

Keepalived + LVS 实现 MySQL 的读写分离和高可用。Keepalived 这里主要用作后端服务器的健康状态检查,提供VIP,以及故障转移;LVS 提供读负载均衡功能。
整体架构设计原理如下:后端服务器 MySQL-Master 和 MySQL-Slave 为主从复制的主库和从库。
- 利用 Keepalived-01 提供 Write-VIP(10.0.0.100),负责数据写入,Keepalived-02 提供 Read-VIP(10.0.0.200) 负责读取数据,实现读写分离。
- 当服务器 MySQL-Master 和 MySQL-Slave 都正常工作时,LVS 通过 Write-VIP 将写请求转发到服务器 MySQL-Master,通过 Read-VIP 将读请求转发给 MySQL-Master 和 MySQL-Slave,实现读负载均衡。
- 当服务器 MySQL-Master 发生异常时,Write-VIP 漂移到服务器 Keepalived-02 上,并使用脚本将 MySQL-Slave 提升为 Master 。
- 当服务器 MySQL-Slave 发生异常时,Read-VIP 自动将 MySQL-Slave 剔除,其他不变。
2.2 服务部署
2.2.1 安装 lvs 管理工具 和 MySQL 客户端
yum -y install ipvsadm mysql
2.2.2 下载安装 Keepalived
```bash安装依赖包
[root@C7-01 ~]# yum install -y gcc openssl-devel libnl3-devel net-snmp-devel
解压
[root@C7-01 ~]# tar xvf keepalived-2.2.2.tar.gz -C /usr/local/src
编译安装
[root@C7-01 ~]# cd /usr/local/src/keepalived-2.2.2/ [root@C7-01 ~]# ./configure —prefix=/opt/app/keepalived [root@C7-01 ~]# make && make install
查看版本
[root@C7-01 ~]# /opt/app/keepalived/sbin/keepalived -v Keepalived v2.2.2 (03/05,2021)
Copyright(C) 2001-2021 Alexandre Cassen, acassen@gmail.com
Built with kernel headers for Linux 3.10.0 Running on Linux 3.10.0-1160.el7.x86_64 #1 SMP Mon Oct 19 16:18:59 UTC 2020 Distro: CentOS Linux 7 (Core)
configure options: —prefix=/opt/app/keepalived
Config options: LVS VRRP VRRP_AUTH VRRP_VMAC OLD_CHKSUM_COMPAT INIT=systemd
System options: VSYSLOG LIBNL3 RTA_ENCAP RTA_EXPIRES RTA_PREF FRA_SUPPRESS_PREFIXLEN FRA_TUN_ID RTAX_CC_ALGO RTAX_QUICKACK RTA_VIA IFA_FLAGS NET_LINUX_IF_H_COLLISION LIBIPTC_LINUX_NET_IF_H_COLLISION LIBIPVS_NETLINK IFLA_LINK_NETNSID GLOB_BRACE GLOB_ALTDIRFUNC INET6_ADDR_GEN_MODE SO_MARK
安装完会自动生成 service 文件
[root@C7-01 ~]# cat /lib/systemd/system/keepalived.service [Unit] Description=LVS and VRRP High Availability Monitor After=network-online.target syslog.target Wants=network-online.target
[Service] Type=forking PIDFile=/run/keepalived.pid KillMode=process EnvironmentFile=-/usr/local/keepalived/etc/sysconfig/keepalived ExecStart=/usr/local/keepalived/sbin/keepalived $KEEPALIVED_OPTIONS ExecReload=/bin/kill -HUP $MAINPID
[Install] WantedBy=multi-user.target
<a name="aCFC6"></a>### 2.2.3 Keepalived-01 配置1. 创建配置文件目录:`mkdir /etc/keepalived`。1. 创建主配置文件:`vim /etc/keepalived/keepalived.conf`。```bashglobal_defs {router_id C7-01.wuvikr.top # keepalived 主机唯一标识,建议使用当前主机名vrrp_skip_check_adv_addr # 如果收到的通告报文和上一个报文是同一个路由,则跳过检查,默认为检查所有报文vrrp_garp_interval 0 # gratuitous ARP messages 报文发送延迟,0表示不延迟vrrp_gna_interval 0 # unsolicited NA messages (不请自来)消息发送延迟vrrp_mcast_group4 224.0.0.20 # 指定组播IP地址范围:224.0.0.0到239.255.255.255,默认值:224.0.0.18}include /etc/keepalived/mysql/*.conf
创建 mysql_write 子配置文件:
vim /etc/keepalived/mysql/mysql_write.conf。 ```bash vrrp_instance VIP_WRITE { state BACKUP # 当前节点在此虚拟路由器上的初始状态,状态为MASTER或者BACKUP interface eth0 # 绑定当前虚拟路由器使用的物理接口,可以不和VIP在同一个网卡 virtual_router_id 11 # 每个虚拟路由器惟一标识,范围:0-255,同属一个虚拟路由器的多个 keepalived 节点此值必须相同 priority 120 # 当前物理节点在此虚拟路由器的优先级,范围:1-254 advert_int 1 # vrrp通告的时间间隔,默认1s nopreempt # 非抢占式 authentication { # 认证机制auth_type PASS # 认证类型,可以是AH或PASS,AH为IPSEC认证(不推荐),PASS为简单密码(建议使用)auth_pass 111111 # 预共享密钥,即相互认证密码
} virtual_ipaddress { # 虚拟路由IP
10.0.0.100 # 指定VIP,不指定网卡,默认eth0,注意:不指定/prefix,默认为32
}
使用单播配置
unicast_src_ip 10.0.0.21 # 本机IP unicast_peer {
10.0.0.22 # 指向其他Keepalived主机IP
}
当 MySQL 主库宕机时,将从库提升为主库
notify_master “/etc/keepalived/conf.d/remove_slave.sh” }
virtual_server 10.0.0.100 3306 { # 虚拟路由 IP 和 PORT delay_loop 3 # 检查后端服务器的时间间隔 lb_algo rr # 定义调度方法,rr|wrr|lc|wlc|lblc|sh|mh|dh|fo|ovf|lblcr|sed|nq lb_kind DR # LVS类型,注意要大写, NAT|DR|TUN protocol TCP # 指定服务协议,一般默认为TCP,TCP|UDP|SCTP
real_server 10.0.0.31 3306 { # RS的IP和PORTweight 1 # 调度权重notify_down "/etc/keepalived/conf.d/mysql_down.sh" # RS下线触发脚本TCP_CHECK {nb_get_retry 3 # 重新连接次数delay_before_retry 3 # 重新连接间隔时间connect_port 3306 # 向当前RS的哪个PORT发起健康状态检测请求connect_timeout 3 # 客户端请求的超时时长, 等于haproxy的timeout server}}
}
4. 创建 mysql_read 子配置文件:`vim /etc/keepalived/mysql/mysql_read.conf`。```bashvrrp_instance VIP_READ {state BACKUP # 当前节点在此虚拟路由器上的初始状态,状态为MASTER或者BACKUPinterface eth0 # 绑定当前虚拟路由器使用的物理接口,可以不和VIP在同一个网卡virtual_router_id 22 # 每个虚拟路由器惟一标识,范围:0-255,同属一个虚拟路由器的多个 keepalived 节点此值必须相同priority 100 # 当前物理节点在此虚拟路由器的优先级,范围:1-254advert_int 1 # vrrp通告的时间间隔,默认1sauthentication { # 认证机制auth_type PASS # 认证类型,可以是AH或PASS,AH为IPSEC认证(不推荐),PASS为简单密码(建议使用)auth_pass 222222 # 预共享密钥,即相互认证密码}virtual_ipaddress { # 虚拟路由IP10.0.0.200 # 指定VIP,不指定网卡,默认eth0,注意:不指定/prefix,默认为32}# 使用单播配置unicast_src_ip 10.0.0.21 # 本机IPunicast_peer{10.0.0.22 # 指向其他Keepalived主机IP}}virtual_server 10.0.0.200 3306 { # 虚拟路由 IP 和 PORTdelay_loop 3 # 检查后端服务器的时间间隔lb_algo rr # 定义调度方法,rr|wrr|lc|wlc|lblc|sh|mh|dh|fo|ovf|lblcr|sed|nqlb_kind DR # LVS类型,注意要大写, NAT|DR|TUNprotocol TCP # 指定服务协议,一般默认为TCP,TCP|UDP|SCTPreal_server 10.0.0.31 3306 { # RS的IP和PORTweight 1 # 调度权重TCP_CHECK {nb_get_retry 3 # 重新连接次数delay_before_retry 3 # 重新连接间隔时间connect_port 3306 # 向当前RS的哪个PORT发起健康状态检测请求connect_timeout 3 # 客户端请求的超时时长, 等于haproxy的timeout server}}real_server 10.0.0.32 3306 {weight 1TCP_CHECK {nb_get_retry 3delay_before_retry 3connect_port 3306connect_timeout 3}}}
2.2.4 Keepalived-02 配置
- 创建配置文件目录:
mkdir /etc/keepalived。 - 创建主配置文件:
vim /etc/keepalived/keepalived.conf。 ```bash global_defs { router_id C7-01.wuvikr.top # keepalived 主机唯一标识,建议使用当前主机名 vrrp_skip_check_adv_addr # 如果收到的通告报文和上一个报文是同一个路由,则跳过检查,默认为检查所有报文 vrrp_garp_interval 0 # gratuitous ARP messages 报文发送延迟,0表示不延迟 vrrp_gna_interval 0 # unsolicited NA messages (不请自来)消息发送延迟 vrrp_mcast_group4 224.0.0.20 # 指定组播IP地址范围:224.0.0.0到239.255.255.255,默认值:224.0.0.18 }
include /etc/keepalived/mysql/*.conf
3. 创建 mysql_write 子配置文件:`vim /etc/keepalived/mysql/mysql_write.conf`。```bashvrrp_instance VIP_WRITE {state BACKUP # 当前节点在此虚拟路由器上的初始状态,状态为MASTER或者BACKUPinterface eth0 # 绑定当前虚拟路由器使用的物理接口,可以不和VIP在同一个网卡virtual_router_id 11 # 每个虚拟路由器惟一标识,范围:0-255,同属一个虚拟路由器的多个 keepalived 节点此值必须相同priority 100 # 当前物理节点在此虚拟路由器的优先级,范围:1-254nopreempt # 非抢占式advert_int 1 # vrrp通告的时间间隔,默认1sauthentication { # 认证机制auth_type PASS # 认证类型,可以是AH或PASS,AH为IPSEC认证(不推荐),PASS为简单密码(建议使用)auth_pass 111111 # 预共享密钥,即相互认证密码}virtual_ipaddress { # 虚拟路由IP10.0.0.100 # 指定VIP,不指定网卡,默认eth0,注意:不指定/prefix,默认为32}# 使用单播配置unicast_src_ip 10.0.0.22 # 本机IPunicast_peer {10.0.0.21 # 指向其他Keepalived主机IP}# 当 MySQL 主库宕机时,将从库提升为主库notify_master "/etc/keepalived/conf.d/remove_slave.sh"}virtual_server 10.0.0.100 3306 { # 虚拟路由 IP 和 PORTdelay_loop 3 # 检查后端服务器的时间间隔lb_algo rr # 定义调度方法,rr|wrr|lc|wlc|lblc|sh|mh|dh|fo|ovf|lblcr|sed|nqlb_kind DR # LVS类型,注意要大写, NAT|DR|TUNprotocol TCP # 指定服务协议,一般默认为TCP,TCP|UDP|SCTPreal_server 10.0.0.32 3306 { # RS的IP和PORTweight 1 # 调度权重notify_down "/etc/keepalived/conf.d/mysql_down.sh" # RS下线触发脚本TCP_CHECK {nb_get_retry 3 # 重新连接次数delay_before_retry 3 # 重新连接间隔时间connect_port 3306 # 向当前RS的哪个PORT发起健康状态检测请求connect_timeout 3 # 客户端请求的超时时长, 等于haproxy的timeout server}}}
- 创建 mysql_read 子配置文件:
vim /etc/keepalived/mysql/mysql_read.conf。 ```bash vrrp_instance VIP_READ { state MASTER # 当前节点在此虚拟路由器上的初始状态,状态为MASTER或者BACKUP interface eth0 # 绑定当前虚拟路由器使用的物理接口,可以不和VIP在同一个网卡 virtual_router_id 22 # 每个虚拟路由器惟一标识,范围:0-255,同属一个虚拟路由器的多个 keepalived 节点此值必须相同 priority 120 # 当前物理节点在此虚拟路由器的优先级,范围:1-254 advert_int 1 # vrrp通告的时间间隔,默认1s authentication { # 认证机制
} virtual_ipaddress { # 虚拟路由IPauth_type PASS # 认证类型,可以是AH或PASS,AH为IPSEC认证(不推荐),PASS为简单密码(建议使用)auth_pass 222222 # 预共享密钥,即相互认证密码
}10.0.0.200 # 指定VIP,不指定网卡,默认eth0,注意:不指定/prefix,默认为32
使用单播配置
unicast_src_ip 10.0.0.22 # 本机IP unicast_peer{
} }10.0.0.21 # 指向其他Keepalived主机IP
virtual_server 10.0.0.200 3306 { # 虚拟路由 IP 和 PORT delay_loop 3 # 检查后端服务器的时间间隔 lb_algo rr # 定义调度方法,rr|wrr|lc|wlc|lblc|sh|mh|dh|fo|ovf|lblcr|sed|nq lb_kind DR # LVS类型,注意要大写, NAT|DR|TUN protocol TCP # 指定服务协议,一般默认为TCP,TCP|UDP|SCTP
real_server 10.0.0.31 3306 { # RS的IP和PORTweight 1 # 调度权重TCP_CHECK {nb_get_retry 3 # 重新连接次数delay_before_retry 3 # 重新连接间隔时间connect_port 3306 # 向当前RS的哪个PORT发起健康状态检测请求connect_timeout 3 # 客户端请求的超时时长, 等于haproxy的timeout server}}real_server 10.0.0.32 3306 {weight 1TCP_CHECK {nb_get_retry 3delay_before_retry 3connect_port 3306connect_timeout 3}}
}
<a name="gQQNd"></a>### 2.2.5 配置说明两台 Keepalived 机器的配置区别主要有以下几点:- 角色不同:Keepalived-01 为 Write-VIP 的 MASTER,Keepalived-02 为 Read-VIP 的 MASTER。- 模式不同:Write-VIP 为非抢占式,Read-VIP 为抢占式。- 单播配置:需要指定单播地址。另外,对于 Read-VIP(10.0.0.200),两台机器的配置基本是一致的。而对于 Write-VIP(10.0.0.100),则不同。<br />正常情况下,Keepalived-01 为 MASTER 角色,当请求访问 10.0.0.100 时,都是由 Keepalive-01 调度到 MySQL-Master(10.0.0.31)进行写入操作。<br />当 MySQL-Master 服务宕机时,Keepalived-01会调用`/etc/keepalived/mysql/mysql_down.sh`脚本,将自身的 keepalived.service 进程杀死,使 Keepalived-02 成为新的 Write-VIP MASTER 角色,这时访问 10.0.0.100 ,则是由 Keepalived-02 机器调度到 MySQL-Slave(10.0.0.32)进行写入操作,当然在 Keepalived-02 成为新的 Master 时,会执行`/etc/keepalived/mysql/remove_slave.sh`脚本,这个脚本会将原本的 MySQL-Slave(10.0.0.32)提升为新的 MySQL-Master。<br />当 MySQL-Slave 服务宕机时,并不影响 Write-VIP(10.0.0.100)。<br />`/etc/keepalived/mysql/mysql_down.sh`脚本内容如下:```bash#!/bin/bash/usr/bin/systemctl stop keepalived.service
/etc/keepalived/mysql/remove_slave.sh脚本内容如下:
#!/bin/bashUSER=rootPASSWORD=123.comHOST=10.0.0.32LOG=/var/log/stop_slave.logDATE=`date '+%F %T'`echo "time : ${DATE}" >> ${LOG}/usr/bin/mysql -u${USER} -p${PASSWORD} -h${HOST} -e "set global read_only=OFF;stop slave;reset master;reset slave all;" >> ${LOG}
注意:
/etc/keepalived/mysql/remove_slave.sh脚本是由新的 keepalived MASTER 来执行的,因此两台 Keepalived 的脚本内容对应的 MySQL-Slave 机器并不一样。- 脚本需要加上执行权限。
2.2.6 启动 Keepalived 服务
由于 Write-VIP 采用了非抢占式模式,为了让 Keepalived-01 成为 MASTER,必须先启动 Keepalived-01。
启动成功后,查看虚拟 ip 地址: ```bash [root@keepalived-01 ~]# ip a 1: lo:[root@keepalived-01 ~]# systemctl start keepalived.service[root@keepalived-02 ~]# systemctl start keepalived.service
mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope hostvalid_lft forever preferred_lft forever
2: eth0:valid_lft forever preferred_lft forever
mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:0c:29:40:93:bd brd ff:ff:ff:ff:ff:ff inet 10.0.0.21/24 brd 10.0.0.255 scope global noprefixroute eth0
inet 10.0.0.100/32 scope global eth0valid_lft forever preferred_lft forever
inet6 fe80::e988:85bf:3ffc:96d7/64 scope link tentative noprefixroute dadfailedvalid_lft forever preferred_lft forever
inet6 fe80::32d4:4c1:856d:4217/64 scope link tentative noprefixroute dadfailedvalid_lft forever preferred_lft forever
inet6 fe80::cdf8:ac2a:1900:51e4/64 scope link tentative noprefixroute dadfailedvalid_lft forever preferred_lft forever
valid_lft forever preferred_lft forever
[root@keepalived-02 ~]# ip a
1: lo:
查看 LVS 后端服务:```bash[root@keepalived-01 ~]# ipvsadm -LIP Virtual Server version 1.2.1 (size=4096)Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port Forward Weight ActiveConn InActConnTCP 10.0.0.200:mysql rr-> 10.0.0.31:mysql Route 1 0 0-> 10.0.0.32:mysql Route 1 0 0TCP keepalived-01:mysql rr-> 10.0.0.31:mysql Route 1 0 0[root@keepalived-02 ~]# ipvsadm -LIP Virtual Server version 1.2.1 (size=4096)Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port Forward Weight ActiveConn InActConnTCP keepalived-02:mysql rr-> 10.0.0.31:mysql Route 1 0 0-> 10.0.0.32:mysql Route 1 0 0TCP 10.0.0.100:mysql rr-> 10.0.0.32:mysql Route 1 0 0
MySQL Real Server 网络配置
在每台 MySQL 机器上使用下面的脚本一键配置 Real Server,并加入开机自启动。
[root@c7-01 ~]# cat /etc/init.d/lvs_dr_rs.sh#!/bin/bashtrap "echo -e '\e[1;36mThank you for using, goodbye !\e[0m'" EXITwrite_vip=10.0.0.100read_vip=10.0.0.200mask=255.255.255.255dev=lo:1case $1 instart)# 禁用本地ARP请求,绑定回环地址。echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignoreecho 1 > /proc/sys/net/ipv4/conf/lo/arp_ignoreecho 2 > /proc/sys/net/ipv4/conf/all/arp_announceecho 2 > /proc/sys/net/ipv4/conf/lo/arp_announce# 在回环地址上绑定VIP,设置掩码,与Director服务器自身IP保持通信/sbin/ifconfig lo:1 ${write_vip} netmask ${mask} up/sbin/ifconfig lo:2 ${read_vip} netmask ${mask} uproute add -host ${write_vip} dev lo:1route add -host ${read_vip} dev lo:2echo -e '\e[1;32mLVS-DR Real Server starts successfully.\n\e[0m';;stop)/sbin/ifconfig lo:1 down/sbin/ifconfig lo:2 downroute del ${write_vip} >/dev/null 2>$1route del ${read_vip} >/dev/null 2>$1echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignoreecho 0 > /proc/sys/net/ipv4/conf/lo/arp_ignoreecho 0 > /proc/sys/net/ipv4/conf/all/arp_announceecho 0 > /proc/sys/net/ipv4/conf/lo/arp_announceecho -e '\e[1;31mLVS-DR Real Server stopped.\n\e[0m';;*)echo "Usage: $(basename $0) start|stop"exit 1;;esac# 添加执行权限[root@c7-01 ~]# chmod +x /etc/init.d/lvs_dr_rs.sh# 开机自启[root@c7-01 ~]# echo "/etc/init.d/lvs_dr_rs.sh start" >> /etc/rc.d/rc.local# 执行脚本[root@c7-01 ~]# /etc/init.d/lvs_dr_rs.sh start
执行完上面的脚本后会在本地 lo 回环网卡上添加上 10.0.0.100/32 和 10.0.0.200/32 的虚拟 VIP ,用于 LVS DR 模型的 Director 转发。
