1. 安装环境 (准备阶段)

	su - root
	yum -y install kernel-devel*
	yum -y install openssl-*
	yum -y install popt-devel
	yum -y install lrzsz
	yum -y install openssh-clients
	yum -y install libnl libnl-devel popt

2. 安装keepalived
2.1. 安装keepalived
将keepalived-1.2.15.tar.gz上传到服务器

tar -zxvf keepalived-1.2.15.tar.gz -C /usr/local/
cd  /usr/local/keepalived-1.2.15/

执行配置命令

./configure --prefix=/usr/local/keepalived

在Linux中安装keepalived实现Nginx的高可用
3、编译

make

4、安装

make install

或者把3和4这个步骤合成一步

make && make install

至此安装成功
5、拷贝执行文件

cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
6、将init.d文件拷贝到etc下,加入开机启动项

cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/keepalived

7、将keepalived文件拷贝到etc下,加入网卡配置

cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/ 

8、创建keepalived文件夹

mkdir -p /etc/keepalived

9、将keepalived配置文件拷贝到etc下

cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf

10、添加可执行权限

chmod +x /etc/init.d/keepalived

2.2. 加入开机启动(添加时必须保证/etc/init.d/keepalived存在):

可以自行去检查是否存在

ll /etc/init.d/

在Linux中安装keepalived实现Nginx的高可用

chkconfig --add keepalived	
chkconfig keepalived on

添加完可查询系统服务是否存在:

chkconfig --list

在Linux中安装keepalived实现Nginx的高可用
2.3. 启动keepalived

启动:service keepalived start
停止:service keepalived stop
重启:service keepalived restart
  1. 配置日志文件
    1.将keepalived日志输出到local0:
vim /etc/sysconfig/keepalived
KEEPALIVED_OPTIONS="-D -d -S 0"

在Linux中安装keepalived实现Nginx的高可用
2.在/etc/rsyslog.conf里添加:

vim /etc/rsyslog.conf
local0.*  /var/log/keepalived.log

在Linux中安装keepalived实现Nginx的高可用
3.重新启动keepalived和rsyslog服务:

service rsyslog restart 
service keepalived restart
  1. 打开防火墙的通讯地址

方式一:手动添加

vim /etc/sysconfig/iptables
iptables -A INPUT -d 224.0.0.18 -j ACCEPT

在Linux中安装keepalived实现Nginx的高可用
方式二(推荐使用这种!!!):

iptables -A INPUT -d 224.0.0.18 -j ACCEPT
/etc/rc.d/init.d/iptables save

例子分析:
假设禁止ip为192.168.1.110的计算机访问本机eth0网卡
分析:
禁止XXX访问本机 所以是INPUT链 增加规则使用-A
网卡是eth0因为是INPUT链 所以参数应该是 -i
源ip是 192.168.1.110
动作是 DROP
于是应该这样写
iptables -A INPUT -i eth0 -s 192.168.1.110 -j DROP
反过来,禁止本机访问192.168.1.110可以这么写
iptables -A OUTPUT -o eth0 -d 192.168.1.110 -j DROP
这里要注意的是,默认允许了所有的链接都可以通过,到达服务器。这样的设置在正式生产服务器环境上是十分危险的,不建议这么设置,应当设置为DROP,但是默认允许所有的链接都禁止的后果就是把自己的远程操作也踢掉了,服务器在本地还无所谓,但是在远程这就麻烦了。于是要牢记,默认规则要在设置好自己访问的规则以后再设置,最好是在最后设置。

接下来就是关键步骤了:
主从机上keepalived的配置文件(keepalived.conf)配置如下(多余的配置我没删除,只是为了给与大家了解含义,各位自行选择删除即可):

vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived

#主从配置:主机上的 全局配置
global_defs {

#指定keepalived在发生切换时需要发送email到的对象,一行一个
   ##notification_email {
     ##[email protected]
     ##[email protected]
     ##[email protected]
   ##}
#指定发件人
   ##notification_email_from [email protected]
#指定smtp服务器地址
   ##smtp_server 192.168.200.1
#指定smtp连接超时时间
   ##smtp_connect_timeout 30
#运行keepalived机器的一个标识,我配置的是当前主机名
# router_id LVS_DEVEL
router_id NginxProxy
}

#配置,自行选择是否需要检查脚本文件,需要放开注释,并在/etc/keepalived/下创建这个文件nginx_check.sh
# 每隔2秒中去执行/etc/keepalived/nginx_check.sh脚本一次,检查是否宕机,我没采用这种,因为这种会以备份机为主导,只有备份机挂了,才会启用主从机
## vrrp_script chk_nginx {
##   script "/etc/keepalived/nginx_check.sh"
## interval表示间隔时间
##   interval 2
#weight -20的意思是,脚本执行成功后把192.168.1.32,这个节点的优先级降低15
##   weight -15
##}

vrrp_instance VI_1 {
#指定A节点(主从机)为主节点 备分机上设置为BACKUP即可 
   state MASTER
#设置实例绑定的网卡
    interface eth0
#VRRP组名,两个节点的设置必须一样,以指明各个节点属于同一VRRP组(同一实例下virtual_router_id必须相同)
    virtual_router_id 51
#
mcast_src_ip 192.168.1.32
#主节点的优先级(1-254之间),备用节点必须比主节点优先级低
    priority 100
#MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位是秒
    advert_int 1

#设置验证信息,两个节点必须一致
    authentication {
#主从服务器验证方式
        auth_type PASS
        auth_pass 1111
    }
# 检查nginx是否宕机自行选择是否需要检查脚本文件,需要的放开注释(我试过会造成备份机作为主导)
##track_script {
##       chk_nginx
##    }
 #指定虚拟IP, 两个节点设置必须一样
    virtual_ipaddress {
#如果两个nginx的ip分别是192.168.232.201,,...205,则此处的虚拟ip跟它俩同一个网段即可,24子网掩码(255.255.255.0),可以多个虚拟IP,换行即可
        ##192.168.200.16
        ##192.168.200.17
        ##192.168.200.18
#对应的一个假设出的虚拟IP,对外提供的虚拟IP(隐藏真实ip),这里可以是一个也可以是多个
	192.168.1.132
    }
}

##virtual_server 192.168.200.100 443 {
##   delay_loop 6
##    lb_algo rr
##    lb_kind NAT
##    nat_mask 255.255.255.0
##    persistence_timeout 50
##    protocol TCP

##   real_server 192.168.201.100 443 {
##        weight 1
##        SSL_GET {
##            url {
##              path /
##              digest ff20ad2481f97b1754ef3e12ecd3a9cc
##            }
##            url {
##              path /mrtg/
##              digest 9b3a0c85a887a256d6939da88aabd8cd
##           }
##            connect_timeout 3
##            nb_get_retry 3
##            delay_before_retry 3
##        }
##    }
##}

##virtual_server 10.10.10.2 1358 {
##    delay_loop 6
##    lb_algo rr 
##   lb_kind NAT
##    persistence_timeout 50
##    protocol TCP

##  sorry_server 192.168.200.200 1358

##    real_server 192.168.200.2 1358 {
##        weight 1
##        HTTP_GET {
##            url { 
##              path /testurl/test.jsp
##              digest 640205b7b0fc66c1ea91c463fac6334d
##            }
##            url { 
##             path /testurl2/test.jsp
##              digest 640205b7b0fc66c1ea91c463fac6334d
##            }
##            url { 
##              path /testurl3/test.jsp
##              digest 640205b7b0fc66c1ea91c463fac6334d
##            }
##            connect_timeout 3
##           nb_get_retry 3
##            delay_before_retry 3
##        }
##    }

##    real_server 192.168.200.3 1358 {
##       weight 1
##       HTTP_GET {
##           url { 
##             path /testurl/test.jsp
##              digest 640205b7b0fc66c1ea91c463fac6334c
##            }
##            url { 
##              path /testurl2/test.jsp
##              digest 640205b7b0fc66c1ea91c463fac6334c
##            }
##            connect_timeout 3
##            nb_get_retry 3
 ##           delay_before_retry 3
 ##       }
##    }
##}

## virtual_server 10.10.10.3 1358 {
##    delay_loop 3
##    lb_algo rr 
##    lb_kind NAT
##    nat_mask 255.255.255.0
##    persistence_timeout 50
##    protocol TCP

 ##   real_server 192.168.200.4 1358 {
 ##       weight 1
 ##       HTTP_GET {
 ##           url { 
 ##             path /testurl/test.jsp
 ##             digest 640205b7b0fc66c1ea91c463fac6334d
  ##          }
  ##          url { 
  ##            path /testurl2/test.jsp
  ##            digest 640205b7b0fc66c1ea91c463fac6334d
  ##          }
  ##          url { 
  ##            path /testurl3/test.jsp
  ##           digest 640205b7b0fc66c1ea91c463fac6334d
  ##          }
  ##          connect_timeout 3
  ##          nb_get_retry 3
  ##         delay_before_retry 3
  ##      }
  ##  }

  ##  real_server 192.168.200.5 1358 {
  ##      weight 1
  ##      HTTP_GET {
  ##          url { 
  ##            path /testurl/test.jsp
  ##            digest 640205b7b0fc66c1ea91c463fac6334d
  ##          }
  ##         url { 
  ##            path /testurl2/test.jsp
  ##            digest 640205b7b0fc66c1ea91c463fac6334d
  ##          }
  ##         url { 
  ##            path /testurl3/test.jsp
  ##            digest 640205b7b0fc66c1ea91c463fac6334d
  ##          }
  ##          connect_timeout 3
  ##          nb_get_retry 3
  ##          delay_before_retry 3
  ##      }
  ##  }
##}

以上是主从机上的keepalived的配置文件,接下来是备份机上(keepalived.conf)的配置文件!

! Configuration File for keepalived

#主从配置:主机上的 全局配置
global_defs {
router_id cloneNginx
}
#配置,不借助check.sh文件来完成!
# 每隔2秒中去执行/etc/keepalived/nginx_check.sh脚本一次
##vrrp_script chk_nginx {
##   script "/etc/keepalived/nginx_check.sh"
#interval表示间隔时间
##   interval 2
#weight -20的意思是,脚本执行成功后把192.168.1.32,这个节点的优先级降低15
##   weight -15
##}

vrrp_instance VI_1 {
#指定B节点为副服务器,备分机上设置为BACKUP即可,主从机设置为MASTER
   state BACKUP
#设置实例绑定的网卡
    interface eth0
#VRRP组名,两个节点的设置必须一样,以指明各个节点属于同一VRRP组(同一实例下virtual_router_id必须相同)
    virtual_router_id 51
#备份机上的真是ip
mcast_src_ip 192.168.1.33
#主节点的优先级(1-254之间)(主、备机取不同的优先级,主机值较大,备份机值较小,值越大优先级越高)
    priority 90
#MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位是秒
    advert_int 1

#设置验证信息,两个节点必须一致
    authentication {
#主从服务器验证方式
        auth_type PASS
        auth_pass 1111
    }
# 检查nginx是否宕机,是否借助check.sh文件来完成
##track_script {
##       chk_nginx
##    }
 #指定虚拟IP, 两个节点设置必须一样
    virtual_ipaddress {
#对应的一个假设出的虚拟IP,对外提供的虚拟IP,这里可以是一个也可以是多个
	192.168.1.132
    }
}


如果大家采用这种方式chk_nginx.sh文件来检测的话,创建宕机检查文件(主从机及备份机都要有,且内容一致)这份文档编辑格式必须保持Unix格式
nginx的脚本文件nginx_check.sh,需要确保脚本格式是unix格式,方法是vim进入编辑模式,然后输入:set ff并按回车即可看到格式,注意:wc -l的"l"是小写的L而不是1)。

cd /etc/keepalived/
vim nginx_check.sh
=`ps -C nginx --no-header |wc -l`
#如果查询到的nginx的进程数量是0的话,就执行if条件里的内容。
if [ $A -eq 0 ];then
#由于检查到当前没有nginx进程,因此尝试去启动nginx。
	/usr/local/nginx/sbin/nginx
#启动nginx之后休眠2秒。
	sleep 2
#检查当前nginx的进程数量并把查询到的进程数量赋值给变量A
	if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
		killall keepalived
	fi
fi

nginx_check.sh脚本文件在两个节点上内容一样(主从机及备份机都要有,且内容一致,上面讲过了)
nginx_check.sh脚本文件的好处就是,当keepalived停止时,它会把对应的Nginx和Tomcat集群都停止!

在Linux中安装keepalived实现Nginx的高可用

由于目前nginx_check.sh脚本只有读权限,因此我们需要把两个节点上这个文件的权限放开,如下图所示。

chmod 777 nginx_check.sh

在Linux中安装keepalived实现Nginx的高可用
之后分别启动192.168.1.32和192.168.1.33的Nginx及Tomcat集群
访问主从机192.168.1.32查看Tomcat集群是否启动成功 !
在Linux中安装keepalived实现Nginx的高可用
访问备份机192.168.1.33查看Tomcat集群是否启动成功 !
在Linux中安装keepalived实现Nginx的高可用
最后启动keepalived

service keepalived start

启动完keepalived后查看我们主从机上的ip,发现主从机上可以看到如下图:
在Linux中安装keepalived实现Nginx的高可用
启动完keepalived后再查看我们备份机上的的ip,发现备份机上可以看到如下图:
在Linux中安装keepalived实现Nginx的高可用
如上面两幅图所示,如果我们发现在两个节点上都看到了虚拟IP192.168.1.132,这是不合理的,正确情况应该是只在Master角色的节点上才有虚拟IP。如果发生此类问题,说明是防火墙的缘故,可以尝试关闭防火墙再次查看!

service iptables stop 
service keepalived stop
service keepalived start
/usr/local/nginx/sbin/nginx -s reload

两个Nginx且Tomcat集群都是正常启动后,启动keepalived访问发现,备份机没有宕机(也就是Nginx没有宕机的时候),怎么访问都是192.168.1.32这个主从机的Tomcat集群!
在Linux中安装keepalived实现Nginx的高可用
当我们把主从机上的keepalived停止后,再次访问的话,就只能访问到备份机192.168.133上的Tomcat集群了!而主从机上的Tomcat集群则不对外开放!
在Linux中安装keepalived实现Nginx的高可用

相关文章:

  • 2021-05-31
  • 2021-10-13
  • 2022-01-13
  • 2021-10-14
  • 2021-05-12
  • 2021-09-16
猜你喜欢
  • 2021-04-27
  • 2022-02-20
  • 2022-12-23
  • 2021-06-21
  • 2021-11-14
相关资源
相似解决方案