实验环境:
操作系统: redhat EL 6.5
机器:
调度器:
server1: 172.25.12.1 ipvsadm
RS 真正主机:
server2: 172.25.12.2 arptables_jf
server3: 172.25.12.3 arptables_jf
客户端去访问vip(虚拟ip),整个集群所有的机器上都有这个vip,但是客户端只能访问到调度机上的vip(RS上做了arp策略)通过调度机上的ipvsadm策略将client发来的数据包的目标mac地址一改(由调度器改为RS),扔给后台的RSRS处理完数据后,再将数据包发送给client(ip是vip,mac是自己的mac)
调度机上的ipvsadm策略是osi模型第二层数据链路层的策略,更改了mac地址,不会对第三层网络层的ip做更改,当数据包被扔给RS之后, 在OSI模型从下往上解包,到第三层ip层时,发现目地ip是vip,如果RS上不添加VIP的话,RS就会将这个包扔掉,因为与自己的ip不匹配
RS上做的arptables策略是为了实现 none VIP , 其实并不冲突,这都是在第二层与第三层之间的策略,RS上做两条策略:
第一条:当网络里有人发送arp请求询问VIP对应的mac地址时,RS不予回应
第二条:从本机上出去的所有arp回应,或者是arp包,注意,只是arp包,因为是arptables策略,如果是VIP发出的(RS上两个ip,一个VIP,一个RIP),都将它转换为RIP
这块要注意的是在网络里,数据包都是先以mac地址(第二层)为目标进行传输的,到达目的地后,一层一层往上解包,进行匹配,第三层匹配ip,第四层匹配端口,等等….只要有一层不匹配,这个包都会被扔掉,或者拒绝
配置:
调度机:
server1:
先修改yum源:
baseurl改成自己的镜像挂载点,这都是镜像里的文件,默认不读,要主动写进去
[root@server1 ~]# cat /etc/yum.repos.d/rhel-source.repo
[Server]
name=Red Hat Enterprise Linux $releasever - $basearch - Source
baseurl=http://172.25.6.250/source6.5
enabled=1
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
[HighAvailability]
name=HighAvailability
baseurl=http://172.25.6.250/source6.5/HighAvailability
gpgcheck=0
[LoadBalancer]
name=LoadBalancer
baseurl=http://172.25.6.250/source6.5/LoadBalancer
gpgcheck=0
[ResilientStorage]
name=ResilientStorage
baseurl=http://172.25.6.250/source6.5/ResilientStorage
gpgcheck=0
[ScalableFileSystem]
name=ScalableFileSystem
baseurl=http://172.25.6.250/source6.5/ScalableFileSystem
gpgcheck=0
配置:
#添加vip
ip addr add 172.25.6.100/24 dev eth0
#安装ipvsadm
yum install -y ipvsadm.x86_64
#设置ipvsadm策略
#-A是增加一台新的虚拟服务器(调度器) -s 是选择算法 rr是轮询
ipvsadm -A -t 172.25.6.100:80 -s rr
#-a是在虚拟服务器(调度器)后面加一台真正主机 -r 是真正主机 -g是工作方式为直接路由
ipvsadm -a -t 172.25.6.100:80 -r 172.25.6.2:80 -g
ipvsadm -a -t 172.25.6.100:80 -r 172.25.6.3:80 -g
#保存ipvsadm策略
/etc/init.d/ipvsadm save
#查看ipvsadm策略
ipvsadm -ln
RS(真正主机)配置:
server2:
#添加vip,不然数据包不能到达osi模型高层
ip addr add 172.25.6.100/24 dev eth0
#安装arptables
yum install arptables_jf -y
#安装apache
yum install -y httpd
cd /var/www/html/
echo server1 > index.html
/etc/init.d/httpd start
#配置arp策略
#拒绝网络里对于vip的arp请求
arptables -A IN -d 172.25.6.100 -j DROP
#将本机上从vip出去的arp数据包改为从RIP出去
arptables -A OUT -s 172.25.6.100 -j mangle --mangle-ip-s 172.25.6.2
server3:
ip addr add 172.25.6.100/24 dev eth0
yum install arptables_jf
cd /var/www/html/
vim index.html
arptables -A IN -d 172.25.6.100 -j DROP
arptables -A OUT -s 172.25.6.100 -j mangle --mangle-ip-s 172.25.6.3
/etc/init.d/httpd start
测试:
[root@groot ~]# curl 172.25.6.100
server2
[root@groot ~]# curl 172.25.6.100
server3
[root@groot ~]# curl 172.25.6.100
server2
[root@groot ~]# curl 172.25.6.100
server3
观察arp包返回的mac地址:
与server1的mac地址一致
但是 lvs没有健康检测
##############lvs高可用负载均衡+keepalived##############
lvs DR模式的配置及工作原理,最后发现它没有健康检测,就是当一台RS挂掉后,它不会将挂掉的那台机器踢除,而是继续向那台机器发送请求.
而keepalived刚好能解决这个问题.
原理:
与lvs原理一致,只是添加了keepalived进行健康检测实现故障排除
keepalived原理:
keepalived的作用是检测服务器的状态,如果有一台web服务器宕机,或工作出现故障,Keepalived将检测到,并将有故障的服务器 从系统中剔除,同时使用其他服务器代替该服务器的工作,当服务器工作正常后Keepalived自动将服务器加入到服务器群中,这些工作全部自动完成
环境:
操作系统: redhat EL 6.5
机器及软件:
server1: 172.25.12.1 VS(虚拟主机) 主 ipvsadm keepalived
server4: 172.25.12.4 VS(虚拟主机) 备 ipvsadm keepalived
server2: 172.25.12.2 RS(真正主机) arptables
server3: 172.25.12.3 RS(真正主机) arptables
keepalived软件包下载:
1.2.24版本(本文所用的版本)
其他版本下载地址
配置:
VS配置:
解压安装keepalived (源码安装)
#解压安装包
tar zxf keepalived-1.2.24.tar.gz
cd keepalived-1.2.24
#解决依赖性
yum install gcc openssl-devel -y
#源码编译 制定安装位置
./configure --prefix=/usr/local/keepalived
#安装
make
make install
keepalived文件配置:
ln -s /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
ln -s /usr/local/keepalived/etc/keepalived /etc
ln -s /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
chmod +x /etc/init.d/keepalived
ln -s /usr/local/keepalives/sbin/keepalived /sbin/
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost ##接受警报的 email 地址,可以添加多个
}
notification_email_from keepalived@server1 ##设置邮箱的发送地址
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 ##备机改为 BACKUP,此状态是由 priority 的值来决定的,当前priority 的值小于备机的值,那么将会失去 MASTER 状态
interface eth0 #HA 监测网络接口
virtual_router_id 6 #主、备机的 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.6.100/24
}
}
virtual_server 172.25.6.100 80 { #定义虚拟服务器
delay_loop 3 #每隔 3 秒查询 realserver 状态
lb_algo rr #lvs 调度算法,这里使用轮叫
lb_kind DR #LVS 是用 DR 模式
# persistence_timeout 50
protocol TCP #指定转发协议类型,有 tcp 和 udp 两种
real_server 172.25.6.2 80 { #配置服务节点
weight 1 #配置服务节点的权值,权值大小用数字表示,数字越大,权值越高,设置权值的大小可以为不同性能的服务器分配不同的负载,可以对性能高的服务器设置较高的权值,而对性能较低的服务器设置相对较低的权值,这样就合理的利用和分配了系统资源
TCP_CHECK { #realserve 的状态检测设置部分,单位是秒
connect_timeout 3 #3 秒无响应超时
nb_get_retry 3 #重试次数
delay_before_retry 3 #重试间隔
}
}
real_server 172.25.6.3 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
注意:
VS只之间是有主备区分的 ,区分之处在于下面这两处
主机 state 是MASTER
备机 state 是BACKUP
主机 priority 值一定要比备机高
state MASTER
priority 100
启动服务:
/etc/init.d/keepalived start
因为RS还没有进行配置,所以我们会收到来自keepalived的邮件,提示我们检测不到真正主机,不过不影响,只要keepalived能正常启动,就说明我们配置已经成功了.
安装ipvsadm 查看状态:
ipvsadm 的安装需要配置yum源
安装ipvsadm:
yum install -y ipvsadm
#查看集群状态
ipvsadm -l
RS配置(与lvs中RS配置一样):
server2:
#添加vip,不然数据包不能到达osi模型高层
ip addr add 172.25.6.100/24 dev eth0
#安装arptables
yum install arptables_jf -y
#安装apache
yum install -y httpd
cd /var/www/html/
echo server1 > index.html
/etc/init.d/httpd start
#配置arp策略
#拒绝网络里对于vip的arp请求
arptables -A IN -d 172.25.6.100 -j DROP
#将本机上从VIP出去的arp数据包改为从RIP出去
arptables -A OUT -s 172.25.6.100 -j mangle --mangle-ip-s 172.25.6.2
server3:
ip addr add 172.25.6.100/24 dev eth0
yum install arptables_jf
cd /var/www/html/
vim index.html
arptables -A IN -d 172.25.6.100 -j DROP
arptables -A OUT -s 172.25.6.100 -j mangle --mangle-ip-s 172.25.6.3
/etc/init.d/httpd start
测试:
1.高可用测试:停止 master 上的 keepalived 服务,看 backup 是否接管。
2. 负载均衡测试:
[kiosk@groot Desktop]$ curl 172.25.6.100
server3
[kiosk@groot Desktop]$ curl 172.25.6.100
server2
[kiosk@groot Desktop]$ curl 172.25.6.100
server3
[kiosk@groot Desktop]$ curl 172.25.6.100
server2
3 故障切换测试:任意关闭 realserver 上的 httpd 服务,Keepalived 监控模块是否能及时发现,然后屏蔽故障节点,同时将服务转移到正常节点来执行。
[kiosk@groot Desktop]$ curl 172.25.6.100
server3
[kiosk@groot Desktop]$ curl 172.25.6.100
server3
[kiosk@groot Desktop]$ curl 172.25.6.100
server3
[kiosk@groot Desktop]$ curl 172.25.6.100
server3