概念
当我们的服务器意外挂了之后,我们要怎么做?
当然是找一台新的机器,替代现有的机器,然后做新的环境部署,端口映射,域名解析等等一系列的工作,再将服务重新启动;但是如果这一系列的操作都是手动完成的,那么等你把这些工作搞好,可能服务已经停止个把小时了,这会儿估计运营早就提着菜刀架在你脖子上了;
但是如果使用了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.51cto.com/u_13640989/2750246
基本架设示意图
安装源文件
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 gccyum install -y openssl-develyum install -y libnl libnl-develyum install -y libnfnetlink-develyum install -y net-toolsyum 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
keepalived配置
将keepalived配置文件拷贝到etc/keepalived下
mkdir /etc/keepalived cp /usr/local/keepalived/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
开机启动项
把 keepalived的启动文件复制到init.d下,加入开机启动项
cp /usr/local/keepalived/keepalived/etc/init.d/keepalived /etc/rc.d/init.d/
将keepalived文件拷贝到etc下
cp /usr/local/keepalived/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
把keepalived加入系统命令目录
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服务环境搭建 中nginx的安装部分
停用firewalld
systemctl stop firewalld.service systemctl disable firewalld.service systemctl mask firewalld.service
安装iptables防火墙
#查看iptables相关的安装包 yum list iptables* #安装 yum install -y iptables-services
keepalived服务器下的配置
192.168.1.128和192.168.1.129下的添加以下配置
vi /etc/sysconfig/iptables
#允许vrrp多播心跳(如果防火墙开启,这里不配置这个,就会出现裂脑) -A INPUT -p vrrp -j ACCEPT #开启80端口的访问(如果防火墙开启,不配置这个,vip的80端口将无法正常访问) -I INPUT -p tcp --dport 80 -j ACCEPT
nginx服务器下配置
192.168.1.130和192.168.1.131下的添加以下配置
vi /etc/sysconfig/iptables
#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这两台服务器上配置即可
启动nginx服务
确保nginx已经正常运行了
ps -ef|grep nginx
编辑realserver脚本文件两台机器都要搞
进入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
如果看到以下效果,说明脚本已经执行成功了
进入192.168.1.128服务器
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 } } }
进入192.168.1.129服务器
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
检查主keepalived 启动后的配置情况
ip a // 如果网卡下出现192.168.1.200(VIP)说明主已经启动成功
检查备keepalived 启动后的配置情况
ip a ··· 备服务器的网卡下**没有出现**192.168.1.200(VIP)的ip,说明备服务正常 **注:如果这里也出现了VIP,那么说明裂脑了,需要检查防火墙是否配置正确;是否允许了vrrp的多播通讯** ![](https://www.www.zyiz.net/i/ll/?i=20190117171119191.?,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2x1cGVuZ2ZlaTEwMDk=,size_16,color_FFFFFF,t_70)
yum install ipvsadm -y
查看当前配置的虚拟服务和各个RS的权重
ipvsadm -Ln
查看当前ipvs模块中记录的连接(可用于观察转发情况)
ipvsadm -lnc
查看ipvs模块的转发情况统计
ipvsadm -Ln --stats | --rate
查看lvs的超时时间
ipvsadm -L --timeout
优化连接超时时间
ipvsadm --set 1 10 300
这里的TCP的连接超时时间最好和keepalived中的persistence_timeout超时时间保持一致;persistence_timeout的超时时间表示指定时间内,同ip的请求会转发到同一个服务;
更多ipvsadm的操作请参考以下文章
LVS管理工具--ipvsadm
使用我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又会自动漂移回主服务
查看最新的虚拟ip对应的RealServer的情况
ipvsadm -l
可以看出192.168.1.130和192.168.1.131两台正式服务都还在
测试停掉192.168.1.130
再次查看虚拟ip对应的RealServer的情况
可以看出192.168.1.130这台已经挂掉的服务器已经被移除了
测试访问虚拟ip
所有的访问都只会转发到131的真实服务器
恢复192.168.1.130
lvs又会自动监控并加入192.168.1.130