1. 準備3臺 centos服務器 192.168.233.128 192.168.233.130 192.168.233.131html
防火牆放開 集羣端口, 這裏一併把全部rabbitmq用到的端口都放開node
firewall-cmd --zone=public --add-port=4369/tcp --permanentc#
firewall-cmd --zone=public --add-port=5671-5672/tcp --permanentcentos
firewall-cmd --zone=public --add-port=25672/tcp --permanent服務器
firewall-cmd --zone=public --add-port=35672-35682/tcp --permanentcookie
firewall-cmd --zone=public --add-port=15672/tcp --permanentapp
firewall-cmd --zone=public --add-port=61613-61614/tcp --permanent異步
firewall-cmd --zone=public --add-port=1883/tcp --permanenttcp
firewall-cmd --zone=public --add-port=8883/tcp --permanent測試
firewall-cmd --zone=public --add-port=15674-15675/tcp --permanent
firewall-cmd --reload
2. 修改host映射 修改 /etc/hosts 文件 ,方便3臺機器訪問
添加以下 ,添加後重啓 3臺機器
192.168.233.128 rabbitmq1
192.168.233.130 rabbitmq2
192.168.233.131 rabbitmq3
3. 修改cookie文件, 統一成一個key , [每一個erlang程序都一個cookie]
這個cookie 能夠在 rabbitmq的日誌中 查找到
如圖 cookie 文件就在 這個 home dir 目錄中
cd /var/lib/rabbitmq
ls -a --這個是查找目錄下全部文件. cookie文件默認是隱藏的
用這個 .erlang.cookie文件中的 key 替換掉 rabbitmq 2,3 中的key ,使 3 臺服務器的 .erlang.cookie中的內容一致
4. 集羣搭建 參考官網 https://www.rabbitmq.com/clustering.html
根據官網介紹: 咱們把rabbitmq2 加入到 rabbitmq1的集羣中
在 rabbitmq2 上 中止 rabbitmq
rabbitmqctl stop_app
rabbitmqctl join_cluster rabbit@rabbitmq1
rabbitmqctl start_app
查看 集羣狀態
rabbitmqctl cluster_status
發現 nodes節點已經變成2個了, 同理 把rabbitmq3加入 rabbitmq1集羣中
5. 集羣搭建完成後, 添加rabbitmq用戶
rabbitmqctl add_user test test //添加用戶,後面兩個參數分別是用戶名和密碼,我這都用test了。
rabbitmqctl set_permissions -p / test ".*" ".*" ".*" //添加權限
rabbitmqctl set_user_tags test administrator //修改用戶角色
而後登陸 ui頁面 http://192.168.233.128:15672/#/
發現三個 info中 都是disc 都是磁盤節點
若是想 把節3點改爲 內存節點 , 參考官網 http://www.rabbitmq.com/clustering.html
在 rabbitmq3 上執行
rabbitmqctl stop_app
rabbitmqctl change_cluster_node_type ram
rabbitmqctl start_app
能夠看到 info中 disc變成RAM了
其餘集羣命令如: 從集羣刪除 某節點, 參考官網 都有
-----------------------------------------------------------------------------高可用集羣-------------------------------------------------------------------------------------
參考: http://www.rabbitmq.com/ha.html
queue 有兩種模式 默認 default
鏡像 mirror
queue mirror => master / slave 高可用的隊列方案
Each mirrored queue consists of one master and one or more mirrors.
Messages published to the queue are replicated to all mirrors
1. 怎麼配置
Mirroring parameters are configured using policies.
HA mode: 把queue 同步到哪些機器上 , 這裏選用all 通常業務也就3臺rabbitmq服務器就差很少了
ha-sync-mode : 異步策略,好比 新加入節點A 到集羣中, automatic=自動同步隊列數據 到節點A ,manual
就手動
簡單測試下 新建policy
新建 queue test1
發現 node 顯示+2 表示 該隊列 當前主節點(Master)是rabbitmq3 ,從節點(Slaver)是 rabbitmq1和2
features 中 顯示了 隊列使用了 咱們剛剛定義的 policy
能夠本身作下測試 : 新建 policy,不設置 ha-sync-mode
讓 rabbitmq1節點掛掉, 推數據到test1 , 而後讓 rabbitmq1 從新啓動, 數據會不會自動同步到 rabbitmq1 (不會的, 須要手動同步, 而 ha-sync-mode=automatic就會,)
下面展現 c#中怎麼鏈接 rabbitmq集羣
class Producter { const string exchangeName = "myexchange"; const string queueName = "test1"; const string routeKey = "test1"; public static void Main() { //建立鏈接工廠 ConnectionFactory factory = new ConnectionFactory { UserName = "test",//用戶名 Password = "test",//密碼 //HostName = "118.24.152.28",//rabbitmq ip }; //建立鏈接 var connection = factory.CreateConnection(new List<string>() { "192.168.141.128", "192.168.141.129", "192.168.141.130" }); //建立通道 var channel = connection.CreateModel(); var properties = channel.CreateBasicProperties(); properties.Persistent = true; //消息持久化 Console.WriteLine(string.Format("開始時間: {0}", DateTime.Now)); for (int i = 0; i < int.MaxValue; i++) { try { var msg = Encoding.UTF8.GetBytes(string.Format("你好{0},{1} ", i, string.Join(",", Enumerable.Range(0, 10)))); channel.BasicPublish(string.Empty, routeKey, properties, msg); Console.WriteLine(i + " 執行完畢"); Thread.Sleep(1000); } catch (Exception ex) { Console.WriteLine(ex.ToString()); } } Console.WriteLine(string.Format("結束時間: {0}", DateTime.Now)); channel.Close(); connection.Close(); } }