一、背景
1.nginx高可用
在生产环境下,Nginx作为流量的入口,如果Nginx不能正常工作或服务器宕机,将导致整个微服务架构的不可用。所以负责负载均衡、反向代理的服务(Nginx)为了提高处理性能,高可用,也需要集群部署。本期咋们采用 keepalived 和 Nginx实现高可用。
2.KeepAlived
KeepAlived是Linux下的基于VRRP备份路由的高可靠性中间件。如果一台服务器宕机,KeepAlived会检测到并将发生故障的机器从集群中摘除,同时使用其他的服务器代替该故障机器的工作,当服务器重新正常工作后KeepAlived就会自动将该服务器加入到工作集群中,以上的工作都是KeepAlived自动完成无需人工介入。
3.VRRP协议
VRRP协议英文全称:Virtual Router Redundancy Protocol,即”虚拟路由冗余协议“。将多台提供相同功能的路由器组成路由器组,包含一个master和多个backup。提供虚拟IP,占有这个虚拟IP的master负责ARP的响应和转发IP数据包。master负责发布组广播消息,若master发送的广播长时间没有被backup接收到就会触发选举backup当新master。
4.Nginx+keepalived 双机主从模式
使用两台Nginx服务器,一台主服务器和一台热备服务器,正常情况下,主服务器绑定一个公网虚拟IP,提供负载均衡服务,热备服务器处于空闲状态;当主服务器发生故障时,热备服务器接管主服务器的公网虚拟IP,提供负载均衡服务;但是热备服务器在主机器不出现故障的时候,永远处于浪费状态,对于服务器不多的网站,该方案不经济实惠。
5.Nginx+keepalived 双机主主模式
使用两台Nginx服务器,互为主备,且都处于活动状态,同时各自绑定一个公网虚拟IP,提供负载均衡服务;当其中一台发生故障时,另一台接管发生故障服务器的公网虚拟IP(这时由非故障机器一台负担所有的请求)。该方案解决了双击主从的资源浪费问题,但是有个性能瓶颈的问题在这种模式会出现。就是单台机器上的负载会瞬时过大。那如何解决这个问题呢,就出现了多点集群模式。
6.Nginx+keepalived 多点模式
以上两种方式都有各自的有缺点,多点集群模式应运而生。多点集群可以理解为双机热备在技术上的提升。多机服务器可以组成一个集群。根据应用的实际情况,可以灵活地在这些服务器上进行部署,同时可以灵活地设置接管策略。比如,可以由一台服务器作为其他所有服务器的备机,也可以设置多重的接管关系,等等。这样,就可以充分地利用服务器的资源,同时保证系统的高可用性。
二、docker部署双机主从模式
1.创建网络
# 创建bridge docker network create -d bridge --subnet 172.70.0.0/16 --gateway 172.70.0.1 nginx-network docker network ls # 查看信息 docker network ls docker network inspect minio-network # 删除 docker network rm networkId
2.创建容器
# master docker run -it --name centos-master --privileged -v /home/centos/master:/mnt/software -p 10010:80 --net=nginx-network centos:7 # salve docker run -it --name centos-salve --privileged -v /home/centos/salve:/mnt/software -p 10020:80 --net=nginx-network centos:7
3.安装准备
# 切换目录 cd /etc/yum.repos.d/ # 删除yum源 rm -rf CentOS* # 复制yum源 docker cp /etc/yum.repos.d/CentOS-Base.repo 容器id:/etc/yum.repos.d/CentOS-Base.repo # 安装工具 yum -y update yum install epel-release yum -y install net-tools yum -y install vim # 清除缓存 yum clean all # 生成缓存 yum makecache
4.安装nginx
yum -y install nginx # 启动 nginx # 停止 nginx -s quit # 刷新配置 nginx -s reload
5.安装keepalived
yum -y install keepalived # 启动 keepalived -l -f /etc/keepalived/keepalived.conf # 停止 pkill keepalived # 查看 ps -ef | grep keepalived
keepalived配置
keepalived master配置
# keepalived.conf ! 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 # 路由id,主备节点不能相同 router_id LVS_DEVEL_MASTER vrrp_skip_check_adv_addr #vrrp_strict vrrp_garp_interval 0 vrrp_gna_interval 0 script_user root enable_script_security } # nginx检查 vrrp_script chk_nginx { script "/etc/keepalived/nginx_check.sh" interval 1 weight 0 } vrrp_instance VI_1 { # Keepalived的角色,MASTER 表示主节点,BACKUP 表示备份节点 state MASTER # 指定监测的网卡,可以使用 ifconfig 或 ip a 进行查看 interface eth0 # 虚拟路由的id,主备节点需要设置为相同 virtual_router_id 51 # 优先级,主节点的优先级需要设置比备份节点高 priority 100 # 设置主备之间的检查时间,单位为秒 advert_int 1 # 定义验证类型和密码 authentication { auth_type PASS auth_pass 1111 } # 虚拟IP地址,可以设置多个 virtual_ipaddress { 172.70.0.10 } # 调用上面自定义的监控脚本 track_script { chk_nginx } }
keepalived salve配置
# keepalived.conf ! 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 LVS_DEVEL_SALVE vrrp_skip_check_adv_addr # vrrp_strict vrrp_garp_interval 0 vrrp_gna_interval 0 script_user root enable_script_security } # nginx检查 vrrp_script chk_nginx { script "/etc/keepalived/nginx_check.sh" interval 1 weight 0 } vrrp_instance VI_1 { state BACKUP interface eth0 # 主从一致 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 172.70.0.10 } track_script { chk_nginx } }
nginx检查配置
# nginx_check.sh A=`ps -C nginx --no-header |wc -l` if [ $A -eq 0 ];then #执行nginx启动命令 #nginx # 启动失败停止keepalived if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then pkill keepalived fi fi
补充配置
# 文件授权 chmod +x check_nginx.sh chmod +x keepalived.conf