Nginx 的高可用
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
}
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
}
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
评论