keepalived+nginx实现web高可用
目录
高可用集群搭建
Keepalived+nginx实现web高可用
一.节点规划
二.基础准备
1.修改主机名
2.关闭防火墙和selinux服务
三.用keepalived配置高可用
1.安装nginx服务
2.修改nginx配置文件
3.启动nginx
4.访问nginx
5.安装keepalived服务
6.编辑配置文件
7.编写nginx状态检测脚本
8.给脚本文件755权限
9.启动keepalived
10.测试高可用
(1)测试1:
(2)测试2:
(3)测试3:
(4)测试4:
(5)测试5:
高可用集群搭建
Keepalived+nginx实现web高可用
一.节点规划
IP | 主机名 | 节点 |
192.168.77.130 | Master | 主节点 |
192.168.77.132 | Backup | 从节点 |
192.168.77.100 | Vip地址 |
二.基础准备
1.修改主机名
主节点:
Hostnamectl set-hostname master bash |
从节点:
Hostnamectl set-hostname backup bash |
2.关闭防火墙和selinux服务
Systemctl stop firewalld Systemctl disable firewalld Setenforce 0 |
三.用keepalived配置高可用
1.安装nginx服务
主节点采用编译安装方式安装nginx,从节点采用yum方式安装nginx
主节点:
安装编译环境依赖包:
#安装c语言和编译安装的环境 Yum -y install gcc gcc-c++ make automake autoconf libtool zlib zlib-devel pcre pcre-devel openssl openssl-devel |
安装nginx:
Wget http://nginx.org/download/nginx-1.13.7.tar.gz 没有wget的话需要先安装wget Yum -y install wget |
解压nginx安装包:
Tar -zxvf nginx-1.13.7.tar.gz |
编译安装nginx:
Cd nginx-1.13.7 #./configure是运行nginx安装脚本 --prefix是配置安装路径 ./configure --prefix=/usr/local/nginx #make && make install开始编译安装 Make && make install |
从节点:
安装nginx:
Yum -y install nginx |
2.修改nginx配置文件
修改nginx首页面内容为节点的IP地址,方便后续测试观察
两台机器采用不同方式安装nginx配置文件路径会有不同
主节点:
Vi /usr/local/nginx/html/index.html |
修改配置为如下:
<body> <h1>192.168.77.130</h1> |
从节点:
Vi /usr/share/nginx/html/index.html |
修改配置为如下:
<div id="content"> <h1>192.168.77.132</h1> |
3.启动nginx
主节点:
Cd /usr/local/nginx/sbin/ ./nginx |
用netstat -ntpl命令查看是否有80端口 有则说明服务已启动:
Netstat -ntpl #如果出现未找到命令,需要下载net-tools Yum -y install net-tools |
从节点:
Systemctl start nginx Systemctl status nginx Netstat -ntpl |
4.访问nginx
http://192.168.77.130 http://192.168.77.132 |
5.安装keepalived服务
主从节点:
Yum -y install keepalived |
6.编辑配置文件
红字为修改的地方
vi /etc/keepalived/keepalived.conf |
编辑master节点配置文件(192.168.77.130)
! Configuration File for keepalived global_defs { #全局配置标识 notification_email { acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 192.168.200.1 smtp_connect_timeout 30 router_id 192.168.77.130 #路由id,不能重复,通常为hostname vrrp_skip_check_adv_addr vrrp_strict vrrp_garp_interval 0 vrrp_gna_interval 0 } vrrp_script chk_nginx { script "/etc/keepalived/nginx_check.sh" #检测nginx状态的脚本路径 interval 2 #每2秒运行一次上面的脚本 } vrrp_instance VI_1 { state MASTER interface ens33 #网卡名称,与本机ip地址所在网卡名 virtual_router_id 51 称相同. priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { #设置虚拟ip 192.168.77.100 #设置vip为100 } track_script { #执行脚本 chk_nginx #对应vrrp_script配置的脚本 } } |
编辑backup节点配置文件(192.168.77.132)
! Configuration File for keepalived global_defs { notification_email { acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 192.168.200.1 smtp_connect_timeout 30 router_id 192.168.77.132 vrrp_skip_check_adv_addr vrrp_strict vrrp_garp_interval 0 vrrp_gna_interval 0 } vrrp_script chk_nginx { script "/etc/keepalived/nginx_check.sh" interval 2 } vrrp_instance VI_1 { state BACKUP #可选值为master或者backup interface ens33 virtual_router_id 51 priority 90 #定义优先级,数字越大优先级越高,ma advert_int 1 ster优先级必须要大于backup优先级 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.77.100 } track_script { chk_nginx } } |
7.编写nginx状态检测脚本
两台虚拟机都要编写
Vi /etc/keepalived/nginx_check.sh |
主节点:
#!/bin/bash #时间变量,用于记录日志 d=`date --date today +%Y%m%d_%H:%M:%S` #计算nginx进程数量 n=`ps -C nginx --no-heading|wc -l` #如果进程为0,则启动nginx,并且再次检测nginx进程数量, #如果还为0,说明nginx无法启动,此时需要关闭keepalived if [ $n -eq "0" ]; then /usr/local/nginx/sbin/nginx n2=`ps -C nginx --no-heading|wc -l` if [ $n2 -eq "0" ]; then echo "$d nginx down,keepalived will stop" >> /var/log/check_ng.log #杀掉keepalived,是为了防止脑裂。脑裂指的是高可用集群中,当主从切换时,主上的keepalived还在启动,会和从争抢VIP,导致后台链接服务器时,不知道连接哪台服务器好,导致出错。 systemctl stop keepalived fi fi |
从节点:
#!/bin/bash #时间变量,用于记录日志 d=`date --date today +%Y%m%d_%H:%M:%S` #计算nginx进程数量 n=`ps -C nginx --no-heading|wc -l` #如果进程为0,则启动nginx,并且再次检测nginx进程数量, #如果还为0,说明nginx无法启动,此时需要关闭keepalived if [ $n -eq "0" ]; then systemctl start nginx ##因为是yum安装,启动有点不一样 n2=`ps -C nginx --no-heading|wc -l` if [ $n2 -eq "0" ]; then echo "$d nginx down,keepalived will stop" >> /var/log/check_ng.log systemctl stop keepalived fi fi |
8.给脚本文件755权限
Chmod 755 /etc/keepalived/nginx_check.sh |
9.启动keepalived
Systemctl start keepalived #启动 Systemctl status keepalived #查看运行状态 |
Master节点成功标志:
可以看到。Master节点已经获取到了vip 192.168.77.100
Backup节点成功标志:
Backup节点上只有192.168.77.132这个ip是正常的
MASTER节点正常的情况下,BACKUP节点一定不会有浮动IP,也就是VIP只能同时在一个节点上。
10.测试高可用
为了区分master和backup两个角色,我们需要先把两台机器的Nginx做一个区分,其实编译安装的Nginx和yum安装的Nginx版本肯定不一样,事实就是如此:
通过curl -I来查看差异:
(1)测试1:
关闭master上的nginx服务
Cd /usr/local/nginx/sbin/ ./nginx -s stop Ps -aux | grep nginx |
脚本可以再次启动nginx,无法关闭
还有一种情况通过彻底关闭nginx来实现放在测试五讲解
(2)测试2:
在master上增加iptabls规则
Iptables -I OUTPUT -p vrrp -j DROP |
可以发现master和backup上都出现了vip。在master上依旧有VIP,master上虽然被禁掉了VRRP协议,但它并不认为自己宕机了,所以不会释放VIP资源。如果master和backup都绑定了VIP,那么对外提供服务就会紊乱,这种情况被称为“脑裂”,这种情况是不允许发生的.
解决的话需要关闭master上的keepalived服务
恢复状态
Iptables -F |
(3)测试3:
关闭master上的keepalived服务
Systemctl stop keepalived |
访问vip成功切换到从上。
(4)测试4:
启动master上的keepalived服务
Systemctl start keepalived |
Vip又调回到了主上。
(5)测试5:
彻底关闭nginx服务
需修改master的nginx配置文件
Vi /usr/local/nginx/conf/nginx.conf |
我们在配置文件开头的woker和event前面添加个注释
测试完成后要修改回来
然后查看nginx进程
使用kill命令将nginx服务停掉
这时候我们再查看keepalived服务
能看到脚本使keepalived停掉了
然后在master和backup节点上查看ip
能看到vip成功转移到backup节点上,没有发生脑裂的情况。
至此测试完毕。