下面要介绍的是如何通过Keepalived+LVS方式来是实现MySQL的高可用性,利用LVS实现MySQL的读写负载均衡,Keepalived避免节点出现单点故障。
此测试是在博文:mysql+keepalived双主高可用配置 的基础上进行测试的,要先将mysql主主同步环境搭建好,然后进行下面的测试
测试环境 LVS_Master: 192.168.220.72 centos7.2 LVS_Backup: 192.168.220.73 centos7.2 MySQL1 Real Server: 192.168.220.70 centos6.9 MySQL2 Real Server: 192.168.220.71 centos6.9 VIP: 192.168.220.74 采用lvs-dr模式,rr调度算法
防火墙设置:可以设置严格条件(注意多播地址),这里4台机器每台机器设置源ip为其他三台机器的都放行。lvs机器需将客户机的ip放行,允许访问
关于lvs和keepalived相关的介绍,需看前面的博文,此处只列出具体的配置,以及注意的地方
在:192.168.220.72和192.168.220.73机器上面安装好keepalived软件,此处使用rpm包安装,此处使用keepalived可抢占式配置,也可以将其都配置为backup非抢占式配置
[root@rtb-72 /etc/keepalived]#cat keepalived.conf global_defs { notification_email { root@localhost } notification_email_from keepalived@localhost smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id lvs-mysql vrrp_mcast_group4 224.0.100.0 } vrrp_script chk_down { script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0" #down文件在,返回1。不在返回0 interval 1 #1秒钟调用一次,当上面的脚本执行返回1的时候会执行下面的操作 weight -20 #当down文件存在,这个vs的节点的优先级-20,如果这个节点的优先级低于其他的vs主机, #这个主机就会处于维护模式,ip被其他优先级高的主机夺走。 } vrrp_instance rtb_mysql { state MASTER interface bond0 virtual_router_id 20 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 2345 } virtual_ipaddress { 192.168.220.74/24 dev bond0 } track_script { chk_down } } virtual_server 192.168.220.74 3306 { delay_loop 3 lb_algo rr lb_kind DR protocol TCP real_server 192.168.220.70 3306 { weight 1 TCP_CHECK { connect_timeout 1 nb_get_retry 3 delay_before_retry 1 connect_port 3306 } } real_server 192.168.220.71 3306 { weight 1 TCP_CHECK { connect_timeout 1 nb_get_retry 3 delay_before_retry 1 connect_port 3306 } } } #启动keepalived [root@rtb-72 ~]#systemctl restart keepalived [root@rtb-72 ~]#systemctl is-enabled keepalived disabled [root@rtb-72 ~]#systemctl enable keepalived Created symlink from /etc/systemd/system/multi-user.target.wants/keepalived.service to /usr/lib/systemd/system/keepalived.service.
–
[root@rtb-73 /etc/keepalived]#cat keepalived.conf global_defs { notification_email { root@localhost } notification_email_from keepalived@localhost smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id lvs-mysql vrrp_mcast_group4 224.0.100.0 } vrrp_script chk_down { script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0" #down文件在,返回1。不在返回0 interval 1 #1秒钟调用一次,当上面的脚本执行返回1的时候会执行下面的操作 weight -20 #当down文件存在,这个vs的节点的优先级-20,如果这个节点的优先级低于其他的vs主机, #这个主机就会处于维护模式,ip被其他优先级高的主机夺走。 } vrrp_instance rtb_mysql { state BACKUP interface bond0 virtual_router_id 20 priority 90 advert_int 1 authentication { auth_type PASS auth_pass 2345 } virtual_ipaddress { 192.168.220.74/24 dev bond0 } track_script { chk_down } } virtual_server 192.168.220.74 3306 { delay_loop 3 lb_algo rr lb_kind DR protocol TCP real_server 192.168.220.70 3306 { weight 1 TCP_CHECK { connect_timeout 1 nb_get_retry 3 delay_before_retry 1 connect_port 3306 } } real_server 192.168.220.71 3306 { weight 1 TCP_CHECK { connect_timeout 1 nb_get_retry 3 delay_before_retry 1 connect_port 3306 } } } #启动keepalived [root@rtb-73 ~]#systemctl restart keepalived [root@rtb-73 ~]#systemctl is-enabled keepalived disabled [root@rtb-73 ~]#systemctl enable keepalived Created symlink from /etc/systemd/system/multi-user.target.wants/keepalived.service to /usr/lib/systemd/system/keepalived.service.
下面是后端rs配置文件,两个rs配置相同
[root@RTB-70 /data/lvs_dr]#cat lvs_dr_slave.sh #!/bin/bash # vip=192.168.220.74 mask='255.255.255.255' gw_ip="192.168.220.1" case $1 in start) echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce ifconfig lo:0 $vip netmask $mask broadcast $vip up route add -host $vip dev lo:0 #vip必须从lo网卡进来,从lo网卡出去 route del default route add default gw $gw_ip ;; stop) ifconfig lo:0 down echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce ;; *) echo "Usage $(basename $0) start|stop" exit 1 ;; esac
先启动后端的rs服务,lo网卡配置上vip
[root@RTB-70 /data/lvs_dr]#echo "bash /data/lvs_dr/lvs_dr_slave.sh" >> /etc/rc.d/rc.local #加入开机启动 [root@RTB-70 /data/lvs_dr]#bash lvs_dr_slave.sh start [root@RTB-70 /data/lvs_dr]#ifconfig eth0 Link encap:Ethernet HWaddr 00:50:56:A9:FE:EC inet addr:192.168.220.70 Bcast:192.168.220.255 Mask:255.255.255.0 lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 lo:0 Link encap:Local Loopback inet addr:192.168.220.74 Mask:255.255.255.255 UP LOOPBACK RUNNING MTU:65536 Metric:1 [root@RTB-71 /data/lvs_dr]#echo "bash /data/lvs_dr/lvs_dr_slave.sh" >> /etc/rc.d/rc.local [root@RTB-71 /data/lvs_dr]#bash lvs_dr_slave.sh start [root@RTB-71 /data/lvs_dr]#ifconfig eth0 Link encap:Ethernet HWaddr 00:50:56:A9:4A:AE inet addr:192.168.220.71 Bcast:192.168.220.255 Mask:255.255.255.0 lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 lo:0 Link encap:Local Loopback inet addr:192.168.220.74 Mask:255.255.255.255 UP LOOPBACK RUNNING MTU:65536 Metric:1
经过测试,调度机宕机一台,可以正常访问,可以正常切换
经过测试,后端mysql宕机一台,可以正常访问,不影响业务
–
关于keepalived的实时漂移,可以通过/var/log/message文件实时查看过程,这里不再赘述,可看前面博文
lvs的调度以及连接数可以通过下面的命令查看
[root@rtb-72 ~]#ipvsadm -Ln IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 192.168.220.74:3306 rr -> 192.168.220.70:3306 Route 1 0 0 -> 192.168.220.71:3306 Route 1 1 0
如果其他网段需要连接此网段的lvs上面的mysql,需要授权其他网段可以访问。
如果其他网段访问此网段lvs上的mysql,linux主机作为网关,注意设置内核参数,不然ip和mac地址对不上的包会被丢弃
[root@localhost ~]#echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter [root@localhost ~]#echo 0 > /proc/sys/net/ipv4/conf/default/rp_filter [root@localhost ~]#echo 0 > /proc/sys/net/ipv4/conf/eth0/rp_filter [root@localhost ~]#echo 0 > /proc/sys/net/ipv4/conf/eth1/rp_filter [root@localhost ~]#echo 0 > /proc/sys/net/ipv4/conf/lo/rp_filter #0 就是对进来的包完全不作检查,这样有被dos 攻击的风险。 #1 就是严格检查,只要不是这个interface 的包,就不返回。 #2 就是不太严格,只要本机配置了这个ip ,还是可以返回的。 #对于lvs 来说,用2 也是可以的。
如果其他网段主机访问此网段的lvs上的mysql,默认网段不能出网,可能涉及到默认网关问题
可在keepalived配置文件中调用脚本来发送邮件通知或者处理其他事情
注意lvs以每个会话作为单独的调度,一个终端进入mysql后,在这个终端会话会全部调度到其中一台机器,所有操作都会在这台机器完成,所有插入语句id都是奇数。当又有一个终端会话的时候,全部调度到另外一台机器,所有操作都在这台机器完成,所有插入语句id都是偶数
当某台机器有vip的时候,不能从这台机器连接vip
未涉及到的地方,可查看前面博文或参考资料
参考文档:http://www.cnblogs.com/kevingrace/p/5570500.html
–
–
–
评论前必须登录!
注册