高可用实例
1.关于高可用
配置负载均衡时,请求通过nginx分发到多个tomcat;
如果其中一个tomcat宕机,将不会被分发请求;
这样保证了稳定性;
但是,nginx也有宕机的可能,会导致请求无法到达tomcat;
配置高可用集群就是为了解决这一问题,也就是nginx宕机了还能正常完成请求;
简单的高可用:
两台nginx,nginx1作为主服务器,nginx2作为从服务器;
当请求时,首先到达主服务器,然后主服务器分发到多个tomcat中;
当主服务器宕机时,会自动切换到从服务器;从服务器也可以把请求转发到多个tomcat中;
这样就达到了高可用效果;
高可用需求:多个nginx、keepalived、虚拟ip;
关于keepalived:
作用是通过脚本来检测当前的nginx是否宕机;如果还活着就继续访问,否则切换到另备份nginx服务器;
关于虚拟ip:
高可用的多个nginx服务器ip不同,因此需要对外提供一个虚拟ip;
通过虚拟ip来绑定服务器的ip来进行访问;
虚拟ip首先与主服务器绑定,当主服务器挂掉时,会被keepalived检测到,keepalived会将虚拟ip绑定到备份服务器;
nginx接收真实请求时相对更容易挂掉,而keepalive没那么容易挂掉;
总之高可用就是我的服务器挂掉,我的系统依然可以完成请求过程;
2.配置高可用的准备工作
1)准备两个服务器(比如两个虚拟机 ps:因为电脑太差带不动两个虚拟机就不演示了)
2)在两个服务器中都装上nginx
3)在两台服务器中安装keepalived
yum安装命令:
yum install keepalived –y
4)主从配置
安装完成后,在/etc/keepalived目录下可以找到 keepalived.conf
1】配置keepalived.conf
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.17.129
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_script chk_http_port {
script "/usr/local/src/nginx_check.sh"
interval 2 #(检测脚本执行的间隔)
weight 2
}
vrrp_instance VI_1 {
state BACKUP # 备份服务器上将 MASTER 改为 BACKUP
interface ens33 //网卡
virtual_router_id 51 # 主、备机的 virtual_router_id 必须相同
priority 90 # 主、备机取不同的优先级,主机值较大,备份机值较小
advert_int 1
authentication { #权限校验的方式,这里用的是密码,密码为1111
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.17.50 // VRRP H 虚拟地址
}
}
global_def ->全局定义;主要的是router_id;
router_id的值为服务器的名字;
服务器的名字可在etc/host文件中查看;
vrrp_script chk_http_port ->检测脚本及其权重参数;
script的值为脚本路径;
interval位脚本检测间隔,如果值为2表示每隔2秒检测一次;
weight表示权重设置的值;例如:如果weigth的值为-10,当服务器挂掉脚本条件成立时,将服务器的权重降低10;
vrrp_instance VI_1 ->虚拟ip的配置;
state为状态,如果是主服务器为MASTER,如果是从服务器用BACKUP;
interface网卡,在哪个网卡上绑定虚拟ip;网卡的名字可用ifconfig命令查看;
advert_int 1,表示每隔1秒发送一个心跳,检测服务器是否还活着;
2】在/usr/local/src添加检测脚本nginx_check.sh
#!/bin/bash
A=`ps -C nginx –no-header |wc -l`
if [ $A -eq 0 ];then
/usr/local/nginx/sbin/nginx
sleep 2
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
killall keepalived
fi
fi
在keepalived.conf中的vrrp_script中引用了该脚本;
大概意思是:启动nginx,如果nginx挂掉,关闭keepalived所有进程;
3】启动两台服务器上的nginx和keepalived
nginx启动:
./nginx
keepalived启动:
systemctl start keeplived.service
5)测试效果
从远程浏览器中输入虚拟ip的地址:
关掉主服务器上的nginx和keepalived,再次访问虚拟ip,依然可以看到页面