KeepalivedがNginxロードバランシングの高可用性を実現

第1章:keepalivedの概要

VRRPプロトコルの
目的は、静的ルーティングの単一障害点の問題を解決することです

第2章:keepalivedの動作原理

2.1システムネットワークサービスとしての高可用性機能(フェイルオーバー)

keepalived高可用功能实现的基本原理为:
两台主机同时安装好keepalived软件并启动服务,开始正常工作时
角色为Master的主机获得所有资源并对用户提供服务
角色为Backup的主机作为Master主机的热备;

当角色为Master的主机失效或出现故障时
角色为Backup的主机将自动接管Master主机的所有工作,包括接管VIP资源及相应资源服务

而当角色为Master的主机故障修复后,又会自动接管回他原来处理的工作
角色为Backup的主机则同时释放Master主机失效时他接管的工作
此时,两台主机将恢复到启动时各自的原始角色及工作状态

2.2 VRRPとは

VRRP,全称Virtual Router Redundancy Protocol,中文名为虚拟路由冗余协议
 VRRP的出现就是为了解决静态路由的单点故障问题
 VRRP是通过一种竞选机制来将路由的任务交给某台VRRP路由器的.

VRRP通过竞选机制来实现虚拟路由器的功能,所有的协议报文都是通过IP多播(Multicast)包(默认的多播地址224.0.0.18)形式发送的
 虚拟路由器由VRID(范围0-255)和一组IP地址组成,对外表现为一个周知的MAC地址,:00-00-5E-00-01-{VRID}.
 所以,在一个虚拟路由器中,不管谁是Master,对外都是相同的MAC和IP(称之为VIP).
 客户端主机并不需要因Master的改变修改自己的路由配置.对它们来说,这种切换是透明的.

在一组虚拟路由器中,只有作为Master的VRRP路由器会一直发送VRRP广播包,此时Backup不会抢占Master
 当Master不可用时,Backup就收不到来自Master的广播包了,此时多台Backup中优先级最高的路由器会抢占为Master.
 这种抢占是非常快速的(可能只有1秒甚至更少),以保证服务的连续性,处于安全性考虑,VRRP数据包使用了加密协议进行了加密.

2.3面接中に何を言うか

解答:
keepalived高可用对之间是通过VRRP通信的,因此,我从VRRP开始给您讲起.
1)VRRP,全称Virtual Router Reduancy Protocol,中文名为虚拟路由器冗余协议,VRRP的出现是为了解决静态路由的单点故障,
2)VRRP是通过一种竞选协议来将路由任务交给某台VRRP路由器的,
3)VRRP用IP多播的方式,(默认多播地址(224.0.0.18))实现高可用对之间通信.
4)工作时主节点发包,备节点接包,当备节点接收不到主节点发的包的时候,就启动接管程序接管主节点的资源.备节点可以有多个,通过优先级竞选,但一般keepalived系统运维工作中都是一对.
5)VRRP使用了加密协议加密数据,但keepalived官方目前还是推荐用明文的方式配置认证类型和密码.
介绍完了VRRP,接下来我在介绍一下keepalived服务的工作原理;
keepalived高可用对之间是通过VRRP进行通信的,VRRP是通过竞选机制来确定主备的,主的优先级高于备,因此,工作时会优先获得所有的资源,备节点处于等待状态,当主挂了的时候,备节点就会接管主节点的资源,然后顶替主节点对外提供服务.
在keepalived服务对之间,只有作为主的服务器会一直发送VRRP广播包,告诉备他还活着,此时备不会抢占主,当主不可用时,即备监听不到主发送的广播包时,就会启动相关服务接管资源,保证业务的连续性,接管速度最快可以小于一秒

第3章:VRRPプロトコル

VRRPは、選択メカニズムを通じて仮想ルーターの機能を実装します。
すべてのプロトコルパケットは、IPマルチキャストパケットを経由します。
デフォルトのマルチキャストアドレスは、224.0.0.18です

VIPの前提条件:

1.仮想パブリックネットワークIPが真に利用可能である必要があります
2.仮想パブリックネットワークIPを繰り返すことはできません
3.マルチキャストアドレスは通信可能でなければなりません

第4章:Keepalivedのインストールと構成

1. keepalivedをインストールします

yum install keepalived -y

2.設定ファイルの説明

global_defs {				
    router_id lb01			#设置路由ID,每个主机不一样
}	

vrrp_instance VI_1 {		#设置VRRP组名,同一组组名相同
    state MASTER			#设置角色状态,分为MASTER BACKUP
        interface eth0		#VIP绑定的网卡
        virtual_router_id 50	#虚拟路由id,同一组一样
        priority 150		#权重,权重越高,优先级越高
        advert_int 1		#发送组播间隔
        authentication {	#设置验证,密码为明文
            auth_type PASS	
            auth_pass 1111	
        }
        virtual_ipaddress {	#设定的虚拟IP,这个虚拟IP必须是存在且合法且没有被使用的。
            10.0.0.3
        }
}

3.lb01構成

[root@lb01 ~]# cat /etc/keepalived/keepalived.conf 
global_defs {
    router_id lb01
}

vrrp_instance VI_1 {
    state MASTER
        interface eth0
        virtual_router_id 50
        priority 150
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            10.0.0.3
        }
}

4.lb02設定

[root@lb02 ~]# cat /etc/keepalived/keepalived.conf 
global_defs {
    router_id lb02
}

vrrp_instance VI_1 {
    state BACKUP 
        interface eth0
        virtual_router_id 50
        priority 100
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            10.0.0.3
        }
}

5.スタート

systemctl start keepalived

6.テスト

いずれかをオフにして、VIPがドリフト
するかどうかを確認し、MASTERを復元して、BACKUPのVIPが表示されなくなるかどうかを確認します。

第5章:脳分割

1.パケットキャプチャツールをインストールする

yum install tcpdump -y 

2.lb02パケットキャプチャビュー

tcpdump -nn -i any host 224.0.0.18

3.lb02新しいターミナルを開き、ファイアウォールを開きます

systemctl start firewalld.service

4.lb02パケットキャプチャの現象を観察する

両側にVIPがあるかどうかを確認します

5.リリースルールを追加する

firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --in-interface eth0 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --in-interface eth1 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
systemctl reload firewalld

6.lb02パケットキャプチャの現象を観察する

両側にVIPがあるかどうかを確認します

第6章:Keepalivedデュアルマスター実験

1.lb01構成ファイル

[root@lb01 ~]# cat /etc/keepalived/keepalived.conf 
global_defs {
    router_id lb01
}

vrrp_instance VI_1 {
    state MASTER
        interface eth0
        virtual_router_id 50
        priority 150
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            10.0.0.3
        }
}

vrrp_instance VI_2 {
    state BACKUP 
        interface eth0
        virtual_router_id 51
        priority 100
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 2222 
        }
        virtual_ipaddress {
            10.0.0.4
        }
}

2.lb02構成ファイル

[root@lb02 ~]# cat /etc/keepalived/keepalived.conf 
global_defs {
    router_id lb02
}

vrrp_instance VI_1 {
    state BACKUP 
        interface eth0
        virtual_router_id 50
        priority 100
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            10.0.0.3
        }
}

vrrp_instance VI_2 {
    state MASTER 
        interface eth0
        virtual_router_id 51
        priority 150
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 2222 
        }
        virtual_ipaddress {
            10.0.0.4
        }
}

3. keepalivedを再起動し、現象を観察します

systemctl restart keepalived

第7章:nginxリバースプロキシロードバランシングと組み合わせたKeepalived

lbサーバーのNginx構成:

注意!2つのlbサーバーのNginx構成はまったく同じです

1.元の構成をバックアップする

mkdir /backup
cd /etc/nginx/conf.d
mv * /backup 

2. Nginx構成ファイルを書き込む

[root@lb01 /etc/nginx/conf.d]# cat proxy.conf 
upstream web_pools {
   server 172.16.1.7;
   server 172.16.1.8;
}

server {
   listen 80;
   server_name  (www|bbs).mysun.com ;
   location / {
      proxy_pass  http://web_pools;
      include proxy_params;
   }
}

3. nginxをテストして再起動します

nginx -t
systemctl restart nginx 

lbサーバーのKeepalived構成:

1.lb01 keepalived構成

[root@lb01 ~]# cat /etc/keepalived/keepalived.conf 
global_defs {
    router_id lb01
}

vrrp_instance VI_1 {
    state MASTER
        interface eth0
        virtual_router_id 50
        priority 150
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            10.0.0.3
        }
}

2.lb02 keepalived構成

[root@lb02 ~]# cat /etc/keepalived/keepalived.conf 
global_defs {
    router_id lb02
}

vrrp_instance VI_1 {
    state BACKUP 
        interface eth0
        virtual_router_id 50
        priority 100
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            10.0.0.3
        }
}

Webサーバー構成:
注意!2つのWebサーバーの構成はまったく同じ

1.nginxの設定

[root@web01 ~]# cat /etc/nginx/conf.d/www.conf 
server {
  listen 80;
  server_name www.mysun.com;
  location / {
     root /code;
     index www.html;
  }
}

2.テストファイルを書き込む

echo "$(hostname)" >/code/index.html 

第8章:クラック防止脳スクリプト

1.問題の現象:

1. Nginxがハングしますが、キープはまだ有効です
2.両側にVIPがあります

2.アイデア:

nginxがハングする問題を解決し
ます。1.スクリプトを記述します

  • nginxを起動する
  • 起動が2回失敗した場合は、keepalivedを停止します

2. Keepalivedは定期的にこのスクリプトを呼び出します

3.実現:

1.コマンドの実装方法

systemctl start nginx

2. nginxプロセスを確認する

[root@lb01 ~]# ps -ef|grep nginx|grep -v "grep"
root       1210      1  0 11:21 ?        00:00:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
nginx      1211   1210  0 11:21 ?        00:00:00 nginx: worker process
[root@lb01 ~]# ps -ef|grep nginx|grep -v "grep"|wc -l
2
[root@lb01 ~]# ps -ef|grep nginx|grep -v "grep"|wc -l
0

スクリプトの内容:

[root@lb01 ~]# cat check_web.sh 
!/bin/bash

nginx_status=$(ps -C nginx --no-header|wc -l)

if [[ ${nginx_status} == 0 ]]
then
   systemctl start nginx &> /dev/null 
   sleep 1
   nginx_status=$(ps -C nginx --no-header|wc -l)
   if [[ ${nginx_status} == 0 ]]
   then
       systemctl stop keepalived  
   fi
fi

Keepalived呼び出しスクリプト:

[root@lb01 ~]# cat /etc/keepalived/keepalived.conf 
global_defs {
    router_id lb01
}

vrrp_script check_web {
    script "/server/scripts/check_web.sh"
    interval 5
    weight 50
}

vrrp_instance VI_1 {
    state MASTER
        interface eth0
        virtual_router_id 50
        priority 150
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            10.0.0.3
        }

    track_script {
        check_web
    }

}

4. 2番目の質問:スプリットブレイン

両側にVIP

現象:
両面にVIPが
2つあるNginxが生きている

MASTER反対のNGINXはまだ生きています

curl -I -s -w "%{http_code}\n" -o /dev/null 10.0.0.5

しかし、私は再びVIPを持っています

ip a |grep "10.0.0.3"|wc -l

自殺します

systemctl stop nginx  
systemctl stop keepalived 

スクリプトの内容:

[root@lb02 /server/scripts]# cat check_vip.sh 

#!/bin/bash

master_status=$(curl -I -s -w "%{http_code}\n" -o /dev/null 10.0.0.5)

my_vip=$(ip a |grep "10.0.0.3"|wc -l)

if [ ${master_status} == 200 -a ${my_vip} == 1 ]
then
   systemctl stop nginx  
   systemctl stop keepalived 
fi

キープアライブ構成:

[root@lb02 ~]# cat /etc/keepalived/keepalived.conf 
global_defs {
    router_id lb02
}

vrrp_script check_web {
    script "/server/scripts/check_web.sh"
    interval 5
    weight 50
}

vrrp_script check_vip {
    script "/server/scripts/check_vip.sh"
    interval 5
    weight 50
}

vrrp_instance VI_1 {
    state BACKUP 
        interface eth0
        virtual_router_id 50
        priority 100
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            10.0.0.3
        }
    track_script {
        check_web
        check_vip
    }
}

抜粋:https : //www.jianshu.com/p/ab6735606178

おすすめ

転載: www.cnblogs.com/centlnx/p/12728870.html
おすすめ