一、准备四台主机
主机名 IP 网关 作用
client10 DIP: 192.168.10.62/24 192.168.10.2 主LVS
VIP: 192.168.10.111/24
client20 DIP: 192.168.10.63/24 192.168.10.2 备LVS
VIP: 192.168.10.111/24
client30 192.168.10.64/24 192.168.10.2 RS1 WEB1
client40 192.168.10.65/24 192.168.10.2 RS2 WEB2
二、配置主节点client10
安装ipvsadm
[root@client10 ~]# yum -y install ipvsadm
安装完不需要做任何配置,启动方式由keepalived控制
安装keepalived
1.yum安装
# yum install -y keepalived
# rpm -ql keepalived-1.3.5-1.el7.x86_64 查看安装路径
2.源码安装
# wget http://www.keepalived.org/software/keepalived-1.2.16.tar.gz
# tar zxvf keepalived-1.2.16.tar.gz
# cd keepalived-1.2.16
解决依赖
# yum -y install gcc openssl-devel libnfnetlink-devel
# ./configure --prefix=/usr/local/keepalived
# make && make install
备份配置文件
[root@client10 ~]# cd /etc/keepalived/
[root@client10 keepalived]# ls
keepalived.conf keepalived.conf.bak
修改配置文件
[root@client10 keepalived]# vim keepalived.conf
1! Configuration File for keepalived
2
3 global_defs {
4 notification_email {
5 root@localhost #默认三个地址,修改可用地址
6 }
7 notification_email_from root@localhost
8 smtp_server localhost
9 smtp_connect_timeout 30
10 router_id client10 #标识当前节点名字,两个节点的此项需要不相同。
11 # vrrp_skip_check_adv_addr
12 # vrrp_strict
13 # vrrp_garp_interval 0
14 # vrrp_gna_interval 0 #这四行注释掉
15 }
16
17 vrrp_instance apache { #定义一个实例,一个集群就是一个实例。 默认VI_1 可以随意改
18 state MASTER #指定 A 节点为主节点 备用节点上设置为 BACKUP 即可
19 interface ens33 #绑定虚拟 IP 的网络接口
20 virtual_router_id 51 #VRRP 组名,两个节点的设置必须一样,以指明各个节点属于同一 VRRP 组
21 priority 100 #主节点的优先级(1-254 之间),备用节点必须比主节点优先级低
22 advert_int 1 #组播信息发送间隔,两个节点设置必须一样
23 authentication { #设置验证信息,两个节点必须一致
24 auth_type PASS
25 auth_pass 1111
26 }
27 virtual_ipaddress {
28 192.168.10.111 #指定虚拟 IP, 两个节点设置必须一样
29 }
30 }
#类似添加虚拟一个服务 ipvsadm -A -t 192.168.10.111 80 -s rr
31 virtual_server 192.168.10.111 80 {
32 delay_loop 6 #Keepalived 多长时间监测一次 RS
33 lb_algo rr #分发算法
34 lb_kind DR #DR 模式
35 persistence_timeout 50 #同一IP50秒内的请求都发到同个real server,这个会影响LVS的 rr 调度算法,
同一 IP 超过 50 秒后,再次访问,才会被转发到另一台 real server 上。 persistence 持久性的意思,测试效果可把时间改为1s
36 protocol TCP
# ipvsadm -a -t 192.168.10.111:80 -r 192.168.10.64 -g 添加的内容,类似这条命令
# ipvsadm -a -t 192.168.10.111:80 -r 192.168.10.65 –g 添加的内容,类似这条命令
37
#配置服务节点1,需要指定 realserver 的真实 IP 地址和端口,IP不端口之间用空格隔开
38 real_server 192.168.10.64 80 {
39 weight 1 #配置服务节点的权值,权值大小用数字表示,数字越大,权值越高,设置权值大小可以为不同性能的服务器
40 TCP_CHECK { #这段内容手动添加,把以前的内容删除
41 connect_timeout 3 #表示 3 秒无响应超时
42 nb_get_retry 3 #表示重试次数
43 delay_before_retry 3 #表示重试间隔
44 connect_port 80 #检测端口
45 }
46 }
47 real_server 192.168.10.65 80 {
48 weight 1
49 TCP_CHECK {
50 connect_timeout 3
51 nb_get_retry 3
52 delay_before_retry 3
53 connect_port 80
54 }
55 }
56 }
其余的模板删除
[root@client10 ~]# systemctl restart keepalived
[root@client10 ~]# systemctl enable keepalived
[root@client10 keepalived]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.10.111:80 rr
realservem 没有启动httpd,所以这里看不到ip
三、配置备用节点client20
安装ipvsadm
安装keepalived
从client10上拷贝配置文件到client20
[root@client10 ]# scp /etc/keepalived/keepalived.conf 192.168.10.63:/etc/keepalived/
router_id client20 #运行 keepalived 的机器标示符
vrrp_instance apache {
state BACKUP #当前 LVS 状态为备用分发器
interface ens32 #修改成本机网卡名
virtual_router_id 51
priority 90 #LVS 优先级,备的要比主的小
[root@client20 ~]# systemctl restart keepalived
[root@client20 ~]# systemctl enable keepalived
四、测试LVS IP漂移
[root@client10 ~]# systemctl stop keepalived
[root@client20 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
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: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:8b:98:8f brd ff:ff:ff:ff:ff:ff
inet 192.168.10.63/16 brd 192.168.255.255 scope global noprefixroute ens32
valid_lft forever preferred_lft forever
inet 192.168.10.111/32 scope global ens32 #.111的ip漂移到了client20上
valid_lft forever preferred_lft forever
inet6 fe80::31c9:6153:d0f6:bc68/64 scope link noprefixroute
valid_lft forever preferred_lft forever
五、配置RS1
[root@client30 ~]# vim /etc/init.d/lvsrsdr #写一个配置RS的脚本
[root@client30 ~]# cat !$
cat /etc/init.d/lvsrsdr
#!/bin/bash
#description:start relserver
VIP=192.168.10.111 #定义变量
source /etc/init.d/functions #加载环境变量(可以加载所有的环境变量)
case $1 in
start)
echo 'start LVS of Realserver DR'
/sbin/ifconfig lo:1 $VIP broadcast $VIP netmask 255.255.255.255 up
/sbin/route add -host $VIP dev lo:1
echo '1' > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo '2' > /proc/sys/net/ipv4/conf/lo/arp_announce
echo '1' > /proc/sys/net/ipv4/conf/all/arp_ignore
echo '2' > /proc/sys/net/ipv4/conf/all/arp_announce
;;
stop)
/sbin/ifconfig lo:1 down
echo 'Close LVS of Realserver DR'
echo '0' > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo '0' > /proc/sys/net/ipv4/conf/lo/arp_announce
echo '0' > /proc/sys/net/ipv4/conf/all/arp_ignore
echo '0' > /proc/sys/net/ipv4/conf/all/arp_announce
;;
*)
echo "Usage:$0 (start|stop)"
exit 1
esac
[root@client30 ~]# chmod +x /etc/init.d/lvsrsdr #给可执行权限
[root@client30 ~]# /etc/init.d/lvsrsdr start #启动脚本
Starting lvsrsdr (via systemctl): [ OK ]
[root@client30 ~]# ifconfig -a
......
lo:1: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 192.168.10.111 netmask 255.255.255.255
loop txqueuelen 1000 (Local Loopback)
[root@client30 ~]# yum install -y httpd
[root@client30 ~]# echo 192.168.10.64 > /var/www/html/index.html
[root@client30 ~]# systemctl restart httpd.service
六、配置RS2
从client30上拷贝脚本到client40
[root@client30 ~]# scp /etc/init.d/lvsrsdr 192.168.10.65:/etc/init.d/
[root@client40 ~]# chmod +x /etc/init.d/lvsrsdr
[root@client40 ~]# /etc/init.d/lvsrsdr start
Starting lvsrsdr (via systemctl): [ OK ]
[root@client40 ~]# ifconfig -a
......
lo:1: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 192.168.10.111 netmask 255.255.255.255
loop txqueuelen 1000 (Local Loopback)
[root@client40 ~]# yum install -y httpd
[root@client40 ~]# echo 192.168.10.65 > /var/www/html/index.html
[root@client40 ~]# systemctl restart httpd
七、测试
测试主备切换,在主上查看client10上的状态
[root@client10 ~]# ip addr
......
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:6c:b9:62 brd ff:ff:ff:ff:ff:ff
inet 192.168.10.62/24 brd 192.168.10.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet 192.168.10.111/32 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe6c:b962/64 scope link
valid_lft forever preferred_lft forever
在备上查看client20的状态
[root@client20 ~]# ip addr
......
2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:8b:98:8f brd ff:ff:ff:ff:ff:ff
inet 192.168.10.63/16 brd 192.168.255.255 scope global noprefixroute ens32
valid_lft forever preferred_lft forever
inet6 fe80::31c9:6153:d0f6:bc68/64 scope link noprefixroute
valid_lft forever preferred_lft forever
在client10上停掉keepalived,模拟故障,再查看client20
[root@client10 ~]# systemctl stop keepalived.service
[root@client20 ~]# ip addr
......
2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:8b:98:8f brd ff:ff:ff:ff:ff:ff
inet 192.168.10.63/16 brd 192.168.255.255 scope global noprefixroute ens32
valid_lft forever preferred_lft forever
inet 192.168.10.111/32 scope global ens32
valid_lft forever preferred_lft forever
inet6 fe80::31c9:6153:d0f6:bc68/64 scope link noprefixroute
valid_lft forever preferred_lft forever
[root@client10 ~]# systemctl restart keepalived.service
重启主上的keepalived,VIP则会自动从备分发器转到主分发器上,因为备的优先级低。
测试RS容错,停掉client40上的httpd之后在client10查看
[root@client10 ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.10.111:80 rr
-> 192.168.10.64:80 Route 1 0 0
client40的ip不在列表中了
[root@client10 ~]# tail -f /var/log/messages
查看日志,可以看到192.168.10.65重连三次失败后被剔除
配置文件模板详解
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost #设置报警邮件地址,即收件人地址
}
notification_email_from admin@localhost #设置邮件的发送地址
smtp_server 127.0.0.1 #设置smtp server的ip地址
smtp_connect_timeout 30 #设置连接smtp server的超时时间
router_id LTT #表示运行keepalived服务器的一个标识名字可以随便取,
名字会显示在发邮件时邮件的主题信息
}
vrrp_instance IN_1 {
state MASTER #指定keepalived的角色,此服务为master
interface ens160 #指定监测网络的接口
virtual_router_id 22 #虚拟路由的标识
priority 100 #定义优先级,数字越大优先级越高,1-255之间
advert_int 1 #设置同步检查的时间间隔,单位是秒
authentication { #设置验证类型
auth_type PASS #验证类型为PASS
auth_pass aaaa #验证的密码
}
virtual_ipaddress {
192.168.2.111 #设置虚拟IP
}
}
virtual_server 192.168.2.111 80 { #定义虚拟服务器,需指定虚拟ip和端口
delay_loop 6 #设置健康检查时间,单位为秒
lb_algo wlc #设置负载调度算法,此处为加权轮叫算法
lb_kind DR #设置LVS实现负载均衡的模式
persistence_timeout 120 #设置会话持续时间
nat_mask 255.255.255.0 # 设置子网掩码
protocol TCP #设置转发协议的类型
real_server 192.168.2.64 80 { #定义realserver,需指定ip和端口
weight 1 #指定权重
HTTP_GET { #设置检测后端realserver的方式为获取http协议报文
url {
path /
status_code 200 #状态码为200则证明后端服务器是在线的
}
connect_timeout 3 #设置超时时间
nb_get_retry 3 #设置超时时候重试几次
delay_before_retry 3 #在重试的时候的时间间隔
}
}
virtual_server 192.168.2.111 8090 { #定义虚拟服务器,需指定虚拟ip和端口
delay_loop 6 #设置健康检查时间,单位为秒
lb_algo wlc #设置负载调度算法,此处为加权轮叫算法
lb_kind DR #设置LVS实现负载均衡的模式
persistence_timeout 120 #设置会话持续时间
nat_mask 255.255.255.0 #设置子网掩码
protocol TCP #设置转发协议的类型
real_server 192.168.2.90 80 { #定义realserver,需指定ip和端口
weight 1 #指定权重
HTTP_GET { #设置检测后端realserver的方式为获取http协议报文
url {
path /
status_code 200 #状态码为200则证明后端服务器是在线的
}
connect_timeout 3 #设置超时时间
nb_get_retry 3 #设置超时时候重试几次
delay_before_retry 3 #在重试的时候的时间间隔
}
}
}