服務器清單
主機 | ip | 安裝軟件 |
---|---|---|
server1 | 192.168.56.102 | rabbitmq服務 |
server2 | 192.168.56.107 | haproxy代理+keepalived |
server3 | 192.168.56.108 | rabbitmq服務 |
server4 | 192.168.56.109 | haproxy代理+keepalived |
服務器架構圖
分別在server1、server3上配置host,確保能相互訪問的地址
vim /etc/hosts
192.168.56.102 server1
192.168.56.108 server3
RabbitMQ的集羣是依賴erlang集羣,而erlang集羣是通過這個cookie進行通信認證的
分別在server1,server3上安裝erlang
sudo apt-get install erlang
rabbitmq集羣需要通過主機名互相訪問 所以必須在這兩臺機器 /etc/hosts配置以上內容 確保主機名正確
兩臺機器使用rabbitmq進行通信 使用的安全策略是 erlang.cookie 就是一個隨機字符串 兩節點必須保持一致 否則 無法添加節點到集羣
該cookie文件 可能位於 /var/lib/rabbitmq/.erlang.cookie 或者 ~/.erlang.cookie 啓動任何一臺機器,剛纔已經啓動了一個節點
把啓動節點的.erlang.cookie拷貝到其他節點相同目錄下
複製.erlang.cookie到其他節點
.erlang.cookie是erlang分佈式的token文件,集羣內所有的節點要持有相同的.erlang.cookie文件,才允許彼此通信。
將server1的.erlang.cookie文件複製到server3的相關路徑下面(在server1下執行)
scp /var/lib/rabbitmq/.erlang.cookie 192.168.56.108:/var/lib/rabbitmq/
修改文件的權限(兩臺服務器都需要執行)
sudo chmod 400 /var/lib/rabbitmq/.erlang.cookie
分別在server1、server3上安裝rabbitmq-server
sudo apt-get install rabbitmq-server
##啓動rabbitmq服務
sudo service rabbitmq-server start
在server3下執行以下命令,將server2節點加入rabbitmq集羣
sudo rabbitmqctl stop_app #暫停server2服務
sudo rabbitmqctl join_cluster rabbit@server1 #server2加入集羣,rabbit是server1默認名稱
sudo rabbitmqctl start_app #啓動server2服務
sudo rabbitmqctl cluster_status #查看集羣狀態
rabbitmq的內存節點和磁盤節點的作用
在RabbitMQ集羣中的節點只有兩種類型:內存節點/磁盤節點,單節點系統只運行磁盤類型的節點。而在集羣中,可以選擇配置部分節點爲內存節點。
內存節點將所有的隊列,交換器,綁定關係,用戶,權限,和vhost的元數據信息保存在內存中。
磁盤節點將這些信息保存在磁盤中,但是內存節點的性能更高,
爲了保證集羣的高可用性,必須保證集羣中有兩個以上的磁盤節點,來保證當有一個磁盤節點崩潰了,集羣還能對外提供訪問服務。
在上面的操作中,可以通過如下的方式,設置新加入的節點爲內存節點還是磁盤節點。
rabbitmqctl join_cluster --ram rabbit@server1 #加入--ram表示內存節點,否則表示磁盤節點
在server1上添加管理員用戶
sudo rabbitmqctl add_user admin manager
server1上爲新用戶授權
sudo rabbitmqctl set_permissions -p / admin ".* " ".* " ".*"
設置admin用戶角色:
sudo rabbitmqctl set_user_tags admin administrator
查看集羣狀態
sudo rabbitmqctl cluster_status
剔除節點:
-
方法一:
在節點上執行:
rabbitmqctl stop rabbitmqctl forget_cluster_node rabbit@server3 --offline
注意上面在使用 rabbitmqctl forget_cluster_node 命令的時候用到了
“–offline” 參數,如果不添加這個參數,就需要保證 server3 節點中的 RabbitMQ 服務處於
運行狀態,而在這種情況下, server3 無法先行啓動, 則 “–offline” 參數的添加讓其可以在非運行狀態下將 nodel 剝離出當前集羣。 -
方法二:
在節點上執行:
rabbitmqctl stop_app rabbitmqctl reset
這樣也能剔除該節點
分別在server2 和 server4 上安裝haproxy
sudo apt-get install haproxy
在server2上配置haproxy
vim /etc/haproxy/haproxy.conf
加入以下配置內容
#### 對MQ集羣進行監聽
listen rabbitmq_cluster
bind 0.0.0.0:5673 #通過5673對m1和m2進行映射
option tcplog #記錄TCP連接狀態和時間
mode tcp #四層協議代理,即對TCP進行轉發
option clitcpka #開啓TCP的Keep Alive(長連接模式)
timeout connect 1s #haproxy與mq建立連接的超時時間
timeout client 10s #客戶端與haproxy最大空閒時間
timeout server 10s #服務器與haproxy最大空閒時間
balance roundrobin #採用輪詢轉發消息
#每5秒發送一次心跳包,如果連續兩次有響應則代表狀態良好
#如果連續3次沒有響應,則視爲服務故障,該節點將被剔除
server server1 192.168.56.102:5672 check inter 5s rise 2 fall 3
server server3 192.168.56.108:5672 check inter 5s rise 2 fall 3
#log /dev/log local0
#### 開啓監控服務
listen http_front
bind 0.0.0.0:1080 #監聽端口
stats refresh 30s #每30秒刷新一次
stats uri /haproxy?stats #統計頁面uri
stats auth admin:manager #統計頁面用戶名和密碼設置
#### RabbitMQ管理界面
listen rabbitmq_admin
bind 0.0.0.0:8804 #這裏注意端口不要衝突,衝突會導致haproxy服務啓動失敗
server server1 192.168.56.102:15672
server server3 192.168.56.108:15672
分別在server2 和 server3 上安裝keepalived
sudo apt-get install keepalived
在server2上配置keepalived ,默認在server2上啓用虛擬IP:192.168.56.110
vrrp_instance VI_1 {
state MASTER
interface enp0s8
virtual_router_id 51
priority 101
advert_int 1
authentication {
auth_type PASS
auth_pass secret
}
virtual_ipaddress {
192.168.56.110
}
}
在server4上配置keepalived, 默認是備份機
vrrp_instance VI_1 {
state BACKUP
interface enp0s8
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass secret
}
virtual_ipaddress {
192.168.56.110
}
}
驗證rabbitmq集羣是否正常
訪問 RabbitMQ管理界面 在server1上添加一個queue,看能否在server2上看到該queue
登錄http://192.168.56.102:15672/ 添加一個queue queue:new
在server1上發佈一個消息到queue:new隊列中
登錄http://192.168.56.108:15672/ 查看等否看到 queue:new
在server3上看能否讀取到該消息
驗證能否通過代理讀取到數據
登錄代理服務器地址 通過虛擬IP訪問 http://192.168.56.110:8804
測試VIP是否能夠故障漂移
關閉server3上的keepalived服務,模擬 server3發生故障,看虛擬IP是否還能正常訪問
再次訪問 http://192.168.56.110:8804 仍能正常顯示
最後測試能否讓程序通過虛擬IP訪問rabbitmq集羣
編寫創建rabbitmq客戶端連接服務的go代碼示例