欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

keepalive集群(负载均衡)

程序员文章站 2022-05-07 15:42:15
...

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)

keepalive集群(负载均衡)

主要用的是VS-DR
VS­DR 直接路由方式
1、 LVS-DR 基于 IBM 的 NetDispatcher 设计
2、 LVS-DR 的数据包流向如下所示
CIP-DGW-VIP-RIP-DGW-CIP
3、 LVS-DR 能够同时处理大量的客户端请求,多用于大量真实服务器或频繁更新的服务。

keepalive集群(负载均衡)
防火墙接到包直接发给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:

PIP
reboot

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 

直接测试。

keepalive集群(负载均衡)

第四部分:

虚拟服务器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
}
}
相关标签: 集群