Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说LVS+KeepAlived+Nginx高可用实现方案,希望能够帮助你!!!。
这是一段血泪教程…
什么是lvs
LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一。
宗旨
特点
可伸缩网络服务的几种结构,它们都需要一个前端的负载调度器(或者多个进行主从备份)。我们先分析实现虚拟网络服务的主要技术,指出IP负载均衡技术是在负载调度器的实现技术中效率最高的。在已有的IP负载均衡技术中,主要有通过网络地址转换(Network Address Translation)将一组服务器构成一个高性能的、高可用的虚拟服务器,我们称之为VS/NAT技术(Virtual Server via Network Address Translation)。在分析VS/NAT的缺点和网络服务的非对称性的基础上,我们提出了通过IP隧道实现虚拟服务器的方法VS/TUN (Virtual Server via IP Tunneling),和通过直接路由实现虚拟服务器的方法VS/DR(Virtual Server via Direct Routing),它们可以极大地提高系统的伸缩性。VS/NAT、VS/TUN和VS/DR技术是LVS集群中实现的三种IP负载均衡技术。
其他
更多其他特点请参考百度百科-Lvs
当我们的服务器意外挂了之后,我们要怎么做?
当然是找一台新的机器,替代现有的机器,然后做新的环境部署,端口映射,域名解析等等一系列的工作,再将服务重新启动;但是如果这一系列的操作都是手动完成的,那么等你把这些工作搞好,可能服务已经停止个把小时了,这会儿估计运营早就提着菜刀架在你脖子上了;
但是如果使用了KeepAlived之后,然后提前将备用机准备好,当主的机器挂掉之后,自动将VIP给你切换到备用机,并且以邮件的形式告诉你说主服务已经挂了,你得赶紧恢复起来;这时候你就可以慢慢的去找主服务的问题,这时候并不会影响到你的正常业务运行。
虚拟机(CentOS 7)
准备了4台虚拟机,用于测试
主机 | ip | 作用 |
---|---|---|
主机1 | 192.168.1.128 | Keepalived Master |
主机2 | 192.168.1.129 | Keepalived Backup |
主机3 | 192.168.1.130 | Nginx1 |
主机4 | 192.168.1.131 | Nginx2 |
无 | 192.168.1.200 | 虚拟IP(VIP) |
虚拟机搭建可参考: 基于VirtualBox搭建Linux(CentOS 7)虚拟机环境(学习必备技能) https://blog.lupf.cn/articles/2020/04/04/1586001434581.html
基本架设示意图
安装源文件
keepalived-2.0.10 下载
在192.168.1.128及192.168.1.129上安装keepalived
在192.168.1.130及192.168.1.131上安装nginx
yum install -y gcc
yum install -y openssl-devel
yum install -y libnl libnl-devel
yum install -y libnfnetlink-devel
yum install -y net-tools
yum install -y vim wget
cd /use/local/src
tar -zxvf keepalived-2.0.10.tar.gz
mv keepalived-2.0.10 ../keepalived
cd /use/local/keepalived/
./configure
make && make install
mkdir /etc/keepalived
cp /usr/local/keepalived/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
cp /usr/local/keepalived/keepalived/etc/init.d/keepalived /etc/rc.d/init.d/
cp /usr/local/keepalived/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
cp /usr/local/sbin/keepalived /usr/sbin/
这里的教程使用的上面的源码安装
yum install -y keepalived
这里只是测试服务是否能正常启动,后续还需要更改keepalived的配置之后才能正常的使用
/etc/init.d/keepalived start
/etc/init.d/keepalived restart
/etc/init.d/keepalived stop
用于查看lvs转发及代理情况的工具
只需要在192.168.1.128及192.168.1.129上安装即可
yum install ipvsadm -y
只需要在192.168.1.130及192.168.1.131上安装nginx即可
请参考基于CentOS 7 web服务环境搭建(包含JDK+Nginx+Tomcat+Mysql+Redis)中nginx的安装部分
或者
请参考OpenResty(Nginx+Lua)高并发最佳实践直接安装OpenResty即可包含了nginx部分,这里选用的是这种方式
systemctl stop firewalld.service
systemctl disable firewalld.service
systemctl mask firewalld.service
#查看iptables相关的安装包
yum list iptables*
#安装
yum install -y iptables-services
#允许vrrp多播心跳(如果防火墙开启,这里不配置这个,就会出现裂脑)
-A INPUT -p vrrp -j ACCEPT
#开启80端口的访问(如果防火墙开启,不配置这个,vip的80端口将无法正常访问)
-I INPUT -p tcp --dport 80 -j ACCEPT
#nginx默认监听的80端口 这里直接开启80端口的外网访问(不开启外网将无法正常反问对应服务器的nginx)
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
systemctl restart iptables.service
直接关闭所有防火墙,这种方式仅仅用于测试;不推荐用于实际项目
systemctl stop iptables.service
以下操作需要在角色为Web服务器的两台中进行
即192.168.1.130和192.168.1.131这两台服务器上配置即可
ps -ef|grep nginx
进入init文件夹
cd /etc/init.d/
编辑脚本
vim realserver
添加以下脚本
#虚拟的vip 根据自己的实际情况定义
SNS_VIP=192.168.1.200
/etc/rc.d/init.d/functions
case "$1" in
start)
ifconfig lo:0 $SNS_VIP netmask 255.255.255.255 broadcast $SNS_VIP
/sbin/route add -host $SNS_VIP dev lo:0
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
sysctl -p >/dev/null 2>&1
echo "RealServer Start OK"
;;
stop)
ifconfig lo:0 down
route del $SNS_VIP >/dev/null 2>&1
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
echo "RealServer Stoped"
;;
*)
echo "Usage: $0 {start|stop}"
exit 1
esac
exit 0
保存并设置脚本的执行权限
chmod 755 /etc/init.d/realserver
// 因为realserver脚本中用到了/etc/rc.d/init.d/functions,所以一并设置权限
chmod 755 /etc/rc.d/init.d/functions
执行脚本
service realserver start
查看执行结果
ip a
如果看到以下效果,说明脚本已经执行成功了
cd /etc/keepalived
#备份默认的keepalived配置
mv keepalived.conf keepalived-back.conf
vim keepalived.conf
global_defs {
notification_email {
edisonchou@hotmail.com
}
notification_email_from sns-lvs@gmail.com
smtp_server 192.168.80.1
smtp_connection_timeout 30
router_id LVS_DEVEL # 设置lvs的id,在一个网络内应该是唯一的
}
vrrp_instance VI_1 {
state MASTER #指定Keepalived的角色,MASTER为主,BACKUP为备 记得大写
interface eno16777736 #网卡id 不同的电脑网卡id会有区别 可以使用:ip a查看
virtual_router_id 51 #虚拟路由编号,主备要一致
priority 100 #定义优先级,数字越大,优先级越高,主DR必须大于备用DR
advert_int 1 #检查间隔,默认为1s
authentication { #这里配置的密码最多为8位,主备要一致,否则无法正常通讯
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.200 #定义虚拟IP(VIP)为192.168.1.200,可多设,每行一个
}
}
# 定义对外提供服务的LVS的VIP以及port
virtual_server 192.168.1.200 80 {
delay_loop 6 # 设置健康检查时间,单位是秒
lb_algo rr # 设置负载调度的算法为wlc
lb_kind DR # 设置LVS实现负载的机制,有NAT、TUN、DR三个模式
nat_mask 255.255.255.0
persistence_timeout 0
protocol TCP
real_server 192.168.1.130 80 { # 指定real server1的IP地址
weight 3 # 配置节点权值,数字越大权重越高
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 192.168.1.131 80 { # 指定real server2的IP地址
weight 3 # 配置节点权值,数字越大权重越高
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
cd /etc/keepalived
#备份默认的keepalived配置
mv keepalived.conf keepalived-back.conf
vim keepalived.conf
global_defs {
notification_email {
edisonchou@hotmail.com
}
notification_email_from sns-lvs@gmail.com
smtp_server 192.168.80.1
smtp_connection_timeout 30
router_id LVS_DEVEL # 设置lvs的id,在一个网络内应该是唯一的
}
vrrp_instance VI_1 {
state BACKUP #指定Keepalived的角色,MASTER为主,BACKUP为备 记得大写
interface eno16777736 #网卡id 不同的电脑网卡id会有区别 可以使用:ip a查看
virtual_router_id 51 #虚拟路由编号,主备要一致
priority 50 #定义优先级,数字越大,优先级越高,主DR必须大于备用DR
advert_int 1 #检查间隔,默认为1s
authentication { #这里配置的密码最多为8位,主备要一致,否则无法正常通讯
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.200 #定义虚拟IP(VIP)为192.168.1.200,可多设,每行一个
}
}
# 定义对外提供服务的LVS的VIP以及port
virtual_server 192.168.1.200 80 {
delay_loop 6 # 设置健康检查时间,单位是秒
lb_algo rr # 设置负载调度的算法为wlc
lb_kind DR # 设置LVS实现负载的机制,有NAT、TUN、DR三个模式
nat_mask 255.255.255.0
persistence_timeout 0
protocol TCP
real_server 192.168.1.130 80 { # 指定real server1的IP地址
weight 3 # 配置节点权值,数字越大权重越高
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 192.168.1.131 80 { # 指定real server2的IP地址
weight 3 # 配置节点权值,数字越大权重越高
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
在192.168.1.128和192.168.1.129下分别执行以下指令启动keepalived
/etc/init.d/keepalived start
ip a
// 如果网卡下出现192.168.1.200(VIP)说明主已经启动成功
ip a
备服务器的网卡下没有出现192.168.1.200(VIP)的ip,说明备服务正常
注:如果这里也出现了VIP,那么说明裂脑了,需要检查防火墙是否配置正确;是否允许了vrrp的多播通讯
yum install ipvsadm -y
ipvsadm -Ln
ipvsadm -lnc
ipvsadm -Ln --stats | --rate
ipvsadm -L --timeout
ipvsadm --set 1 10 300
这里的TCP的连接超时时间最好和keepalived中的persistence_timeout超时时间保持一致;persistence_timeout的超时时间表示指定时间内,同ip的请求会转发到同一个服务;
使用我linux虚拟机的windows宿主机进行测试
测试vip
ping 192.168.1.200
测试vip监听的端口
telnet 192.168.1.200 80
请求虚拟IP查看转发的服务
停掉主keepalived
/etc/init.d/keepalived stop
vip漂移至备服务器
此时网页访问:192.168.1.200依然能够正常访问;却分发依然正常
重启主keepalived
主服务恢复之后;vip又会自动漂移回主服务
ipvsadm -l
可以看出192.168.1.130和192.168.1.131两台正式服务都还在
感谢以下资料对我的帮助
【参考资料】
Keepalived源码安装
高可用解决方案–keepalived
Centos7.2下基于Nginx+Keepalived搭建高可用负载均衡(一.基于Keepalived搭建HA体系)
keepalived介绍和配置
【大型网站技术实践】初级篇:借助LVS+Keepalived实现负载均衡
【解决问题参考资料】
咨询个lvs的问题,有时访问VIP会出现SYN_RECV
怎么样让 LVS 和 realserver 工作在同一台机器上
两台服务器既做LVS主备又做realserver的配置方法
keepalived+lvs无法访问vip或访问超时
lvs中ipvsadm的ActiveConn和InActConn的深入理解
今天的分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。
上一篇
已是最后文章
下一篇
已是最新文章