一 场景引入1
我们知道LVS仅仅是做根据调度算法和策略来做负载均衡的,LVS本身只是调度后端服务器,并不管后端服务器的死活,想想这样一个场景:如果由于由于某种原因,后端服务器挂掉,而调度服务器却不知道,还一个劲头的给其发送请求,后端服务器此时不响应数据,而客户端会处于等待的状态(直到超时),客户体验不好!
说明:后续有时间了再模拟这个场景(后端某个服务关闭,观察实验现象)!
引出了我们今天要讲解的心跳检查(heartbeat),通俗点就是前端服务器检查后端服务器的存活,进而采取某种策略!
说明:由于DR模式最常见,所以我们以此种模式进行讲解!
二 lvs+directord
(1)directord的简单理解
directord 对lvs策略的动态维护:ldirectord是监视集群节点(真实服务器),并从集群中自动移除节点,我们需要使用ldirectord程序,这个程序在启动时自动建立IPVS表(不用手动建立了),然后监视集群节点的健康情况,在发现失效节点时将其自动从IPVS表中移除。
(1)第一次安装出现的问题
yum install -y ldirectord-3.9.5-3.1.x86_64.rpm
Error: Package: ldirectord-3.9.5-3.1.x86_64 (/ldirectord-3.9.5-3.1.x86_64)
Requires: resource-agents
说明:安装包从官网下载即可!
原因:没有使用系统自带的高可用套件,缺乏依赖,yum源进行配置(所需安装软件在光盘上就可以,不需要额外配置yum源!
# 自带附加高可用源
[HighAvailability]
name="HighAvailability"
baseurl=http://172.25.2.250/rhel7.3/addons/HighAvailability
gpgcheck=0
(2)正式安装
yum install -y ldirectord-3.9.5-3.1.x86_64.rpm
rpm -ql ldirectord-3.9.5-3.1.x86_64 # 查询
cp /usr/share/doc/ldirectord-3.9.5/ldirectord.cf /etc/ha.d/
(3)编写配置文件
# 虚拟VIP-->核心配置文件!
virtual=172.25.2.100:80
real=172.25.2.201:80 gate
real=172.25.2.202:80 gate
fallback=127.0.0.1:80 gate
service=http
scheduler=rr
#persistent=600
#netmask=255.255.255.255
protocol=tcp
checktype=negotiate
checkport=80
request="index.html"
# 注意:一定要将其注释!
#receive="Test Page"
#virtualhost=www.x.y.z
检测:开启ldirectord服务,然后通过ipvsadm -l 来看是否有IPVS表的规则!
注意:还是手动写VIP,只是通过配置文件的形式帮助我们生成ipvs规则表!
补充:还得手动开启服务!
理解:并不管理资源!
ip addr add 172.25.2.100/24 dev eth0 #配置VIP(由于是DR模式,所以三个都需要配置)
(4)后端服务器的配置
VIP(手动配置)和ARP策略
arptables -A INPUT -d 172.25.2.100 -j DROP
arptables -A OUTPUT -s 172.25.2.100 -j mangle --mangle-ip-s 172.25.2.201
# 两个后端服务器一样
注意:服务必须自己开启!
(5)测试
测试1:两个后端服务器均开启Apach服务,然后客户端测试看是否轮询!
测试2:其中一个后端服务器关闭服务,观察此服务器是否被IPVS表移出,以及客户端测试的内容!
测试3:其中一个后端服务器有开启服务,观察此服务器是否被IPVS表添加,以及客户端测试的内容!
测试4:前端服务器也安装httpd软件,并开启服务,看后端服务器挂掉的时候,前端服务器会不会顶上去!
说明:在其它后端服务器都挂了的情况下,前端调度器也可以作为临时服务器,但是一般时间很短!
二:场景引入
假如:lvs调度服务器挂掉了呢,是不是整个就瘫痪了,怎么办?总得防患于未然,添加lvs的备用机,如何监控呢?
引入:我们今天要讲解的keepalived
注意:做实验之前一定要事先关闭selinux和firewalld !
(1)源码编译安装
#(1)说明:第三方的包-->源码安装
# 最好进入一个目录!
tar -zxf keepalived-2.0.6.tar.gz
cd keepalived-2.0.6
#(2)安装依赖的软件
yum install gcc openssl-devel -y
#(3)编译-->6|7的区别
./configure --prefix=/usr/local/keepalived --with-init=systemd
#核心:Use IPVS Framework是否是Yes
#(4)安装
make && make install
#(5)进入对应的目录-->设置软链接
cd /usr/local/keepalived/
ln -s /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
ln -s /usr/local/keepalived/etc/keepalived/ /etc/
ln -s /usr/local/keepalived/sbin/keepalived /sbin/
#(6)安装邮件软件
yum install -y mail #看是否发生报错信息!
# 说明:用的也是高可用的包!
说明:主和备用的安装方式一致!
(2) 对配置文件进行配置
安装之前做一些清理工作
1)IPVS规则的清理(-C)
2)VIP的手动删除--->会自动生成此VIP
配置文件参数的说明!
# 全局配置
global_defs {
notification_email {
#(1)节点宕机了给谁发送邮件!-->本机的root用户(安装mail软件,看是否发送邮件)
root@localhost
}
#(2)发送人的名称
notification_email_from keeplived@loclhost
#(3)发送的服务器-->本机
smtp_server 172.0.0.1
#(4)指定smtp连接超时时间
smtp_connect_timeout 30
router_id LVS_DEVEL
#(5)运行keepalived机器的一个标识!
vrrp_skip_check_adv_addr
#(6)必须注释
#vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
#(1)主节点的标识
state MASTER #BACKUP(备用的标识)
interface eth0
#(2)说明:主和备用的必须一致
virtual_router_id 51
#(3)优先级,越大越优先启动
priority 100 #说明:备用的必须小于100
advert_int 1 # 检查间隔
authentication {
auth_type PASS #认证方式(密码认证)
auth_pass 1111 #认证的密码
}
#(4)虚拟VIP-->不用手动创建(可以创建多个,对应不同的服务)
virtual_ipaddress {
172.25.2.100
}
}
# 虚拟服务的相关配置-->理解成IPVS表规则
virtual_server 172.25.2.100 80 {
delay_loop 6 # 当rs报错时候,尝试多少次之后才会发送邮件告知!
lb_algo rr # 负载均衡的算法(10种)
lb_kind DR # 默认时NAT模式(这里选择DR)
#persistence_timeout 50 #注释(保持连接的时间)
protocol TCP
real_server 172.25.2.201 80 {
TCP_CHECK {
connect_port 80
weight 1
connect_timeout 3
}
}
real_server 172.25.2.202 80 {
TCP_CHECK {
connect_port 80
weight 1
connect_timeout 3
}
}
}
说明:备用只修改state和proprity
后端服务器的配置
ip addr add 172.25.2.100/24 dev eth0
arptables -A INPUT -d 172.25.2.100 -j DROP
arptables -A OUTPUT -s 172.25.2.100 -j mangle --mangle-ip-s 172.25.2.201
注意:要配置VIP,因为后端服务器和前端控制器是想对独立的
重启之后的现象-->主
备用
测试1:后端服务器关闭和开启,看IPVS表的变化
说明:这里省略
测试2:主LB关闭keepalived服务,看IPVS表和VIP的走向
测试3:主LB开启keeplalived服务
说明:keepalived备机在主机宕机的情况会自动接管了资源,但待keepalived主机恢复正常的时候,主机会重新接管资源!
小知识:IP/32表示是一个集群!
补充测试:看mail是否有邮件发送