centos7 搭建docker內運行rabbitmq,然后再鏡像ha方案的完全教程,暫時一個宿主機只能運行一個docker的rabbitmq,但是集群 ha都正常


1、安裝centos7.x,配置好網絡
2、因為docker需要比較高版本的內核,比如使用overlayfs作為默認docker文件系統要3.18,所以先升級內核到3.18以上版本,能直接過4是最佳了
檢查內核
uname -r
不夠3.18。x的話 升級內核
導入key
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm

yum --enablerepo=elrepo-kernel install kernel-lt -y
生產環境應用lt的長支持版本

 

Centos 7 的grub2采用自動生成的機制,手動不好修改。

1、centos 7的grub.conf 文件在/boot/grub2/下面,grub.conf最好不要手動編輯

2、如果想要刪除啟動條目可以作如下操作:

1.# uname -a 列出系統中正在使用的內核:

[root@ip108 ~]# uname -r
4.4.31-1.el7.elrepo.x86_64


2.# rpm -qa | grep kernel 查詢系統中全部的內核:

[root@ip108 ~]# rpm -qa | grep kernel
kernel-lt-4.4.31-1.el7.elrepo.x86_64
kernel-tools-libs-3.10.0-514.10.2.el7.x86_64
kernel-3.10.0-514.10.2.el7.x86_64
kernel-tools-3.10.0-514.10.2.el7.x86_64
kernel-3.10.0-327.36.3.el7.x86_64
kernel-headers-3.10.0-514.10.2.el7.x86_64

3.刪除不使用的版本號 我用docker 所以使用4.x的lt 長期支持版本的內核 所以 3.x的都刪了

#yum remove kernel-tools-libs-3.10.0-514.10.2.el7.x86_64 kernel-3.10.0-514.10.2.el7.x86_64 kernel-tools-3.10.0-514.10.2.el7.x86_64 kernel-3.10.0-327.36.3.el7.x86_64 kernel-headers-3.10.0-514.10.2.el7.x86_64

rpm -e  kernel-tools-libs-3.10.0-514.10.2.el7.x86_64 kernel-3.10.0-514.10.2.el7.x86_64 kernel-tools-3.10.0-514.10.2.el7.x86_64 kernel-3.10.0-327.36.3.el7.x86_64 kernel-headers-3.10.0-514.10.2.el7.x86_64

搞定

 

注:其實可以用通配符yum remove kernel-tools-libs-3.1*  kernel-3.1*  kernel-tools-3.1*  kernel-3.10.0-327.36.3.el7.x86_64 kernel-headers-3.1* 

有些情況下需要像下面這樣物理刪除  正常情況不用

# cd /boot

# rm -rf *3.10.0-123.4.4.el7*                     刪除所有相關的文件

# cd /lib/modules/

# rm -rf 3.10.0-123.4.4.el7   對應的文件夾

然后

最后 grub2-mkconfig -o /boot/grub2/grub.cfg 

有些情況下 新內核直接在grub的list最高位所以直接
grub2-set-default 0

當然 如果刪除了所有其他內核則不用干這個了


重啟 一般就可以了
現在的版本以上操作完成后centos7的內核版本
應該是4.4+
3、(老版本)yum -y install docker-io 安裝docker
chkconfig docker on 配置開機docker作為服務自動啟動
service docker start 手動開始docker服務
4、修改docker的默認存儲驅動為OverlayFS 這是最新的官方推薦
# systemctl stop docker
# rm -rf /var/lib/docker //注意好像 images可能會被清空
編輯/etc/sysconfig/docker-storage
DOCKER_STORAGE_OPTIONS= -s overlay

有時候可能這時候還不能正常啟動
編輯/etc/sysconfig/docker里的OPTIONS后面,將selinux哪項給去掉就行了

systemctl start docker
docker info 就可以看到改變了

(新版本docker-ce版本)請直接專看我的另一篇文章

http://www.cnblogs.com/sfissw/p/6129764.html

 

編輯真系統的/etc/hosts 為 如:ip對應節點名稱(編號的結構)比如像下面 注意自己節點的對外ip 不要出現在自己節點的hosts文件里
10.133.6.20 rabbit3 如果是20ip的節點 就不要寫20這行 否則會出錯
10.133.6.22 rabbit1 如果是22ip的節點 就不要寫22這行 否則會出錯

 

配置容器外的數據目錄和log目錄:

mkdir /rabbitmq;mkdir /rabbitmq/mnesia;mkdir /rabbitmq/log

保存一份自己的鏡像

docker pull rabbitmq:3.6.10-management 取得官方倉庫的rabbitmq3.6.10版本的帶管理鏡像

然后 tag

docker tag rabbitmq:3.6.10-management registry.x.com:5000/rabbitmq

docker login  registry.x.com:5000

docker push  registry.x.com:5000/rabbitmq


到這里基本的docker環境就安裝完了 然后先做一個單節點rabbitmq實例的docker容器來對外服務:
docker run -d  --restart=always --name=rmq -p 5671:5671 -p 15671:15671 -p 5673:5672 -p 15673:15672 -p 25672:25672 -p 4369:4369 -v /etc/hosts:/etc/hosts -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=123abc -e RABBITMQ_DEFAULT_VHOST=my_vhost -e RABBITMQ_NODENAME=rabbit1 -e RABBITMQ_ERLANG_COOKIE='NICAYNNZGMAHWQLRVQQU' --hostname rabbit1 rabbitmq:3.6.1-management
docker run -d  --restart=always --name=rmq -p 5671:5671 -p 15671:15671 -p 5673:5672 -p 15673:15672 -p 25672:25672 -p 4369:4369 -v /etc/hosts:/etc/hosts -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=123abc -e RABBITMQ_DEFAULT_VHOST=my_vhost -e RABBITMQ_NODENAME=rabbit3 -e RABBITMQ_ERLANG_COOKIE='NICAYNNZGMAHWQLRVQQU' --hostname rabbit3 rabbitmq:3.6.1-management


docker run -d --restart=always --name=rmq -p 5671:5671 -p 15671:15671 -p 5672:5672 -p 15672:15672 -p 25672:25672 -p 4369:4369 -v /etc/hosts:/etc/hosts -v /rabbitmq/log:/var/log/rabbitmq -v /rabbitmq/mnesia:/var/lib/rabbitmq/mnesia -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=123abc -e RABBITMQ_DEFAULT_VHOST=my_vhost -e RABBITMQ_NODENAME=rabbit1 -e RABBITMQ_ERLANG_COOKIE='NICAYNNZGMAHWQLRVQQU' --hostname rabbit1 registry.x.com:5000/rabbitmq
docker run -d --restart=always --name=rmq -p 5671:5671 -p 15671:15671 -p 5672:5672 -p 15672:15672 -p 25672:25672 -p 4369:4369 -v /etc/hosts:/etc/hosts -v /rabbitmq/log:/var/log/rabbitmq -v /rabbitmq/mnesia:/var/lib/rabbitmq/mnesia -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=123abc -e RABBITMQ_DEFAULT_VHOST=my_vhost -e RABBITMQ_NODENAME=rabbit3 -e RABBITMQ_ERLANG_COOKIE='NICAYNNZGMAHWQLRVQQU' --hostname rabbit3 registry.x.com:5000/rabbitmq

參數解釋:

雷獸2號(2337422234)  14:43:38
 -d  運行於后台

 --restart=always 物理機重啟自動start
 --name=rmq docker容器名
-p 5671:5671  ssl客戶端通信端口
-p 15671:15671 我自己的一個端口 並非官方
 -p 5672:5672 默認客戶端通信端口
 -p 15672:15672 管理web端口
 -p 25672:25672集群通信端口
 -p 4369:4369 erlang集群監聽端口
-v /etc/hosts:/etc/hosts -v /rabbitmq/log:ar/log/rabbitmq -v /rabbitmq/mnesia:arb/rabbitmq/mnesia 外掛配置、元數據、數據目錄
-e RABBITMQ_DEFAULT_USER=admin 默認帳號
 -e RABBITMQ_DEFAULT_PASS=123abc  默認密碼
-e RABBITMQ_DEFAULT_VHOST=my_vhost 默認vhost
-e RABBITMQ_NODENAME=rabbit3 節點名  跟構建集群時候貌似跟 join的時候有關  也可能是hostname
-e RABBITMQ_ERLANG_COOKIE='NICAYNNZGMAHWQLRVQQU' erlang集群cookie
--hostname rabbit3 主機名  hosts文件里最好跟這個關聯 跟nodename可能有一個跟建立集群有關 至少一個是有關的

雷獸2號(2337422234)  14:44:06
另外hosts文件 我是外掛 -v里物理機的 物理機的我一般設計成了跟節點名 主機名 有關

 


經過漫長的下載等待之后 docker容器運行起來了
這樣 通過http://ip:15673 用戶名密碼 默認admin權限的guest guest的一個支持http管理的rabbitmq的基本單實例就搭建完成了

登錄比如http://ip:15673/#/users

新增一個更好記的特殊名稱密碼的用戶名

輸入好用戶名密碼

set成admin

按add user按鈕 就新增好新的管理賬號了 此時 用新賬號登錄

刪除老的guest

再建立一個用於mq外部調用的用戶名 比如test 密碼 123abc

為test新建一個Virtual Hosts

比如 test_virtual_host

新建以后 點進test_virtual_host的名字里 為test設定能讀寫配置test_virtual_host的權限

剩下的Exchanges、Queues等的設置 可以在代碼端完成不必rabbitmq配置里完成
如果使用docker默認的比如 上面命令里的my_vhost 檢查一下他是否被你需要授權的用戶可訪問了
在web ui http://ip:端口/#/vhosts 里 點擊相關vhost名稱的 來給某個用戶賦予權限

下一篇講兩個vm里的rabbitmq的集群,用鏡像當做高可備方案。

 

 

編輯每個節點的Erlang Cookie 文件:/var/lib/rabbitmq/.erlang.cookie 編輯成一樣的內容 如果在run的時候已經做了這步就可以過了


題外話:
在每個節點里准備環境
rabbitmq鏡像內部都是debain的
如果需要改什么配置文件 默認沒有安裝編輯工具先安裝
docker exec 容器id apt-get update
docker exec 容器id apt-get install -y vim

然后 在主節點以外的節點上執行以下內容
docker exec -it rmq bash  (有的鏡像底包沒有bash 用sh)
進入容器內部控制台
rabbitmqctl stop_app

rabbitmqctl join_cluster rabbit1@rabbit1 注:RABBITMQ_NODENAME@hostname 這兩個設成一樣的了 就肯定不會出問題了 設置就在上面的docker run命令里完成了

(如果不對 試試 rabbitmqctl join_cluster rabbit3@rabbit1 或rabbitmqctl join_cluster rabbit1@rabbit3 或 rabbitmqctl join_cluster rabbit3@rabbit3  反正就是節點名和主機名的組合 哈哈哈 2台就四種情況)

注:

不是docker 默認的安裝方式 可能@前面 默認是rabbit

RABBITMQ_NODENAME在rabbitmq-env.conf配置里配置 docker方式 官方鏡像run的時候指定RABBITMQ_NODENAME就已經配好了 自己非docker安裝 可能要自己配

 

rabbitmqctl start_app

rabbitmqctl set_policy -p my_vhost HA '^(?!amq.).*' '{"ha-mode":"all", "ha-sync-mode":"automatic"}'
my_vhost是某個Virtual Hosts, "ha-sync-mode":"automatic" 有一些問題當失敗節點或者新增節點重新加入集群的時候可能會阻塞整個集群的直到該節點同步完成 現實里是否會這樣有待測試
如果不打算自動同步 可以是
rabbitmqctl set_policy -p my_vhost HA '^(?!amq.).*' '{"ha-mode":"all"}'

rabbitmqctl set_policy -p 【Virtual Hosts名字】 【同步規則的名字】 【同步隊列名的正則匹配】 '{"ha-mode":"all"}【,和其他選項】'

最后用各種4層負載均衡方案來隨機指向 各個節點的對外接口 就是docker內部的5672 接口所對外的 在本例子的命令行里都是5673

當一個節點崩潰 重啟節點然后執行從
docker exec -it 容器id /bin/sh或者 /bin/bash

rabbitmqctl start_app
的部分就加會了集群了
鏡像隊列有主從之分,一個主節點(master),0個或多個從節點(slave)。當master宕掉后,會在slave中選舉新的master。選舉算法為最早啟動的節點。
最好在加的時候 重新確認一下主節點
再加入以后 檢查policy是否存在 如果不存在再在新加入節點上
執行rabbitmqctl set_policy那行 在"ha-sync-mode":"automatic"的情況下 應該就直接搞定了 但是注意 ha 自動同步模式下 新加入可能會造成節點在全局同步完成以前阻塞
現實里要注意

注:如果要加新節點 比較麻煩 要把每個節點的hosts文件都修改才行 除非你利用統一的內外dns

注意事項:不要手動stop主節點,可以kill掉主節點的docker 甚至vm 總之默認異常關閉主節點 主節點會重新選舉 但是正常用stop命令關閉主節點  會造成整個集群出現問題


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM