MySQL复制能够保证数据的冗余的同时可以做读写分离来分担系统压力,如果是主主复制还可以很好的避免主节点的单点故障。然而MySQL主主复制存在一些问题无法满足我们的实际需要:未提供统一访问入口来实现负载均衡,如果其中master宕掉的话需要手动切换到另外一个master,而不能自动进行切换。前面介绍了Mysql+Keepalived双主热备高可用方案记录,那篇文档里没有使用到LVS(实现负载均衡),而下面要介绍的就是如何通过Keepalived+LVS方式来是实现MySQL的高可用性,利用LVS实现MySQL的读写负载均衡,Keepalived避免节点出现单点故障,同时解决以上问题。

Keepalived是一个基于VRRP(虚拟路由冗余协议)可用来实现服务高可用性的软件方案,避免出现单点故障。Keepalived一般用来实现轻量级高可用性,且不需要共享存储,一般用于两个节点之间,常见有LVS+Keepalived、Nginx+Keepalived组合。

LVS(Linux Virtual Server)是一个高可用性虚拟的服务器集群系统。本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一。LVS主要用于多服务器的负载均衡,作用于网络层。LVS构建的服务器集群系统中,前端的负载均衡层被称为Director Server;后端提供服务的服务器组层被称为Real Server。通过下图可以大致了解LVS的基础架构。

LVS有三种工作模式,分别是:
1)DR(Direct Routing 直接路由)模式。 DR可以支持相当多的Real Server,但需要保证Director Server(分发器)虚拟网卡与物理网卡在同一网段,并且后端Real Server的vip要建立在本地回环口lo设备上,这样做是为了防止ip冲突;DR模式的好处是进站流量经过Director Server,出站流量不经过Director Server,减轻了Director Server的负载压力。
2)NAT(Network Address Translation 网络地址转换)模式。NAT扩展性有限,无法支持更多的Real Server,因为所有的请求包和应答包都需要Director Server进行解析再生,这样就很影响效率。
3)TUN(Tunneling IP隧道)模式。TUN模式能够支持更多的Real Server,但需要所有服务器支持IP隧道协议;

LVS负载均衡有10中调度算法,分别是:rr(轮询)、wrr(加权轮询)、lc、wlc、lblc、lblcr、dh、sh、sed、nq

以下详细记录了Mysql在主主同步环境下,利用LVS实现Mysql的读写负责均衡以及使用Keepalived心跳测试避免节点出现单点故障,实现故障转移的高可用。
1)高可用方案的环境准备

  1. LVS_Master 182.148.15.237
  2. LVS_Backup 182.148.15.236
  3. MySQL1 Real Server 182.148.15.233
  4. MySQL2 Real Server 182.148.15.238
  5. VIP 182.148.15.239
  6. OS: CentOS 6.8
  7.  
  8. 温馨提示:LVS_MasterLVS_Backup充当的是Director Server分发器的角色。
  9. 这里的LVS采用DR模式,即"进站流量经过Director Server分发器,出站流量不经过分发器",这就要求:
  10. 1LVS_MasterLVS_Backup需要将VIP绑定在其正常提供服务的网卡上(这里指182.48.115.0网段所在的网卡),netmask和对于网卡设备一致。
  11. 2)后端的Real Server要在本地回环口lo上绑定vip(防止ip冲突)

2)环境部署记录如下
a)Mysql主主热备环境部署
MySQL1 Real Server1和MySQL2 Real Server的主主热备可以参考Mysql+Keepalived双主热备高可用操作记录中对应部分。

b)Keepalived安装
LVS_Master和LVS_Backup的keepalived安装,也可以参考Mysql+Keepalived双主热备高可用操作记录中对应部分。

c)LVS安装

  1. LVS_MasterLVS_Backup两台机器安装步骤一样
  2.  
  3. 首先打开两台机器的ip_forward转发功能
  4. [root@LVS_Master ~]# echo "1" > /proc/sys/net/ipv4/ip_forward
  5.  
  6. 先下载ipvsadm
  7. [root@LVS_Master ~]# cd /usr/local/src/
  8. [root@LVS_Master src]# wget http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.26.tar.gz
  9.  
  10. 需要安装以下软件包
  11. [root@LVS_Master src]# yum install -y libnl* popt*
  12.  
  13. 查看是否加载lvs模块
  14. [root@LVS_Master src]# modprobe -l |grep ipvs
  15.  
  16. 解压安装
  17. [root@LVS_Master src]# ln -s /usr/src/kernels/2.6.32-431.5.1.el6.x86_64/ /usr/src/linux
  18. [root@LVS_Master src]# tar -zxvf ipvsadm-1.26.tar.gz
  19. [root@LVS_Master src]# cd ipvsadm-1.26
  20. [root@LVS_Master ipvsadm-1.26]# make && make install
  21.  
  22. LVS安装完成,查看当前LVS集群
  23. [root@LVS_Master ipvsadm-1.26]# ipvsadm -L -n
  24. IP Virtual Server version 1.2.1 (size=4096)
  25. Prot LocalAddress:Port Scheduler Flags
  26. -> RemoteAddress:Port Forward Weight ActiveConn InActConn

d)编写LVS启动脚本/etc/init.d/realserver

  1. 1)在MySQL1 Real Server服务器上的操作
  2. [root@MySQL1 ~]# vim /etc/init.d/realserver
  3. #!/bin/sh
  4. VIP=182.148.15.239
  5. . /etc/rc.d/init.d/functions
  6.  
  7. case "$1" in
  8. # 禁用本地的ARP请求、绑定本地回环地址
  9. start)
  10. /sbin/ifconfig lo down
  11. /sbin/ifconfig lo up
  12. echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
  13. echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
  14. echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
  15. echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
  16. /sbin/sysctl -p >/dev/null 2>&1
  17. /sbin/ifconfig lo:0 $VIP netmask 255.255.255.255 up #在回环地址上绑定VIP,设定掩码,与Direct Server(自身)上的IP保持通信
  18. /sbin/route add -host $VIP dev lo:0
  19. echo "LVS-DR real server starts successfully.\n"
  20. ;;
  21. stop)
  22. /sbin/ifconfig lo:0 down
  23. /sbin/route del $VIP >/dev/null 2>&1
  24. echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
  25. echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
  26. echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
  27. echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
  28. echo "LVS-DR real server stopped.\n"
  29. ;;
  30. status)
  31. isLoOn=`/sbin/ifconfig lo:0 | grep "$VIP"`
  32. isRoOn=`/bin/netstat -rn | grep "$VIP"`
  33. if [ "$isLoON" == "" -a "$isRoOn" == "" ]; then
  34. echo "LVS-DR real server has run yet."
  35. else
  36. echo "LVS-DR real server is running."
  37. fi
  38. exit 3
  39. ;;
  40. *)
  41. echo "Usage: $0 {start|stop|status}"
  42. exit 1
  43. esac
  44. exit 0
  45.  
  46. lvs脚本加入开机自启动
  47. [root@MySQL1 ~]# chmod +x /etc/init.d/realserver
  48. [root@MySQL1 ~]# echo "/etc/init.d/realserver" >> /etc/rc.d/rc.local
  49.  
  50. 启动LVS脚本
  51. [root@MySQL1 ~]# service realserver start
  52. LVS-DR real server starts successfully.\n
  53.  
  54. 查看MySQL1 Real Server服务器,发现VIP已经成功绑定到本地回环口lo上了
  55. [root@MySQL1 ~]# ifconfig
  56. eth0 Link encap:Ethernet HWaddr 52:54:00:D1:27:75
  57. inet addr:182.148.15.233 Bcast:182.148.15.255 Mask:255.255.255.224
  58. inet6 addr: fe80::5054:ff:fed1:2775/64 Scope:Link
  59. UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
  60. RX packets:598406 errors:0 dropped:0 overruns:0 frame:0
  61. TX packets:12050 errors:0 dropped:0 overruns:0 carrier:0
  62. collisions:0 txqueuelen:1000
  63. RX bytes:78790653 (75.1 MiB) TX bytes:33151764 (31.6 MiB)
  64.  
  65. lo Link encap:Local Loopback
  66. inet addr:127.0.0.1 Mask:255.0.0.0
  67. inet6 addr: ::1/128 Scope:Host
  68. UP LOOPBACK RUNNING MTU:65536 Metric:1
  69. RX packets:483 errors:0 dropped:0 overruns:0 frame:0
  70. TX packets:483 errors:0 dropped:0 overruns:0 carrier:0
  71. collisions:0 txqueuelen:0
  72. RX bytes:55807 (54.4 KiB) TX bytes:55807 (54.4 KiB)
  73.  
  74. lo:0 Link encap:Local Loopback
  75. inet addr:182.148.15.239 Mask:255.255.255.255
  76. UP LOOPBACK RUNNING MTU:65536 Metric:1
  77.  
  78. 2)在MySQL2 Real Server服务器上的操作
  79. [root@MySQL2 ~]# vim /etc/init.d/realserver //这个脚本在后端Real Server上都是一样的内容
  80. #!/bin/sh
  81. VIP=182.148.15.239
  82. . /etc/rc.d/init.d/functions
  83.  
  84. case "$1" in
  85.  
  86. start)
  87. /sbin/ifconfig lo down
  88. /sbin/ifconfig lo up
  89. echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
  90. echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
  91. echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
  92. echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
  93. /sbin/sysctl -p >/dev/null 2>&1
  94. /sbin/ifconfig lo:0 $VIP netmask 255.255.255.255 up
  95. /sbin/route add -host $VIP dev lo:0
  96. echo "LVS-DR real server starts successfully.\n"
  97. ;;
  98. stop)
  99. /sbin/ifconfig lo:0 down
  100. /sbin/route del $VIP >/dev/null 2>&1
  101. echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
  102. echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
  103. echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
  104. echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
  105. echo "LVS-DR real server stopped.\n"
  106. ;;
  107. status)
  108. isLoOn=`/sbin/ifconfig lo:0 | grep "$VIP"`
  109. isRoOn=`/bin/netstat -rn | grep "$VIP"`
  110. if [ "$isLoON" == "" -a "$isRoOn" == "" ]; then
  111. echo "LVS-DR real server has run yet."
  112. else
  113. echo "LVS-DR real server is running."
  114. fi
  115. exit 3
  116. ;;
  117. *)
  118. echo "Usage: $0 {start|stop|status}"
  119. exit 1
  120. esac
  121. exit 0
  122.  
  123. lvs脚本加入开机自启动并启动lvs脚本
  124. [root@MySQL2 ~]# chmod +x /etc/init.d/realserver
  125. [root@MySQL2 ~]# echo "/etc/init.d/realserver" >> /etc/rc.d/rc.local
  126. [root@MySQL2 ~]# service realserver start
  127. LVS-DR real server starts successfully.\n
  128.  
  129. [root@MySQL2 ~]# ifconfig
  130. eth0 Link encap:Ethernet HWaddr 52:54:00:3B:33:8F
  131. inet addr:182.148.15.238 Bcast:182.148.15.255 Mask:255.255.255.224
  132. inet6 addr: fe80::5054:ff:fe3b:338f/64 Scope:Link
  133. UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
  134. RX packets:135305 errors:0 dropped:0 overruns:0 frame:0
  135. TX packets:11256 errors:0 dropped:0 overruns:0 carrier:0
  136. collisions:0 txqueuelen:1000
  137. RX bytes:17338566 (16.5 MiB) TX bytes:892363 (871.4 KiB)
  138.  
  139. lo Link encap:Local Loopback
  140. inet addr:127.0.0.1 Mask:255.0.0.0
  141. inet6 addr: ::1/128 Scope:Host
  142. UP LOOPBACK RUNNING MTU:65536 Metric:1
  143. RX packets:0 errors:0 dropped:0 overruns:0 frame:0
  144. TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
  145. collisions:0 txqueuelen:0
  146. RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
  147.  
  148. lo:0 Link encap:Local Loopback
  149. inet addr:182.148.15.239 Mask:255.255.255.255
  150. UP LOOPBACK RUNNING MTU:65536 Metric:1

e)配置iptables防火墙

  1. 1)后端两台机器MySQL1 Real ServerMySQL2 Real Server要在iptables里开放3306端口
  2. [root@MySQL1 ~]# vim /etc/sysconfig/iptables
  3. ......
  4. -A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT
  5.  
  6. [root@MySQL1 ~]# /etc/init.d/iptables restart
  7.  
  8. 2LVS_MasterLVS_Backup两台机器要在iptables开放VRRP组播地址的相关规则。
  9. 注意:这个一定要设置!!!否则会出现故障时的VIP资源漂移错乱问题!
  10.  
  11. [root@LVS_Master ~]# vim /etc/sysconfig/iptables //两台LVS机器都要设置
  12. .......
  13. -A INPUT -s 182.148.15.0/24 -d 224.0.0.18 -j ACCEPT //允许组播地址通信
  14. -A INPUT -s 182.148.15.0/24 -p vrrp -j ACCEPT //允许VRRP(虚拟路由器冗余协)通信
  15. -A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT
  16.  
  17. [root@LVS_Master ~]# /etc/init.d/iptables restart

3)接着配置LVS+Keepalived配置

  1. 1LVS_Master上的操作
  2. [root@LVS_Master ~]# vim /etc/keepalived/keepalived.conf
  3. ! Configuration File for keepalived
  4.  
  5. global_defs {
  6. router_id LVS_Master
  7. }
  8.  
  9. vrrp_instance VI_1 {
  10. state MASTER #指定instance初始状态,实际根据优先级决定.backup节点不一样
  11. interface eth0 #虚拟IP所在网
  12. virtual_router_id 51 #VRID,相同VRID为一个组,决定多播MAC地址
  13. priority 100 #优先级,另一台改为90.backup节点不一样
  14. advert_int 1 #检查间隔
  15. authentication {
  16. auth_type PASS #认证方式,可以是pass或ha
  17. auth_pass 1111 #认证密码
  18. }
  19. virtual_ipaddress {
  20. 182.148.15.239 #VIP
  21. }
  22. }
  23.  
  24. virtual_server 182.148.15.239 3306 {
  25. delay_loop 6 #服务轮询的时间间隔
  26. lb_algo wrr #加权轮询调度,LVS调度算法 rr|wrr|lc|wlc|lblc|sh|sh
  27. lb_kind DR #LVS集群模式 NAT|DR|TUN,其中DR模式要求负载均衡器网卡必须有一块与物理网卡在同一个网段
  28. #nat_mask 255.255.255.0
  29. persistence_timeout 50 #会话保持时间
  30. protocol TCP #健康检查协议
  31.  
  32. ## Real Server设置,3306就是MySQL连接端口
  33. real_server 182.148.15.233 3306 {
  34. weight 3 ##权重
  35. TCP_CHECK {
  36. connect_timeout 3
  37. nb_get_retry 3
  38. delay_before_retry 3
  39. connect_port 3306
  40. }
  41. }
  42. real_server 182.148.15.238 3306 {
  43. weight 3
  44. TCP_CHECK {
  45. connect_timeout 3
  46. nb_get_retry 3
  47. delay_before_retry 3
  48. connect_port 3306
  49. }
  50. }
  51. }
  52.  
  53. 启动keepalived
  54. [root@LVS_Master ~]# /etc/init.d/keepalived start
  55. Starting keepalived: [ OK ]
  56.  
  57. 注意此时网卡的变化,可以看到虚拟网卡已经分配到了realserver上。
  58. 此时查看LVS集群状态,可以看到集群下有两个Real Server,调度算法,权重等信息。ActiveConn代表当前Real Server的活跃连接数。
  59. [root@LVS_Master ~]# ipvsadm -ln
  60. IP Virtual Server version 1.2.1 (size=4096)
  61. Prot LocalAddress:Port Scheduler Flags
  62. -> RemoteAddress:Port Forward Weight ActiveConn InActConn
  63. TCP 182.148.15.239:3306 wrr persistent 50
  64. -> 182.148.15.233:3306 Route 3 1 0
  65. -> 182.148.15.238:3306 Route 3 0 0
  66.  
  67. 2LVS_Backup上的操作
  68. [root@LVS_Backup ~]# vim /etc/keepalived/keepalived.conf
  69. ! Configuration File for keepalived
  70.  
  71. global_defs {
  72. router_id LVS_Backup
  73. }
  74.  
  75. vrrp_instance VI_1 {
  76. state BACKUP
  77. interface eth0
  78. virtual_router_id 51
  79. priority 90
  80. advert_int 1
  81. authentication {
  82. auth_type PASS
  83. auth_pass 1111
  84. }
  85. virtual_ipaddress {
  86. 182.148.15.239
  87. }
  88. }
  89.  
  90. virtual_server 182.148.15.239 3306 {
  91. delay_loop 6
  92. lb_algo wrr
  93. lb_kind DR
  94.  
  95. persistence_timeout 50
  96. protocol TCP
  97.  
  98. real_server 182.148.15.233 3306 {
  99. weight 3
  100. TCP_CHECK {
  101. connect_timeout 3
  102. nb_get_retry 3
  103. delay_before_retry 3
  104. connect_port 3306
  105. }
  106. }
  107. real_server 182.148.15.238 3306 {
  108. weight 3
  109. TCP_CHECK {
  110. connect_timeout 3
  111. nb_get_retry 3
  112. delay_before_retry 3
  113. connect_port 3306
  114. }
  115. }
  116. }
  117.  
  118. 启动keepalived
  119. [root@LVS_Backup ~]# /etc/init.d/keepalived start
  120. Starting keepalived: [ OK ]
  121.  
  122. [root@LVS_Backup ~]# ipvsadm -ln
  123. IP Virtual Server version 1.2.1 (size=4096)
  124. Prot LocalAddress:Port Scheduler Flags
  125. -> RemoteAddress:Port Forward Weight ActiveConn InActConn
  126. TCP 182.148.15.239:3306 wrr persistent 50
  127. -> 182.148.15.233:3306 Route 3 0 0
  128. -> 182.148.15.238:3306 Route 3 0 0

此时LVS+Keepalived+MySQL主主复制已经搭建完成。

4)最后进行测试验证

  1. 1)先进行功能性验证
  2. a)关闭MySQL2 Real Server服务器上的mysql
  3. [root@MySQL2 ~]# /etc/init.d/mysql stop
  4. Shutting down MySQL.. SUCCESS!
  5.  
  6. LVS_Master查看/var/log/messages中关于keepalived日志,LVS_Master检测到了MySQL2 Real Server服务器宕机,同时LVS集群自动剔除了故障节点
  7. [root@LVS_Master ~]# tail -f /var/log/messages
  8. .......
  9. Apr 26 15:22:19 test3-237 Keepalived_healthcheckers[4606]: TCP connection to [182.148.15.238]:3306 failed.
  10. Apr 26 15:22:19 test3-237 Keepalived_vrrp[4608]: Sending gratuitous ARP on eth0 for 182.148.15.239
  11. .......
  12.  
  13. [root@LVS_Master ~]# ipvsadm -ln //LVS已经将MySQL2 Real Server剔除
  14. IP Virtual Server version 1.2.1 (size=4096)
  15. Prot LocalAddress:Port Scheduler Flags
  16. -> RemoteAddress:Port Forward Weight ActiveConn InActConn
  17. TCP 182.148.15.239:3306 wrr persistent 50
  18. -> 182.148.15.233:3306 Route 3 1 0
  19.  
  20. 从新启动MySQL2 Real Server后自动将故障节点自动加入LVS集群
  21. [root@LVS_Master ~]# tail -f /var/log/messages
  22. .......
  23. Apr 26 15:23:49 test3-237 Keepalived_healthcheckers[4606]: TCP connection to [182.148.15.238]:3306 success.
  24. Apr 26 15:23:49 test3-237 Keepalived_healthcheckers[4606]: Adding service [182.148.15.238]:3306 to VS [182.148.15.239]:3306
  25. .......
  26.  
  27. [root@LVS_Master ~]# ipvsadm -ln
  28. IP Virtual Server version 1.2.1 (size=4096)
  29. Prot LocalAddress:Port Scheduler Flags
  30. -> RemoteAddress:Port Forward Weight ActiveConn InActConn
  31. TCP 182.148.15.239:3306 wrr persistent 50
  32. -> 182.148.15.233:3306 Route 3 1 0
  33. -> 182.148.15.238:3306 Route 3 1 0
  34.  
  35. b)关闭LVS_Master上的Keepalived(模拟宕机操作),查看LVS_Master上的日志,可以看到Keepalived移出了LVS1上的VIP
  36. [root@LVS_Master ~]# /etc/init.d/keepalived stop
  37. Stopping keepalived: [ OK ]
  38.  
  39. [root@LVS_Master ~]# tail -f /var/log/messages
  40. ........
  41. Apr 26 15:29:38 test3-237 Keepalived[4976]: Stopping
  42. Apr 26 15:29:38 test3-237 Keepalived_vrrp[4979]: VRRP_Instance(VI_1) sent 0 priority
  43. Apr 26 15:29:38 test3-237 Keepalived_vrrp[4979]: VRRP_Instance(VI_1) removing protocol VIPs.
  44. Apr 26 15:29:38 test3-237 Keepalived_healthcheckers[4977]: Removing service [182.148.15.233]:3306 from VS [182.148.15.239]:3306
  45. Apr 26 15:29:38 test3-237 Keepalived_healthcheckers[4977]: Removing service [182.148.15.238]:3306 from VS [182.148.15.239]:3306
  46. Apr 26 15:29:38 test3-237 Keepalived_healthcheckers[4977]: Stopped
  47. Apr 26 15:29:38 test3-237 kernel: IPVS: __ip_vs_del_service: enter
  48. Apr 26 15:29:39 test3-237 Keepalived_vrrp[4979]: Stopped
  49. Apr 26 15:29:39 test3-237 Keepalived[4976]: Stopped Keepalived v1.3.5 (03/19,2017), git commit v1.3.5-6-g6fa32f2
  50.  
  51. [root@LVS_Master ~]# ip addr //发现VIP资源已经不在本机了
  52. 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
  53. link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
  54. inet 127.0.0.1/8 scope host lo
  55. inet6 ::1/128 scope host
  56. valid_lft forever preferred_lft forever
  57. 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
  58. link/ether 52:54:00:68:dc:b6 brd ff:ff:ff:ff:ff:ff
  59. inet 182.148.15.237/27 brd 182.148.15.255 scope global eth0
  60. inet 182.148.15.239/27 brd 182.148.15.255 scope global secondary eth0:0
  61. inet6 fe80::5054:ff:fe68:dcb6/64 scope link
  62. valid_lft forever preferred_lft forever
  63.  
  64. 同时查看LVS_Backup上日志,可以看到LVS_Backup成为了Master,并接管了VIP
  65. [root@LVS_Backup ~]# tail -f /var/log/messages
  66. .....
  67. Apr 26 15:26:41 test4-236 Keepalived_vrrp[4711]: VRRP_Instance(VI_1) Transition to MASTER STATE
  68. Apr 26 15:26:42 test4-236 Keepalived_vrrp[4711]: VRRP_Instance(VI_1) Entering MASTER STATE
  69. Apr 26 15:26:42 test4-236 Keepalived_vrrp[4711]: VRRP_Instance(VI_1) setting protocol VIPs.
  70. Apr 26 15:26:42 test4-236 Keepalived_vrrp[4711]: Sending gratuitous ARP on eth0 for 182.148.15.239
  71. Apr 26 15:26:42 test4-236 Keepalived_vrrp[4711]: VRRP_Instance(VI_1) Sending/queueing gratuitous ARPs on eth0 for 182.148.15.239
  72.  
  73. [root@LVS_Backup ~]# ip addr //发现VIP资源已经转移到LVS_Backup机器上了
  74. 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
  75. link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
  76. inet 127.0.0.1/8 scope host lo
  77. inet6 ::1/128 scope host
  78. valid_lft forever preferred_lft forever
  79. 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
  80. link/ether 52:54:00:90:ac:0f brd ff:ff:ff:ff:ff:ff
  81. inet 182.148.15.236/27 brd 182.148.15.255 scope global eth0
  82. inet 182.148.15.239/32 scope global eth0
  83. inet6 fe80::5054:ff:fe90:ac0f/64 scope link
  84. valid_lft forever preferred_lft forever
  85.  
  86. LVS_Backup上查看LVS集群状态,一切正常。
  87. [root@LVS_Backup ~]# ipvsadm -ln
  88. IP Virtual Server version 1.2.1 (size=4096)
  89. Prot LocalAddress:Port Scheduler Flags
  90. -> RemoteAddress:Port Forward Weight ActiveConn InActConn
  91. TCP 182.148.15.239:3306 wrr persistent 50
  92. -> 182.148.15.233:3306 Route 3 0 0
  93. -> 182.148.15.238:3306 Route 3 1 1
  94.  
  95. 接着恢复LVS_Master上的Keepalived,发现VIP资源又会重新从LVS_Backup上转移回来。即LVS_Master重新接管服务。
  96. [root@LVS_Master ~]# tail -f /var/log/messages
  97. .......
  98. Apr 26 15:37:14 test3-237 Keepalived_vrrp[5263]: VRRP_Instance(VI_1) Transition to MASTER STATE
  99. Apr 26 15:37:15 test3-237 Keepalived_vrrp[5263]: VRRP_Instance(VI_1) Entering MASTER STATE
  100. Apr 26 15:37:15 test3-237 Keepalived_vrrp[5263]: VRRP_Instance(VI_1) setting protocol VIPs.
  101. Apr 26 15:37:15 test3-237 Keepalived_vrrp[5263]: Sending gratuitous ARP on eth0 for 182.148.15.239
  102. Apr 26 15:37:15 test3-237 Keepalived_vrrp[5263]: VRRP_Instance(VI_1) Sending/queueing gratuitous ARPs on eth0 for 182.148.15.239
  103.  
  104. [root@LVS_Master ~]# ip addr
  105. 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
  106. link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
  107. inet 127.0.0.1/8 scope host lo
  108. inet6 ::1/128 scope host
  109. valid_lft forever preferred_lft forever
  110. 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
  111. link/ether 52:54:00:68:dc:b6 brd ff:ff:ff:ff:ff:ff
  112. inet 182.148.15.237/27 brd 182.148.15.255 scope global eth0
  113. inet 182.148.15.239/32 scope global eth0
  114. inet 182.148.15.239/27 brd 182.148.15.255 scope global secondary eth0:0
  115. inet6 fe80::5054:ff:fe68:dcb6/64 scope link
  116. valid_lft forever preferred_lft forever
  117.  
  118. -----------------------------------------------------------------------------------------
  119. 2)接着进行mysql主主热备的高可用
  120. MySQL1 Real ServerMySQL2 Real Server两台机器的mysql里授权,使远程客户机能正常连接。
  121.  
  122. mysql> grant all on *.* to test@'%' identified by "123456";
  123. Query OK, 0 rows affected (0.03 sec)
  124.  
  125. mysql> flush privileges;
  126.  
  127. 经测试发现,对于上面的功能验证,不管是LVS_Masterkeepalived关闭(宕机)还是后端MySQL2 Real Servemysql关闭,在远程客户机上都能正常连接mysql(通过VIP进行连接)(LVS_Masterkeepalived关闭时,如若远程客户机在连接mysql中,可以断开重新连接一次即可)
  128. [root@bastion-IDC ~]# mysql -h182.148.15.239 -utest -p123456
  129. Welcome to the MySQL monitor. Commands end with ; or \g.
  130. Your MySQL connection id is 856
  131. Server version: 5.6.34-log Source distribution
  132.  
  133. Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
  134.  
  135. Oracle is a registered trademark of Oracle Corporation and/or its
  136. affiliates. Other names may be trademarks of their respective
  137. owners.
  138.  
  139. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
  140.  
  141. mysql> select * from huanqiu.haha;
  142. +----+-----------+
  143. | id | name |
  144. +----+-----------+
  145. | 1 | wangshibo |
  146. | 2 | guohuihui |
  147. | 22 | huihui |
  148. | 23 | bobo |
  149. +----+-----------+
  150. 4 rows in set (0.00 sec)

总结几点:
1)MySQL主主复制是集群的基础,组成Server Array,其中每个节点作为Real Server。
2)LVS服务器提供了负载均衡的作用,将用户请求分发到Real Server,一台Real Server故障并不会影响整个集群的。
3)Keepalived搭建主备LVS服务器,避免了LVS服务器的单点故障,出现故障时可以自动切换到正常的节点。
4)VRRP虚拟IP地址和接口实际IP必须在同一个网段内,VRRP两个实际接口不在同一网段,是不能形成主备关系的。因为:

  1. VRRP的形式是组播(多播),这个和广播基本一个原理,只不过缩小了范围,让几个服务器能收到,众所周知广播必须在2层里面实现,出3层就出了广播域了。
  2. VRRP中的ip切换是靠arp欺骗实现的,否则vip从主切到备得断多少机器,arp欺骗也是没法在出了3层以外的2个机器直接做的。

KVM虚拟机网络基础及优化说明的更多相关文章

  1. CentOS 6.9下KVM虚拟机网络Bridge(网桥)方式与NAT方式详解(转)

    摘要:KVM虚拟机网络配置的两种方式:NAT方式和Bridge方式.Bridge方式的配置原理和步骤.Bridge方式适用于服务器主机的虚拟化.NAT方式适用于桌面主机的虚拟化. NAT的网络结构图: ...

  2. kvm虚拟机管理基础

    部署 KVM 虚拟机 a.kvm 安装 环境:centos7,cpu 支持虚拟化,关闭 selinux,关闭 firewalld yum install libvirt virt-install qe ...

  3. KVM虚拟机网络

    某一天,我的QEMU/KVM虚拟机在打开的时候,出现了以下错误: 查看default配置状态(命令是sudo virsh net-list -all,注意sudo,管理员用户登录的当我没说): 上图是 ...

  4. [原] KVM虚拟机网络闪断分析

    背景 公司云平台的机器时常会发生网络闪断,通常在10s-100s之间. 异常情况 VM出现问题时,表现出来的情况是外部监控系统无法访问,猜测可能是由于系统假死,OVS链路问题等等.但是在出现网络问题的 ...

  5. KVM虚拟机网络闪断分析

    https://www.cnblogs.com/Bozh/p/5484838.html 背景 公司云平台的机器时常会发生网络闪断,通常在10s-100s之间. 异常情况 VM出现问题时,表现出来的情况 ...

  6. KVM虚拟机网络配置 Bridge方式,NAT方式

    https://blog.csdn.net/hzhsan/article/details/44098537/

  7. kvm虚拟机最佳实践系列2-创建KVM及KVM优化

    创建KVM及KVM优化 把KVM优化与KVM创建放在一起,是因为我们创建的KVM是要用在生产环境中,所以基础优化工作是必备的. 创建KVM 创建系统盘, 大小: 操作系统通常都不到10G,所以系统盘2 ...

  8. 命令行安装kvm虚拟机、桥接网络、用virt-manager管理

    宿主机CentOS Linux release 7.2.1511 (Core),内核3.10.0-327.el7.x86_64 1.配置宿主机网络桥接 想让虚拟机有自己的ip且外网可访问,需要在安装虚 ...

  9. Ubuntu18.04服务器使用netplan网络构建桥接kvm虚拟机

    参考链接 Ubuntu 18.04 LTS安装KVM虚拟机 如何在 Ubuntu 18.04 服务器上安装和配置 KVM KVM日常管理和克隆 KVM详解 1.准备工作 首先需要检查一下CPU是否支持 ...

随机推荐

  1. rails provide与content_for的区别

    页面渲染时:provide先执行,但找到一个provide之后就不再查找 content_for 顺序执行,在哪个位置,就等之前的渲染完后才执行.但是要等到所有的content被查找完后一块返回,也就 ...

  2. How to Use Telnet to Test SMTP Communication

    Topic Last Modified: 2005-05-24 Telnet is an extremely useful tool for troubleshooting issues relate ...

  3. virtualbox虚拟机迁移出现"connot find device eth0"错误

    我在自己的机器上面配置virtualbox虚拟机完毕以后,移植到另外一台机器上面,登陆页面总是在检查network,并且最后网络加载失败,不论我是用桥接还是NAT方式连接.登陆系统以后,我尝试连接网络 ...

  4. iOS 获取系统音量

    //设置一个全局变量 UISilder * volumeViewSlider; #pragma mark - 获取系统音量 - (void)configureVolume { volumeView = ...

  5. IOS数组NSArray与NSMutableArray知识点

    此文是对数组NSArray与NSMutableArray知识点的总结,主要是一些常见的操作,别外一些操作见其相应的文档,下面的代码部分还运用的第三方插件BlocksKit相结合: a:Foundati ...

  6. 【读书笔记】iOS-Tagged Pointer对象-注意事项

    一,2013年9月,苹果推出了iPhone5s,与此同时,iPhone5s配备了首个采用64位架构的A7双核处理器,为了节省内存和提高执行效率,苹果提出了Tagged Pointer的概念. 对于64 ...

  7. WPF x名称空间

    X是映射XML名称空间时给他取的名字.X名称空间里面的成员是专门给XAML编译器看的.用来引导XAML编译器把XAML代码编译成CLR代码的,他是取的XAML的首字母X. XAML有自己的编译器,会吧 ...

  8. KVO的使用

    KVO的使用 KVO是一种设计模式,名为观察者. addObserver:forKeyPath:options:context: 通知其他对象的方法,这个方法在NSObject中就已经申明了,也就是说 ...

  9. iOS证书失效

    iOS证书突然失效 今早上班打包直接报错,错误如图 根据错误信息到“钥匙串”里面看了一下证书,证书都莫名其妙的失效了,昨天还是好好的. 重新去钥匙串从证颁发中心获取证书,然后登陆开发者账号重新申请证书 ...

  10. selinux开启关闭

    查看SELinux状态: 1./usr/sbin/sestatus -v      ##如果SELinux status参数为enabled即为开启状态 SELinux status:         ...