Linux原始碼安裝RabbitMQ高可用叢集

sun丶牧羊人發表於2022-03-28

1.環境說明

  • linux版本:CentOS Linux release 7.9.2009
  • erlang版本:erlang-24.0
  • rabbitmq版本:rabbitmq_server-3.9.13

2.原始碼安裝erlang、RabbitMQ

  Rabbitmq採用erlang語言開發,所以在安裝rabbitmq之前,需要安裝erlang。

2.1 下載erlang、RabbitMQ原始碼包

erlang官網下載地址:http://www.erlang.org/download 選擇opt_src_版本號.tar.gz(這裡我選擇的是 otp_src_24.0.tar.gz)

或者在linux伺服器上使用 wget http://www.erlang.org/download/otp_src_24.0.tar.gz 進行下載

官網下載erlang原始碼包截圖

 RabbitMq官網下載地址:https://www.rabbitmq.com/download.html

RabbitMQ下載截圖

 

RabbitMQ原始碼包

2.2 安裝erlang

  1. 安裝相關依賴 

yum -y install make gcc gcc-c++ kernel-devel m4 ncurses-devel openssl-devel gtk2-devel binutils-devel unixODBC unixODBC-devel xz

2. 上傳並解壓erlang安裝包

#上傳otp_src_24.0.tar.gz rabbitmq-server-generic-unix-3.9.13.tar.xz 到指定路徑(這裡我上傳到/lee)
#解壓安裝包
[root@lee lee]# tar -zxvf otp_src_24.0.tar.gz 
[root@lee lee]# ll
total 111200
drwxr-xr-x 12 2004 wheel      4096 May 12  2021 otp_src_24.0
-rw-r--r--  1 root root  101193664 Mar 21 09:45 otp_src_24.0.tar.gz
-rw-r--r--  1 root root   12660820 Mar 21 09:45 rabbitmq-server-generic-unix-3.9.13.tar.xz

3. 編譯安裝erlang

#建立erlang安裝目錄
[root@lee lee]# mkdir -p /lee/erlang
#進入otp_src_24.0目錄
[root@lee lee]# cd otp_src_24.0
[root@lee otp_src_24.0]# ./configure prefix=/lee/erlang
[root@lee otp_src_24.0]# make && make install
#安裝完成後安裝路徑下的目錄如下
[root@lee otp_src_24.0]# cd ../erlang/
[root@lee erlang]# ll
total 8
drwxr-xr-x 2 root root 4096 Mar 21 11:03 bin
drwxr-xr-x 3 root root 4096 Mar 21 11:02 lib

在執行 ./configure prefix=/lee/erlang 時出現如下問題可不用處理,這樣編譯完成

Linux原始碼安裝RabbitMQ高可用叢集

4. 配置環境變數並驗證erlang是否安裝成功

# 將erlang安裝路徑/bin 新增到 /ect/profile 末尾
[root@lee erlang]# vi /etc/profile
[root@lee erlang]# source /etc/profile
# 驗證是否安裝成功,執行erl 結果如下表示正常
[root@lee erlang]# erl
Erlang/OTP 24 [erts-12.0] [source] [64-bit] [smp:2:2] [ds:2:2:10] [async-threads:1]

Eshell V12.0  (abort with ^G)
1>
# 執行 halt(). 退出控制檯
1> halt().
[root@lee erlang]#

 2.3. 安裝RabbitMQ

安裝RabbitMQ前需要確認erlang安裝成功

# 解壓 rabbitmq-server-generic-unix-3.9.13.tar.xz
[root@lee lee]# xz -d rabbitmq-server-generic-unix-3.9.13.tar.xz
[root@lee lee]# tar -xvf rabbitmq-server-generic-unix-3.9.13.tar
[root@lee lee]# mv rabbitmq_server-3.9.13/ rabbitmq
# 配置 RabbitMQ 環境變數
# 將 export PATH=$PATH:/lee/rabbitmq/bin:/lee/rabbitmq/sbin 新增到 /etc/profile 末尾
[root@lee lee]# vi /etc/profile
[root@lee lee]# source /etc/profile
# 後臺啟動 RabbitMQ
[root@lee lee]# rabbitmq-server -detached
# 檢視埠 5672 存在表示啟動成功
[root@lee lee]# ss -tnlp|grep 5672
LISTEN     0      128          *:25672                    *:*                   users:(("beam.smp",pid=8418,fd=17))
LISTEN     0      128       [::]:5672                  [::]:*                   users:(("beam.smp",pid=8418,fd=32))
# 新增rabbitmq瀏覽器管理外掛
[root@lee lee]# rabbitmq-plugins enable rabbitmq_management
# RabbitMQ有預設使用者名稱密碼 guest/guest,該使用者名稱密碼只能在本地登陸
# 如若在瀏覽器中登陸,須新建立使用者名稱密碼
# 新增使用者名稱密碼
[root@lee lee]# rabbitmqctl add_user rabbitmq_user rabbitmq_pwd
# 檢查使用者列表
[root@lee lee]# rabbitmqctl list_users
Listing users ...
user    tags
guest   [administrator]
rabbitmq_user   []
# 為 rabbitmq_user 使用者新增administrator角色
[root@lee lee]# rabbitmqctl set_user_tags rabbitmq_user administrator
Setting tags for user "rabbitmq_user" to [administrator] ...
# 設定 rabbitmq_user 使用者許可權,允許訪問vhost及read/write
[root@lee lee]# rabbitmqctl set_permissions -p / rabbitmq_user ".*" ".*" ".*"
Setting permissions for user "rabbitmq_user" in vhost "/" ...
# 檢查許可權列表
[root@lee lee]# rabbitmqctl list_permissions -p /
Listing permissions for vhost "/" ...
user    configure   write   read
guest   .*  .*  .*
rabbitmq_user   .*  .*  .*
# 啟動訊息佇列服務
[root@lee lee]# rabbitmqctl start_app
Starting node rabbit@lee ...
# 驗證15672埠存在表示訊息佇列服務啟動成功
[root@lee lee]# ss -tnlp | grep 15672<br>LISTEN     0      128         *:15672         *:*             users:(("beam.smp",pid=8418,fd=35))

 2.4 瀏覽器登陸RabbitMQ管理介面

在瀏覽器中訪問 ip:15672 登陸管理頁面,若重新安裝 RabbitMQ 後,該介面底部出現 ReferenceError: disable_stats is not defined,ctrl+f5清除頁面快取後重新登陸

Linux原始碼安裝RabbitMQ高可用叢集

檢視服務狀態,若為綠色表示正常

Linux原始碼安裝RabbitMQ高可用叢集

3. 搭建RabbitMQ高可用叢集

搭建叢集前,需要在各個節點上安裝好RabbitMQ,安裝方法見 2.原始碼安裝erlang、RabbitMQ,本文使用映象模式搭建叢集,HaProxy作為負載均衡,使用keepalived實現高可用。

3.1 映象佇列叢集

 RabbitMQ叢集可以使得在RabbitMQ節點當機時,消費者和生產者可以繼續執行;並且可以承載更多的業務量增加系統吞吐量。

普通模式叢集下可能會丟失資料,例如生產者通過連線node1上傳訊息,訊息實體只會儲存到node1節點的Queue中,node2和node3節點只是儲存相同的Queue結構,不儲存訊息實體,消費者如通過node2(或mode3)進行消費時,RabbitMQ會臨時在node1和node2(或node3)之間進行訊息傳輸,將node1中的訊息通過node2(或node3)傳送給消費者,在此期間node1發生當機,node2(或node3)無法獲取該訊息,若該訊息進行了持久化,則node1節點恢復後,該訊息可繼續被消費,若未進行持久化,則該訊息會丟失。此時在普通模式叢集的基礎上構建映象佇列,可以將訊息資料儲存在多個節點上。

Haproxy通過負載均衡演算法將訊息分發給叢集中的各個節點。

搭建兩臺Haproxuy,使用keepalived對其做高可用,兩臺keepalived伺服器之間通過vrrp進行互動,對外通過虛擬ip(192.168.0.45)進行訪問haproxy

總結:客戶端通過虛擬ip(192.168.0.45)進行訪問haproxy,通過keepalived會將其發放到MASTER節點上的haproxy,若MASTER節點上的Haproxy當機,則會發放到SLAVE節點上,通過Haproxy會訪問到RabbitMQ叢集,通過叢集訪問各個RabbitMQ

 

3.2 搭建映象模式叢集

使用三臺伺服器製作叢集,主機名可執行命令 hostname 檢視

ip 主機名 部署的服務
192.168.0.1  node1 RabbitMQ + HAProxy + KeepAlived
192.168.0.2  node2 RabbitMQ + HAProxy + KeepAlived
192.168.0.3  node3 RabbitMQ

 1、配置IP地址和主機名之間的對映

分別在三個節點上 /etc/hosts 檔案中新增 三臺伺服器ip和主機名之間的對映

vi /etc/hosts
# 新增如下內容
192.168.0.1 node1
192.168.0.2 node2
192.168.0.3 node3

 2、同步erlang cookies

RabbitMQ是通過erlang編寫,erlang語言通過同步erlang叢集各個節點的cookie實現分散式。

隨機選擇一個節點(這裡選擇node1),將該節點上的 .erlang.cookie檔案拷貝到另兩個節點上,該檔案相當於金鑰令牌,叢集中的各個節點通過該令牌進行相互認證。

RabbitMQ服務啟動時,erlang虛擬機器會自動建立.erlang.cookie檔案,預設路徑為 /var/lib/rabbitmq/.erlang.cookie(rpm方式安裝)或$HOME/.erlang.cookie,該檔案是個隱藏檔案,可通過 ls -al檢視。

在node1節點上執行如下命令同步 .erlang.cookie檔案

# 將 node1上 /root/.erlang.cookie 拷貝到node2上
scp /root/.erlang.cookie node2:/root/.erlang.cookie
# 將 node1上 /root/.erlang.cookie 拷貝到node2上
scp /root/.erlang.cookie node3:/root/.erlang.cookie
# 分別在三個節點上檢視該檔案內容是否相同
more /root/.erlang.cookie

 3. RabbitMQ叢集新增節點

分別在node2、node3節點執行如下命令,將node2、node3加入叢集中

#在node2節點執行
#關閉應用
rabbitmqctl stop_app
#將node2加入叢集中
rabbitmqctl join_cluster ‐‐ram rabbit@node2
#啟動應用
rabbitmqctl start_app

#在node3節點執行
#關閉應用
rabbitmqctl stop_app
#將node3加入叢集中
rabbitmqctl join_cluster ‐‐ram rabbit@node3
#啟動應用
rabbitmqctl start_app

 4. 驗證叢集是否配置成功

執行如下命令進行驗證

# 在任一節點執行如下命令驗證叢集是否配置成功
rabbitmqctl cluster_status

#出現如下內容表示成功
Disk Nodes

rabbit@node1
rabbit@node2
rabbit@node3

Running Nodes

rabbit@node1
rabbit@node2
rabbit@node3

 或使用任一節點 ip:15672 登陸管理頁面,使用者名稱密碼為主節點node1的使用者名稱密碼,如下圖顯示綠色表示成功

Linux原始碼安裝RabbitMQ高可用叢集

 5. 配置映象佇列叢集

 以上配置的叢集只是普通叢集,該叢集下可能會丟失資料,例如生產者通過連線node1上傳訊息,訊息實體只會儲存到node1節點的Queue中,node2和node3節點只是儲存相同的Queue結構,不儲存訊息實體,消費者如通過node2(或mode3)進行消費時,RabbitMQ會臨時在node1和node2(或node3)之間進行訊息傳輸,將node1中的訊息通過node2(或node3)傳送給消費者,在此期間node1發生當機,node2(或node3)無法獲取該訊息,若該訊息進行了持久化,則node1節點恢復後,該訊息可繼續被消費,若未進行持久化,則該訊息會丟失。

如下為通過命令方式和管理頁面方式實現:同步 virtual host 為 "/"下名稱字首為 "mirroring"的交換機和佇列,並且自動儲存到兩個節點上

(1)命令列方式配置映象佇列

在任一節點上執行如下命令:

#同步 virtual host 為 "/"下名稱字首為 "mirroring"的交換機和佇列,並且自動儲存到兩個節點上
rabbitmqctl set_policy -p / --priority 1 --apply-to all myPolicy "^mirroring" '{"ha-mode":"exactly","ha-params":2,"ha-sync-mode":"automatic"}'

# policy配置格式
rabbitmqctl set_policy [-p <vhost>] [--priority <priority>] [--apply-to <apply-to>] <name> <pattern>  <definition>

policy引數說明

引數 描述
 -p  可選引數,針對指定 Virtual host
 –priority  可選引數,policy 的優先順序
 –apply-to  可選引數,策略適用的物件型別,其值可為 queues、exchanges、all,預設是 all
 name  policy 的名稱
 pattern  匹配模式(正規表示式)
 definition  映象定義,json 格式,包括三部分(ha-mode,ha-params,ha-sync-mode)具體配置見下表

 

definition引數說明

引數 描述
 ha-mode

 ha-mode:指明映象佇列的模式,有效值為 all、exactly、nodes

     all:表示在叢集中所有的節點上進行映象
     exactly:表示在指定個數的節點上進行映象,節點的個數由ha-params指定
          nodes:表示在指定的節點上進行映象,節點名稱通過ha-params指定

 ha-params  ha-mode模式需要用到的引數(ha-mode=exactly時為整數,nodes時為字串陣列,all時不用指定)
ha-sync-mode

 ha-sync-mode:進行佇列中訊息的同步方式,有效值為automatic和manual

  manual:手動<預設模式>.新的佇列映象將不會收到現有的訊息,它只會接收新的訊息,除非顯式呼叫同步命令

  automatic:自動同步,新加入節點時會預設同步已知的映象佇列

命令 rabbitmqctl sync_queue 佇列名,手動同步佇列
命令 rabbitmqctl cancel_sync_queue 佇列名 取消某個queue的同步


(2)通過管理頁面新增:通過該叢集任一節點ip:15672登陸

Linux原始碼安裝RabbitMQ高可用叢集

 6. 叢集策略相關命令

設定策略:rabbitmqctl set_policy [-p <vhost>] [--priority <priority>] [--apply-to <apply-to>] <name> <pattern> <definition>

清除策略:rabbitmqctl clear_policy [-p <vhost>] <name>

檢視策略:rabbitmqctl list_policies [-p <vhost>]

7. 將某節點退出叢集

# 在退出的節點上執行
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app

# 在主節點上執行(如去除node2),offline引數代表允許離線刪除
rabbitmqctl forget_cluster_node node2 [--offline]

3.3 配置HaProxy負載均衡

 HAProxy提供高可用性、負載均衡以及基於TCP和HTTP應用的代理,支援虛擬主機,它是免費、 快速並且可靠的一種解決方案。HAProxy實現了一種事件驅動、單一程式模型,此模型支援非常大的併發連線數。

安裝包下載地址:https://www.haproxy.org/#down

在linux上下載: wget https://www.haproxy.org/download/2.5/src/haproxy-2.5.5.tar.gz

 3.3.1 上傳安裝

系統核心:3.10.0-1160.53.1.el7.x86_64

選擇兩個節點分別安裝 Haproxy,這裡選擇node1,node2節點(分別在兩個節點上執行如下操作)

# 上傳 haproxy-2.5.5.tar.gz 並解壓(此次上傳到/usr/local)
tar -zxvf haproxy-2.5.5.tar.gz
mv haproxy-2.5.5.tar.gz haproxy
cd haproxy

#編譯並指定安裝目錄
make TARGET=linux-glibc ARCH=x86_64 PREFIX=/usr/local/haproxy
# 安裝
make install PREFIX=/usr/local/haproxy

 引數說明:

TARGET和ARCH通過uname -r 檢視伺服器核心,根據核心資訊匹配 haproxy/INSTALL(有些版本可檢視 haproxy/README)中對應的引數,該引數不同版本有所區別

TARGET:核心版本

ARCH:系統CUP(64位為 x86_64)

PREFIX:指定安裝目錄

Linux原始碼安裝RabbitMQ高可用叢集

 3.3.2 配置 Haproxy 環境變數

vi /etc/profile
# 將如下內容匯入該檔案中
    export HAPROXY_HOME=/usr/local/haproxy   #安裝路徑 
    export PATH=$PATH:$HAPROXY_HOME/sbin
# 生效
source /etc/profile

 3.3.3 負載均衡配置

 建立使用者,日誌目錄

#新增haproxy組
groupadd haproxy
#建立nginx執行賬戶haproxy並加入到haproxy組,不允許haproxy使用者直接登入系統
useradd -g haproxy haproxy -s /bin/false 

#建立haproxy錯誤日誌目錄
mkdir -p /usr/local/haproxy/errors
cp -r /usr/local/haproxy/examples/errorfiles/* /usr/local/haproxy/errors/

#建立日誌檔案
mkdir -p /usr/local/haproxy/logs
touch /usr/local/haproxy/logs/haproxy.log
#建立haproxy配置檔案
mkdir -p /usr/local/haproxy/conf
touch /usr/local/haproxy/conf/haproxy.cfg
touch /usr/local/haproxy/stats

修改配置檔案:/usr/local/haproxy/conf/haproxy.cfg

#‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
# Global settings
#‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
global
  log 127.0.0.1 local2
  chroot /usr/local/haproxy  
  #haproxy的pid存放路徑,啟動程式的使用者必須有許可權訪問此檔案 
  pidfile /var/run/haproxy.pid
  maxconn 4000
  user haproxy
  group haproxy
  daemon  
  #需要建立該檔案
  stats socket /usr/local/haproxy/stats
  
defaults
  mode http
  #採用全域性定義的日誌
  log global  
  #日誌類別http日誌格式
  option httplog 
  #不記錄健康檢查的日誌資訊
  option dontlognull 
  #每次請求完畢後主動關閉http通道
  option http-server-close
  option forwardfor except 127.0.0.0/8
  #serverId對應的伺服器掛掉後,強制定向到其他健康的伺服器
  option redispatch
  ##3次連線失敗就認為服務不可用,也可以通過後面設定
  retries 3
  timeout http-request 10s
  timeout queue 1m
  
  #default 10 second timeout if a backend is not found
  timeout connect 10s 
  #客戶端連線超時
  timeout client 1m
  #伺服器連線超時
  timeout server 1m
  timeout http-keep-alive 10s
  timeout check 10s
  #最大連線數
  maxconn 3000
  
#開啟haproxy監控服務
listen rabbitmq_cluster
  #通過6672對節點進行對映(自定義)
  bind 0.0.0.0:6672
  #記錄tcp連線的狀態和時間
  option tcplog
  #四層協議代理,即對TCP協議轉發
  mode tcp
  #開啟TCP的Keep Alive(長連線模式)
  option clitcpka
  #haproxy與mq建立連線的超時時間
  timeout connect 1s
  #客戶端與haproxy最大空閒時間
  timeout client 10s
  #伺服器與haproxy最大空閒時間
  timeout server 10s
  #採用輪詢轉發訊息
  balance roundrobin
  
  #每5秒傳送一次心跳包,如連續兩次有響應則代表狀態良好
  #如連續三次沒有響應,則視為服務故障,該節點將被剔除。
  server node1 節點1 ip地址:5672 check inter 5s rise 2 fall 3
  server node2 節點2 ip地址:5672 check inter 5s rise 2 fall 3

listen http_front
  #監聽埠-頁面訪問的埠(自定義)
  bind 0.0.0.0:6001
  #統計頁面自動重新整理時間stats refresh 30s
  stats refresh 30s
  
  #統計頁面url  (頁面訪問的uri,即瀏覽器通過 ip:6001/haproxy_stats 訪問)
  stats uri /haproxy_stats
  
  # 指定Haproxy訪問使用者名稱密碼
  stats auth haproxy_admin:haproxy_pwd
  
  ########設定haproxy 錯誤頁面#####
  errorfile 403 /usr/local/haproxy/errors/403.http
  errorfile 500 /usr/local/haproxy/errors/500.http
  errorfile 502 /usr/local/haproxy/errors/502.http
  errorfile 503 /usr/local/haproxy/errors/503.http
  errorfile 504 /usr/local/haproxy/errors/504.http

開啟日誌記錄:安裝Haproxy之後,預設是沒有開啟日誌記錄的,需要根據rsyslog通過udp的方式獲取Haproxy日誌資訊

vi /etc/rsyslog.conf
    #開啟以下兩行註解,開啟 514 USP監聽
    $ModLoad imudp
    $UDPServerRun 514
    #新增日誌目錄 (local2 與haproxy.cfg中global log保持一致)
    local2.*   /usr/local/haproxy/haproxy.log

vi /etc/sysconfig/rsyslog
    #修改如下內容(若沒有則新增)
    SYSLOGD_OPTIONS="-r -m 0 -c 2"
#重啟生效
service rsyslog restart

 3.3.4 啟動Haproxy驗證

haproxy相關命令

# 檢查配置檔案語法
haproxy -c -f /usr/local/haproxy/haproxy.cfg
# 啟動
haproxy -f /usr/local/haproxy/haproxy.cfg

# 以daemon模式啟動,以systemd管理的daemon模式啟動
haproxy -D -f /usr/local/haproxy/haproxy.cfg
haproxy -Ds -f /usr/local/haproxy/haproxy.cfg

# 啟動除錯功能,將顯示所有連線和處理資訊在螢幕
haproxy -d -f /usr/local/haproxy/haproxy.cfg

# 重啟 需要使用st選項指定pid列表
haproxy -f /usr/local/haproxy.cfg -st `cat /var/run/haproxy.pid`

# graceful restart,即reload。需要使用sf選項指定pid列表
haproxy -f /usr/local/haproxy.cfg -sf `cat /var/run/haproxy.pid`

# 顯示haproxy編譯和啟動資訊
haproxy -vv

 瀏覽器登陸 ip:6001/haproxy_stats,顯示如下頁面表示正常(須開放6001埠)

Linux原始碼安裝RabbitMQ高可用叢集

 3.4 安裝keepalived

 官網下載地址:https://www.keepalived.org/download.html

 在安裝Haproxy的兩個節點 node1,node2 (192.168.0.1、192.168.0.2)上安裝keepalived

# 安裝依賴
yum install -y gcc openssl-devel popt-devel ipvsadm libnl3-devel net-snmp-devel libnl libnl-devel libnfnetlink-devel

# 上傳安裝包到 /usr/local 並解壓
tar -zxvf keepalived-2.2.4
# 建立安裝目錄
mkdir /usr/local/keepalived
# 編譯
cd keepalived-2.2.4
./configure --prefix=/usr/local/keepalived
# 安裝
make && make install

# 建立keepalived配置檔案目錄 keepalived預設會讀取 /etc/keepalived/keepalived.conf
madir keepalived.conf

cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
cp /usr/local/keepalived-2.2.4/keepalived/etc/init.d/keepalived /etc/init.d/
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig
cp /usr/local/keepalived/sbin/keepalived /usr/sbin/

# 建立關閉keepalived的指令碼
vi /etc/keepalived/stop_keepalived
   # 指令碼內容 監聽haproxy埠 6001
   #! /bin/bash
    counter=$(ss -tanlp | grep "LISTEN" | grep "6001"|wc -l)
    if [ "${counter}" -eq 0 ]
    then
       pkill keepalived
    fi

 修改配置檔案: vi /etc/keepalived/keepalived.conf

主節點node1上的配置檔案

! Configuration File for keepalived

global_defs {
   script_user root
   enable_script_security
   router_id node1
   vrrp_skip_check_adv_addr
#   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    #keepalived角色,MASTER表示主節點 BACKUP從節點
    state MASTER
	#指定檢測的網路卡
    interface eth0
	#虛擬路由的id,主備節點設定相同
    virtual_router_id 60
	#優先順序,主節點的優先順序需要設定的比從節點高
    priority 90
	#設定主備之間的檢查時間,單位s
    advert_int 1
	#定義驗證型別和密碼
    authentication {
        auth_type PASS
        auth_pass 1111
    }
	# 另一個節點的ip
	unicast_peer {
		192.168.0.2
	}
	#虛擬ip
    virtual_ipaddress {
        192.168.0.45
    }
}

virtual_server 192.168.0.45 6001 {
    virtual_server 
    delay_loop 6
    lb_algo rr
    lb_kind NAT
    persistence_timeout 50
    protocol TCP

    real_server 192.168.0.1 6001 {
        weight 1
	# 監控指令碼
        notify_down /etc/keepalived/stop_keepalived.sh
		TCP_CHECK {
		  connect_timeout 10
		  retry 3
		  connect_port 6001
		}
    }
}

 從節點node2配置檔案

! Configuration File for keepalived

global_defs {
   script_user root
   enable_script_security
   router_id node2
   vrrp_skip_check_adv_addr
#   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    #keepalived角色,MASTER表示主節點 BACKUP從節點
    state MASTER
	#指定檢測的網路卡
    interface eth0
	#虛擬路由的id,主備節點設定相同
    virtual_router_id 60
	#優先順序,主節點的優先順序需要設定的比從節點高
    priority 90
	#設定主備之間的檢查時間,單位s
    advert_int 1
	#定義驗證型別和密碼
    authentication {
        auth_type PASS
        auth_pass 1111
    }
	# 另一個節點的ip
	unicast_peer {
		192.168.0.1
	}
	#虛擬ip
    virtual_ipaddress {
        192.168.0.45
    }
}

virtual_server 192.168.0.45 6001 {
    virtual_server 
    delay_loop 6
    lb_algo rr
    lb_kind NAT
    persistence_timeout 50
    protocol TCP

    real_server 192.168.0.2 6001 {
        weight 1
	# 監控指令碼
        notify_down /etc/keepalived/stop_keepalived.sh
		TCP_CHECK {
		  connect_timeout 10
		  retry 3
		  connect_port 6001
		}
    }
}

 啟動命令 /etc/init.d/keepalived start

關閉命令 /etc/init.d/keepalived stop

檢視日誌 tail -f /var/log/messages

驗證:啟動後在兩個節點上使用 ip addr 命令,檢視配置虛擬ip(192.168.0.45)是否在配置的網路卡(eth0)下,如果主節點下存在從節點點不存在,說明正常,此時關閉主節點haproxy,虛擬ip(192.168.0.45)會漂移到從節點,重新啟動主節點keepalived會重新漂移到主節點,此時可以根據 192.168.0.45連線haproxy

相關文章