keepalived + nginx ホット スタンバイ高可用性のビルド (アクティブ スタンバイ + デュアル アクティブ モード)
序文
マスター Nginx はハングアップしますが、スレーブ nginx はすぐに動作します
vrrp テクノロジーを使用して VIP を提供します
メイン nginx がハングアップしたら、スクリプトを使用してメイン keepalied をシャットダウンします。keepalived は、vrrp テクノロジーを使用してスレーブ マシンが VIP を取得し、同じ nginx と設定をスレーブ マシンにインストールし、スレーブ マシンはサービスを提供し続けます。 VIPを通じて外の世界へ。
関連記事:
【Nginx - この記事だけでnginxを学べる】
【LVS+KeepAlived+Nginx高可用性導入計画】
キープアライブの紹介
nginx:
リクエストの分散、負荷分散、キャッシュ、その他の非常に実用的な機能をサポートする非常に優れたリバース プロキシ ツールです。リクエスト処理に関して、nginx はイベント監視に基づいたモデルである epoll モデルを使用しているため、非常に効率的なリクエスト処理効率があり、単一マシンの同時実行能力は数百万に達します。nginx が受信したリクエストは、負荷分散ポリシーを通じて下位レベルのアプリケーション サーバーに分散できます。これらのサーバーは通常、クラスターにデプロイされます。そのため、パフォーマンスが不十分な場合、アプリケーション サーバーはマシンを追加してトラフィックを拡張できます。現時点では、一部の非常に大規模な Web サイトのパフォーマンスのボトルネックは nginx にあります。これは、単一マシンの nginx の同時実行能力には上限があり、nginx 自体がクラスター モードをサポートしていないためです。そのため、現時点での nginx の水平方向の拡張は次のとおりです。は特に重要であると思われます。
Keepalived:
Linux 上で VRRP バックアップ ルーティングを実装する、信頼性の高い実行ソフトウェアです。Keepalived に基づいて設計されたサービス モデルは、メイン サーバーとバックアップ サーバーに障害が発生した場合に、瞬時かつシームレスな IP ハンドオーバーを真に実現します。
VRRP プロトコル:
正式名は Virtual Router Redundancy Protocol で
、仮想ルーティング冗長プロトコルです。ルータの高可用性を実現するフォールトトレラントなプロトコルと考えられます. 同じ機能を提供する N 台のルータがルータ グループ (RouterGroup) として形成されます. このグループにはマスターと複数のバックアップがありますが、外部からは 1 つのように見えますこれは仮想ルーターを構成し、仮想 IP (vip、ルーターが配置されている LAN 内の他のマシンのデフォルト ルート) を持ち、この IP を所有するマスターが実際に ARP 応答と IP パケットの転送を担当します。グループ内の他のルーターはバックアップの役割としてスタンバイ状態です。マスターはマルチキャスト メッセージを送信します。バックアップがタイムアウト期間内に vrrp パケットの受信に失敗すると、マスターがダウンしていると見なされます。このとき、バックアップは VRRP 優先度に基づいてマスターとして選択され、確実にルーターの高可用性。
概要: 2 台のアクティブ マシンとバックアップ マシンがキープアライブされて、仮想 IP (VIP という意味ではありませんが、仮想 IP を意味します) を作成します。VIP はメイン マシンによって所有され始め、バックアップ マシンはアイドル状態になりますが、同時にキープアライブされた 2 つの間の通信はハートビート ラインに相当し、ハートビート ラインを介して相互に通信します。メイン マシンが ngin サービスが停止するまで (スクリプトを介して) 監視している限り、メイン マシンは自分でキープアライブを停止し、メイン マシンが再び通常に戻り、VIP をメインマシン。
アーキテクチャを次の図に示します。
高可用性を実現する 2 つの方法:
1.マスタースレーブモード
このソリューションは VIP アドレスを使用し、フロントエンドで 2 台のマシンを使用します。1 台はマスター、もう 1 台はバックアップです。ただし、同時に動作するマシンは 1 台だけです。メイン マシンが動作すると、他のバックアップ マシンは常に無駄になります。サーバーが少ない Web サイトの場合、このソリューションは経済的ではありません。
2.デュアルマスターモード
このソリューションは 2 つの VIP アドレスを使用し、フロントエンドで 2 台のマシンを相互にプライマリおよびバックアップとして使用します。2 台のマシンは同時に動作します。一方のマシンに障害が発生すると、2 台のマシンからのリクエストはもう一方のマシンに転送されます。現在のアーキテクチャ環境に非常に適したマシンです。
以下に示すように:
2. 環境構築
1. 環境準備(ここではcentos7システムを使用します)
ホスト名 | IP | 説明する |
---|---|---|
キープ1 | 192.168.92.100 | keepalived マスターサーバー (nginx と同じマスターロードバランサー) |
キープ2 | 192.168.92.101 | keepalived マスターサーバー (nginx と同じマスターロードバランサー) |
ウェブ1 | 192.168.92.102 | バックエンド Web サーバー ノード (nginx で構成された負荷分散) この記事はテストの便宜を目的としています (オプション) |
キープ4 | 192.168.92.103 | 模擬クライアントテストマシン(オプション) |
テストの便宜上、この記事ではデモンストレーションに 2 つのサーバー (keep1、keep12) のみを使用します。
2.キープアライブインストール
複数端末の同時操作や複数ウィンドウの同時操作にはXshellの使用を推奨します。
この記事ではnginxのインストールについては詳しく説明しませんので、必要に応じて Baidu を参照してください。
# 安装ipvs
yum install ipvsadm
# 安装keepalived
yum install keepalived
共通コマンド
#启动
systemctl start keepalived
#停止
systemctl stop keepalived
重启#
systemctl restart keepalived
#查看状态
systemctl status keepalived
#设置开机启动
systemctl enable keepalived
#关闭开机启动
systemctl disable keepalived
関連する設定は、/etc/keepalived/ ディレクトリ内の keepalived.conf ファイルを編集することで変更できます。
vim /etc/keepalived/keepalived.conf
- CentOS 7 にはデフォルトで firewalld ファイアウォールがインストールされているため、ファイアウォールをオフにします。
#启动防火墙
systemctl start firewalld
#关闭防火墙
systemctl stop firewalld
3.キープアライブ関連の設定
1.nginx スクリプトと設定
後でテストするので、最初の簡単なスクリプトで十分ですが、nginx プロセスに値がないと判断される限り、keepalived サービスは停止されます。テストスクリプトは次のとおりです。
#! /bin/bash
pidof nginx
if [ $? -ne 0 ];then
systemctl stop keepalived
fi
テストが完了したら、nginx の起動試行を追加できます。試行が 2 回失敗した場合は、keepalived サービスを停止します。
スクリプト check_nginx.sh を作成します。スクリプトは次のとおりです。
#!/bin/bash
counter=$(ps -C nginx --no-heading|wc -l)
if [ "${counter}" = "0" ]; then
/usr/local/nginx/sbin/nginx
sleep 2
counter=$(ps -C nginx --no-heading|wc -l)
if [ "${counter}" = "0" ]; then
systemctl stop keepalived
fi
fi
nginx サーバーの nginx 構成:server_name を VIP の IP に変更するだけで済みます。その他の変更は必要ありません。ロード バランシング中は、テストを容易にするためにこの VIP アドレスにアクセスするだけで済みます。この記事では、次のような文字列を直接返します。実際の運用では、
バックエンド リバース プロキシを で設定します。
server {
listen 80;
#server_name 192.168.92.200; #vip地址可加可不加
location / {
default_type text/html;
return 200 "Hello, Nginx! Server 192.168.92.100";
}
}
2. アクティブモードとバックアップモード
1.キープアライブ設定
この構成はアクティブ/スタンバイ モードですが、最初にアクティブ/スタンバイ モードを理解した後、デュアル アクティブ モードを構成するのが簡単になります。
設定ファイルの場所:
/etc/keepalived/keepalived.conf
vi /etc/keepalived/keepalived.conf
nginx サービスの検出に使用される 3 つの基本モジュール (global_defs グローバル モジュール、vrrp_instance 構成 vip モジュール、および vrrp_script スクリプト モジュール) があります。
注: vrrp_script でスクリプトを定義した後、track_script パラメーターを vrrp_instance モジュールに追加する必要があります。私はこの罠にはまってしまい、スクリプトが有効になりませんでした。
global_defs モジュールのパラメータ
notification_email
: keepalived は、切り替え操作が発生したときに電子メール通知アドレスを送信する必要があります。次の smtp_server も電子メール サーバー アドレスであることがわかっています。他の方法で警察に通報することもできますが、やはりメールではリアルタイムに通報されません。router_id
: マシン ID。通常はホスト名に設定されます。障害発生時には電子メール通知が使用されます。
vrrp_instance モジュールのパラメーター
state
: インスタンスの初期状態 (Initial)、MASTER または BACKUP を指定します。これは一意ではなく、その背後にある優先度パラメーターに関連します。interface
: 仮想 IP を構成するときに既存のネットワーク カードに追加する必要があるため、インスタンスにバインドされたネットワーク カード (自分のシステムに注意してください。私のシステムはデフォルトで ens33 で、一部は eth0 です)mcast_src_ip
: マルチキャスト パケットを送信するときの送信元 IP アドレス。ここに注意してください。これは実際にそのアドレスで VRRP 通知を送信しています。これは非常に重要です。送信するには安定したネットワーク カード ポートを選択する必要があります。これはハートビートのハートビート ポートに相当します。設定されていない場合は、バインドされたネットワーク カードのデフォルト IP、つまりインターフェイスで指定された IP アドレスが使用されます。virtual_router_id
: ここで VRID を設定します。ここは非常に重要です。同じ VRID はグループであり、マルチキャストの MAC アドレスを決定します。priority
: このノードの優先度を設定します。優先度が高い方がマスターになります (1-255)advert_int
: チェック間隔。デフォルトは 1 秒です。これは VRRP タイマーであり、このような時間間隔ごとに、MASTER はアドバタイズメント メッセージを送信して、グループ内の他のルーターに正常に動作していることを通知します。authentication
: 認証方法とパスワードを定義します。マスターとスレーブは同じである必要があります。virtual_ipaddress
: ここで設定するのは仮想IPアドレスであるVIPで、状態の変化に応じて追加・削除されます。状態がマスターの場合は追加され、状態がバックアップの場合は削除されます。主に優先度によって決まります。状態によって設定される値とはほとんど関係がなく、ここでは複数の IP アドレスを設定できます。track_script
: VRRP スクリプトへの参照、vrrp_script セクションで指定された名前。これらを定期的に実行して優先順位を変更し、最終的にアクティブ/スタンバイの切り替えをトリガーします。
vrrp_script モジュール パラメータは、
どのような状況で切り替えるかを keepalived に指示するため、特に重要です。複数の vrrp_scripts が存在する可能性があります
script
: 自分で書いた検出スクリプト。killall -0 nginx のような 1 行コマンドでも構いません。interval 2
: 2秒ごとに検出weight -5
: 検出が失敗した場合 (スクリプトが 0 以外を返した場合)、優先度は -5 です。fall 2
: 真の失敗とみなされるには、テストが 2 回連続で失敗する必要があります。重みを使用して優先度を下げます (1 ~ 255)rise 1
:1回検出に成功すると成功とみなされます。ただし優先順位は変わりません
メイン nginx サーバー 192.168.92.100 では、VIP は 192.168.92.200 に設定され、構成は次のようになります。
! Configuration File for keepalived
global_defs {
router_id Nginx_01
}
vrrp_script check_nginx {
script "/etc/keepalived/check_nginx.sh"
interval 2
weight -5
fall 3
rise 2
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.92.200
}
track_script {
check_nginx
}
}
バックアップ nginx サーバー 192.168.92.101 では、設定は同じですが、3 つの違いがあります。そのうちの 1 つは同じである必要があります。1. router_id が異なり、2. BACKUP 状態が異なり、3. 優先度が異なります。違う。4.virtual_router_id は同じである必要があります。構成は次のとおりです。
! Configuration File for keepalived
global_defs {
router_id Nginx_02
}
vrrp_script check_nginx {
script "/etc/keepalived/check_nginx.sh"
interval 2
weight -5
fall 3
rise 2
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.92.200
}
track_script {
check_nginx
}
}
2. テストを開始し、IP を確認します。
2 つのキープアライブを再起動する
syetemctl restart keepalived
ip a
IP を確認すると、VIP が現在サーバー 100 上にあることがわかります。
- VIP が利用可能かどうかをテストする
[root@bogon keepalived]# curl http://192.168.92.200
Hello, Nginx! Server 192.168.92.100
- キープアライブを停止し、vip がドリフトしたかどうかを確認します
100 サービスで keepalived が停止している場合、再度サービスアドレスを要求して結果を確認すると、101 サーバーが要求されます。
[root@bogon keepalived]# curl http://192.168.92.200
Hello, Nginx! Server 192.168.92.101
3.デュアルマスターモード
1.キープアライブ設定
アクティブ モードとスタンバイ モードを理解すると、デュアル アクティブ モードの設定がはるかに簡単になります。vrrp_instance VI_2 という名前の vrrp_instance を各 keepalived 構成ファイルに追加し、いくつかのパラメーターを変更して、別の VIP: 192.168.200.201
keep1 構成を設定するだけです。
! Configuration File for keepalived
global_defs {
router_id Nginx_01
}
vrrp_script check_nginx {
script "/etc/keepalived/check_nginx.sh"
interval 2
weight -5
fall 3
rise 2
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.92.200
}
track_script {
check_nginx
}
}
# 100------100
vrrp_instance VI_2 {
state BACKUP
interface ens33
virtual_router_id 52
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.92.201
}
track_script {
check_nginx
}
}
keep2 の構成は次のとおりです。
! Configuration File for keepalived
global_defs {
router_id Nginx_02
}
vrrp_script check_nginx {
script "/etc/keepalived/check_nginx.sh"
interval 2
weight -5
fall 3
rise 2
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.92.200
}
track_script {
check_nginx
}
}
# 101------101
vrrp_instance VI_2 {
state MASTER
interface ens33
virtual_router_id 52
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.92.201
}
track_script {
check_nginx
}
}
変更が完了したら、keep1 と keep2 をそれぞれ起動して、バインディング VIP のステータスを確認します。
2. テストを開始し、IP を確認します。
ip addr
次の結果が表示されれば、構成は成功しています。
1. VIP が利用可能かどうかをテストする
次の結果は、構成が成功したことを示しています。
[root@bogon ~]# curl http://192.168.92.201
Hello, Nginx! Server 192.168.92.101
[root@bogon ~]# curl http://192.168.92.200
Hello, Nginx! Server 192.168.92.100
2. キープアライブを停止し、vip がドリフトしたかどうかを確認します。
次に192.168.90.100のキープサービスを停止します。
systemctl stop keepalived
101 サーバの IP アドレスを確認する
100 サービスの keepalived が停止している場合は、再度サービスアドレスを要求し、結果を確認する 101 サーバが要求される
[root@bogon ~]# curl http://192.168.92.201
Hello, Nginx! Server 192.168.92.101
[root@bogon ~]# curl http://192.168.92.200
Hello, Nginx! Server 192.168.92.101
100 サーバーを手動で起動すると、200 のアドレスが自動的にバインドされていることがわかります。
4. keepalived設定ファイルの詳細説明(参考)
#全局配置
global_defs {
# 邮件通知信息
notification_email {
# 定义收件人
[email protected]
}
# 定义发件人
notification_email_from [email protected]
# SMTP服务器地址
smtp_server 192.168.200.1
smtp_connect_timeout 30
# 路由器标识,一般不用改,也可以写成每个主机自己的主机名
router_id LVS_DEVEL
# VRRP的ipv4和ipv6的广播地址,配置了VIP的网卡向这个地址广播来宣告自己的配置信息,下面是默认值
vrrp_mcast_group4 224.0.0.18
vrrp_mcast_group6 ff02::12
}
# 定义用于实例执行的脚本内容,比如可以在线降低优先级,用于强制切换
vrrp_script SCRIPT_NAME {
}
# 一个vrrp_instance就是定义一个虚拟路由器的,实例名称
vrrp_instance VI_1 {
# 定义初始状态,可以是MASTER或者BACKUP
state MASTER
# 工作接口,通告选举使用哪个接口进行
interface ens33
# 虚拟路由ID,如果是一组虚拟路由就定义一个ID,如果是多组就要定义多个,而且这个虚拟
# ID还是虚拟MAC最后一段地址的信息,取值范围0-255
virtual_router_id 51
# 使用哪个虚拟MAC地址
use_vmac XX:XX:XX:XX:XX
# 监控本机上的哪个网卡,网卡一旦故障则需要把VIP转移出去
track_interface {
eth0
ens33
}
# 如果你上面定义了MASTER,这里的优先级就需要定义的比其他的高
priority 100
# 通告频率,单位为秒
advert_int 1
# 通信认证机制,这里是明文认证还有一种是加密认证
authentication {
auth_type PASS
auth_pass 1111
}
# 设置虚拟VIP地址,一般就设置一个,在LVS中这个就是为LVS主机设置VIP的,这样你就不用自己手动设置了
virtual_ipaddress {
# IP/掩码 dev 配置在哪个网卡
192.168.200.16/24 dev eth1
# IP/掩码 dev 配置在哪个网卡的哪个别名上
192.168.200.17/24 dev label eth1:1
}
# 虚拟路由,在需要的情况下可以设置lvs主机 数据包在哪个网卡进来从哪个网卡出去
virtual_routes {
192.168.110.0/24 dev eth2
}
# 工作模式,nopreempt表示工作在非抢占模式,默认是抢占模式 preempt
nopreempt|preempt
# 如果是抢占默认则可以设置等多久再抢占,默认5分钟
preempt delay 300
# 追踪脚本,通常用于去执行上面的vrrp_script定义的脚本内容
track_script {
}
# 三个指令,如果主机状态变成Master|Backup|Fault之后会去执行的通知脚本,脚本要自己写
notify_master ""
notify_backup ""
notify_fault ""
}
# 定义LVS集群服务,可以是IP+PORT;也可以是fwmark 数字,也就是防火墙规则
# 所以通过这里就可以看出来keepalive天生就是为ipvs而设计的
virtual_server 10.10.10.2 1358 {
delay_loop 6
# 算法
lb_algo rr|wrr|lc|wlc|lblc|sh|dh
# LVS的模式
lb_kind NAT|DR|TUN
# 子网掩码,这个掩码是VIP的掩码
nat_mask 255.255.255.0
# 持久连接超时时间
persistence_timeout 50
# 定义协议
protocol TCP
# 如果后端应用服务器都不可用,就会定向到那个服务器上
sorry_server 192.168.200.200 1358
# 后端应用服务器 IP PORT
real_server 192.168.200.2 1358 {
# 权重
weight 1
# MSIC_CHECK|SMTP_CHEKC|TCP_CHECK|SSL_GET|HTTP_GET这些都是
# 针对应用服务器做健康检查的方法
MISC_CHECK {}
# 用于检查SMTP服务器的
SMTP_CHEKC {}
# 如果应用服务器不是WEB服务器,就用TCP_CHECK检查
TCP_CHECK {
# 向哪一个端口检查,如果不指定默认使用上面定义的端口
connect_port <PORT>
# 向哪一个IP检测,如果不指定默认使用上面定义的IP地址
bindto <IP>
# 连接超时时间
connect_timeout 3
}
# 如果对方是HTTPS服务器就用SSL_GET方法去检查,里面配置的内容和HTTP_GET一样
SSL_GET {}
# 应用服务器UP或者DOWN,就执行那个脚本
notify_up "这里写的是路径,如果脚本后有参数,整体路径+参数引起来"
notify_down "/PATH/SCRIPTS.sh 参数"
# 使用HTTP_GET方法去检查
HTTP_GET {
# 检测URL
url {
# 具体检测哪一个URL
path /testurl/test.jsp
# 检测内容的哈希值
digest 640205b7b0fc66c1ea91c463fac6334d
# 除了检测哈希值还可以检测状态码,比如HTTP的200 表示正常,两种方法二选一即可
status_code 200
}
url {
path /testurl2/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
url {
path /testurl3/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
# 向哪一个端口检查,如果不指定默认使用上面定义的端口
connect_port <PORT>
# 向哪一个IP检测,如果不指定默认使用上面定义的IP地址
bindto <IP>
# 连接超时时间
connect_timeout 3
# 尝试次数
nb_get_retry 3
# 每次尝试之间间隔几秒
delay_before_retry 3
}
}
real_server 192.168.200.3 1358 {
weight 1
HTTP_GET {
url {
path /testurl/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334c
}
url {
path /testurl2/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334c
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
要約する
keepalived に設定された 2 つの VIP へのアクセスは正常にスケジュールできます。 keepalived ノードを停止しても、アクセスは正常のままです。 この時点で、keepalived+nginx ホットスタンバイ高可用性 (アクティブ スタンバイ + デュアル アクティブ モード) の構築が完了します。