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
VS­DR 直接路由方式
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并写测试页。

[root@rip1 ~]# yum install httpd -y
[root@rip1 ~]# cd /var/www/html/
[root@rip1 html]# echo -e "<h1>RIP1<h1>\n<h1>172.16.12.111<h1>" >> index.html

[root@rip1 html]# systemctl restart httpd 
[root@rip1 html]# systemctl enable httpd
[root@rip2 ~]# yum install httpd -y
[root@rip2 ~]# cd /var/www/html/
[root@rip2 html]# echo -e "<h1>RIP2<h1>\n<h1>172.16.12.112<h1>" >> index.html

[root@rip2 html]# systemctl restart httpd 
[root@rip2 html]# systemctl enable httpd

【2】绑定VIP
绑定IP用本地回环地址,因为在DR的路由架构中有3个VIP相同的情况。所以讲本地回环地址的IP设为VIP,并且广播地址也设为VIP,自己发出的广播只有自己能够收到,这样就能实现多个IP相同的绑定了。

[root@rip1 html]# cd /etc/sysconfig/network-scripts/
[root@rip1 network-scripts]# cp ifcfg-lo ifcfg-lo:0
[root@rip1 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

[root@rip1 network-scripts]# systemctl restart network 
[root@rip1 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了
[root@rip2 html]# cd /etc/sysconfig/network-scripts/
[root@rip2 network-scripts]# cp ifcfg-lo ifcfg-lo:0
[root@rip2 network-scripts]# vim ifcfg-lo\:0 
[root@rip2 network-scripts]# systemctl restart network 
[root@rip2 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包。

[root@rip1 network-scripts]# cd /etc/
[root@rip1 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

[root@rip1 etc]# sysctl -p			//重启配置文件
[root@rip2 network-scripts]# vim /etc/sysctl.conf 
[root@rip2 network-scripts]# sysctl -p

RIP2 也这样写。

PIP配置:

装包:

[root@pip ~]# yum install keepalived ipvsadm -y

获取RIP的测试页的md5校验和:

[root@pip ~]# genhash -s 172.16.12.111 -p 80 -u /index.html
MD5SUM = a880aa463404771cd6dbe0bef99825f1

[root@pip ~]# genhash -s 172.16.12.112 -p 80 -u /index.html
MD5SUM = 27fe5a14e7f53b33224afd01c0e50c8b

这个一会要用。

这个MD5校验和是根据访问页面来计算的,如果访问的页面相同则校验和相同,这里的是因为index.html不同才有不同的结果。

安装完keepalived包,系统中会多出一个命令genhash,通过该命令可以获取页面的hash串,如下是更改某个页面前后的digest值:可以看到相同的IP和端口和页面,但是因为页面内容做了修改所以生成的不同

[root@lvs1 ~]# genhash -s 172.16.12.10 -p 80 -u /index.html
MD5SUM = 6df8d89daedcbb90e3f0c1d1f82cbcf6
[root@lvs1 ~]# genhash -s 172.16.12.10 -p 80 -u /index.html
MD5SUM = e6368a07d59e3922d2f428b2acd27090
genhash	-S使用到远程服务器的ssl连接。

genhash	-s使用指定的远程服务器地址。

genhash	-p使用指定的远程服务器端口。

genhash	-u使用指定的远程服务器url。

genhash -V在GET查询中使用指定的virtualhost。

genhash	-v使用详细模式输出。

genhash	-h显示这个简短的内联帮助屏幕。

genhash	-r显示版本号

修改配置文件:

! 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
        }
    }
}

然后重启服务:

[root@pip ~]# systemctl restart keepalived.service 
[root@pip ~]# echo "systemctl restart keepalived" >> /etc/rc.local 
[root@pip ~]# chmod +x /etc/rc.d/rc.local 
[root@pip ~]# 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

[root@kickstart-server ~]# curl 172.16.12.110
<h1>RIP2<h1>
<h1>172.16.12.112<h1>
[root@kickstart-server ~]# curl 172.16.12.110
<h1>RIP2<h1>
<h1>172.16.12.112<h1>
[root@kickstart-server ~]# curl 172.16.12.110
<h1>RIP2<h1>
<h1>172.16.12.112<h1>

发现都是2 因为配置了持久化时间,在一定时间内客户端访问只能访问到同一个服务端。

SIP配置:
[root@pip ~]# scp /etc/keepalived/keepalived.conf 172.16.12.114:/etc/keepalived/

直接将配置文件拷贝过去

[root@sip keepalived]# systemctl restart keepalived.service 
[root@sip keepalived]# echo "systemctl restart keepalived" >> /etc/rc.local 
[root@sip keepalived]# chmod +x /etc/rc.d/rc.local 
[root@sip 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停止服务:

[root@pip ~]# 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上了。

[root@sip 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重新启动系统

[root@pip ~]# systemctl restart  keepalived.service
[root@sip keepalived]# reboot
[root@pip ~]# 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

[root@sip ~]# 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上了

测试负载均衡:

[root@kickstart-server ~]# curl 172.16.12.110
<h1>RIP2<h1>
<h1>172.16.12.112<h1>

访问的是RIP2。于是停掉RIP2 的服务。

[root@rip2 network-scripts]# systemctl stop httpd

再次访问会先出一点错误,然后转移到RIP1上

[root@kickstart-server ~]# curl 172.16.12.110
curl: (7) Failed connect to 172.16.12.110:80; Connection refused
[root@kickstart-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

[root@jq-nginx1 network-scripts]# cp ifcfg-lo ifcfg-lo:0
[root@jq-nginx1 network-scripts]# vim ifcfg-lo\:0 

[root@jq-nginx1 network-scripts]# ifconfig 

lo:0: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 172.16.12.110  netmask 255.255.255.255

写测试页。

[root@jq-nginx1 network-scripts]# cd /usr/local/nginx/html/
[root@jq-nginx1 html]# echo "<h1>RIP1 nginx 172.16.12.104<h1>" >> check.html
[root@jq-nginx2 network-scripts]# cd /usr/local/nginx/html/
[root@jq-nginx2 html]# echo "<h1>RIP2 nginx 172.16.12.105<h1>" >> check.html

改端口为8000

PIP获取RIP的测试页的md5校验和:

[root@pip ~]# genhash -s 172.16.12.104 -p 8000 -u /check.html
MD5SUM = 6cfccefee769cd3a407c65afca5d6a56

[root@pip ~]# 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
        }
    }
}

查看配置情况:

[root@pip ~]# 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
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值