keepalived+LVS

系统环境:CentOS 7+

IP规划:

ser-01: 192.168.237.128

ser-02: 192.168.237.129

vip: 192.168.237.120

先在两台服务器的sysctl.conf文件中添加如下配置,

vi /etc/sysctl.conf

# 用于关闭linux内核的重定向参数响应,避免网络内的ARP解析出现异常,ens33为网卡名称,不同系统网卡名称不同,可通过ifconfig或ip ad自行查看修改
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0

net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.ens33.arp_ignore = 1
net.ipv4.conf.ens33.arp_announce = 2

DR模型中的VIP的MAC广播问题: 在DR模型中,由于每个节点均要配置VIP,因此存在VIP的MAC广播问题,在现在的linux内核中,都提供了相应kernel 参数对MAC广播进行管理,具体如下:

arp_ignore: 定义接收到ARP请求时的响应级别; 0:只要本地配置的有相应地址,就给予响应; 1:仅在请求的目标地址配置在到达的接口上的时候,才给予响应;DR模型使用

arp_announce:定义将自己地址向外通告时的通告级别; 0:将本地任何接口上的任何地址向外通告; 1:试图仅向目标网络通告与其网络匹配的地址; 2:仅向与本地接口上地址匹配的网络进行通告;DR模型使用

使上面的配置立即生效

sysctl -p

在两台服务器上安装keepalived

yum install -y keepalived

修改配置文件

vi /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {
   router_id httpd_1	#用于区分两台服务器,不能一样

}

vrrp_script chk_httpd {		#httpd服务状态检查配置
	script "/sh/check_httpd.sh"		#httpd服务状态检查脚本
	interval 1			# 脚本检查间隔时间(秒)
}

vrrp_instance VI_1 {	#备份实例组名称,主从必须一样
	state MASTER		#在本实例中本服务器的角色,这里为MASTER,一个实例中只能有一个MASTER,其它均为SLAVE。主服务器宕机后,从服务器接过VIP提供服务;主服务器恢复后,因为优先级一般比从服务器高,会抢回VIP。还有一种做法,两个都设置为SLAVE,设置相同优先级,可以避免主服务器重新启动后抢占VIP,导致服务访问切换,这种情况下只有正在提供服务的服务器无法正常提供服务才会导致虚拟IP切换到其它服务器。
	interface ens32		#本机物理网卡名称,可通过 ip ad命令查看,根据实际情况填写
	virtual_router_id 51	#虚拟分组ID,主从需要一致,用于判断是否在同一组
	priority 100		#优先级,取值范围 0-254 ,值越大,优先级越高.
	advert_int 1		#检查其它节点时间间隔
	authentication {	#主从节点认证信息,必须一样
		auth_type PASS
		auth_pass 1111
	}
	virtual_ipaddress {	#虚拟IP(VIP),可配置多个,主从必须一样。用于提供对外访问
		192.168.237.120
	}
	track_script {	#调用脚本配置
		chk_httpd	#指定上面配置脚本引用的名称
	}
}

# 以下配置可不要
virtual_server 192.168.237.120 80 { #备份服务配置
	delay_loop 6		#健康检查时间间隔
	lb_algo rr			#轮询方式,调试方法
	lb_kind NAT			#转发方式
	persistence_timeout 50	#会话保持时间
	protocol TCP		

	real_server 192.168.237.129 80 {
		weight 1		#权重
			connect_timeout 3	#连接超时设置
			nb_get_retry 3		#失败重试次数
			delay_before_retry 3#重试间隔时间
	}

	real_server 192.168.237.128 80 {
	weight 1
		connect_timeout 3
		nb_get_retry 3
		delay_before_retry 3
}
}

vi /sh/check_httpd.sh	# 检查nginx服务的脚本,如果nginx服务不存在,尝试重启服务,如果重启后还是检测不到,就停止keepalived

#!/bin/bash
run=`ps -C nginx --no-header | wc -l`
if [ $run -eq 0 ]
then
	/opt/nginx/sbin/nginx
	sleep 2
	if [ $run -eq 0 ]
	then
		killall keepalived
	fi
fi

为检查脚本设置可执行权限

chmod +x /sh/check_httpd.sh

httpd服务安装

yum install -y httpd

echo 'site 1' > /var/www/html/index.html	#httpd默认ROOT目录
systemctl start httpd

keepalived服务控制

systemctl [start | stop | restart | status]  keepalived
	

安装LVS管理工具,因为linux自2.4之后的内核都集成了LVS,所以直接安装管理工具即可

yum install -y ipvsadm

配置LVS,在两台服务器上都执行如下配置,

ipvsadm -A 192.168.237.120:80 -r ss
ipvsadm -a 192.168.237.120:80 -t 192.168.237.128:80 -g
ipvsadm -a 192.168.237.120:80 -t 192.168.237.129:80 -g

现在通过http://192.168.237.120/ 就能实现负载均衡和热备

通过 ipvsadm -lnc 可以查看转发状态

ipvsadm常用命令参数 管理集群服务

添加:-A -t|u|f service-address [-sscheduler] -t:tcp协议的集群服务 -u:udp协议的集群 -f:FWM:防火墙标记 修改:-E 删除:-D -D -t|u|f service-address 例如:# ipvsadm -A -t 172.16.100.1:80 -s rr

管理集群服务中的RS

添加:-a -t|u|f service-address -rserver-address [-g|i|m] [-w weight] -t|u|f service-address:事先定义好的某集群服务 -r server-address:某RS的地址,在NAT模型中,可以使用IP:PORT事先端口映射 [-g|i|m]:LVS类型 -g:DR -I:TUN -m:NAT [-w weight]:定义服务器权重

修改:-e

删除:-d -t|u|f service-address -r server-address 例如:#ipvsadm -a -t 172.16.100.1:80 -r192.168.10.8 -m 例如:#ipvsadm-a -t 172.16.100.1:80 -r 192.168.10.9 -m

查看

-L|l[options] -n:数字格式显示主机地址和端口号 --stats:统计信息 --rate:速率 --timeout:显示tcp、tcpfin和udp会话的超时时间值 --daemon --sort:跟协议、地址、端口进行排序,默认为升序 -c:显示当前ipvs连接状况

删除所有集群服务: -C:清空ipvs规则

保存规则 -S:(用输出重定向进行保存) 格式:#ipvsadm -s >/path/to/somefile

载入此前的规则: -R 格式:#ipvsadm -R </path/to/somefile

LVS十种调度算法

1、静态调度:

①rr(Round Robin):轮询调度,轮叫调度

轮询调度算法的原理是每一次把来自用户的请求轮流分配给内部中的服务器,从1开始,直到N(内部服务器个数),然后重新开始循环。算法的优点是其简洁性,它无需记录当前所有连接的状态,所以它是一种无状态调度。【提示:这里是不考虑每台服务器的处理能力】

②wrr:weight,加权(以权重之间的比例实现在各主机之间进行调度)

由于每台服务器的配置、安装的业务应用等不同,其处理能力会不一样。所以,我们根据服务器的不同处理能力,给每个服务器分配不同的权值,使其能够接受相应权值数的服务请求。

③sh:source hashing,源地址散列。主要实现会话绑定,能够将此前建立的session信息保留了

源地址散列调度算法正好与目标地址散列调度算法相反,它根据请求的源IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的并且没有超负荷,将请求发送到该服务器,否则返回空。它采用的散列函数与目标地址散列调度算法的相同。它的算法流程与目标地址散列调度算法的基本相似,除了将请求的目标IP地址换成请求的源IP地址,所以这里不一个一个叙述。

④Dh:Destination hashing:目标地址散列。把同一个IP地址的请求,发送给同一个server。

目标地址散列调度算法也是针对目标IP地址的负载均衡,它是一种静态映射算法,通过一个散列(Hash)函数将一个目标IP地址映射到一台服务器。目标地址散列调度算法先根据请求的目标IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。

2、动态调度

①lc(Least-Connection):最少连接

最少连接调度算法是把新的连接请求分配到当前连接数最小的服务器,最小连接调度是一种动态调度短算法,它通过服务器当前所活跃的连接数来估计服务器的负载均衡,调度器需要记录各个服务器已建立连接的数目,当一个请求被调度到某台服务器,其连接数加1,当连接中止或超时,其连接数减一,在系统实现时,我们也引入当服务器的权值为0时,表示该服务器不可用而不被调度。 简单算法:active*256+inactive(谁的小,挑谁)

②wlc(Weighted Least-Connection Scheduling):加权最少连接。

加权最小连接调度算法是最小连接调度的超集,各个服务器用相应的权值表示其处理性能。服务器的缺省权值为1,系统管理员可以动态地设置服务器的权限,加权最小连接调度在调度新连接时尽可能使服务器的已建立连接数和其权值成比例。 简单算法:(active*256+inactive)/weight【(活动的连接数+1)/除以权重】(谁的小,挑谁)

③sed(Shortest Expected Delay):最短期望延迟

基于wlc算法 简单算法:(active+1)*256/weight 【(活动的连接数+1)*256/除以权重】

④nq(never queue):永不排队(改进的sed)

无需队列,如果有台realserver的连接数=0就直接分配过去,不需要在进行sed运算。

⑤LBLC(Locality-Based Least Connection):基于局部性的最少连接

基于局部性的最少连接算法是针对请求报文的目标IP地址的负载均衡调度,不签主要用于Cache集群系统,因为Cache集群中客户请求报文的布标IP地址是变化的,这里假设任何后端服务器都可以处理任何请求,算法的设计目标在服务器的负载基本平衡的情况下,将相同的目标IP地址的请求调度到同一个台服务器,来提高个太服务器的访问局部性和主存Cache命中率,从而调整整个集群系统的处理能力。 基于局部性的最少连接调度算法根据请求的目标IP地址找出该目标IP地址最近使用的RealServer,若该Real Server是可用的且没有超载,将请求发送到该服务器;若服务器不存在,或者该服务器超载且有服务器处于一半的工作负载,则用“最少链接”的原则选出一个可用的服务器,将请求发送到该服务器。

⑥LBLCR(Locality-Based Least Connections withReplication):带复制的基于局部性最少链接

带复制的基于局部性最少链接调度算法也是针对目标IP地址的负载均衡,该算法根据请求的目标IP地址找出该目标IP地址对应的服务器组,按“最小连接”原则从服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器;若服务器超载,则按“最小连接”原则从这个集群中选出一台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的程度。

最后更新于