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命令关闭主节点  会造成整个集群出现问题

原文地址:https://www.cnblogs.com/sfissw/p/5497874.html