客戶端通過虛擬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 進行下載
RabbitMq官網下載地址:https://www.rabbitmq.com/download.html
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:表示在集群中所有的節點上進行鏡像 |
ha-params | ha-mode模式需要用到的參數(ha-mode=exactly時為整數,nodes時為字元串數組,all時不用指定) |
ha-sync-mode |
ha-sync-mode:進行隊列中消息的同步方式,有效值為automatic和manual manual:手動<預設模式>.新的隊列鏡像將不會收到現有的消息,它只會接收新的消息,除非顯式調用同步命令 automatic:自動同步,新加入節點時會預設同步已知的鏡像隊列 命令 rabbitmqctl sync_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