LVS
即Linux虚拟机,实现了基于IP的数据请求负载均衡调度方案。当服务器收到客户端的请求,请求会先经过LVS调度器,调度器会根据预设的算法策略分发给后端的服务器(如轮询算法),其他调度算法还包括加权轮询策略,最小连接策略,加权最小连接策略,目的地址散列策略,源地址散列策略。如果可以保证后端服务提供的业务和数据都是相同的,那么不管请求分发到哪一台服务,对于用户效果都是一样的。从而整个服务集群对于用户来说都是透明的。
NAT模式:网络地址转换模式,原理是通过修改数据报头,使得私有IP地址可以访问外网,外部请求可以访问私有IP。做法是通过两块网卡,eth0设置局域网私有IP,eth1设置公有IP与外部网络联通。首先客户端会访问服务器的外网地址,相对于真实的服务器来说,LVS的外网IP又叫做VIP(Virtual IP Address)。LVS 会转发给策略选择出的真实服务器,再转发前会把数据包中的目标地址和端口换成真实服务器的地址和端口。真实服务器处理请求后将数据包返回给LVS调度器,调度器修改数据包的源地址和端口为VIP,最后返回给客户端。
TUN模式:IP隧道模式,原理是将请求和响应分离。因为在集群比较大的情况下,LVS调度器会成为瓶颈。而请求数据往往小于响应数据,调度器仅处理请求,响应数据由真实服务器直接返回给客户端。TUN模式是将原始的数据包封装并添加新的包头(新的源地址端口和目标地址端口),目标地址修改为选择出的真实服务器的地址,源地址修改为VIP的地址,真实服务器处理请求响应后直接返回给客户端。要求真实服务器与外网链接,也就是说每台服务器都有公网IP。
DR模式:直接路由模式,由于TUN模式建立隧道同样会增加服务器的开销。调度器只负责选出后端服务器。直接路由模式要求调度器与后端服务器必须在同一个局域网内,VIP地址要与调度器和所有服务器共享。这样真实服务器处理请求后响应目标IP是客户端IP,源IP是是VIP,客户端是感觉不到后端服务器的存在。真实服务器的VIP必须配置在Non-ARP上,不对外广播自己,也就是说对外不可见。调度器接收到请求后选出真实服务器,修改MAC地址,通过交换机将数据发给真实服务器。
LVS+keepalived
Keepalived 本质上是提供数据转发与服务器健康检测并具备故障切换功能的高可用路由。keepalived基于虚拟路由冗余协议(VRRP)实现了LVS的负载均衡故障转移,VRRP协议会根据优先级确定自己的角色,Master会定期发送报文给其他Backup自己正常工作,而Backup负责接受Master的通知,如果没有收到通知说明Master故障,这时候会通过选举算法选出新的Master。从而实现高可用。除了定期发送报文,Master还负责转发请求到后端服务器进行负载均衡。
LVS+keepalived+nginx
工具 ipvsadm 可以分析lvs
Ipvsadm -ln 查看当前的路由转发情况
实现主从热备
在两台nginx服务器分别安装 keepalived, check_nginx.sh 的作用是检测nginx的状态,如果down掉就把当前服务器从集群中剔除掉,启用备用服务器。 配置文件主从差异如下:
Keepalived.conf
! Configuration File for keepalived
global_defs {
router_id LVS_134 //设备ID 每台服务器不一样
}
vrrp_script chk_nginx {
script "/etc/keepalived/check_nginx.sh"
#每2s检查一次
interval 2
#每次检查-20
weight -20
}
vrrp_instance VI_1 {
state MASTAER //节点角色(BACKUP)
interface eth0 //网卡接口
virtual_router_id 51 //虚拟路由ID 所有服务器不一样
priority 50 //优先级 MASTAER应该大于BACKUP(30)
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
chk_nginx #检测脚本,上面配置的
}
virtual_ipaddress {
192.168.169.140 //VIP 可绑定多个
}
}
check_nginx.sh
#!/bin/bash
COUNT=$(ps -C nginx --no-header |wc -l)
echo $COUNT
#判断Nginx 是否都挂掉了
if [ $COUNT -eq 0 ]
then
#如果挂掉了,就启动nginx
/cn.tongxingzhe.www/nginx/sbin/nginx
echo "重启nginx"
#等5秒钟后,再次查看是否 启动成功
sleep 5
#如果nginx没有启动起来,就直接干掉keepalived
COUNT=$(ps -C nginx --no-header |wc -l)
if [ $COUNT -eq 0 ]
then
echo "干掉keepalived"
#如果killall命令不能使用,就需要安装psmisc工具了
#yum install -y psmisc
killall keepalived
fi
fi
实现负载均衡
需要四台服务器,两台充当 LVS的主从服务,两台充当后端服务器,安装nginx
四台服务器都需要设置VIP
LVS服务器需要安装keepalived,配置文件如下:
virtual_server 192.168.169.140 80 {
delay_loop 6
lb_algo wrr
lb_kind DR //设置LVS DR模式
nat_mask 255.255.255.0
persistence_timeout 0 //会话时间
protocol TCP
real_server 192.168.169.135 80 {
weight 3 //权重
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 192.168.169.136 80{
weight 6
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
没有轮询的问题
persistence_timeout:会话保持时间,测试轮询可以把这个时间设小
ipvsadm -L --timeout lvs 缓存时间 默认 900 120 300 可是当调小
腾讯云上实现
腾讯云只允许私有网络申请虚拟IP,不支持基础网络
HAVIP是一个浮动的内网IP,不会固定在指定机器上
有子网属性,只能被同一子网下的机器ARP宣告
传统物理网络中,通过keepalived的VRRP协议协商主备状态,腾讯云的限制
使用的VIP必须是腾讯云申请的HAVIP
有子网属性
用弹性公网IP绑定VIP,从而达到外网通信的效果
目前存在问题
目前项目部署到腾讯云的基础网络上,如果要使用VIP必须迁移到私有网络,迁移的话需要考虑如下问题
域名重新解析到VIP需不需要备份
域名如果备份过,更换IP不需要重新备份
域名解析到VIP会不会有延迟
腾讯云同一地区的域名(广州地区)的解析变更不会有延迟,立即生效
数据库迁移到私有网络影响
内网IP和公网IP都会改变,应用的配置文件连接池地址需要修改
微聚时代的库私有网络会连接不上
服务器迁移到私有网络影响
作者:把代码写成诗
版权所有,转载请注明出处
欢迎关注,沟通交流 https://github.com/githubweili
网友评论