1、环境准备
搭建双主高可用服务,首先需要有两台阿里云服务器,然后在阿里云控制台-申请一个高可用虚拟IP,这个IP需要在keepalived中配置
2、nginx+keepalived
两台服务器上分别部署nginx和keepalived,部署方式略,其中一台keepalived配置如下 ,其中virtual_ipaddress就是自己申请的虚拟ip,unicast_src_ip是本机的ip,unicast_peer是另一台的ip,router_id需要不一致,smtp_server是网关ip,smtp_connect_timeout是超时时间,这个要自己学习一下keepalive的用法,这里不做多余解释。
script "/etc/keepalived/nginx_check.sh"这个需要自己编写脚本
! Configuration File for keepalived
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh"
interval 5
weight -5
fall 3
rise 2
}
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 172.26.168.1
smtp_connect_timeout 10
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
# vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
unicast_src_ip 172.26.168.166
unicast_peer {
172.26.168.165
}
virtual_ipaddress {
172.26.168.168
}
track_script {
chk_nginx
}
}
另一台
! Configuration File for keepalived
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh"
interval 5
weight -5
fall 3
rise 2
}
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 172.26.168.1
smtp_connect_timeout 10
router_id LVS_DEVEL2
vrrp_skip_check_adv_addr
# vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
script_user root
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
unicast_src_ip 172.26.168.165
unicast_peer {
172.26.168.166
}
virtual_ipaddress {
172.26.168.168
}
track_script {
chk_nginx
}
}
脚本,其中某服务名代表自己需要高可用的服务名称,如果其中一台某个服务挂了,就让当前的keepalived一起挂掉,保证服务迁移。这里面的服务都是用docker部署的
#!/bin/bash
#检测nginx是否存活的脚本
A=`docker ps -q -f "name=某服务名" | grep -v grep | wc -l`
B=`docker ps -q -f "name=某服务名" | grep -v grep | wc -l`
C=`docker ps -q -f "name=某服务名" | grep -v grep | wc -l`
D=`docker ps -q -f "name=某服务名" | grep -v grep | wc -l`
if [ $B -eq 0 ];then
sleep 2
if [ $B -eq 0 ];then
systemctl stop keepalived
fi
elif [ $B -eq 0 ];then
sleep 2
if [ $B -eq 0 ];then
systemctl stop keepalived
fi
elif [ $C -eq 0 ];then
sleep 2
if [ $C -eq 0 ];then
systemctl stop keepalived
fi
elif [ $D -eq 0 ];then
sleep 2
if [ $D -eq 0 ];then
systemctl stop keepalived
fi
fi
3、docker部署的容器想要跨服务器相互访问,需要在阿里云上新建路由