一:环境介绍
1.操作系统:
centos6.9和7.3,censtos6用作keepalived调度,centos7用作realserver
2.服务安装:
keepalived-1.2.13-5.el6_6.x86_64
nginx-1.10.2-1.el7.x86_64
mariadb-5.5.52-1.el7.x86_64
php-fpm-5.4.16-42.el7.x86_64
以上都是yum仓库安装
3.实验环境
关闭selinux,关闭iptables,时间同步
二:原理及拓扑图
1.lvs概念
lVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。主要是工作在内核中,通过其他工具配置调用,只认识IP地址和端口。例如ipvsadm,但是在本案例中,keepalived完全可以代理ipvsadm调用lvs。
1.VRRP(Virtual Router Redundancy Protocol,虚拟路由冗余协议)
可以认为是实现路由器高可用的协议,简单的说,当一个路由器故障时可以由另一个备份路由器继续提供相同的务。
VRRP根据优先级来确定虚拟路由器中每台路由器的角色(Master路由器或Backup路由器)。 VRRP优先级的取值范围为0到255(数值越大表明优先级越高),可配置的范围是1到254,优先级0为系统保留给路由器放弃Master位置时使用,255则是系统保留给IP地址拥有者使用。优先级越高,则越有可能成为Master路由器。当两台优先级相同的路由器同时竞争Master时,比较接口IP地址大小,接口地址大者当选为Master。
2.keepalived简介
Keepalived 是一个基于VRRP协议来实现的LVS服务高可用方案,可以利用其来避免单点故障。一个LVS服务会有2台服务器运行Keepalived,一台为主服务器(MASTER),一台为备份服务器(BACKUP),但是对外表现为一个虚拟IP,主服务器会发送特定的消息给备份服务器,当备份服务器收不到这个消息的时候,即主服务器宕机的时候,备份服务器就会接管虚拟IP,继续提供服务,从而保证了高可用性。Keepalived是VRRP的完美实现。
3.lvs_dr
直接路由,LVS默认模式,应用最广泛,通过为请求报文重新封装一个MAC首部进行转发,源MAC是DIP所在的接口的MAC,目标MAC是某挑选出的RS的RIP所在接口的MAC地址;源IP/PORT,以及目标IP/PORT均保持不变。
工作原理:DR和REAL SERVER都使用同一个IP对外服务。但只有DR对ARP请求进行响应,所有REAL SERVER对本身这个IP的ARP请求保持静默。也就是说,网关会把对这个服务IP的请求全部定向给DR,而DR收到数据包后根据调度算法,找出对应的 REAL SERVER,把目的MAC地址改为REAL SERVER的MAC并发给这台REAL SERVER。这时REAL SERVER收到这个数据包,则等于直接从客户端收到这个数据包无异,处理后直接返回给客户端。由于DR要对二层包头进行改换,所以DR和REALSERVER之间必须在一个广播域,也可以简单的理解为在同一台交换机上。
需要注意的是:
第一:确保client能够直接访问web服务器。因为在LVS-DR模式下web服务器回复client的时候,是直接回复给client的,不需要经过LVS,所以web服务器必须能够和client的网络互通。
第二,lvs服务器和web-server他们必须在同一个网段内,因为LVS转发包的时候,是直接修改了包目标的MAC地址,直接扔给了rs,基于MAC地址的修改是活动在OSI二层数据链路层的,工作在数据链路层的网络设备就是交换机了,所以必须在一个交换机下面,也就是一个局域网内。
第三为啥抑制real-server的ARP,是这样的,我们在DR模式要更改web-server的ARP的模式,arp_ignore为1是说只回答目标IP地址是来访网络接口本地地址的ARP查询请求,我们都在回环接口上配置了一个VIP,当arp模式更改以后,那么如果有谁在请求VIP的mac地址时,那么那些web-server就会回答arp广播报文了,只有lvs才会,如果没有更改arp模式,那么大家都喊我是VIP,这就乱套了。
4.拓扑图
三:keepalived配置
1.安装keepalived
yum install keepalived -y
2.高可用的ipvs双主集群配置
1.节点一的配置:
global_defs {
notification_email {
root@localhost
}
notification_email_from root@magedu.com
smtp_server 172.0.0.1
smtp_connect_timeout 30
router_id LVS_KEEPALIVED
}
vrrp_instance VI_1 {
state MASTER
interface eth1
virtual_router_id 10
priority 100
advert_int 1
#nopreempt
authentication {
auth_type PASS
auth_pass magedu
}
virtual_ipaddress {
172.17.250.200
}
}
virtual_server 172.17.250.200 80 {
delay_loop 6
lb_algo wrr
lb_kind DR
nat_mask 255.255.255.255
persistence_timeout 50
protocol TCP
real_server 172.17.252.78 80 {
weight 1
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
real_server 172.17.110.110 80 {
weight 1
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
vrrp_instance VI_2 {
state BACKUP
interface eth1
virtual_router_id 20
priority 98
advert_int 1
#nopreempt
authentication {
auth_type PASS
auth_pass magedu
}
virtual_ipaddress {
172.17.250.250
}
}
virtual_server 172.17.250.250 443 {
delay_loop 6
lb_algo wrr
lb_kind DR
nat_mask 255.255.255.255
persistence_timeout 50
protocol TCP
real_server 172.17.252.78 443 {
weight 1
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
real_server 172.17.110.110 443 {
weight 1
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
第二步:节点二的配置
global_defs {
notification_email {
root@localhost
}
notification_email_fromroot@magedu.com
smtp_server 172.0.0.1
smtp_connect_timeout 30
router_id LVS_KEEPALIVED
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 10
priority 98
advert_int 1
# nopreempt
authentication {
auth_type PASS
auth_pass magedu
}
virtual_ipaddress {
172.17.250.200
}
}
virtual_server 172.17.250.200 80 {
delay_loop 6
lb_algo wrr
lb_kind DR
nat_mask 255.255.255.255
persistence_timeout 50
protocol TCP
real_server172.17.252.78 80 {
weight 1
connect_timeout3
nb_get_retry 3
delay_before_retry 3
}
real_server172.17.110.110 80 {
weight 1
connect_timeout3
nb_get_retry 3
delay_before_retry 3
}
}
vrrp_instance VI_2 {
state MASTER
interface eth0
virtual_router_id 20
priority 100
advert_int 1
# nopreempt
authentication {
auth_type PASS
auth_pass magedu
}
virtual_ipaddress {
172.17.250.250
}
}
virtual_server 172.17.250.250 443 {
delay_loop 6
lb_algo wrr
lb_kind DR
nat_mask 255.255.255.255
persistence_timeout 50
protocol TCP
real_server172.17.252.78 443 {
weight 1
connect_timeout3
nb_get_retry 3
delay_before_retry 3
}
real_server 172.17.110.110 443 {
weight 1
connect_timeout3
nb_get_retry 3
delay_before_retry 3
}
}
四:realserver配置
我的realserv服务器实现的小米电子网站,所以就不过多介绍了,用的是lnmp的架构,80端口和443端口分别代表不同的虚拟ip访问的不同站点,互为主备。
1.nginx加密的步骤如下:
mkdir /usr/local/nginx/conf -p --建立一个存放加密文件的目录
cd /usr/local/nginx/conf/
openssl genrsa -des3 -out server.key 1024 --创建服务器私钥会让你输入一个口令
openssl req -new -key server.key -out server.csr --创建签名请求的证书csr
cp server.keyserver.key.org
openssl rsa -in server.key.org -out server.key --加载ssl支持nginx的时候使用私钥除去必须的口令
openssl x509 -req -days 365 -in server.csr -signkey server.key-out server.crt --标志证书使用上述私钥和csr
2.主要修改配置文件如下:
让站点兼容80端口和443端口
server {
listen 80;
listen 443 ssl;
server_name xiaomi.magedu.com;
root /data/web;
#charset koi8-r;
ssl_certificate /usr/local/nginx/conf/server.crt;
ssl_certificate_key /usr/local/nginx/conf/server.key;
}
3.修改内核参数:
dr模型中,各主机上均需要配置VIP,解决地址冲突的方式有三种:
(1) 在前端网关做静态绑定;
(2) 在各RS使用arptables;
(3) 在各RS修改内核参数,来限制arp响应和通告的级别;
限制响应级别:arp_ignore
0:默认值,表示可使用本地任意接口上配置的任意地址进行响应;
1: 仅在请求的目标IP配置在本地主机的接收到请求报文接口上时,才给予响应;
限制通告级别:arp_announce
0:默认值,把本机上的所有接口的所有信息向每个接口上的网络进行通告;
1:尽量避免向非直接连接网络进行通告;
2:必须避免向非本网络通告。
#配置本地回环网卡路由
echo "1">/proc/sys/net/ipv4/conf/lo/arp_ignore
#1 只回答目标IP地址是来访网络接口本地地址的ARP查询请求
echo "2">/proc/sys/net/ipv4/conf/lo/arp_announce
#2 对查询目标使用最适当的本地地址.在此模式下将忽略这个IP数据包的源地址并尝试选择与能与该地址通信的本地地址.
echo "1">/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2">/proc/sys/net/ipv4/conf/all/arp_announce
#关闭arp应答
1: 仅在请求的目标IP配置在本地主机的接收到请求报文的接口上时,才给予响应
2:必须避免将接口信息向非本网络进行通告
4.配置回环网卡和路由:
ifconfig lo:0 172.17.250.200 broadcast 172.17.250.200 netmask255.255.255.255 up
route add -host 172.17.250.200 lo:0
ifconfig lo:1 172.17.250.250 broadcast 172.17.250.250 netmask255.255.255.255 up
route add -host 172.17.250.250 lo:1
五:测试
1.启动服务
ip漂移前:
ip漂移后:
2.模拟一台keepalived服务器宕机:
service stop keepalived
3.模拟一台web服务宕机:
systemctl stop nginx
4.实验总结:
由此我们发现即使一台高可用负载均衡器的主机宕机了,我们依然可以通过另外一个虚拟ip进行wab访问,体现了高可用的实用性,Keepalived检测web服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的web 服务器从系统中剔除,当web服务器工作正常后Keepalived自动将web服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的web服务器。lvs只是能够负载均衡,为后端的web服务器分流,降低web负载,加上keepalived就能够实现高可用负载均衡,而且主主模式也能够避免主备模式一台调度器完全被压榨的状态,可以为客户端提供更高效的服务。