基于腾讯云用 HAVIP+Keepalived 搭建高可用主备集群

2021年09月15日 阅读数:1
这篇文章主要向大家介绍基于腾讯云用 HAVIP+Keepalived 搭建高可用主备集群,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

基本原理
一般高可用主备集群包含2台服务器,一台主服务器处于某种业务的激活状态(即 Active 状态),另外一台备服务器处于该业务的备用状态(即 Standby 状态),它们共享同一个 VIP(Virtual IP)。同一时刻,VIP 只在一台主设备上生效,当主服务器出现问题时,备用服务器接管 VIP 继续提供服务。高可用主备模式有着普遍的应用,例如,MySQL 主备切换、Nginx Web 接入。
javascript

在 VPC 的云服务器间能够经过部署 Keepalived 来实现高可用主备集群。Keepalived 是基于 vrrp 协议的一款高可用软件,Keepalived 配置经过 keepalived.conf 文件完成。
架构图
基于腾讯云用 HAVIP+Keepalived 搭建高可用主备集群

php

    说明:为了节省成本,没有给每台cvm都绑定弹性IP。若是服务器须要访问外网进行下载等,能够开通NAT网关,而且绑定路由模式就能够了。
    弹性IP-->绑定NAT网关-->绑定路由表

网络拓扑图
基于腾讯云用 HAVIP+Keepalived 搭建高可用主备集群
基于腾讯云用 HAVIP+Keepalived 搭建高可用主备集群
基于腾讯云用 HAVIP+Keepalived 搭建高可用主备集群


css

在传统的物理网络中,能够经过 keepalived 的 VRRP 协议协商主备状态,其原理是:主设备周期性发送免费 ARP 报文刷新上联交换机的 MAC 表或终端 ARP 表,触发 VIP 迁移到主设备上。
在腾讯云 VPC 中,支持部署 keepalived 来搭建主备高可用集群。与物理网络相比,主要区别是:
使用的 VIP 必须是从腾讯云申请的 高可用虚拟 IP (HAVIP) 。
VIP 有子网属性,只能在同一个子网下的机器间宣告绑定。

推荐使用单播方式进行 VRRP 通讯。
强烈推荐使用 Keepalived(1.2.24版本及以上)。
确保已经配置如下 garp 相关参数。由于 keepalived 依赖 ARP 报文更新 IP 信息,若是缺乏如下参数,会致使某些场景下,主设备不发送 ARP 致使通讯异常。

html

garp_master_delay 1
garp_master_refresh 5

确保同一 VPC 下的每一个主备集群须要配置不一样的 vrrp router id。
肯定没有采用 strict 模式,即须要删除“vrrp_strict” 配置。
控制单个网卡上配置的 VIP 数量,建议目前在单个网卡绑定的高可用虚拟 IP 数量不超过5个。若是须要使用多个虚拟 IP,建议在 keepalived 配置文件的 global_defs 段落添加或修改配置“vrrp_garp_master_repeat 1”。

java

操做步骤node

服务器信息:
主节点云服务器:HAVIP-01,172.21.0.5
备节点云服务器:HAVIP-02,172.21.0.17
后端web服务器:tomcat01:172.21.0.4
后端web服务器:tomcat02:172.21.0.3
高可用HAVIP:172.21.10.10
弹性公网IP:81.70.xx.xx
镜像版本:CentOS 7.8 64位
#########################################
申请HAVIP:申请HAVIP
在 HAVIP 管理页面,选择所在地域,单击【申请】。
在弹出的【申请高可用虚拟 IP】对话框中输入名称,选择 HAVIP 所在的私有网络和子网等信息,单击【肯定】便可。










nginx

下载keepalived:keepalived-2.1.5
基于腾讯云用 HAVIP+Keepalived 搭建高可用主备集群
web

主keepalived.confvim

! Configuration File for keepalived
global_defs {
notification_email {
jiaxushuang@etiir.com
}
notification_email_from xx@qq.com
smtp_server smtp.qq.com
smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_script checkhaproxy
{
script "/etc/keepalived/do_sth.sh"
interval 5
}
vrrp_instance VI_1 {
#注意主备参数选择
state MASTER            # 设置初始状态为“备“
interface eth0          # 设置绑定 VIP 的网卡 例如 eth0
virtual_router_id 51    # 配置集群 virtual_router_id 值
nopreempt               # 设置非抢占模式
preempt_delay 10
priority 100              # 设置优先级,值越大优先级越高
advert_int 1
authentication {
   auth_type PASS
   auth_pass 1111
}
unicast_src_ip 172.21.x.5  # 设置本机内网IP地址
unicast_peer {
   172.21.x.17             # 对端设备的 IP 地址
}
virtual_ipaddress {
   172.21.x.10           # 设置高可用虚拟 VIP
}
notify_master "/etc/keepalived/notify_action.sh MASTER"
notify_backup "/etc/keepalived/notify_action.sh BACKUP"
notify_fault "/etc/keepalived/notify_action.sh FAULT"
notify_stop "/etc/keepalived/notify_action.sh STOP"
garp_master_delay 1    # 设置当切为主状态后多久更新 ARP 缓存
garp_master_refresh 5   # 设置主节点发送 ARP 报文的时间间隔
   track_interface {
           eth0               # 使用绑定 VIP 的网卡 例如 eth0
   }
track_script {
  checkhaproxy
}
}

备keepalive.conf配置后端

! Configuration File for keepalived
global_defs {
notification_email {
jiaxushuang@etiir.com
}
notification_email_from xx@qq.com
smtp_server smtp.qq.com
smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_script checkhaproxy
{
script "/etc/keepalived/do_sth.sh"
interval 5
}
vrrp_instance VI_1 {
#注意主备参数选择
state BACKUP                # 设置初始状态为“备“
interface eth0          # 设置绑定 VIP 的网卡 例如 eth0
virtual_router_id 51    # 配置集群 virtual_router_id 值
nopreempt               # 设置非抢占模式
preempt_delay 10
priority 50              # 设置优先级,值越大优先级越高
advert_int 1
authentication {
   auth_type PASS
   auth_pass 1111
}
unicast_src_ip 172.21.x.17  # 设置本机内网 IP 地址
unicast_peer {
   172.21.x.5             # 对端设备的 IP 地址
}
virtual_ipaddress {
   172.21.x.10           # 设置高可用虚拟 VIP
}
notify_master "/etc/keepalived/notify_action.sh MASTER"
notify_backup "/etc/keepalived/notify_action.sh BACKUP"
notify_fault "/etc/keepalived/notify_action.sh FAULT"
notify_stop "/etc/keepalived/notify_action.sh STOP"
garp_master_delay 1    # 设置当切为主状态后多久更新 ARP 缓存
garp_master_refresh 5   # 设置主节点发送ARP报文的时间间隔
   track_interface {
           eth0               # 使用绑定 VIP 的网卡 例如 eth0
   }
track_script {
  checkhaproxy
}

vim /etc/keepalived/notify_action.sh

#!/bin/bash
#/etc/keepalived/notify_action.sh
log_file=/var/log/keepalived.log
log_write()
{
echo "[`date '+%Y-%m-%d %T'`] $1" >$log_file
}
[ ! -d /var/keepalived/ ] && mkdir -p /var/keepalived/
case "$1" in
"MASTER" )
   echo -n "$1" /var/keepalived/state
   log_write " notify_master"
   echo -n "0" /var/keepalived/vip_check_failed_count
   ;;
   "BACKUP" )
   echo -n "$1" /var/keepalived/state
   log_write " notify_backup"
   ;;
   "FAULT" )
   echo -n "$1" /var/keepalived/state
   log_write " notify_fault"
   ;;
   "STOP" )
   echo -n "$1" /var/keepalived/state
   log_write " notify_stop"
   ;;
*)
   log_write "notify_action.sh: STATE ERROR!!!"
   ;;
esac

而后经过查看主master主机网卡就会多出高可用IP的地址
基于腾讯云用 HAVIP+Keepalived 搭建高可用主备集群
再进行关闭主keepalived服务,测试查看IP是否漂移到备keepalived上。

两台nginx的配置是同样的。因此只要高可用的IP进行了漂移,那么nginx都是能够提供访问服务的。
nginx.conf

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
events {
    worker_connections 1024;
}
http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log  /var/log/nginx/access.log  main;
    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;
    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;
    server {
        listen       80 default_server;
        server_name  www.musemusic.com;
        root         /usr/share/nginx/html/songshumiusi_music/;
        }
     server {
        gzip on;
        gzip_min_length 1k;
        gzip_comp_level 9;
        gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
        gzip_vary on;
        gzip_disable "MSIE [1-6]\.";
    }
    upstream backend {
    server 172.21.0.4:8080 weight=20 max_fails=3 fail_timeout=10s;
    server 172.21.0.3:8080 weight=20 max_fails=3 fail_timeout=10s;
    }
    server {
        listen       443 ssl http2 default_server;
        listen       [::]:443 ssl http2 default_server;
        server_name   api.musemusic.com;
        ssl_certificate "/etc/pki/nginx/1_api.musemusic.com_bundle.crt";
        ssl_certificate_key "/etc/pki/nginx/2_api.musemusic.com.key";
        ssl_session_cache shared:SSL:1m;
        ssl_session_timeout  5m;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
        ssl_prefer_server_ciphers on;
         location ^~ /eduplat-boot {
           client_max_body_size    1000m;
            proxy_pass              http://backend;
            proxy_set_header        Host $host:$proxy_port;
            proxy_set_header        X-Real-IP $remote_addr;
            proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
        }
         location / {
            root   html;
            index  index.html index.htm;
            client_max_body_size    1000m;
            if (!-e $request_filename) {
                rewrite ^(.*)$ /index.html?s=$1 last;
                break;
            }
        access_log    /var/log/nginx/access.log main;
        }
        error_page 404 /404.html;
            location = /40x.html {
        }
        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
  }
}