主頁 > 後端開發 > Linux原始碼安裝RabbitMQ高可用集群

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

2022-03-28 06:27:03 後端開發

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

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/450369.html

標籤:Java

上一篇:混合配置

下一篇:使用元件代碼擴展C 應用程式(可執行檔案)?

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more