这里我们采用VS/DR
实验环境: rhel6
server1: 172.25.70.1
server2: 172.25.70.2
server3: 172.25.70.3
server4: 172.25.70.4
server1为调度服务器(vs),server2和server3为rs(真实的后端服务器),server4为keepalived备机
1.利用ipvsadm
利用ipvsadm内核功能,(不需要开启,用户层面需要控制这个服务,调用脚本来保存)策略)
[HighAvailability]
name=HighAvailability
baseurl=http://172.25.70.250/rhel6.5/HighAvailability
gpgcheck=0
[ResilientStorage]
name=ResilientStorage
baseurl=http://172.25.70.250/rhel6.5/ResilientStorage
gpgcheck=0
[ScalableFileSystem]
name=ScalableFileSystem
baseurl=http://172.25.70.250/rhel6.5/ScalableFileSystem
gpgcheck=0
[LoadBalancer]
name=LoadBalancer
baseurl=http://172.25.70.250/rhel6.5/LoadBalancer
gpgcheck=0
[root@server1 ~]# yum install ipvsadm -y
[root@server1 ~]# ip addr add 172.25.70.100/24 dev eth0 #添加一个vip
[root@server1 ~]# ipvsadm -A -t 172.25.70.100:80 -s rr
[root@server1 ~]# ipvsadm -a -t 172.25.70.100:80 -r 172.25.70.2:80 -g
[root@server1 ~]# ipvsadm -a -t 172.25.70.100:80 -r 172.25.70.3:80 -g
添加一个vip(调度服务器的虚拟ip)以及为该vip绑定两个rs(真实的后端服务器)的ip,他们的监听端口都为80
[root@server2 ~]# yum install arptables_jf -y
[root@server2 ~]# arptables -A IN -d 172.25.70.100 -j DROP
[root@server2 ~]# arptables -A OUT -s 172.25.70.100 -j mangle --mangle-ip-s 172.25.70.2
[root@server2 ~]# ip addr add 172.25.70.100/24 dev eth0
server3同理
[root@server2 ~]# vim /var/www/html/index.html
the page from server2
[root@server3 ~]# vim /var/www/html/index.html
the page from server3
[root@foundation70 kiosk]# curl 172.25.70.100
the page from server3
[root@foundation70 kiosk]# curl 172.25.70.100
the page from server2
测试成功,同时我们可以查看该vip的访问对应哪一台服务器的mac地址
[root@foundation70 kiosk]# arp -an | grep 100
? (172.25.70.100) at 52:54:00:ff:a3:61 [ether] on br0
You have new mail in /var/spool/mail/kiosk
如你所料,对应的是vs的mac地址,具体原理可以参见这篇博客(我感觉不可能有人家写的具体详细~~)
2.keepalived的安装和部署
[root@server1 ~]# tar -zxf keepalived-1.3.6.tar.gz
[root@server1 ~]# yum install libnfnetlink-devel-1.0.0-1.el6.x86_64.rpm openssl-devel libnl-devel iptables-devel -y
[root@server1 ~]# cd keepalived-1.3.6
[root@server1 keepalived-1.3.6]# ./configure --prefix=/usr/local/keepalived --with-init=SYSV #编译检查
[root@server1 keepalived-1.3.6]# make
[root@server1 keepalived-1.3.6]# make install
[root@server1 keepalived-1.3.6]# ln -s /usr/local/keepalived/etc/keepalived/ /etc/
[root@server1 keepalived-1.3.6]# ln -s /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
[root@server1 keepalived-1.3.6]# ln -s /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
[root@server1 keepalived-1.3.6]# ln -s /usr/local/keepalived/sbin/keepalived /sbin/
[root@server1 keepalived-1.3.6]# chmod +x /etc/init.d/keepalived #为启动脚本加上可执行权限
[root@server1 keepalived-1.3.6]# ip addr del 172.25.70.100/24 dev eth0
[root@server1 keepalived]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
2721671190@qq.com #接收警报的 email 地址,可以添加多个
}
notification_email_from keepalived@server1.example.com #设置邮件的发送地址
smtp_server 127.0.0.1 #设置 smtp server 地址
smtp_connect_timeout 30 #设置连接 smtp 服务器超时时间
router_id LVS_DEVEL #load balancer 的标识 ID,用于 email 警报
}
vrrp_instance VI_1 {
state MASTER #该服务器的状态为master
interface eth0 #高可用监测的网络接口
virtual_router_id 51 #主、备机的 virtual_router_id 必须相同,取值 0-255
priority 100 #主机的优先级,备份机改为 50,主机优先级一定要大于备机
advert_int 1 #主备之间的通告间隔秒数
authentication { #主备切换时的验证
auth_type PASS #设置验证类型,主要有 PASS 和 AH 两种
auth_pass 1111 #设置验证密码,在一个 vrrp_instance 下,MASTER 与 BACKUP 必须使用相同的密码才能正常通信
}
virtual_ipaddress { #设置虚拟 IP 地址,可以设置多个虚拟 IP 地址,每行一个
172.25.70.100
}
}
virtual_server 172.25.70.100 80 { #定义虚拟服务器
delay_loop 6 #每隔 6 秒查询 realserver 状态
lb_algo rr #lvs 调度算法,这里使用轮叫
lb_kind DR #LVS 是用 DR 模式
#persistence_timeout 50
protocol TCP #指定转发协议类型,有 tcp 和 udp 两种
real_server 172.25.70.2 80 { #realserve 的状态检测设置部分,单位是秒
weight 1
TCP_CHECK {
connect_timeout 3 #10 秒无响应超时
nb_get_retry 3 #重试次数
delay_before_retry 3 #重试间隔
}
}
real_server 172.25.70.3 80 { #realserve 的状态检测设置部分,单位是秒
weight 1
TCP_CHECK {
connect_timeout 3 #10 秒无响应超时
nb_get_retry 3 #重试次数
delay_before_retry 3 #重试间隔
}
}
}
注意:persistence_timeout 表示会话保持时间,单位是秒,这个选项对于动态网页是非常有用的,为集群系统中 session 共享提供了一个很好的解决方案。有了这个会话保持功能,用户的请求会被一直分发到某个服务节点,直到超过这个会话保持时间。需要注意的是,这个会话保持时间,是最大无响应超时时间,也就是说用户在操作动态页面时,如果在 50 秒内没有执行任何操作,那么接下来的操作会被分发到另外节点,但是如果一直在操作动态页面,则不受 50 秒的时间限制。
[root@server1 keepalived]# /etc/init.d/keepalived restart #重启服务
我们说keepalived可以自动添加vip,并具有安全检查的功能,即后端的服务器挂掉,可以检测出来,来测试一下
成功添加上vip
自动安全检查
[root@server2 ~]# /etc/init.d/httpd stop #down掉后端一台服务器
[root@server1 keepalived]# ipvsadm -Ln #在活跃的rs中没有server2的ip
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.25.70.100:80 rr
-> 172.25.70.3:80 Route 1 0 0
这样我们在测试机上就只能访问到server3的apache网页信息
[root@foundation70 keepalived]# curl 172.25.70.100
the page from server3
[root@foundation70 keepalived]# curl 172.25.70.100
the page from server3
而如果没有keepalived,后端一台服务器挂掉结果
[root@server1 keepalived]# /etc/init.d/keepalived stop
[root@server2 ~]# /etc/init.d/httpd stop
[root@foundation70 keepalived]# curl 172.25.70.100 #结果是都不能访问
curl: (7) Failed connect to 172.25.70.100:80; No route to host
You have new mail in /var/spool/mail/kiosk
3.高可用
我们假设这么一种情况,如果部署keepalived的服务器(即本实验的server1挂掉)那么很显然,我们后端的服务器将都不能访问,为了解决这种问题,下面实验我们要做主备模式的keepalived,实现高可用。
[root@server1 local]# scp -r keepalived/ server4:/usr/local/
[root@server4 ~]# ln -s /usr/local/keepalived/sbin/keepalived /sbin/
[root@server4 ~]# ln -s /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
[root@server4 ~]# ln -s /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
[root@server4 ~]# ln -s /usr/local/keepalived/etc/keepalived/ /etc/
[root@server4 ~]# chmod +x /etc/init.d/keepalived
[root@server4 ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
2721671190@qq.com #接收警报的 email 地址,可以添加多个
}
notification_email_from keepalived@server1.example.com #设置邮件的发送地址
smtp_server 127.0.0.1 #设置 smtp server 地址
smtp_connect_timeout 30 #设置连接 smtp 服务器超时时间
router_id LVS_DEVEL #load balancer 的标识 ID,用于 email 警报
}
vrrp_instance VI_1 {
state ABCKUP #该服务器的状态为master
interface eth0 #高可用监测的网络接口
virtual_router_id 51 #主、备机的 virtual_router_id 必须相同,取值 0-255
priority 50 #主机的优先级,备份机改为 50,主机优先级一定要大于备机
advert_int 1 #主备之间的通告间隔秒数
authentication { #主备切换时的验证
auth_type PASS #设置验证类型,主要有 PASS 和 AH 两种
auth_pass 1111 #设置验证密码,在一个 vrrp_instance 下,MASTER 与 BACKUP 必须使用相同的密码才能正常通信
}
virtual_ipaddress { #设置虚拟 IP 地址,可以设置多个虚拟 IP 地址,每行一个
172.25.70.100
}
}
virtual_server 172.25.70.100 80 { #定义虚拟服务器
delay_loop 6 #每隔 6 秒查询 realserver 状态
lb_algo rr #lvs 调度算法,这里使用轮叫
lb_kind DR #LVS 是用 DR 模式
#persistence_timeout 50
protocol TCP #指定转发协议类型,有 tcp 和 udp 两种
real_server 172.25.70.2 80 { #realserve 的状态检测设置部分,单位是秒
weight 1
TCP_CHECK {
connect_timeout 3 #10 秒无响应超时
nb_get_retry 3 #重试次数
delay_before_retry 3 #重试间隔
}
}
real_server 172.25.70.3 80 { #realserve 的状态检测设置部分,单位是秒
weight 1
TCP_CHECK {
connect_timeout 3 #10 秒无响应超时
nb_get_retry 3 #重试次数
delay_before_retry 3 #重试间隔
}
}
}
[root@server4 ~]# /etc/init.d/keepalived start
Starting keepalived: [ OK ]
[root@server4 ~]# yum install ipvsadm -y
[root@server4 ~]# ipvsadm -Ln #策略因为配置文件自动添加
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.25.70.100:80 rr
-> 172.25.70.2:80 Route 1 0 0
-> 172.25.70.3:80 Route 1 0 0
[root@server1 local]# /etc/init.d/keepalived stop #挂掉server1的keepalived
[root@foundation70 keepalived]# curl 172.25.70.100 #成功访问server2&&server3,并且是轮叫模式
the page from server3
[root@foundation70 keepalived]# curl 172.25.70.100
the page from server2
[root@foundation70 keepalived]# arp -an | grep 100 #查看该vip处于的mac地址
? (172.25.70.100) at 52:54:00:5f:de:54 [ether] on br0
You have new mail in /var/spool/mail/kiosk
和server4的mac地址一致。证明server4的keepalived生效
打开master的keepalived服务
[root@server1 local]# /etc/init.d/keepalived start
Starting keepalived: [ OK ]
再次访问server2&&server3,并查看mac地址,发现mac地址改变
来验证一下是否为serevr1的mac地址
证明主备模式的作用,当master恢复的时候,由于权值比较大的关系,所以是通过master的作用将数据包传递给后端的rs。