一、部署背景
由于业务系统的特殊性,我们需要针对不同的客户环境部署 rabbitmq+haproxy高可用镜像模式集群,由于大都数用户都是专网环境,无法使用外网,为了更便捷,高效的部署,针对业务系统的特性,我这边编写了基于ansible自动化工具, 一键远程离线部署rabbitmq+haproxy高可用镜像模式容器版集群,当然也会编写二进制版本,敬请期待吧!
说明:如果有兴趣,可以从工具下载中获取下载链接,此工具可帮助你快速了解一个自动化部署工具是如何编写的?
二、功能简介
1、支持 1台主机一键远程部署rabbitmq单实例。
2、支持 1台主机一键远程部署rabbitmq+haproxy高可用镜像模式集群+(1个磁盘节点+2个内存节点+1个haproxy节点)。
3、支持 2台或3台主机一键远程部署rabbitmq+haproxy高可用镜像模式集群(1个磁盘节点+1个内存节点+1个haproxy节点)。
3、支持 3台或4台主机一键远程部署rabbitmq+haproxy高可用镜像模式集群(1个磁盘节点+2个内存节点+1个haproxy节点)。
5、支持一键部署所有节点或单个rabbitmq和haproxy实例依次部署、启动、停止、重启、检查、移除等功能。
6、 支持数据目录、日志目录、插件目录、IP地址、端口、内存阀值、磁盘阀值、账号、密码等参数的灵活配置。
7、 支持数据目录、日志目录、插件目录、配置文件目录等持久化。
三、工具下载
基于ansible一键离线部署rabbitmq+haproxy高可用镜像模式容器版分布式集群工具
四、工具说明
目录结构如下:
目录说明如下:
#1、ansible目录:存放ansible工具rpm包目录,可一键安装ansible
#2、cluster目录:存放hosts文件和config.yml文件目录,主要配置服务器信息及rabbitmq+haproxy高可用镜像模式集群配置信息
#3、example目录:存放hosts文件和config.yml模板文件
#4、images目录:存放rabbitmq+haproxy高可用镜像模式集群镜像文件,部署工具中所涉及到的镜像皆为官方镜像
#5、op.sh:rabbitmq+haproxy高可用镜像模式集群部署的主控脚本
#6、pkgs:存放sshpass和nc命令的rpm包文件
#7、playbooks:rabbitmq+haproxy高可用镜像模式集群部署的剧本文件
#8、README.txt:帮助文档
#9、roles目录:rabbitmq+haproxy高可用镜像模式集群部署的角色文件
README.txt文件内容如下:
op.sh主控脚本参数如下:
其中代码行数:5828行,使用shell语言+jinja2语言。
五、部署要求
1、建议提前关闭好防火墙和selinux。
2、rabbitmq+haproxy模式镜像集群是基于docker和docker-compose工具, 所以rabbitmq+haproxy模式镜像集群主机上提前安装好docker和docker-compose工具。
六、部署步骤
说明:根据主机数量,请选择一台主机作为主控端,其它主机作为受控端,如果服务器数量为1台,则即可为主控端,又可为受控端。主控端需提前安装好ansible工具。这里为了避免麻烦,特意写了一个离线的ansible部署脚本,可实现一键部署ansible。脚本已经集成到该工具中,开箱即用,非常方便!
由于文章篇幅有限,这里就只介绍,在4台主机上,如何使用ansible工具实现rabbitmq镜像模式分布式集群的一键容器化部署?
1、生成hosts文件和config.yml文件
[root@localhost rabbitmq]# ./op.sh new node3
2023-02-24 11:33:35 DEBUG generate custom cluster files in /opt/rabbitmq/cluster/node3
2023-02-24 11:33:35 DEBUG cluster node3: files successfully created.
2023-02-24 11:33:35 INFO next steps 1: to config '/opt/rabbitmq/cluster/node3/hosts'
2023-02-24 11:33:35 INFO next steps 2: to config '/opt/rabbitmq/cluster/node3/config.yml'
2、编辑hosts文件
注意:base_dir变量无需修改,这个变量是自动生成的,只需修改服务器ip地址、ssh端口、账号密码等信息即可。
# 服务名称:rabbitmq镜像集群
# 服务器支持: <最多支持3台服务器>
# 网络环境要求:<适用于企业或单位内网环境\互联网环境>
# 说明:根据实际服务器数量进行部署规划,如不清楚,建议咨询公司运维工程师
# 部署类型:使用3台主机部署rabbitmq镜像集群
[rabbitmq_cluster_1]
192.168.1.191 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=123456 ansible_python_interpreter=/usr/bin/python2.7
[rabbitmq_cluster_2]
192.168.1.192 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=123456 ansible_python_interpreter=/usr/bin/python2.7
[rabbitmq_cluster_3]
192.168.1.193 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=123456 ansible_python_interpreter=/usr/bin/python2.7
[haproxy]
192.168.1.194 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=123456 ansible_python_interpreter=/usr/bin/python2.7
# 为主机组指定变量,作用范围为整个主机组
[all:vars]
# Deploy Directory (rabbitmq镜像集群一键部署工具包workspace),不修改
base_dir="/opt/haproxy_rabbitmq"
3、编辑config.yml文件
# 使用3台服务器部署3个实例rabbitmq镜像模式分布式集群
#################################################公共变量########################################################
# 宿主机最大磁盘空间分区下目录,比如说"/"分区下空间最大,就在"/"分区下创建一个data目录
MAX_SPACE_DIR: "/data"
# rabbitmq工作目录,主要用来存放离线镜像及其它部署相关文件,默认不修改
RABBITMQ_WORK_DIR: "{{ MAX_SPACE_DIR }}/pkgs/rabbitmq-cluster"
# rabbitmq数据存放根目录,主要用来存放数据、日志、插件、配置文件等,默认不修改
RABBITMQ_DATA_DIR: "{{ MAX_SPACE_DIR }}/basic-data/rabbitmq-cluster"
# 默认用户密码,可根据实际情况填写,注意密码格式为<大小写英文字母+数字>,根据实际情况填写
RABBITMQ_DEFAULT_USER: "lolaage"
RABBITMQ_DEFAULT_PASS: "XnZKE7jGOn6SRXG"
# 内存告警阀值(相对值),建议值为0.4~0.7区间,根据实际情况修改
# 当MQ服务器使用超过内存阀值时,会触发告警,并阻塞所有正在发布消息的连接
VM_MEMORY_HIGH_WATERMARK_RELATIVE: "0.6"
# 数据目录磁盘空间阀值(绝对值),根据实际情况修改
# 当MQ服务器数据目录的磁盘空间超过阀值时,会触发告警,并阻塞所有正在发布消息的连接
DISK_FREE_LIMIT_ABSOLUTE: "5GB"
#####################################################<mq1磁盘节点变量>#########################################
# mq1节点宿主机内网ip地址,必须与主机清单hosts文件中定义的[rabbitmq_cluster_1]组中定义的IP相同
RABBITMQ_NODE1_HOST: "192.168.1.191"
# mq1节点供客户端建立连接端口,端口不冲突情况下,默认不修改
RABBITMQ_NODE1_PORT: "5672"
# mq1节点web页面管理端口,端口不冲突情况下,默认不修改
RABBITMQ_NODE1_MANAGEMENT_PORT: "15672"
# mq1节点用于节点间和CLI工具通信端口,端口不冲突情况下,默认不修改
# 注意:端口号必须设置为RABBITMQ_NODE1_DIST_PORT = RABBITMQ_NODE1_PORT + 20000
RABBITMQ_NODE1_DIST_PORT: "25672"
# mq1节点epmd用于节点间通信和CLI工具通信的端口,集群中的所有主机必须使用相同的端口 ,端口不冲突情况下,默认不修改
# 注意: 如果修改当前变量,则必须确保RABBITMQ_NODE2_ERL_EPMD_PORT与RABBITMQ_NODE1_ERL_EPMD_PORT以及RABBITMQ_NODE3_ERL_EPMD_PORT的端口号相同
RABBITMQ_NODE1_ERL_EPMD_PORT: "4369"
#####################################################<mq2内存节点变量>#########################################
# mq2节点宿主机内网ip地址,必须与主机清单hosts文件中定义的[rabbitmq_cluster_2]组中定义的IP相同
RABBITMQ_NODE2_HOST: "192.168.1.192"
# mq2节点供客户端建立连接端口,端口不冲突情况下,默认不修改
RABBITMQ_NODE2_PORT: "5672"
# mq2节点web页面管理端口,端口不冲突情况下,默认不修改
RABBITMQ_NODE2_MANAGEMENT_PORT: "15672"
# mq2节点用于节点间和CLI工具通信端口,端口不冲突情况下,默认不修改
# 注意:端口号必须设置为RABBITMQ_NODE2_DIST_PORT = RABBITMQ_NODE2_PORT + 20000
RABBITMQ_NODE2_DIST_PORT: "25672"
# mq2节点epmd用于节点间通信和CLI工具通信的端口,集群中的所有主机必须使用相同的端口 ,端口不冲突情况下,默认不修改
# 注意: 如果修改当前变量,则必须确保RABBITMQ_NODE3_ERL_EPMD_PORT与RABBITMQ_NODE2_ERL_EPMD_PORT以及RABBITMQ_NODE3_ERL_EPMD_PORT的端口号相同
RABBITMQ_NODE2_ERL_EPMD_PORT: "4369"
#####################################################<mq3内存节点变量>#########################################
# mq3节点宿主机内网ip地址,必须与主机清单hosts文件中定义的[rabbitmq_cluster_3]组中定义的IP相同
RABBITMQ_NODE3_HOST: "192.168.1.193"
# mq3节点供客户端建立连接端口,端口不冲突情况下,默认不修改
RABBITMQ_NODE3_PORT: "5672"
# mq3节点web页面管理端口,端口不冲突情况下,默认不修改
RABBITMQ_NODE3_MANAGEMENT_PORT: "15672"
# mq3节点用于节点间和CLI工具通信端口,端口不冲突情况下,默认不修改
# 注意:端口号必须设置为RABBITMQ_NODE3_DIST_PORT = RABBITMQ_NODE3_PORT + 20000
RABBITMQ_NODE3_DIST_PORT: "25672"
# mq1节点epmd用于节点间通信和CLI工具通信的端口,集群中的所有主机必须使用相同的端口 ,端口不冲突情况下,默认不修改
# 注意: 如果修改当前变量,则必须确保RABBITMQ_NODE1_ERL_EPMD_PORT与RABBITMQ_NODE2_ERL_EPMD_PORT以及RABBITMQ_NODE3_ERL_EPMD_PORT的端口号相同
RABBITMQ_NODE3_ERL_EPMD_PORT: "4369"
#####################################################<haproxy节点变量>#########################################
# haproxy节点宿主机内网ip地址,必须与主机清单hosts文件中定义的[haproxy]组中定义的IP相同
HAPROXY_NODE_HOST: "192.168.1.194"
# rabbitmq工作目录,主要用来存放离线镜像及其它部署相关文件,默认不修改
HAPROXY_WORK_DIR: "{{ MAX_SPACE_DIR }}/pkgs/haproxy"
# rabbitmq数据存放根目录,主要用来存放数据、日志、配置文件等,默认不修改
HAPROXY_DATA_DIR: "{{ MAX_SPACE_DIR }}/basic-data/haproxy"
# rabbitmq镜像集群实例数量,切记不能修改
RABBITMQ_INSTANCE_NUM: "3"
# haproxy节点<rabbitmq集群业务负载均衡端口>,端口不冲突情况下,建议不修改
HAPROXY_NODE_PROXY_RABBITMQ_PORT: "5673"
# haproxy节点<rabbitmq集群管理页面负载均衡端口>,端口不冲突情况下,建议不修改
HAPROXY_NODE_PROXY_RABBITMQ_MANAGEMENT_PORT: "15673"
# haproxy管理页面端口,端口不冲突情况下,建议不修改
HAPROXY_MANAGEMENT_PORT: "15000"
# haproxy管理页面登录账号和面,根据实际情况填写
HAPROXY_DEFAULT_USER: "admin"
HAPROXY_DEFAULT_PASS: "admin@123"
4、执行部署操作
说明:如果不清楚部署操作命令,可使用其帮助命令,如下所示
一键部署服务
#方式一:一键部署所有节点
[root@localhost haproxy_rabbitmq]# ./op.sh setup node3 all
#方式二:单个节点依次部署
[root@localhost haproxy_rabbitmq]# ./op.sh setup node3 08
[root@localhost haproxy_rabbitmq]# ./op.sh setup node3 09
[root@localhost haproxy_rabbitmq]# ./op.sh setup node3 10
[root@localhost haproxy_rabbitmq]# ./op.sh setup node3 11
一键部署结果,如下图所示:
查看rabbitmq集群节点信息,如下图所示:
http://192.168.1.194:15673
查看haproxy管理页面信息,如下图所示:
http://192.168.1.194:15000/rabbitmq-stats
总结:使用ansible自动化工具一键部署rabbitmq+haproxy高可用镜像模式集群,效率确实非常高,全程部署2分钟就完全搞定了,对于一些需要多次部署的场景,自动化确实很重要,可以极大的提高整个部署效率,我觉得对于运维来说,一定要有高度的自动化意识,当然这只是单个服务模块的自动化部署,如果是把整个业务系统,编写成一键自动化部署工具的化,这可能是一个非常的工程,当然,后期有机会我也会进行分享整个业务系统的一键部署是如果设计及编写的。
总结:整理不易,如果对你有帮助,可否点赞关注一下?
更多详细内容请参考:《Linux运维篇:Linux系统运维指南》