为了解决实验室每次演示项目的稳定性,提高项目的可用性。现在搭建一个Keepalived+Nginx的负载均衡高可用的一个环境。设置一个VIP地址,里面配置两个真实IP的地址,当一天Nginx服务器宕机之后,VIP会自动跳转到另一台Nginx服务上去,从而实现了高可用。
1.系统环境
系统为Centos 7.3
Keepalived的安装包为keepalived-1.2.16.tar.gz
Nginx的安装包为nginx/1.10.1
网络环境配置
进入/etc/sysconfig/network-scripts
目前这两台虚拟机上都有两块网卡,第一块是外网网卡,第二块是内网网卡,基本信息如下:
虚拟IP | 真实IP | Nginx端口 | 默认主从 | 软件 |
---|---|---|---|---|
59.69.29.10 | 59.68.29.xx | 80 | MAATER | Keepalived+Nginx |
59.69.29.10 | 59.68.29.xx | 80 | BACKUP | Keepalived+Nginx |
2.虚拟路由冗余协议(VRRP)
VRRP是Virtual Router RedundancyProtocol
(虚拟路由器冗余协议)的缩写,VRRP出现的目的就是为了解决静态路由单点故障问题的,它能够保证当个别节点宕机时,整个网络可以不间断地运行。
3.Keepalived原理介绍
Keepalived
的作用是检测服务器的状态,如果有一台web服务器宕机,或工作出现故障,Keepalived
将检测到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服务器的工作,当服务器工作正常后Keepalived
自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器
1、刚开始VIP绑定到MASTER机器,对外提供VIP访问,实际访问的是MASTER机器
2、如果Nginx宕机,对外不可服务,则VIP会重新漂移到新的BACKUP机器上面,新的BACKUP重新选举MASTER机器,从而解决Nginx的单点故障问题
3、VIP选择问题
此架构需考虑的问题:
1、Master
运行,则Master占有vip
且Nginx
能够正常服务;
2、Master
挂了,则Backup抢占vip
且Nginx
能够正常服务
3、任何一台前端nginx
服务挂了,则vip
资源转移到另一台服务器上,并发送提醒邮件;
4、由于应用需要Session
保持,但由于没有做Session共享
,实际服务器角色转换时,应用会受到一定的影响。
4.Nginx安装与配置
分别在两台虚拟机(MASTER和BACKUP节点)上安装Nginx,安装Nginx的教程请看之前的一篇博客。
5.Keepalived的安装与配置
1.上传或下载 keepalived-1.2.16.tar.gz
到/usr/local/
目录下,新建keepalived
目录,
2.解压安装,进入/usr/local
执行tar -zxvf keepalived-1.2.16.tar.gz
3.进入解压后的目录cd keepalived-1.2.16
- 指定编译路径:
./configure --prefix=/usr/local/keepalived
- 编译安装:
make && make install
4.将keepalived
安装成Linux系统服务
复制默认的配置文件到默认路径:安装完成后,进入安装目录的etc
目录下,将keepalived
相应的配置文件拷贝到系统相应的目录当中。keepalived
启动时会从/etc/keepalived
目录下查找keepalived.conf
配置文件,如果没有找到测使用默认的配置。
#拷贝执行文件
cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
#将init.d文件拷贝到etc下,加入开机启动项
cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/keepalived
#将keepalived文件拷贝到etc下
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
#创建Keepalived文件夹
mkdir -p /etc/keepalived
#将keepalived配置文件拷贝到etc下
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf
#添加可执行权限
chmod +x /etc/init.d/keepalived
设置keepalived
服务开机启动:
chkconfig keepalived on
systemctl enable keepalived.service #设置开机自动启动
systemctl disable keepalived.service #取消开机自动启动
systemctl start keepalived.service #启动服务
systemctl restart keepalived.service #重启服务
systemctl stop keepalived.service #停止服务
systemctl status keepalived.service #查看服务状态
Keepalived配置文件详解
在MASTER节点上,进入/usr/local/keepalived/etc/keepalived
这个目录下,打开配置文件keepalived.conf
如下:
! Configuration File for keepalived
#全局配置段
global_defs {
#通知邮件配置块
notification_email {
root@localhost #通知邮件收件人
}
#通知邮件发件人
notification_email_from root@localhost
#邮件服务器地址
smtp_server localhost
#邮件服务器连接超时时间
smtp_connect_timeout 30
#机器表示,通常设置为本机的hostname(本机是slave1)
router_id LVS_DEVEL
}
#配置vrrp_script,主要用于健康检查,以及检查失败后执行的动作。
vrrp_script chk_nginx {
#健康检查脚本,当脚本返回值不为0时认为失败
script "/etc/keepalived/ck_ng.sh"
#检查频率,以下配置每2秒检查1次
interval 2
#当检查失败后,将vrrp_instance的priority减小5
weight -5
#连续监测失败3次,才认为真的健康检查失败。并调整优先级
fall 3
#连续监测2次成功,就认为成功。但不调整优先级
rise 2
}
#VRRP实例配置段
vrrp_instance VI_1 {
#指定vrrp_instance的初始状态。但如果master的优先级比某个backup还低,那么在通告时,那台backup就会抢占master
state MASTER
#绑定虚拟IP的网络接口,与本机IP地址所在的网络接口相同
interface ens32
#发送心跳包的源IP,可使用绑定的网卡IP,也可以使用本服务器上的其他IP
mcast_src_ip 172.16.97.252
#设置虚拟路由器标识(范围0-255)。只有相同的标识,才能实现在多播域内通告优先级以及其他信息(主从要一致)
virtual_router_id 51
#设置本机节点的优先级,优先级最高的为真正的MASTER
priority 100
#每隔多长时间通告并检查一次,默认为1秒
advert_int 1
#定义认证方式和密码。MASTER/BACKUP必须一样
authentication {
auth_type PASS
auth_pass 1111
}
#本vrrp_instance所引用的脚本配置,名称就是vrrp_script 定义的容器名
track_script {
chk_nginx
}
#设置VIP地址,也就是虚拟IP地址。可以设置多个VIP;只有当节点为MASTER时,此IP才会生效(每行一个)
virtual_ipaddress {
59.68.29.10/24
}
}
在BUCKUP的节点上只需将:
route_id vs1
>> route_id vsN
只需要修改vs
后的数字为backup的机器编号即可
state MASTER
>> state BACKUP
在这之前我们说过,Master只能有一个,所以其他BAKCUP都要修改这里
priority 100
>> priority 90
其他BACKUP节点的优先级一定要比Master节点小
添加Nginx监控脚本,监控Nginx的运行状态,如果发现异常并不能重启成功则关闭Keepalived
,让VIP漂移到备份服务器
vim /etc/keepalived/ck_ng.sh
配置内容如下:
#!/bin/bash
#检查nginx进程是否存在
counter=$(ps -C nginx --no-heading|wc -l)
if [ "${counter}" = "0" ]; then
#尝试启动一次nginx,停止5秒后再次检测
service nginx start
sleep 5
counter=$(ps -C nginx --no-heading|wc -l)
if [ "${counter}" = "0" ]; then
#如果启动没成功,就杀掉keepalive触发主备切换
service keepalived stop
fi
fi
增加监控脚本的执行权限,设置keepalived
开机启动
chmod +x /etc/keepalived/ck_ng.sh
systemctl enable keepalived.service
如果是自己测试练着玩的话,本机直接访问vip就可以了.如果应用到生产环境,还需有一个外网IP映射到VIP,然后申请一个域名解析到这个外网IP
如何解决session问题
ip_hash(只能解决不宕机的情况的)
#利用每个请求按访问的ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题
upstream mgmt {
server 59.68.29.xx:19666;
server 59.68.29.xx:19666;
ip_hash;
}
Tomcat session复制(测试可行)
1、对于每一个server.xml
<Engine name="Catalina" defaultHost="localhost">
2、在Engine标签内增加
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
3、在程序的web.xml的web-app结束前增加 <distributable/>
4、session复制需用组播添加static route(这一步没有使用)
vim /etc/sysconfig/network-scripts/route-eth0
增加
192.0.2.0/24 dev eth0 scope host
default via 192.0.2.1
192.168.2.0/24 via 192.168.13.1 dev eth0
service network restart
6.参考资料
https://www.cnblogs.com/GreedyL/p/7519969.html