目錄
????????引言
? ? ? ? 一、環境準備
? ? ? ? 二、利用虛擬機搭建
?????????三、鏡像集群配置
????????四、HAProxy實現負載均衡(主用虛擬機操作)
? ? ? ? 五、測試RabbitMQ集群搭建情況
????????引言
? ? ? ? 一、環境準備

? ? ? ? 二、利用虛擬機搭建
????????這里利用我本地的虛擬機模擬三臺真實的機器
服務器信息表:
IP地址 | 主機名 | 操作系統 |
---|---|---|
192.168.93.135 | rabbitmq01 | CentOS7(64位) |
192.168.93.136 | rabbitmq02 | CentOS7(64位) |
192.168.93.137 | rabbitmq03 | CentOS7(64位) |
????????進行下一步前可以在本地windows的cmd中測試ping一下上面的三個虛擬機的IP地址。如果都能ping通,那可以進行下一步。
? ? ? ? (1)下面修改三臺機器的hosts配置文件,為了方便機器間的相互訪問,三臺centos都執行 vim /etc/hosts , 添加下邊的配置,依次執行:
#將三臺機器上hosts都修改內容如下
vim /etc/hosts192.168.93.135 rabbitmq01
192.168.93.136 rabbitmq02
192.168.93.137 rabbitmq03#通過ping命令看主機名是否生效
ping rabbitmq02#修改三臺主機的主機名 vim /etc/hostname
#修改主機名會導致這臺主機上RabbitMQ的數據丟失,可以只改后兩臺主機名,或者修改前備份
#rabbitmq01 修改為 rabbitmq01.localdomain
#rabbitmq02 修改為 rabbitmq02.localdomain
vim /etc/hostname#然后重啟每臺機器
reboot
? ? ? ? 對應修改如下:
????????(2)如果上述都已準確完成,進行下一步:
#查看rabbitmq01的.erlang.cookie
cat erlang.cookie#修改rabbitmq02和rabbitmq03的.erlang.cookie
vim /var/lib/rabbitmq/.erlang.cookie#該文件是只讀的,加上寫權限
chmod u+w /var/lib/rabbitmq/.erlang.cookie
vim /var/lib/rabbitmq/.erlang.cookie
? ? ? ? 將另外兩臺都改成與這一樣的即可。
? ? ? ? 最后啟動三臺機器上的rabbitMQ服務
#每臺機器的RabbitMQ服務的訪問地址和控制臺的訪問地址分別是
#192.168.93.135:5672 192.168.93.135:15672
#192.168.93.136:5672 192.168.93.136:15672
#192.168.93.137:5672 192.168.93.137:15672#啟動RabbitMQ服務
service rabbitmq-server start
? ? ? ? (3)將rabbitmq02,rabbitmq03作為內存節點加入rabbitmq01節點集群中
? ? ? ? 開放端口:
#這里需要開放25672和4369
firewall-cmd --zone=public --add-port=25672/tcp --permanent
systemctl restart firewalld.service
firewall-cmd --reloadfirewall-cmd --zone=public --add-port=4369/tcp --permanent
systemctl restart firewalld.service
firewall-cmd --reload
? ? ? ? 在進行操作:
#在rabbitmq02機器下執行
#停掉rabbit應用
rabbitmqctl stop_app #加入rabbitmq01
rabbitmqctl join_cluster --ram rabbit@rabbitmq01#啟動rabbit應用
rabbitmqctl start_app#查看所有節點狀態
rabbitmqctl cluster_status
????????最后查看所有節點狀態時:
到此:
????????三、鏡像集群配置
? ? ? ? 在網頁上打開三個虛擬機的任意一個RabbitMQ的控制臺,按照以下添加策略:
? ? ? ? 當然如果不想用上面的方式,可以執行下面一行命令來完成操作(任意虛擬機即可):
策略參數解讀:# ha-all:為策略名稱;
# ^my:為匹配符,只有一個^代表匹配所有,^abc為匹配名稱以abc開頭的queue或exchange,^.則
匹配所有
# ha-mode:為同步模式,一共3種模式:
# all-所有(所有的節點都同步消息),
# exctly-指定節點的數目(需配置ha-params參數,此參數為int類型比如2,在集群中隨機
抽取2個節點同步消息)
# nodes-指定具體節點(需配置ha-params參數,此參數為數組類型比如
["rabbit@rabbitmq01","rabbit@rabbitmq02"],明確#指定在這兩個節點上同步消息)。
# ha-sync-mode
#ha-sync-mode=manual(默認),鏡像隊列中的消息不會主動同步到新節點,除非顯式調用同步命令,
調用同步命令后,隊列開始阻塞,無法對其進行操作,直到同步完畢
#ha-sync-mode=automatic 新加入節點時會默認同步已知的鏡像隊列#執行該命令等效于上面的頁面添加策略操作
rabbitmqctl set_policy ha-all "^." '{"ha-mode":"all","ha-sync-mode":"automatic"}'
測試:
#關閉rabbitmq01
rabbitmqctl stop_app
????????四、HAProxy實現負載均衡(主用虛擬機操作)
yum install -y haproxyhaproxy -v
看到下面則安裝成功:
### haproxy 監控頁面地址是:http://192.168.93.134:9188/haproxy_statuslisten admin_statsbind *:9188mode httplog 127.0.0.1 local3 errstats refresh 60sstats uri /haproxy_statusstats realm welcome login\ Haproxystats auth admin:123456 ##記得改成自己的賬號和密碼stats hide-versionstats admin if TRUE### rabbitmq 集群配置,轉發到listen rabbitmq_clusterbind *:5672mode tcpbalance roundrobinserver rabbitnode1 192.168.93.135:5672 check inter 2000 rise 2 fall 3 weight 1server rabbitnode2 192.168.93.136:5672 check inter 2000 rise 2 fall 3 weight 1server rabbitnode3 192.168.93.137:5672 check inter 2000 rise 2 fall 3 weight 1
添加后:
完成上述的修改和配置后,啟動
haproxy -f /etc/haproxy/haproxy.cfg
在網頁上訪問:http://192.168.93.134:9188/haproxy_status
看到下圖,說明已經配置成功:
? ? ? ? 可以看到三個虛擬機已經和HAProxy實現了負載均衡,當有信息發送到三臺主機中的任意一個rabbitMQ時,盡管兩外一臺或兩臺出現宕機的情況,仍然不妨礙我們使用。
? ? ? ? 五、測試RabbitMQ集群搭建情況
? ? ? ? 完成上面的所有配置后,下面使用IDEA來連接RabbitMQ測試搭建情況:
? ? ? ? 連接三臺中任意一臺虛擬機即可:
public class SimpleProducer {public static void main(String[] args) throws IOException, TimeoutException {//1.創建連接工廠,并且設置RabbitMQ相關的連接參數ConnectionFactory connectionFactory = new ConnectionFactory();connectionFactory.setHost("192.168.93.135");connectionFactory.setPort(5672); //設置rabbitMq的默認端口 不修改可以不設置//connectionFactory.setUsername("admin");//connectionFactory.setPassword("123456");//connectionFactory.setVirtualHost("myVH");//2.根據連接工廠創建一個連接,根據這個連接創建一個channelConnection connection = connectionFactory.newConnection();Channel channel = connection.createChannel();//3.創建一個隊列(Queue)//設置隊列名、是否持久化、是否獨占、是否被消費后自動刪除、隊列參數等等channel.queueDeclare("hello",true,false,false,null);//4.發布一條消息//設置交換機名稱、routingKey、信息屬性、消息內容channel.basicPublish("","hello",null,"Hello,World".getBytes());//5.釋放資源channel.close();connection.close();}
}
發送信息后,查看任意頁面:
????????當故意關閉三臺中的任意一臺或兩臺虛擬機(模擬宕機)時,仍可以繼續發送信息,再次啟動“宕機”的虛擬機,會自動同步消息,應為三臺機器已經構成一個集群,可以實現信息互相同步,當出問題時,信息會立刻同步到正常的機器上去,宕機修復后又可以同步,這里不再演示此過程。