写点什么

Nginx 的高可用

作者:java易二三
  • 2023-07-30
    湖南
  • 本文字数:2667 字

    阅读完需:约 9 分钟

Keepalived+重启脚本+双机热备搭建


①首先创建一个对应的目录并下载 keepalived 到 Linux 中并解压:


[root@localhost]# mkdir /soft/keepalived && cd /soft/keepalived


[root@localhost]# wget https://www.keepalived.org/software/keepalived-2.2.4.tar.gz


[root@localhost]# tar -zxvf keepalived-2.2.4.tar.gz


②进入解压后的 keepalived 目录并构建安装环境,然后编译并安装:


[root@localhost]# cd keepalived-2.2.4[root@localhost]# ./configure --prefix=/soft/keepalived/[root@localhost]# make && make install③进入安装目录的/soft/keepalived/etc/keepalived/并编辑配置文件:


[root@localhost]# cd /soft/keepalived/etc/keepalived/[root@localhost]# vi keepalived.conf④编辑主机的 keepalived.conf 核心配置文件,如下:


global_defs {


# 自带的邮件提醒服务,建议用独立的监控或第三方 SMTP,也可选择配置邮件发送。


notification_email {


root@localhost


}


notification_email_from root@localhost


smtp_server localhost


smtp_connect_timeout 30


# 高可用集群主机身份标识(集群中主机身份标识名称不能重复,建议配置成本机 IP)


router_id 192.168.12.129


}

定时运行的脚本文件配置

vrrp_script check_nginx_pid_restart {


# 之前编写的 nginx 重启脚本的所在位置


script "/soft/scripts/keepalived/check_nginx_pid_restart.sh"


# 每间隔 3 秒执行一次


interval 3


# 如果脚本中的条件成立,重启一次则权重-20


weight -20


}

定义虚拟路由,VI_1 为虚拟路由的标示符(可自定义名称)

vrrp_instance VI_1 {


# 当前节点的身份标识:用来决定主从(MASTER 为主机,BACKUP 为从机)


state MASTER


# 绑定虚拟 IP 的网络接口,根据自己的机器的网卡配置


interface ens33


# 虚拟路由的 ID 号,主从两个节点设置必须一样


virtual_router_id 121


# 填写本机 IP


mcast_src_ip 192.168.12.129


# 节点权重优先级,主节点要比从节点优先级高


priority 100


# 优先级高的设置 nopreempt,解决异常恢复后再次抢占造成的脑裂问题


nopreempt


# 组播信息发送间隔,两个节点设置必须一样,默认 1s(类似于心跳检测)


advert_int 1


authentication {


auth_type PASS


auth_pass 1111


}


# 将 track_script 块加入 instance 配置块


track_script {


# 执行 Nginx 监控的脚本


check_nginx_pid_restart


}


virtual_ipaddress {      # 虚拟IP(VIP),也可扩展,可配置多个。  
复制代码


192.168.12.111


}


}


⑤克隆一台之前的虚拟机作为从(备)机,编辑从机的 keepalived.conf 文件,如下:


global_defs {


# 自带的邮件提醒服务,建议用独立的监控或第三方 SMTP,也可选择配置邮件发送。


notification_email {


root@localhost


}


notification_email_from root@localhost


smtp_server localhost


smtp_connect_timeout 30


# 高可用集群主机身份标识(集群中主机身份标识名称不能重复,建议配置成本机 IP)


router_id 192.168.12.130


}

定时运行的脚本文件配置

vrrp_script check_nginx_pid_restart {


# 之前编写的 nginx 重启脚本的所在位置


script "/soft/scripts/keepalived/check_nginx_pid_restart.sh"


# 每间隔 3 秒执行一次


interval 3


# 如果脚本中的条件成立,重启一次则权重-20


weight -20


}

定义虚拟路由,VI_1 为虚拟路由的标示符(可自定义名称)

vrrp_instance VI_1 {


# 当前节点的身份标识:用来决定主从(MASTER 为主机,BACKUP 为从机)


state BACKUP


# 绑定虚拟 IP 的网络接口,根据自己的机器的网卡配置


interface ens33


# 虚拟路由的 ID 号,主从两个节点设置必须一样


virtual_router_id 121


# 填写本机 IP


mcast_src_ip 192.168.12.130


# 节点权重优先级,主节点要比从节点优先级高


priority 90


# 优先级高的设置 nopreempt,解决异常恢复后再次抢占造成的脑裂问题


nopreempt


# 组播信息发送间隔,两个节点设置必须一样,默认 1s(类似于心跳检测)


advert_int 1


authentication {


auth_type PASS


auth_pass 1111


}


# 将 track_script 块加入 instance 配置块


track_script {


# 执行 Nginx 监控的脚本


check_nginx_pid_restart


}


virtual_ipaddress {      # 虚拟IP(VIP),也可扩展,可配置多个。  
复制代码


192.168.12.111


}


}


⑥新建 scripts 目录并编写 Nginx 的重启脚本,check_nginx_pid_restart.sh:


[root@localhost]# mkdir /soft/scripts /soft/scripts/keepalived


[root@localhost]# touch /soft/scripts/keepalived/check_nginx_pid_restart.sh


[root@localhost]# vi /soft/scripts/keepalived/check_nginx_pid_restart.sh


#!/bin/sh


# 通过 ps 指令查询后台的 nginx 进程数,并将其保存在变量 nginx_number 中


nginx_number=ps -C nginx --no-header | wc -l


# 判断后台是否还有 Nginx 进程在运行


if [ $nginx_number -eq 0 ];then


# 如果后台查询不到Nginx进程存在,则执行重启指令


/soft/nginx/sbin/nginx -c /soft/nginx/conf/nginx.conf


# 重启后等待 1s 后,再次查询后台进程数


sleep 1


# 如果重启后依旧无法查询到 nginx 进程


if [ ps -C nginx --no-header | wc -l -eq 0 ];then


# 将 keepalived 主机下线,将虚拟 IP 漂移给从机,从机上线接管 Nginx 服务


systemctl stop keepalived.service


fi


fi


⑦编写的脚本文件需要更改编码格式,并赋予执行权限,否则可能执行失败:


[root@localhost]# vi /soft/scripts/keepalived/check_nginx_pid_restart.sh


:set fileformat=unix # 在 vi 命令里面执行,修改编码格式


:set ff # 查看修改后的编码格式


[root@localhost]# chmod +x /soft/scripts/keepalived/check_nginx_pid_restart.sh


⑧由于安装 keepalived 时,是自定义的安装位置,因此需要拷贝一些文件到系统目录中:


[root@localhost]# mkdir /etc/keepalived/[root@localhost]# cp /soft/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/[root@localhost]# cp /soft/keepalived/keepalived-2.2.4/keepalived/etc/init.d/keepalived /etc/init.d/[root@localhost]# cp /soft/keepalived/etc/sysconfig/keepalived /etc/sysconfig/⑨将 keepalived 加入系统服务并设置开启自启动,然后测试启动是否正常:


[root@localhost]# chkconfig keepalived on[root@localhost]# systemctl daemon-reload[root@localhost]# systemctl enable keepalived.service[root@localhost]# systemctl start keepalived.service 其他命令:


systemctl disable keepalived.service # 禁止开机自动启动 systemctl restart keepalived.service # 重启 keepalived systemctl stop keepalived.service # 停止 keepalived tail -f /var/log/messages # 查看 keepalived 运行时日志⑩最后测试一下 VIP 是否生效,通过查看本机是否成功挂载虚拟 IP:


[root@localhost]# ip addr

用户头像

java易二三

关注

还未添加个人签名 2021-11-23 加入

还未添加个人简介

评论

发布
暂无评论
Nginx的高可用_编程_java易二三_InfoQ写作社区