负载调度器算法
静态算法:只考虑算法本身,不考虑服务器状态
rr(轮循):从1开始到n结束
wrr(加权轮循):按权重比例进行调度,权重越大,负责的请求越多
sh(源地址hash):实现会话绑定,保留之前建立的会话信息。将来自于同一个ip地址的请求发送给一个真实服务器。
dh(目标地址hash):将同一个目标地址的请求,发送给同一个服务器节点。提高缓存命中率
动态算法:既要考虑算法本身,也要考虑服务器状态(原理:通过hash表记录连接状态----active/inactive)
LC(最少连接):将新的连接请求分配给当前连接数最少的服务器。 公式:活动连接*256+非活动连接
WLC(加权最少连接):最少连接的特殊模式。 公式:(活动连接*256+非活动连接)/权重
SED(最短期望延迟):加权最少连接的特殊模式。 公式:(活动连接 +1)*256/权重
NQ (永不排队):sed的特殊模式,当某台真实服务器连接为0时,直接分配,不计算
LBLC(基于局部性的最少连接):dh的特殊模式,既要提高缓存命中率,又要考虑连接数量。先根据请求的目标 IP 地址寻找最近的该目标 IP 地址所有使用的服务器,如果这台服务器依然可用,并且有能力处理该请求,调度器会尽量选择相同的服务器,否则会继续选择其它可行的服务器
LBLCR(带复制的基于局部性的最少连接):LBLCR=LBLC+缓存共享机制
高可用集群(HA High availability Cluster)
目的:最大限度的保证用户的应用程序持久、不间断的提供服务。(故障转移)
高可用性(HA,High Availablity)是指通过尽量缩短系统停机时间(因日常的维护操作或突发的系统崩溃等),以提高系统和应用的可用性。一般是2个节点做出的HA集群,有很多通俗不科学的名称,比如“双机热备”,“双机互备”。 这样做的好处是当服务启动的时候,两台服务器一个作主(ser1),另外一个作从(ser2)。测试机每几秒会ping主机,当发现主机没有回应,就证明主机拓机了,那么从机马上会启动相应的服务,继续进行服务。这样就可保证服务部间断。
最大限度:
99% 87.6h
99.9% 8.8h
99.99% 53m
99.999% 5m
故障切换:
心跳检测:RS232串口线:串行电缆被认为是比以太网连接安全性稍好些的连接方式,因为hacker无法通过串行连接运行诸如telnet、ssh或rsh类的程序,从而可以降低其通过已劫持的服务器再次侵入备份服务器的几率。但串行线缆受限于可用长度,因此主、备服务器的距离必须非常短。
双机备份软件:Rose Haproxy Keepalived Heartbeat
特殊:
脑分裂:在一个网络或线缆故障时导致两个节点同时认为自已是唯一处于活动状态的服务器从而出现争用资源的情况,这种争用资源的场景即是所谓的“脑裂”,造成数据不完整,服务不可访问
解决:
设置参考ip,抢夺资源之前,都去ping参考ip(网关),ping不通时,不去抢资源,而是释放资源,将控制权交出去;设置冗余线路,设置两条心跳线,两个网卡,第一个测时不同,再拿第二个去测。
stonish(shoot the other node in the head 爆头):基于能够通过软件指令关闭某节点特殊的硬件设备,掐电源。
keepalive概述:
案例环境专为LVS和HA设计的一款健康检查工具
支持故障自动切换,主备模式共用同一个IP地址,但优先级不同
实验架构图:
实验规划:
7-5 测试机
ens33 vmnat10 ip:192.168.10.150 gw:192.168.10.10 dns:192.168.10.10
CentOs 7 桌面版 路由器
ens33 vmnat10 ip:192.168.10.10
ens37 vmnat11 ip:192.168.11.10
#1. 开启路由转发
#2. 设置防火墙规则实现目标地址转换和源地址转换
#3. 安装配置DNS(选做)
7-1 主负载调度器
ens33 vmnat11 ip:192.168.11.110 gw:192.168.11.10 #DIP
ens33:0 vmant11 ip:192.168.11.200 gw:192.168.11.10 #VIP
#1. 修改网卡启动脚本,忽略arp冲突检测功能
#2. 关闭路由重定向
#3. 安装keepalived软件,实现集群的自动启动和故障监测和故障转移
7-2 从负载调度器
ens33 vmnat11 ip:192.168.11.120 gw:192.168.11.10 #DIP
ens33:0 vmant11 ip:192.168.11.200 gw:192.168.11.10 #VIP
#1. 修改网卡启动脚本,忽略arp冲突检测功能
#2. 关闭路由重定向
#3. 安装keepalived软件,实现集群的自动启动和故障监测和故障转移
7-3 应用服务器一
ens33 vmnat11 ip:192.168.11.130 gw:192.168.11.10
#1. 安装并启动httpd服务,设置不同的首页文件
#2. 添加回环网卡子接口,并配置VIP地址
#3. 修改arp数据包通告级别和响应级别
#4. 添加路由记录
7-4 应用服务器二
ens33 vmnat11 ip:192.168.11.140 gw:192.168.11.10
#1. 安装并启动httpd服务,设置不同的首页文件
#2. 添加回环网卡子接口,并配置VIP地址
#3. 修改arp数据包通告级别和响应级别
#4. 添加路由记录
实验过程:
先来做应用服务器一和应用服务器二:
先安装并启动httpd服务,设置不同的首页文件:
yum -y install httpd
systemctl start httpd
systemctl enable httpd
设置不同的首页文件:
应用服务器1:echo "hello 130..." >> /var/www/html/index.html
应用服务器2: echo "hello 140..." >> /var/www/html/index.html
添加回环网卡子接口,并配置VIP地址:
cd /etc/sysconfig/network-scripts/
cp -a ifcfg-lo ifcfg-lo:0
vim ifcfg-lo:0
配置内容如下(改名,VIP地址,子网掩码):
然后重启网络服务:systemctl restart network
查看一下回环网卡和回环网卡子接口: ifconfig lo 、 ifconfig lo:0
然后添加路由策略:route add -host 192.168.11.200 dev lo:0 #临时的
使其永久:
chmod +x /etc/rc.local
vim /etc/rc.local
将 route add -host 192.168.11.200 dev lo: 0添加进去:
修改arp数据包通告级别和响应级别:
vim /etc/sysctl.conf 编辑如下:
然后执行 sysctl -p
然后开始做主负载调度器和从负载调度器:
修改网卡启动脚本,忽略arp冲突检测功能:
cd /etc/sysconfig/network-scripts/
vim ifup-eth
搜索arping关键词,将判断部分注释掉:
cp -a ifcfg-ens33 ifcfg-ens33:0
vim ens33:0 #把uuid删掉,ens33名改为ens33:0 ,ip地址改为VIP:192.168.11.200
然后 在没有显示ens33:0网卡的机器上执行:ifup ens33:0
此时再ifconfig 就可以看到ens33:0网卡启动了
关闭路由重定向:
vim /etc/sysctl.conf 编辑内容如下:
然后执行 sysctl -p
安装keepalived软件,实现集群的自动启动和故障监测和故障转移:
yum -y install keepalived
cd /etc/keepalived
vim keepalived.conf
主负载调度器(修改完成的keepalived文件):
! Configuration File for keepalived
global_defs {
router_id LVS_MASTER #本服务器的名称
}
vrrp_instance VI_1 {
state MASTER #表示主服务器
interface ens33 #网卡
virtual_router_id 51 #虚拟路由的id号
priority 100 #优先级 数值越大,代表优先级越高
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.11.200 #指定负载调度器的VIP
}
}
virtual_server 192.168.11.200 80 { #集群的IP
delay_loop 6
lb_algo rr #算法
lb_kind DR #模式
persistence_timeout 0
protocol TCP
real_server 192.168.11.130 80 { #应用服务器1IP
weight 1
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
real_server 192.168.11.140 80 { #应用服务器2IP
weight 1
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
#注意:标红色的都是经过必须修改的,黄色为注意,例如主负载调度器与从负载调度器的
id必须相同
从负载调度器(经过修改后的keeplived文件):
! Configuration File for keepalived
global_defs {
router_id LVS_SLAVE #本服务器的名称
}
vrrp_instance VI_1 {
state SLAVE #表示从服务器
interface ens33 #网卡
virtual_router_id 51 #虚拟路由的id号
priority 49 #从负载调度器的优先级一定要比主负载调度器的优先级的一半还要低
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.11.200 #指定负载调度器的VIP
}
}
virtual_server 192.168.11.200 80 { #集群的IP
delay_loop 6
lb_algo rr #算法
lb_kind DR #模式
persistence_timeout 0
protocol TCP
real_server 192.168.11.130 80 { #应用服务器1的IP
weight 1
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
real_server 192.168.11.140 80 { #应用服务器2的IP
weight 1
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
#注意:标红色的都是经过必须修改的,黄色为注意,例如从负载调度器与主负载调度器的
id必须相同
然后主负载调度器与从负载调度器执行: systemctl start keepalived
yum -y install ipvsadm
然后执行 ipvsadm -ln ,查看集群构建结果:
至此由两台应用服务器构成的集群构建成功
然后用路由器这台机器:
开启路由转发: vim /etc/sysctl.conf
编辑内容为:net.ipv4.ip_forward=1
然后执行:sysctl -p
然后设置防火墙规则实现目标地址转换和源地址转换:
先iptables -t nat -L #查看防护墙nat表的规则,如果有规则记得先清空!
然后开始添加两条防火墙规则:
iptables -t nat -A PREROUTING -i ens33 -d 192.168.10.10 -p tcp --dport 80 -j DNAT --to-destination 192.168.11.200
iptables -t nat -A POSTROUTING -o ens33 -s 192.168.11.0/24 -p tcp --sport 80 -j SNAT --to-source 192.168.10.10
此时添加之后再次查看,成功添加了两条防火墙规则:
最后用客户端测试:
此时来到主负载调度器和从负载调度器发现InActConn,从负载调度器都是0,只有主负载调度器有记录:
这是因为主负载调度器与从负载调度器此时都启动着keepalived,因为主负载调度器的优先级高于从负载调度器
当关掉主负载调度器的keepalived时,只开启从负载调度器的keepalived时(模拟主服务器发生故障):这时相当于主服务器发生故障,由于有从服务器的存在并且从负载调度器开启了keepalived,所以这时从服务器会马上启动相应的服务,继续进行服务,这样就可以保证服务不间断。