keepalive集群(负载均衡)
LB–负载均衡集群
1、 LB 集群通过将客户端请求分发至多个服务器 , 以达到负载均衡的效果
2、 最简单的 LB 集群系统可通过 DNS 来进行配置
3、 目前在 LINUX 系统下使用最为广泛的 LB 集群系统为 LVS
4、 除了软件 LB 系统外很多厂商也提供了硬件的 LB 设备
LVS
LVS 是由电子科技大学的章文嵩博士创立的基于 LINUX 内核的负载均衡技术, 1998年 5 月发布第一个版本。 LVS 是由中国人发起的最著名的 LINUX 项目。 LVS 可以兼容目前大多数的网络服务,具备高可用性和高伸缩性的特征,易于管理。
LVS 的地址概念
CIP :客户端 IP
DGW :默认网关
VIP :虚拟 IP ,用于客户端访问服务
PIP :私有 IP ,用于管理员直接访问服务器
SIP :用于高可用 LVS 中的服务器心跳备份
DIP : LVS 调度器 IP 用于访问真实服务器
RIP :真实服务器 IP
LVS 的三种路由方式
1、 Virtual Server via Network Address Translation(VS-NAT)
2、 Virtual Server via Direct Routing(VS-DR)
3、 Virtual Server via IP Tunneling(VS-TUN)
主要用的是VS-DR
VSDR 直接路由方式
1、 LVS-DR 基于 IBM 的 NetDispatcher 设计
2、 LVS-DR 的数据包流向如下所示
CIP-DGW-VIP-RIP-DGW-CIP
3、 LVS-DR 能够同时处理大量的客户端请求,多用于大量真实服务器或频繁更新的服务。
防火墙接到包直接发给172.16.0.250的VIP,但是有3个,所以要做ARP抑制。2个RIP就不能直接收到这个包,包是PIP发给某个RIP的。
回包时直接给防火墙。返回给客户端。
调度算法:https://blog.csdn.net/n_u_l_l_/article/details/103687500
具体实现:
172.16.12.110 VIP
172.16.12.111 RIP1
172.16.12.112 RIP2
172.16.12.113 PIP
172.16.12.114 SIP
RIP配置:
【1】安装apazhe并写测试页。
[aaa@qq.comrip1 ~]# yum install httpd -y
[aaa@qq.comrip1 ~]# cd /var/www/html/
[aaa@qq.comrip1 html]# echo -e "<h1>RIP1<h1>\n<h1>172.16.12.111<h1>" >> index.html
[aaa@qq.comrip1 html]# systemctl restart httpd
[aaa@qq.comrip1 html]# systemctl enable httpd
[aaa@qq.comrip2 ~]# yum install httpd -y
[aaa@qq.comrip2 ~]# cd /var/www/html/
[aaa@qq.comrip2 html]# echo -e "<h1>RIP2<h1>\n<h1>172.16.12.112<h1>" >> index.html
[aaa@qq.comrip2 html]# systemctl restart httpd
[aaa@qq.comrip2 html]# systemctl enable httpd
【2】绑定VIP
绑定IP用本地回环地址,因为在DR的路由架构中有3个VIP相同的情况。所以讲本地回环地址的IP设为VIP,并且广播地址也设为VIP,自己发出的广播只有自己能够收到,这样就能实现多个IP相同的绑定了。
[aaa@qq.comrip1 html]# cd /etc/sysconfig/network-scripts/
[aaa@qq.comrip1 network-scripts]# cp ifcfg-lo ifcfg-lo:0
[aaa@qq.comrip1 network-scripts]# vim ifcfg-lo\:0
DEVICE=lo:0 //名字
IPADDR=172.16.12.110 //IP地址
NETMASK=255.255.255.255 //子网掩码,设置成这样广播地址才能是下边的。
BROADCAST=172.16.12.110 //广播地址
ONBOOT=yes
NAME=loopback:0
[aaa@qq.comrip1 network-scripts]# systemctl restart network
[aaa@qq.comrip1 network-scripts]# ifconfig
lo:0: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 172.16.12.110 netmask 255.255.255.255
loop txqueuelen 1 (Local Loopback)
能看到这个lo:0就是ok了
[aaa@qq.comrip2 html]# cd /etc/sysconfig/network-scripts/
[aaa@qq.comrip2 network-scripts]# cp ifcfg-lo ifcfg-lo:0
[aaa@qq.comrip2 network-scripts]# vim ifcfg-lo\:0
[aaa@qq.comrip2 network-scripts]# systemctl restart network
[aaa@qq.comrip2 network-scripts]# ifconfig
lo:0: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 172.16.12.110 netmask 255.255.255.255
loop txqueuelen 1 (Local Loopback)
RIP2 的修改和1 一样。
【3】抑制ARP广播
拦截到达本机的ARP包。
[aaa@qq.comrip1 network-scripts]# cd /etc/
[aaa@qq.comrip1 etc]# vim sysctl.conf
//写这几行
net.ipv4.conf.lo.arp_ignore=1
net.ipv4.conf.all.arp_ignore=1
net.ipv4.conf.lo.arp_announce=2
net.ipv4.conf.all.arp_announce=2
[aaa@qq.comrip1 etc]# sysctl -p //重启配置文件
[aaa@qq.comrip2 network-scripts]# vim /etc/sysctl.conf
[aaa@qq.comrip2 network-scripts]# sysctl -p
RIP2 也这样写。
PIP配置:
装包:
[aaa@qq.compip ~]# yum install keepalived ipvsadm -y
获取RIP的测试页的md5校验和:
[aaa@qq.compip ~]# genhash -s 172.16.12.111 -p 80 -u /index.html
MD5SUM = a880aa463404771cd6dbe0bef99825f1
[aaa@qq.compip ~]# genhash -s 172.16.12.112 -p 80 -u /index.html
MD5SUM = 27fe5a14e7f53b33224afd01c0e50c8b
这个一会要用。
修改配置文件:
! Configuration File for keepalived
global_defs {
router_id LB_Apache_love
}
vrrp_sync_group VG1{
group {
VI_1
}
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 12
priority 100
advert_int 1
nopreempt
authentication {
auth_type PASS
auth_pass lbapache
}
virtual_ipaddress {
172.16.12.110 dev ens33 label ens33:0
}
}
virtual_server 172.16.12.110 80 { //VIP的地址和端口
delay_loop 6 //延迟时间,秒
lb_algo wlc //调度算法
lb_kind DR //路由算法
persistence_timeout 50 //持久化时间,秒
protocol TCP //协议
real_server 172.16.12.111 80 { // RIP的地址和端口
weight 10 //权重
HTTP_GET {
url {
path /index.html
digest a880aa463404771cd6dbe0bef99825f1 //获取到的测试页的md5校验和
}
connect_timeout 3 //连接RIP的超时时间,秒
nb_get_retry 3 //重试的次数
delay_before_retry 3 //重试的时间间隔
}
}
real_server 172.16.12.112 80 {
weight 10
HTTP_GET {
url {
path /index.html
digest 27fe5a14e7f53b33224afd01c0e50c8b
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
然后重启服务:
[aaa@qq.compip ~]# systemctl restart keepalived.service
[aaa@qq.compip ~]# echo "systemctl restart keepalived" >> /etc/rc.local
[aaa@qq.compip ~]# chmod +x /etc/rc.d/rc.local
[aaa@qq.compip ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.16.12.110:http wlc persistent 50
-> 172.16.12.111:http Route 10 0 0
-> 172.16.12.112:http Route 10 0 0
看到地址了,然后在另外的一个机器访问这个VIP
[aaa@qq.comkickstart-server ~]# curl 172.16.12.110
<h1>RIP2<h1>
<h1>172.16.12.112<h1>
[aaa@qq.comkickstart-server ~]# curl 172.16.12.110
<h1>RIP2<h1>
<h1>172.16.12.112<h1>
[aaa@qq.comkickstart-server ~]# curl 172.16.12.110
<h1>RIP2<h1>
<h1>172.16.12.112<h1>
发现都是2 因为配置了持久化时间,在一定时间内客户端访问只能访问到同一个服务端。
SIP配置:
[aaa@qq.compip ~]# scp /etc/keepalived/keepalived.conf 172.16.12.114:/etc/keepalived/
直接将配置文件拷贝过去
[aaa@qq.comsip keepalived]# systemctl restart keepalived.service
[aaa@qq.comsip keepalived]# echo "systemctl restart keepalived" >> /etc/rc.local
[aaa@qq.comsip keepalived]# chmod +x /etc/rc.d/rc.local
[aaa@qq.comsip 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 172.16.12.110:80 wlc persistent 50
-> 172.16.12.111:80 Route 10 0 0
-> 172.16.12.112:80 Route 10 0 0
直接重启服务,就可以了
测试高可用性:
1、keepalive停止服务:
[aaa@qq.compip ~]# ifconfig ens33:0
ens33:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.16.12.110 netmask 255.255.255.255 broadcast 0.0.0.0
ether 00:0c:29:2e:fc:fb txqueuelen 1000 (Ethernet)
有浮动IP
然后就发现浮动IP到SIP上了。
[aaa@qq.comsip keepalived]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.16.12.114 netmask 255.255.0.0 broadcast 172.16.255.255
inet6 fe80::20c:29ff:fe02:3d36 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:02:3d:36 txqueuelen 1000 (Ethernet)
RX packets 14938 bytes 11172613 (10.6 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 4742 bytes 375026 (366.2 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ens33:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.16.12.110 netmask 255.255.255.255 broadcast 0.0.0.0
ether 00:0c:29:02:3d:36 txqueuelen 1000 (Ethernet)
2、PIP重启服务,SIP重新启动系统
[aaa@qq.compip ~]# systemctl restart keepalived.service
[aaa@qq.comsip keepalived]# reboot
[aaa@qq.compip ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.16.12.113 netmask 255.255.0.0 broadcast 172.16.255.255
inet6 fe80::20c:29ff:fe2e:fcfb prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:2e:fc:fb txqueuelen 1000 (Ethernet)
RX packets 22003 bytes 11712938 (11.1 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 8046 bytes 714491 (697.7 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ens33:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.16.12.110 netmask 255.255.255.255 broadcast 0.0.0.0
ether 00:0c:29:2e:fc:fb txqueuelen 1000 (Ethernet)
浮动IP又到PIP上了。
3、重启PIP:
PIPreboot
SIP
[aaa@qq.comsip ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.16.12.114 netmask 255.255.0.0 broadcast 172.16.255.255
inet6 fe80::20c:29ff:fe02:3d36 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:02:3d:36 txqueuelen 1000 (Ethernet)
RX packets 301 bytes 23458 (22.9 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 103 bytes 10907 (10.6 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ens33:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.16.12.110 netmask 255.255.255.255 broadcast 0.0.0.0
ether 00:0c:29:02:3d:36 txqueuelen 1000 (Ethernet)
浮动IP又到SIP上了
测试负载均衡:
[aaa@qq.comkickstart-server ~]# curl 172.16.12.110
<h1>RIP2<h1>
<h1>172.16.12.112<h1>
访问的是RIP2。于是停掉RIP2 的服务。
[aaa@qq.comrip2 network-scripts]# systemctl stop httpd
再次访问会先出一点错误,然后转移到RIP1上
[aaa@qq.comkickstart-server ~]# curl 172.16.12.110
curl: (7) Failed connect to 172.16.12.110:80; Connection refused
[aaa@qq.comkickstart-server ~]# curl 172.16.12.110
<h1>RIP1<h1>
<h1>172.16.12.111<h1>
转发另一组web-server
VIP:172.16.12.110
Nginx1:172.16.12.104:8000
Nginx2:172.16.12.105:8000
注意,要想转发另一组WEBserver,他们的VIP要相同,但是端口不同才行。
2个Nginx依旧是和Apache的一样 ,绑定VIP
[aaa@qq.comjq-nginx1 network-scripts]# cp ifcfg-lo ifcfg-lo:0
[aaa@qq.comjq-nginx1 network-scripts]# vim ifcfg-lo\:0
[aaa@qq.comjq-nginx1 network-scripts]# ifconfig
lo:0: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 172.16.12.110 netmask 255.255.255.255
写测试页。
[aaa@qq.comjq-nginx1 network-scripts]# cd /usr/local/nginx/html/
[aaa@qq.comjq-nginx1 html]# echo "<h1>RIP1 nginx 172.16.12.104<h1>" >> check.html
[aaa@qq.comjq-nginx2 network-scripts]# cd /usr/local/nginx/html/
[aaa@qq.comjq-nginx2 html]# echo "<h1>RIP2 nginx 172.16.12.105<h1>" >> check.html
改端口为8000
PIP获取RIP的测试页的md5校验和:
[aaa@qq.compip ~]# genhash -s 172.16.12.104 -p 8000 -u /check.html
MD5SUM = 6cfccefee769cd3a407c65afca5d6a56
[aaa@qq.compip ~]# genhash -s 172.16.12.105 -p 8000 -u /check.html
MD5SUM = c1c6ce6a7a5304599229e081e111f54c
修改配置文件:
virtual_server 172.16.12.110 8000 {
delay_loop 6
lb_algo wlc
lb_kind DR
persistence_timeout 50
protocol TCP
real_server 172.16.12.104 8000 {
weight 10
HTTP_GET {
url {
path /check.html
digest 6cfccefee769cd3a407c65afca5d6a56
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 172.16.12.105 8000 {
weight 10
HTTP_GET {
url {
path /check.html
digest c1c6ce6a7a5304599229e081e111f54c
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
查看配置情况:
[aaa@qq.compip ~]# ipvsadm
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.16.12.110:http wlc persistent 50
-> 172.16.12.111:http Route 10 0 0
-> 172.16.12.112:http Route 10 0 0
TCP 172.16.12.110:irdmi wlc persistent 50
-> 172.16.12.104:irdmi Route 10 0 0
-> 172.16.12.105:irdmi Route 10 0 0
直接测试。
第四部分:
虚拟服务器virtual_server定义块 ,虚拟服务器定义是keepalived框架最重要的项目了,是keepalived.conf必不可少的部分。 该部分是用来管理LVS的,是实现keepalive和LVS相结合的模块。ipvsadm命令可以实现的管理在这里都可以通过参数配置实现,注意:real_server是被包含在viyual_server模块中的,是子模块。
virtual_server 192.168.202.200 23 { //VIP地址,要和vrrp_instance模块中的virtual_ipaddress地址一致
delay_loop 6 //健康检查时间间隔
lb_algo rr #lvs调度算法rr|wrr|lc|wlc|lblc|sh|dh
lb_kind DR #负载均衡转发规则NAT|DR|RUN
persistence_timeout 5 //会话保持时间
protocol TCP #使用的协议
persistence_granularity <NETMASK> //lvs会话保持粒度
virtualhost <string> //检查的web服务器的虚拟主机(host:头)
sorry_server<IPADDR> <port> //备用机,所有realserver失效后启用
real_server 192.168.200.5 23 { //RS的真实IP地址
weight 1 //默认为1,0为失效
inhibit_on_failure //在服务器健康检查失效时,将其设为0,而不是直接从ipvs中删除
notify_up <string> | <quoted-string> //在检测到server up后执行脚本
notify_down <string> | <quoted-string> //在检测到server down后执行脚本
TCP_CHECK { //常用
connect_timeout 3 //连接超时时间
nb_get_retry 3 //重连次数
delay_before_retry 3 //重连间隔时间
connect_port 23 //健康检查的端口的端口
bindto <ip>
}
HTTP_GET | SSL_GET{ //不常用
url{ #检查url,可以指定多个
path /
digest <string> //检查后的摘要信息
status_code 200 //检查的返回状态码
}
connect_port <port>
bindto <IPADD>
connect_timeout 5
nb_get_retry 3
delay_before_retry 2
}
SMTP_CHECK{ //不常用
host{
connect_ip <IP ADDRESS>
connect_port <port> //默认检查25端口
bindto <IP ADDRESS>
}
connect_timeout 5
retry 3
delay_before_retry 2
helo_name <string> | <quoted-string> //smtp helo请求命令参数,可选
}
MISC_CHECK{ //不常用
misc_path <string> | <quoted-string> //外部脚本路径
misc_timeout //脚本执行超时时间
misc_dynamic
如设置该项,则退出状态码会用来动态调整服务器的权重,返回0 正常,不修改;返回1,
检查失败,权重改为0;返回2-255,正常,权重设置为:返回状态码-2
}
}
上一篇: 关系代数符号:σ π ⋈ ⟗ ⟕ ⟖ × ÷ ∪ ∩ −
下一篇: 16.集群