集群从功能实现上分为两种:高可用集群和负载均衡集群。高可用,顾名思义,当一台服务器宕机不能提供服务了,还有另外的服务器替代。负载均衡集群,简单讲就是把用户的请求分摊到多台服务器上。
18.1 搭建高可用集群
高可用集群,即“HA集群”,也称为“双机热备”,用于关键业务。
常用实现高可用集群的开源软件有heartbeat和Keepalived,其中Keppalived还有负载均衡的功能。这两个软件类似,核心原理都是通过心跳线连接两台服务器,正常情况下由一台服务器提供服务,当这台服务器宕机,备用服务器顶替。这里建议使用Keepalived。
Keepalived工作原理
VRRP(Virtual Router Redundancy Protocol)协议叫做虚拟路由冗余协议,它是实现路由高可用的一个通信协议。
VRRP协议将两台或多台路由器设备虚拟成一个设备,对外提供虚拟路由器IP(一个或多个)。而在路由器组内部,如果实际拥有这个对外IP的路由器如果工作正常的话,就是MASTER,或者是通过算法选举产生的,MASTER实现针对虚拟路由器IP的各种网络功能,如ARP请求,ICMP,以及数据的转发等,其他设备不具有该IP,状态是BACKUP。除了接收MASTER的VRRP状态通告信息外,不执行对外的网络功能,当MASTER失效时,BACKUP将接管原先MASTER的网络功能。
Keepalived就是基于VRRP协议实现的。Keepalived要有三个模块,分别是core、check和vrrp。其中core模块为Keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析;check模块负责健康检查;vrrp模块用来实现VRRP协议。
安装Keepalived
刚刚提到的VRRP协议有1个master角色和至少一个backup角色,所以做本实验需要准备至少两台linux机器。这里我用了两台虚拟机(192.168.33.128和192.168.33.129,其中128作为master,129作为backup)来完成实验。
- 在两台机器上都安装keepalived:
[root@localhost ~]# cd /usr/local/src/ //为了辨识,我将主进入/src/目录
[root@localhost src]# yum install -y keepalived //安装keepalived
[root@localhost ~]# cd /usr/local/mysql/ //将从进入/mysql/目录
[root@localhost mysql]# yum install -y keepalived
Keepalived+Nginx实现Web高可用
在生产环境中,很多企业把Nginx作为负载均衡器使用,它很重要,一旦宕机会导致整个站点不能访问,所以需要再准备一台备用Nginx,Keepalived用在这种场景下非常合适。
在配置之前,我把两台机器的IP、角色罗列一下:
master:192.168.33.128 安装keepalived+Nginx
backup:192.168.33.129 安装keepalived+Nginx
VIP(虚拟IP):192.168.33.100
VIP(虚拟IP)是由Keepalived给服务器配置上的,服务器靠这个VIP对外提供服务,当master机器宕机,VIP就会被分配到backup机器上继续对外提供服务,而用户是无法感知的。
- 编辑master的keepalived配置文件:
[root@localhost src]# vim /etc/keepalived/keepalived.conf //更改为下面内容
global_defs {
notification_email {
lzx@lzxlinux.com //定义接收告警的人
}
notification_email_from root@lzxlinux.com //定义发邮件的地址
smtp_server 127.0.0.1 //定义发邮件服务器地址,若为127.0.0.1则使用本机自带邮件服务器发送
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_script chk_nginx { //chk_nginx为自定义名字,后面会用到
script "/usr/local/sbin/check_ng.sh" //自定义脚本,该脚本为监控Nginx服务的脚本
interval 3 //每隔3s执行一次该脚本
}
vrrp_instance VI_1 {
state MASTER //角色为master
interface ens33 //针对哪个网卡监听VIP
virtual_router_id 51
priority 100 //设置权重为100,master权重必须要比backup大,因为权重越大优先级越高
advert_int 1
authentication {
auth_type PASS
auth_pass lzxlinux>com //定义密码,这个密码自定义
}
virtual_ipaddress {
192.168.33.100 //定义VIP地址
}
track_script {
chk_nginx //定义监控脚本,这里和上面vrrp_script后面的字符串保持一致
}
}
Keepalived要实现高可用,监控Nginx服务是必须的,它本身没有这个功能,需要借助自定义脚本来实现。
- 定义监控Nginx服务的脚本:
[root@localhost src]# vim /usr/local/sbin/check_ng.sh //写入下面内容
#!/bin/bash
#时间变量,用于记录日志
d=`date --date today +%Y%m%d_%H:%M:%S`
#计算nginx进程数量
n=`ps -C nginx --no-heading|wc -l`
#如果进程为0,则启动nginx,并且再次检测nginx进程数量,
#如果还为0,说明nginx无法启动,此时需要关闭keepalived
if [ $n -eq "0" ]; then
/etc/init.d/nginx start
n2=`ps -C nginx --no-heading|wc -l`
if [ $n2 -eq "0" ]; then
echo "$d nginx down,keepalived will stop" >> /var/log/check_ng.log
systemctl stop keepalived
fi
fi
[root@localhost src]# chmod a+x /usr/local/sbin/check_ng.sh //需要给予执行权限,否则无法被keepalived调用
上面操作完成后,就可以启动master上的keepalived了,如果没有启动Nginx服务,它会帮我们自动拉起来,并监听VIP
- 启动master上的keepalived:
[root@localhost src]# systemctl start keepalived //启动keepalived服务
[root@localhost src]# ip add //这里使用ip add命令才能查看VIP,ifconfig无法查看
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:8e:5e:ee brd ff:ff:ff:ff:ff:ff
inet 192.168.33.128/24 brd 192.168.33.255 scope global ens33
valid_lft forever preferred_lft forever
inet 192.168.33.100/32 scope global ens33 //可以看到VIP地址
valid_lft forever preferred_lft forever
inet6 fe80::686b:95cd:2ab3:9c19/64 scope link
valid_lft forever preferred_lft forever
- 查看Nginx服务是否启动:
[root@localhost src]# ps aux |grep nginx
root 843 0.0 0.0 20540 656 ? Ss 08:53 0:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
nobody 844 0.0 0.0 22984 3236 ? S 08:53 0:00 nginx: worker process
nobody 845 0.0 0.0 22984 3236 ? S 08:53 0:00 nginx: worker process //Nginx服务已经启动
master上面的配置已经完成,接下来配置backup
- 编辑keepalived配置文件:
[root@localhost mysql]# vim /etc/keepalived/keepalived.conf //更改为下面内容
global_defs {
notification_email {
lzx@lzxlinux.com
}
notification_email_from root@lzxlinux.com
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_script chk_nginx {
script "/usr/local/sbin/check_ng.sh"
interval 3
}
vrrp_instance VI_1 {
state BACKUP //角色为backup
interface ens33
virtual_router_id 51
priority 90 //权重设为90,比master权重小
advert_int 1
authentication {
auth_type PASS
auth_pass lzxlinux>com
}
virtual_ipaddress {
192.168.33.100
}
track_script {
chk_nginx
}
}
- 编辑监控Nginx服务的脚本:
[root@localhost mysql]# vim /usr/local/sbin/check_ng.sh //写入下面内容
#时间变量,用于记录日志
d=`date --date today +%Y%m%d_%H:%M:%S`
#计算nginx进程数量
n=`ps -C nginx --no-heading|wc -l`
#如果进程为0,则启动nginx,并且再次检测nginx进程数量,
#如果还为0,说明nginx无法启动,此时需要关闭keepalived
if [ $n -eq "0" ]; then
systemctl start nginx //这里与master不同,因为backup上面Nginx是yum安装的
n2=`ps -C nginx --no-heading|wc -l`
if [ $n2 -eq "0" ]; then
echo "$d nginx down,keepalived will stop" >> /var/log/check_ng.log
systemctl stop keepalived
fi
fi
[root@localhost mysql]# chmod a+x /usr/local/sbin/check_ng.sh //给予执行权限
- backup安装Nginx:
[root@localhost mysql]# yum install -y epel-release //安装扩展源
[root@localhost mysql]# yum install -y nginx
在CentOS 7上yum安装的Nginx启动命令为systemctl start nginx ,所以在前面的check_ng.sh脚本中,启动命令有所更改
- 启动keepalived服务:
[root@localhost mysql]# systemctl start keepalived
虽然backup上安装了Nginx,但不需要启动,正常情况下只要master提供Nginx服务即可
另外,master上面的Nginx是编译安装,而backup上面的Nginx是yum安装,所以Nginx的版本号不一样,可以用来区分它们
- 验证上面配置:
[root@localhost mysql]# curl -I 192.168.33.128 //backup上访问master
HTTP/1.1 200 OK
Server: nginx/1.12.1 //master上面的Nginx版本为1.12.1
Date: Fri, 20 Jul 2018 02:07:17 GMT
Content-Type: text/html
Content-Length: 8
Last-Modified: Thu, 05 Jul 2018 07:22:18 GMT //版本不一样,Last-Modified也会不一样
Connection: keep-alive
ETag: "5b3dc72a-8"
Accept-Ranges: bytes
[root@localhost mysql]# systemctl start nginx //backup上启动Nginx
[root@localhost mysql]# systemctl stop firewalld //关闭防火墙
[root@localhost mysql]# systemctl disable firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@localhost mysql]# getenforce
Enforcing
[root@localhost mysql]# setenforce 0 //关闭selinux
[root@localhost src]# curl -I 192.168.33.129 //master上访问backup
HTTP/1.1 200 OK
Server: nginx/1.12.2 //backup上面的Nginx版本为1.12.2
Date: Fri, 20 Jul 2018 02:13:41 GMT
Content-Type: text/html
Content-Length: 3700
Last-Modified: Tue, 06 Mar 2018 09:26:21 GMT
Connection: keep-alive
ETag: "5a9e5ebd-e74"
Accept-Ranges: bytes
[root@localhost mysql]# curl -I 192.168.33.100 //backup上访问VIP
HTTP/1.1 200 OK
Server: nginx/1.12.1 //可以看到VIP在master上
Date: Fri, 20 Jul 2018 02:21:59 GMT
Content-Type: text/html
Content-Length: 8
Last-Modified: Thu, 05 Jul 2018 07:22:18 GMT
Connection: keep-alive
ETag: "5b3dc72a-8"
Accept-Ranges: bytes
关掉master上面的Nginx服务:
[root@localhost src]# netstat -lntp |grep nginx
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 843/nginx: master p
[root@localhost src]# /etc/init.d/nginx stop
Stopping nginx (via systemctl): [ 确定 ]
[root@localhost src]# netstat -lntp |grep nginx //可以看到Nginx服务又启动了
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 8399/nginx: master
[root@localhost src]# tail /var/log/messages //通过日志看到Nginx被启动的信息
Jul 20 10:27:30 localhost systemd: Stopping SYSV: http service....
Jul 20 10:27:30 localhost nginx: Stopping Nginx: [ 确定 ]
Jul 20 10:27:30 localhost systemd: Stopped SYSV: http service..
Jul 20 10:27:31 localhost systemd: Starting SYSV: http service....
Jul 20 10:27:31 localhost nginx: Starting Nginx: [ 确定 ]
Jul 20 10:27:31 localhost systemd: Started SYSV: http service..
关掉master上的keepalived服务,模拟master宕机:
[root@localhost src]# systemctl stop keepalived //关闭keepalived服务
[root@localhost src]# curl -I 192.168.33.100 //master上访问VIP
HTTP/1.1 200 OK
Server: nginx/1.12.2 //这里VIP已经到了backup上
Date: Fri, 20 Jul 2018 02:35:01 GMT
Content-Type: text/html
Content-Length: 3700
Last-Modified: Tue, 06 Mar 2018 09:26:21 GMT //这里也显示为backup
Connection: keep-alive
ETag: "5a9e5ebd-e74"
Accept-Ranges: bytes
开启master上的keepalived服务,再看:
[root@localhost src]# systemctl start keepalived //开启keepalived服务
[root@localhost src]# curl -I 192.168.33.100 //master上访问VIP
HTTP/1.1 200 OK
Server: nginx/1.12.1 //这里VIP又回到了master上
Date: Fri, 20 Jul 2018 02:37:51 GMT
Content-Type: text/html
Content-Length: 8
Last-Modified: Thu, 05 Jul 2018 07:22:18 GMT //这里也显示是master
Connection: keep-alive
ETag: "5b3dc72a-8"
Accept-Ranges: bytes
如果一台机器宕机,那么上面的keepalived服务必然会停掉,所以上面验证高可用是没有问题的。
另外,如果只是禁掉vrrp协议,但master不会认为自己宕机,也就不会释放VIP资源。而如果master和backup都绑定了VIP,那么对外提供服务就会紊乱,这就叫做“脑裂”,这种情况是不允许发生的。
18.2 搭建负载均衡集群
负载均衡集群,即让多台服务器均衡地去承受压力。实现负载均衡集群的开源软件有LVS、Keepalived、haproxy、Nginx等,当然也有商业负载均衡设备,如F5,Netscaler等,商业的负载均衡解决方案非常稳定,但价格也很昂贵。这里,我们以LVS为主。
LVS介绍
LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统,由国内大牛章文嵩开发。
LVS是一个4层的负载均衡软件,针对TCP/IP做的路由和转发。在LVS架构中,核心角色是调度器,用来分发用户的请求,调度器具有很好的吞吐率,将请求均衡地转移到不同的真实服务器上执行,且调度器自动屏蔽掉真实服务器的故障,从而将一组服务器构成一个高性能的、高可用的虚拟服务器。
LVS根据实现方式的不同,主要分为3种类型:NAT模式,IP Tunnel(IP隧道)模式,DR模式。
NAT模式
NAT模式的实现原理比较简单,调度器会把用户的请求通过预设的iptables规则转发给后端的真实服务器,其中调度器有两个IP,一个是公网IP,一个是内网IP,而真实服务器只有内网IP。用户访问的时候请求的是调度器的公网IP,它会把用户的请求转发到真实服务器的内网IP上。
IP Tunnel模式
IP隧道是将一个IP报文封装在另一个IP报文的技术,这样就使目标为一个IP地址的数据报文能被封装和转发到另一个IP报文,如VPN技术就是IP隧道。
在LVS的IP Tunnel模式中,后端的真实服务器有一组而非一个,在有请求的时候调度器会动态的选择一台服务器,将请求报文封装和转发给选出的真实服务器。这样,我们可以利用IP隧道的原理,将一组服务器上的网络服务组成在一个IP地址上的虚拟网络服务。
调度器将请求报文封装在另一个IP报文中,再将封装后的IP报文转发给真实服务器,真实服务器收到报文后,先将报文解封获得原来目标地址为VIP的报文,服务器发现VIP地址被配置在本地的IP隧道设备上,所以就处理这个请求,然后根据路由表将响应报文发给客户。
DR模式
和IP Tunnel模式相同,用户的请求被调度器动态地分配到真实服务器上,真实服务器响应请求把结果直接返回给用户。不过,在这种模式下不会封装IP,而是将数据帧的MAC地址改为真实服务器的MAC地址
上面三种模式,NAT模式适合小型的集群,机器数量不多,它的优势是节约公网IP;IP Tunnel和DR模式相差不大,都能支撑较大规模的集群,但缺点是浪费公网IP。
LVS的调度算法
调度器把客户端发来的请求均衡地分发给后端的真实服务器,这是依靠预先设定好的调度算法来实现的。LVS中支持的调度算法主要有8种:
1.轮询调度(RR)
按顺序把请求依次发送给后端的服务器,而不考虑后端服务器的性能、处理速度和响应时间。
2.带权重的轮询调度(WRR)
比上面算法多了一个权重的设置,权重越高的服务器被分配到的请求就越高,这样后端服务器性能不一致时,就可以给配置低的服务器较小的权重。
3.最小连接调度(LC)
会根据各真实服务器上的连接数来决定把新的请求分配给谁,连接数少说明服务器是空闲的,这样把新的请求分配给空闲服务器上更加合理。
4.带权重的最小连接调度(WLC)
在最小连接调度的基础上再增加一个权重设置,这样就可以人为地去控制哪些服务器上多分配请求、哪些少分配请求。
5.基于局部性的最小连接调度(LBLC)
简称LBLC算法,是针对报文的目标IP地址的负载均衡调度,主要用于Cache集群系统,在服务器的负载均衡的情况下,将相同目标IP地址的请求调度到同一台服务器,来提高各台服务器的访问局部性和主存Cache命中率。
6.带复制的基于局部性的最小连接调度(LBLCR)
简称LBLCR算法,与上面的算法不同在于:它要维护从一个目标IP地址到一组服务器的映射,而LBLC算法是维护从一个IP地址到一台服务器的映射。
LBLCR算法先根据请求的目标IP地址找出该目标IP地址对应的服务器组,按“最小连接”原则从该服务器组中选出一台服务器,若该服务器没有超载,则将请求发送到该服务器;若服务器超载,则按“最小连接”原则从整个集群中选出一台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的程度。
7.目标地址散列调度(DH)
根据请求的IP地址,作为散列键(hash key)从静态分配的散列表中找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。
8.源地址散列调度(SH)
与目标地址散列调度正好相反,它是根据请求的源IP地址,作为散列键从静态分配的散列表中找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。
上面8种算法,前4种用的最多,基本上能满足绝大多数的应用场景。
NAT模式LVS搭建
NAT模式下,调度器需要有两个IP,一个公网IP一个内网IP,真实服务器只需要内网IP,此架构需要至少三台服务器。三台机器的IP分配如下:
调度器dir:192.168.33.127(内网IP),192.168.40.128(公网IP,vmware仅主机网络模式)
真实服务器rs1:192.168.33.128(内网IP)
真实服务器rs2:192.168.33.129(内网IP)
调度器上有两块网卡,作为内网的网卡使用的是NAT的网络,而作为“公网”的网卡使用的是仅主机网络
[root@lzx ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.40.128 netmask 255.255.255.0 broadcast 192.168.40.255
inet6 fe80::c159:c855:9b0:115 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:13:48:42 txqueuelen 1000 (Ethernet)
RX packets 41 bytes 5482 (5.3 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 65 bytes 7200 (7.0 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ens34: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.33.127 netmask 255.255.255.0 broadcast 192.168.33.255
inet6 fe80::98c2:9f58:8e3d:c10a prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:13:48:4c txqueuelen 1000 (Ethernet)
RX packets 25575 bytes 32190330 (30.6 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 7658 bytes 776297 (758.1 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
- 首先,真实服务器rs1和rs2上需要把内网的网关设置为调度器dir的内网IP:
[root@localhost src]# vim /etc/sysconfig/network-scripts/ifcfg-ens33 //更改下面内容
GATEWAY=192.168.33.127 //rs1上更改网关为dir的内网IP
[root@localhost src]# service network restart
Restarting network (via systemctl): [ 确定 ]
[root@localhost mysql]# vim /etc/sysconfig/network-scripts/ifcfg-ens33 //更改下面内容
GATEWAY=192.168.33.127 //rs2上更改网关为dir的内网IP
[root@localhost mysql]# service network restart
Restarting network (via systemctl): [ 确定 ]
- 关闭三台服务器的防火墙并使不开机启动:
[root@localhost src]# systemctl stop firewalld //rs1关闭防火墙
[root@localhost src]# systemctl disable firewalld //使不开机启动
[root@localhost mysql]# systemctl stop firewalld //rs2关闭防火墙
[root@localhost mysql]# systemctl disable firewalld //使不开机启动
[root@lzx ~]# systemctl stop firewalld //dir关闭防火墙
[root@lzx ~]# systemctl disable firewalld //使不开机启动
- dir上安装LVS核心工具ipvsadm:
[root@lzx ~]# yum install -y ipvsadm
- 在dir上编写一个脚本:
[root@lzx ~]# vim /usr/local/sbin/lvs_nat.sh //写入下面内容
#! /bin/bash
# director 服务器上开启路由转发功能
echo 1 > /proc/sys/net/ipv4/ip_forward
# 关闭icmp的重定向
echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/default/send_redirects
# 注意区分网卡名字,我的两个网卡分别为ens33和ens34
echo 0 > /proc/sys/net/ipv4/conf/ens33/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/ens34/send_redirects
# director 设置nat防火墙
iptables -t nat -F
iptables -t nat -X
iptables -t nat -A POSTROUTING -s 192.168.33.0/24 -j MASQUERADE
# director设置ipvsadm
IPVSADM='/usr/sbin/ipvsadm'
$IPVSADM -C
$IPVSADM -A -t 192.168.40.128:80 -s wlc
$IPVSADM -a -t 192.168.40.128:80 -r 192.168.33.128:80 -m -w 1
$IPVSADM -a -t 192.168.40.128:80 -r 192.168.33.129:80 -m -w 1
上面,
ipvsadm的-C选项可以清空规则,防止之前的规则有影响,-A增加Virtual Server,-t为TCP,-s指定调度算法,wlc为带权重的最小连接调度算法,
-a增加rs,-r指定rs的IP,-m表示LVS的模式为NAT(masquerad),如果是-g表示DR,-i表示IP Tunnel,-w指定权重,另外还有-p,指定超时时间,这里不设置该参数,以免影响后面检验
- 编辑完脚本后,直接执行:
[root@lzx ~]# bash /usr/local/sbin/lvs_nat.sh
如果dir上有开启Nginx服务,需要把它关闭
killall nginx
- 下面验证LVS效果:
为了方便区分,需要给rs1和rs2各设置一个默认主页
[root@localhost src]# echo "rs1" > /data/nginx/default/index.html //rs1上执行,rs1上的Nginx是编译的Nginx
[root@localhost mysql]# echo "rs2" > /usr/share/nginx/html/index.html //rs2上执行,rs2上的Nginx是yum安装的Nginx,所以路径与rs1不同
再在dir上访问dir的外网IP(192.168.40.128)
[root@lzx ~]# curl 192.168.40.128
rs2
[root@lzx ~]# curl 192.168.40.128
rs1
[root@lzx ~]# curl 192.168.40.128
rs2
[root@lzx ~]# curl 192.168.40.128
rs1
[root@lzx ~]# curl 192.168.40.128
rs2
[root@lzx ~]# curl 192.168.40.128
rs1
[root@lzx ~]# curl 192.168.40.128
rs2
[root@lzx ~]# curl 192.168.40.128
rs1
可以看到,每次访问,返回的结果是在rs1和rs2中随机出现的。这样,就做到了负载均衡
更多资料参考:
LVS入门系列
配置nginx + keepalived双主模式
MySQL 高可用:mysql+Lvs+Keepalived 负载均衡及故障转移