Nginx: 使用KeepAlived配置实现虚IP在多服务器节点漂移及Nginx高可用原理
创始人
2024-09-25 05:50:19
0

使用KeepAlived配置实现虚IP在多服务器节点漂移


1 )环境准备

  • 2台 linux , 一主一备
    • 节点1:192.168.184.30 CentOS 7 Master
    • 节点2:192.168.184.40 CentOS 7 Backup
    • VIP 192.168.184.50
  • 安装 KeepAlived, $ yum install keepalived
    • 注意,安装好yum源,base 源就有这个软件
    • 两台都执行安装
  • 关闭selinux 和 防火墙
    • $ setenforce 0 临时关闭
      • vim /etc/sysconfig/selinux 编辑 SELINUX=disabled 永久关闭
    • $ systemctl stop firewalld 关闭
      • systemctl disable firewalld 关闭自启动
    • 这里非常重要,否则可能两台机器无法通信

2 ) 相关配置说明

  • 查看软件生成了哪些文件, $ rpm -ql keepalived
    • 可以选择其中一台去执行
    • 输出有一些比较重要的文件和目录,可以去看看,这里着重说明
    • /etc/keepalived/keepalived.conf 主配置文件
    • /etc/sysconfig/keepalived 更改默认属性配置文件
    • /usr/bin/genhash 二进制程序
    • /usr/lib/systemd/system/keepalived.service 使用systemctl 启动停止查看
    • /usr/libexec/keepalived 这是lib包
    • /usr/sbin/keepalived 这是主程序文件
  • 查看相关配置文件 $ vim /etc/keepalived/keepalived.conf
    • 可以先在一台上操作,比如 184.30 这台机器
    • ! Configuration File for keepalived 这一段是注释
    • global_defs 块中,决定了全局属性,全局配置, 对整个 keepalived 生效
      global_defs { 	notification_email {   # 这里可以写多个邮箱, 确保服务器在内网并且邮箱可收到当前服务器发送的邮件 		admin@baidu.com 		master@baidu.com 	} 	notification_email_from  ka@baidu.com  # 填写自己的邮箱 	smtp_server 192.168.184.200 	smtp_connect timeout 30 # 连接邮件服务器时的超时时长 	router_id Nginx  # 这里 router_id 自己起个名字 	# vrrp_skip_check_adv_addr # 以下都注释掉 	# vrrp_strict     # 严格的vrrp限制,可以注释掉,可能会有绑定好了,但ping不通的问题,所以注释了 	# vrrp_garp_interval 0 	# vrrp_gna_interval 0 } 
    • vrrp_instance Nginx_1 块,是vrrp的实例,名称叫做 Nginx_1 这个自己修改
      vrrp instance Nginx_1 { 	state MASTER        # 标记是 master 还是 backup 	interface ens33       # 当前服务器需要绑定的网卡,指定一块网卡, 根据实际情况指定内网网卡(184.30这块) 	virtual_router_id 51   # 标识虚拟路由id,可以自己写,要确保相同名称的实例,这里的id是一样的 	priority 100   # 指定优先级,值越大,转移优先级越高 	advert_int 1 	authentication { 		auth_type PASS # 认证方式,通过密码 		auth_pass 1111 	} 	virtual_ipaddress { # 虚拟的ip地址,下面可以填入多个,VIP 也可以就填一个,按照之前设计 		192.168.200.50 	} } 
    • 其他配置都可以先删除
  • 接着,在 184.40 的 /etc/keepalived/keepalived.conf 配置文件做类似必要修改
    global_defs { 	notification_email { 		admin@baidu.com 		master@baidu.com 	} 	notification_email_from  ka@baidu.com  	smtp_server 192.168.184.200 	smtp_connect timeout 30 # 连接邮件服务器时的超时时长 	router_id Nginx  	# vrrp_skip_check_adv_addr 	# vrrp_strict 	# vrrp_garp_interval 0 	# vrrp_gna_interval 0 }  vrrp instance Nginx_1 { # 这里要和 master 配置成同一个实例名称,否则不会成功 	state BACKUP   # 注意这里     	interface ens33       # 根据实际情况指定内网网卡(184.40这块) 	virtual_router_id 51   # 同 master 一致,才能保证转移 	priority 98    # 这个优先级较小 	advert_int 1 	authentication { 		auth_type PASS # 认证方式,通过密码 		auth_pass 1111 	} 	virtual_ipaddress { # 虚拟的ip地址,下面可以填入多个,VIP 也可以就填一个,按照之前设计 		192.168.200.50 	} } 
  • 配置好两台之后,我们在 184.30 机器上监控下日志,新开一个控制台, $ tail -f /var/log/messages
  • 之后再 184.30 上开启一个终端,启动 $ systemctl start keepalived
  • 通过 var/log/messages 日志的监控,我们可以看到如下关键信息
    Starting Keepalived v1.3.5 (03/19,2017),git commit v1.3.5-6 g6fa32f2   这里可以看到软件版本 Opening file '/etc/keepalived/keepalived.conf'   这里正在打开配置文件 Starting Healthcheck child process, pid=3968   这里进行健康检查 Starting VRRP child process, pid=3969    这里启动 VRRP 协议 Keepalived healthcheckers[3968]: Opening file '/etc/keepalived/keepalived.conf Registering Kernel netlink reflector Registering Kernel netlink command channel Registering  gratuitous  ARP  shared  channel Opening file '/etc/keepalived/keepalived.conf' Started LVS and VRRP High Availability  Monitor VRRP Instance(Nginx 1) removing protocol VIPs. Using LinkWatch kernel netlink reflector... VRRP sockpool: [ifindex(2), proto(112), unicast(0), fd(10,11)] VRRP_Instance(Nginx_1) Transition to MASTER STATE  # 注意这里,进入 master 状态 VRRP_Instance(Nginx_1) Entering MASTER  STATE VRRP_Instance(Nginx_1) setting protocol IPs.  # 注意这里,设置 ip Sending gratuitous ARP on ens33 for 192.168.184.50   # 配置184.50到当前节点 VRRP_Instance(Nginx_1) Sending/queueing gratuitous ARPs on ens33 for 192.168.184.50 # 不停发送信息 Sending gratuitous ARP on ens33 for 192.168.184.50 Sending gratuitous ARP on ens33 for 192.168.184.50 
    • 184.30 后面在局域网内不停发送 ARP 广播信息:我已经有了184.50地址了,并且我是健康的
    • 184.40 机器收到后发现自己的优先级较低,会自动进入备用和待命状态
  • 在184.30 这台机器上检查 $ ip a
    1: lo:  mtu 65536 qdisc noqueue state UNKNOWN qlen 1 	link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 	inet 127.0.0.1/8 scope host lo 		valid lft forever preferred lft forever 	inet6 :: 1/128 scope host 		valid lft forever preferred lft forever  2: ens33:  mtu 1500 qdisc pfifo fast state UP qlen 1 000 	link/ether 00:0c:29:e1:51:9c brd ff:ff:ff:ff:ff:ff 	inet 192.168.184.30/24 brd 192.168.184.255 scope global ens33 		valid lft forever preferred lft forever 	inet 192.168.184.50/32 scope global ens33 		valid lft forever preferred lft forever  	inet6 fe80::e2f8:ff8a:c97a:2368/64 scope link 		valid lft forever preferred lft forever 
    • 这里可以看到 ens33上存在: inet 192.168.184.50/32 scope global ens33
    • 也就是 184.50 被绑定到了 ens33 网卡上了
    • 使用其他机器,比如 184.40 ping 这个 184.50 显示正常
    • 这样,184.50 这个 VIP 就可以正常对外提供服务了
  • 按照同样的方法,监测并启动 184.40 这台 backup 机器
    • 它会进入 BACKUP STATE 并不断进行监测
    • 有一条重要信息:VRRP_Instance(Nginx_1) Received advert with higher priority 100, ours 98
    • 可见,基于优先级,这里仍旧是 BACKUP STATE
    • 执行 $ ip a 时,184.40 是不会有 184.50 的VIP信息的

3 )模拟主节点宕机

  • 在 184.30 机器上,$ systemctl stop keepalived 或 $ reboot
  • 在 184.40 机器上监测的日志信息中会发现,立即进入 MASTER STATE
    • 并且 setting protocol VIPs.
    • 同时,继续广播自己已经拥有了 184.50,其他机器去主动更新本地ARP缓存表
    • 通过 $ ip a 可以看到 184.50 已经有了
  • 当184.30机器恢复并重新上线
    • 184.30 会立即变成 MASTER STATE
    • 184.40 会立即降级 BACKUP STATE
    • 这个是默认的配置,有时候我们并不想有这个效果,会对业务存在一定风险
  • 如果不想重新上线后又变成了 MASTER STATE,即非抢占式的
    • 在两台机器的 /etc/keepalived/keepalived.conf 的 vrrp_instance Nginx_1 段中
    • 添加一项配置 nopreempt 并且 都配置成 state BACKUP,没有 MASTER 了
    • 这样就都配置成了非抢占式,注意这里,非抢占式都配置成 BACKUP
    • 只要有一台配置了 MASTER 并且优先级较大,非抢占式就不会成功,就会去抢占
  • 以上就实现了2台机器的 VIP 转移, 需要多个机器的话,就多配置几台即可

4 )日志管理

  • 默认情况下,配置到了 /var/log/messages 中,如果不想配置在这里
  • 可以在 /etc/sysconfig/keepalived 中
    # Options for keepalived. See `keepalived --help' output and keepalived(8) and # keepalived.conf(5) man pages for a list of all options. Here are the most #  common ones : # #  --vrrp                  -P       Only run with VRRP subsystem. #  --check                 -C       Only run with Health-checker subsystem. #  --dont-release-vrrp     -V       Dont remove VRRP VIPs & VROUTEs on daemon stop. # --dont-release-ipvs      -I       Dont remove IPVS topology on daemon stop. # --dump-conf              -d       Dump the configuration data. #  --log-detail            -D       Detailed log messages. #  --log-facility          -S       0-7 Set local syslog facility (default=LOG DAEMON) #  KEEPALIVED OPTIONS="-D -d -S  0"   # 修改这里,默认是 -D 
    • KEEPALIVED OPTIONS="-D -d -S 0" 将 日志文件 放入 -S 中
  • 之后,$ vim /etc/rsyslog.conf 更改日志的存放位置
    local7.*                           /var/log/boot.log local0.*                           /var/log/keepalived/keepalived.log 
  • 之后,$ systemctl restart rsyslog 重启日志服务
  • 之后,$ systemctl restart keepalived 重启 keepalived
  • 检查,$ cd /var/log/keepalived/ && ll 下发现存在 keepalived.log 文件
    • 以后,所有的 keepalived 日志都会写在这里

Nginx 高可用原理


1 ) 原理

  • 同一时刻,两台Nginx只能有一台拥有 VIP
  • 当 Nginx 挂掉,KeepAlived 不会因为Nginx挂掉而转移 VIP
  • 而是宕机(或KeepAlived服务退出)之后才能转移
  • 我们需要写一个脚本,把 keepalived 和 Nginx 结合起来,实现服务的故障转移
  • 我们需要监测nginx程序,如果nginx 宕掉,那么就触发故障转移
  • 比如说,有两台Nginx服务器,准备好相同的数据,一台服务器节点宕掉之后
  • 另外一台服务器节点把对应的Nginx服务给我启动起来
  • 只要ip漂过来之后,对于用户来说,仍然能访问到相关服务

2 ) 脚本

  • $ vim nginx_health.sh 用于监测 nginx
    #!/bin/bash #  ps -ef | grep nginx | grep -v grep &> /dev/null  if [ $? -ne 0 ];then 	killall keepalived fi 
    • $? 表示 上一行命令的执行结果
  • 这里,当 Nginx 存在,执行 $ ps -ef | grep nginx | grep -v grep &> /dev/null 再执行 $ $? 这里是 0
  • 如果,Nginx 不存在,执行 $ ps -ef | grep nginx | grep -v grep &> /dev/null 再执行 $ $? 这里是 1 (非零)
  • 充分说明,我们可以通过这条命令的返回值来确定 Nginx 进程是否存在
  • 对脚本赋予执行权限 $ chmod +x nginx_health.sh
  • 两台机器都做以上处理,后续需要在 KeepAlived 配置文件中利用这样的脚本去追踪Nginx的状态
  • 并且配置实现对 Nginx 的高可用,此处留下思考,不再提供细节

相关内容

热门资讯

安卓11怎么退回系统,轻松操作... 你有没有遇到过这种情况:新系统更新后,发现新功能虽然炫酷,但老系统用起来更顺手?别急,今天就来教你怎...
返回主系统安卓11,探索新一代... 你有没有发现,最近你的安卓手机好像变得不一样了?没错,就是那个一直在默默无闻为你服务的安卓系统,它悄...
安卓系统豆瓣在哪看,轻松找到豆... 你有没有发现,手机里装了那么多应用,有时候找某个特定的软件就像大海捞针一样?比如说,你想要找豆瓣,但...
平板电脑小型安卓系统,探索平板... 你有没有发现,最近平板电脑界又掀起了一股热潮?没错,就是那些小巧便携、功能强大的安卓系统平板电脑。今...
安卓系统商店改地址,探索全新购... 你知道吗?最近安卓系统商店悄悄地改了地址,这可让不少手机用户感到新奇又好奇呢!让我们一起揭开这个神秘...
华为平板换安卓系统,体验全新智... 你有没有发现,最近华为平板的安卓系统更新换代的速度简直让人眼花缭乱?没错,我就要来跟你聊聊这个热门话...
安卓系统忘记网络设置,安卓系统... 亲爱的安卓用户们,你是否曾经遇到过这样的烦恼:手机连接网络时,突然忘记了网络设置,各种网络连接问题层...
安卓系统正在安装软件,软件安装... 你有没有发现,最近你的安卓手机好像变得特别忙碌呢?它正在悄悄地安装各种软件,仿佛在为你的生活添砖加瓦...
安卓系统漏洞措施,安卓系统漏洞... 你知道吗?安卓系统,这个陪伴我们日常生活的智能伙伴,最近可是有点小麻烦呢。不过别担心,今天我就要给你...
鸿蒙与安卓系统对比,谁将引领未... 你知道吗?最近手机圈里可是热闹非凡呢!鸿蒙系统和安卓系统,这两大操作系统之间的较量,简直就像是一场没...
安卓主板如何刷系统,轻松实现系... 你有没有遇到过安卓主板刷系统的烦恼?别急,今天就来给你详细说说这个话题,让你轻松搞定安卓主板刷系统的...
电脑如何切换安卓系统,操作指南... 你有没有想过,你的电脑竟然也能变身成为安卓系统的超级战士?没错,就是那个我们日常离不开的手机操作系统...
橘子系统与安卓系统区别,差异解... 你有没有想过,为什么你的手机里装的是安卓系统,而朋友的手机却是橘子系统呢?这两种系统看似相似,实则各...
超薄安卓系统手机推荐,超薄安卓... 你有没有想过,拥有一部超薄安卓系统手机,就像拥有了行走的时尚宣言?想象走在街头,手指轻轻一滑,屏幕上...
国产电脑安装安卓系统,开启智能... 你有没有想过,你的国产电脑除了Windows系统,还能装上安卓系统呢?没错,就是那个手机上常用的安卓...
手机安卓系统太老了,焕新体验 你有没有发现,你的手机安卓系统好像已经有点“老态龙钟”了呢?没错,就是那种用了好几年,虽然还能用,但...
和平精英外挂安卓系统,技术滥用... 你有没有发现,最近在和平精英的战场上,总有一些玩家像是开了挂一样,轻松击败敌人,让人不禁怀疑:他们是...
车载安卓系统怎么重启,轻松应对... 亲爱的车主朋友们,你是否曾在驾驶途中,突然发现车载安卓系统有点“卡壳”,想要给它来个“大扫除”?别急...
直播软件app安卓系统,打造个... 你有没有发现,最近手机上多了一个神奇的小玩意儿?没错,就是直播软件app!这玩意儿在安卓系统上可是火...
安卓系统apk如何安装,安卓系... 你有没有想过,为什么你的安卓手机里总是缺那么几个好用的应用呢?别急,今天就来手把手教你如何安装APK...