centos7 搭建docker内运行rabbitmq,然后再镜像ha方案的完全教程,暂时一个宿主机只能运行一个docker的rabbitmq,但是集群 ha都正常

时间:2021-07-01 10:13:04

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的长支持版本

一般新内核在grub的list最高位所以直接
grub2-set-default 0
重启 一般就可以了
现在的版本以上操作完成后centos7的内核版本
应该是4.5+
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 就可以看到改变了

编辑真系统的/etc/hosts 为 如:ip对应节点名称(编号的结构)比如像下面 注意自己节点的对外ip 不要出现在自己节点的hosts文件里
10.133.6.20 rabbit3 如果是20ip的节点 就不要写20这行 否则会出错
10.133.6.22 rabbit1 如果是22ip的节点 就不要写22这行 否则会出错

到这里基本的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容器运行起来了
这样 通过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 容器id /bin/sh或者 /bin/bash
进入容器内部控制台
rabbitmqctl stop_app
rabbitmqctl join_cluster rabbit1@rabbit1 注:RABBITMQ_NODENAME@hostname 这两个设成一样的了 就肯定不会出问题了 设置就在上面的docker run命令里完成了
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命令关闭主节点  会造成整个集群出现问题