Linux源碼安裝RabbitMQ高可用集群

来源:https://www.cnblogs.com/sunnyLee/archive/2022/03/28/16033853.html
-Advertisement-
Play Games

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


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 時出現如下問題可不用處理,這樣編譯完成

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清除頁面緩存後重新登陸

查看服務狀態,若為綠色表示正常

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的用戶名密碼,如下圖顯示綠色表示成功

 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登陸

 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:指定安裝目錄

 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埠)

 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


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在 Ubuntu 下交換Alt和Ctrl鍵: sudo vim /usr/share/X11/xkb/keycodes/evdev 或者用系統預設編輯器打開: sudo xdg-open /usr/share/X11/xkb/keycodes/evdev 然後找到LALT和LCTL所在的行,它們的默 ...
  • 概述 1. Mycat 是什麼? Mycat 是資料庫中間件,連接 Java 應用程式和資料庫,它的作用如下: 讀寫分離 數據分片:垂直拆分(分庫)、水平拆分(分表)、垂直+水平拆分(分庫分表) 多數據源整合 2. Mycat 原理 Mycat 攔截了用戶發送過來的 SQL 語句,首先對 SQL 語 ...
  • Mysql8 安裝失敗 第一次安裝失敗 Windows Server 2012 首先是使用mysql的最新安裝包去安裝, 但是安裝包在執行到 starting mysql server 時,就卡住不動了。 手動去服務中啟動 顯示無法啟動服務 helpmsg 3534 原因不詳! 第二次安裝 由於客戶 ...
  • 一、前言 在上一篇文章中,介紹了Flutter的開發環境搭建流程,創建並運行成功一個flutter項目,用戶界面呈現也通過Android虛擬機實現線上查看效果。 但是對於一個前端來說,用 VS Code 編輯器的同學肯定很多,第一次接觸Flutter開發對於Android Studio 編輯器可能不 ...
  • 起因 由於項目App迭代,一個佈局發生了改變。因此產生了一個奇怪的問題,按道理,滑動NestedScrollView的時候,AppBarLayout會上移。這是appbar_scrolling_view_behavior和scroll|enterAlwaysCollapsed使用的常規操作嘛。但是拖 ...
  • 學習Flutter,首先需要搭建好Flutter的開發環境,下麵我將一步步帶領大家搭建開發環境並且成功運行flutter項目。 Flutter環境配置主要有這幾點: 系統配置要求 Java環境 Flutter SDK Android 開發環境 ***以下是基於在Window操作系統上安裝和配置Flu ...
  • 一、變數與屬性的區別; 1. 概念 什麼是變數? 變數:變數是一個存儲數據的容器,本質:變數是記憶體裡面的一個空間,通過變數名來獲取數據;聲明(var)一個變數就是在記憶體裡面獲取一個存儲空間。 什麼是屬性? 為元素提供各種附加信息的就是屬性,存在對象裡面表示對象有什麼樣的特征,常用名詞來表示,它總是以 ...
  • Array.find((item,indexArr,arr)=>{}) 掌握 找出第一個符合條件的數組成員。 它的參數是一個回調函數,對所有數組成員依次執行該回調函數。 直到找出第一個返回值為true的成員,然後返回該成員。 如果沒有符合條件的成員,則返回undefined。 -- 找出第一個大於1 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...