Centos7:rabbitmq3.8+haproxy+keepalived(搭建高可用RabbitMQ镜像模式集群)

标签: Rabbitmq

Centos7:rabbitmq3.8+haproxy+keepalived(搭建高可用RabbitMQ镜像模式集群)

https://blog.csdn.net/xjjj064/article/details/110539442
一、环境描述
在这里插入图片描述
注:三台服务器selinux设置为了disabled,firewalld已经stop,且已分别设置了主机名对应如下

[root@server3 lib]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.6.101 server1
192.168.6.102 server2
192.168.6.103 server3

二、部署jdk环境+erlang环境
此前已经部署过一台服务器
参考:Centos7下安装部署rabbitmq3.8.9+erlang23.0
server1已经部署过一套rabbitmq3.8.9+erlang23.0
所以将server1上的jdk、erlang、rabbitmq3.8.9 传输给server2、server3,并设置好环境变量。
传输erlang包

[root@server1 lib]# scp erlang.tar.gz [email protected]:/usr/lib/
[email protected]'s password: 
erlang.tar.gz                                                                                                                                                                      100%   55MB  11.1MB/s   00:05    
[root@server1 lib]# scp erlang.tar.gz [email protected]:/usr/lib/
[email protected]'s password: 
erlang.tar.gz                                                                                                                                                                      100%   55MB   9.2MB/s   00:06

传输jdk包:

[root@server1 src]# scp jdk-8u121-linux-x64.gz [email protected]:/usr/local/src/
[email protected]'s password: 
jdk-8u121-linux-x64.gz                                                                                                                                                             100%  175MB   7.9MB/s   00:22    
[root@server1 src]# scp jdk-8u121-linux-x64.gz [email protected]:/usr/local/src/
[email protected]'s password: 
jdk-8u121-linux-x64.gz                                                                                                                                                              84%  148MB  11.8MB/s   00:02 ETAljdk-8u121-linux-x64.gz                                                                                                                                                             100%  175MB   9.7MB/s   00:18 

server2、server3设置环境变量

unset i
unset -f pathmunge
source /opt/rh/devtoolset-9/enable
export JAVA_HOME=/usr/local/jdk
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$JAVA_HOME/bin:$PATH
export PATH=$PATH:/usr/lib/erlang/bin:/usr/local/rabbitmq/sbin

测试erlang环境和jdk环境
erlang

[root@server2 src]# erl
Erlang/OTP 23 [erts-11.0] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [hipe]

Eshell V11.0  (abort with ^G)
1> 

jdk

[root@server2 src]# java -version
java version "1.8.0_121"
Java(TM) SE Runtime Environment (build 1.8.0_121-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode)

统一 erlang.cookie 文件中 cookie 值

[root@server1 ~]# scp .erlang.cookie [email protected]:/root
[email protected]'s password: 
.erlang.cookie                                                                                                                                                                     100%   20    11.8KB/s   00:00    
[root@server1 ~]# scp .erlang.cookie [email protected]:/root
[email protected]'s password: 
.erlang.cookie                                                                                                                                                                     100%   20    20.5KB/s   00:00 

三、安装并启动rabbitmq

传送rabbitmq包到server2、server3

[root@server1 ~]# cd /usr/local/src/
[root@server1 src]# ls
jdk-8u121-linux-x64.gz  otp_src_23.0  otp_src_23.0.tar.gz  rabbitmq-server-generic-unix-3.8.9.tar  redis-6.0.5  redis-6.0.5.tar.gz
[root@server1 src]# scp rabbitmq-server-generic-unix-3.8.9.tar [email protected]:/usr/local/src/
[email protected]'s password: 
rabbitmq-server-generic-unix-3.8.9.tar                                                                                                                                             100%   15MB   8.0MB/s   00:01    
[root@server1 src]# scp rabbitmq-server-generic-unix-3.8.9.tar [email protected]:/usr/local/src/
[email protected]'s password: 
rabbitmq-server-generic-unix-3.8.9.tar                                                                                                                                             100%   15MB  10.7MB/s   00:01 

解压到usr/local/rabbitmq 目录

[root@server2 src]# ls -l /usr/local/rabbitmq/
total 176
drwxr-xr-x. 2 root root   124 Sep 25 02:39 escript
drwxr-xr-x. 3 root root    22 Sep 25 02:39 etc
-rw-r--r--. 1 root root    75 Sep 25 02:39 INSTALL
-rw-r--r--. 1 root root 19534 Sep 25 02:39 LICENSE
-rw-r--r--. 1 root root 11354 Sep 25 02:39 LICENSE-APACHE2
-rw-r--r--. 1 root root 11360 Sep 25 02:39 LICENSE-APACHE2-excanvas
-rw-r--r--. 1 root root 11358 Sep 25 02:39 LICENSE-APACHE2-ExplorerCanvas
-rw-r--r--. 1 root root 10851 Sep 25 02:39 LICENSE-APL2-Stomp-Websocket
-rw-r--r--. 1 root root  1207 Sep 25 02:39 LICENSE-BSD-base64js
-rw-r--r--. 1 root root  1469 Sep 25 02:39 LICENSE-BSD-recon
-rw-r--r--. 1 root root  1274 Sep 25 02:39 LICENSE-erlcloud
-rw-r--r--. 1 root root  1471 Sep 25 02:39 LICENSE-httpc_aws
-rw-r--r--. 1 root root   757 Sep 25 02:39 LICENSE-ISC-cowboy
-rw-r--r--. 1 root root  1084 Sep 25 02:39 LICENSE-MIT-EJS
-rw-r--r--. 1 root root  1087 Sep 25 02:39 LICENSE-MIT-EJS10
-rw-r--r--. 1 root root  1057 Sep 25 02:39 LICENSE-MIT-Erlware-Commons
-rw-r--r--. 1 root root  1069 Sep 25 02:39 LICENSE-MIT-Flot
-rw-r--r--. 1 root root  1075 Sep 25 02:39 LICENSE-MIT-jQuery
-rw-r--r--. 1 root root  1076 Sep 25 02:39 LICENSE-MIT-jQuery164
-rw-r--r--. 1 root root  1087 Sep 25 02:39 LICENSE-MIT-Mochi
-rw-r--r--. 1 root root  1073 Sep 25 02:39 LICENSE-MIT-Sammy
-rw-r--r--. 1 root root  1076 Sep 25 02:39 LICENSE-MIT-Sammy060
-rw-r--r--. 1 root root 16725 Sep 25 02:39 LICENSE-MPL
-rw-r--r--. 1 root root 16726 Sep 25 02:39 LICENSE-MPL-RabbitMQ
-rw-r--r--. 1 root root  1471 Sep 25 02:39 LICENSE-rabbitmq_aws
drwxr-xr-x. 2 root root  4096 Sep 25 02:39 plugins
drwxr-xr-x. 2 root root   192 Sep 25 02:39 sbin
drwxr-xr-x. 3 root root    17 Sep 25 02:39 share

server2、server3 启动rabbitmq服务
此处只截图server2

[root@server2 src]# rabbitmq-server -detached       
[root@server2 src]# netstat -ntlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1056/sshd           
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1233/master         
tcp        0      0 0.0.0.0:25672           0.0.0.0:*               LISTEN      1909/beam.smp       
tcp        0      0 0.0.0.0:4369            0.0.0.0:*               LISTEN      2005/epmd           
tcp6       0      0 :::22                   :::*                    LISTEN      1056/sshd           
tcp6       0      0 ::1:25                  :::*                    LISTEN      1233/master         
tcp6       0      0 :::5672                 :::*                    LISTEN      1909/beam.smp       
tcp6       0      0 :::4369                 :::*                    LISTEN      2005/epmd  

server1上查看rabbitmq服务状态

[root@server1 src]# rabbitmqctl status
Status of node rabbit@server1 ...
Runtime

OS PID: 1647
OS: Linux
Uptime (seconds): 5992
Is under maintenance?: false
RabbitMQ version: 3.8.9
Node name: rabbit@server1
Erlang configuration: Erlang/OTP 23 [erts-11.0] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:64] [hipe]
Erlang processes: 447 used, 1048576 limit
Scheduler run queue: 1
Cluster heartbeat timeout (net_ticktime): 60

Plugins

Enabled plugin file: /usr/local/rabbitmq/etc/rabbitmq/enabled_plugins
Enabled plugins:

 * rabbitmq_management
 * amqp_client
 * rabbitmq_web_dispatch
 * cowboy
 * cowlib
 * rabbitmq_management_agent

Data directory

Node data directory: /usr/local/rabbitmq/var/lib/rabbitmq/mnesia/rabbit@server1
Raft data directory: /usr/local/rabbitmq/var/lib/rabbitmq/mnesia/rabbit@server1/quorum/rabbit@server1

Config files


Log file(s)

 * /usr/local/rabbitmq/var/log/rabbitmq/[email protected]
 * /usr/local/rabbitmq/var/log/rabbitmq/rabbit@server1_upgrade.log

Alarms

(none)

Memory

Total memory used: 0.085 gb
Calculation strategy: rss
Memory high watermark setting: 0.4 of available memory, computed to: 3.2805 gb

code: 0.0278 gb (32.67 %)
other_proc: 0.0238 gb (28.03 %)
other_system: 0.0143 gb (16.86 %)
allocated_unused: 0.0076 gb (8.97 %)
reserved_unallocated: 0.0037 gb (4.33 %)
other_ets: 0.0032 gb (3.78 %)
plugins: 0.0023 gb (2.7 %)
atom: 0.0014 gb (1.67 %)
mgmt_db: 0.0003 gb (0.32 %)
metrics: 0.0002 gb (0.25 %)
binary: 0.0002 gb (0.2 %)
mnesia: 0.0001 gb (0.09 %)
quorum_ets: 0.0 gb (0.06 %)
connection_other: 0.0 gb (0.04 %)
msg_index: 0.0 gb (0.04 %)
connection_channels: 0.0 gb (0.0 %)
connection_readers: 0.0 gb (0.0 %)
connection_writers: 0.0 gb (0.0 %)
queue_procs: 0.0 gb (0.0 %)
queue_slave_procs: 0.0 gb (0.0 %)
quorum_queue_procs: 0.0 gb (0.0 %)

File Descriptors

Total: 2, limit: 927
Sockets: 0, limit: 832

Free Disk Space

Low free disk space watermark: 0.05 gb
Free disk space: 46.5476 gb

Totals

Connection count: 0
Queue count: 0
Virtual host count: 1

Listeners

Interface: [::], port: 15672, protocol: http, purpose: HTTP API
Interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication
Interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0
[root@server1 src]# 

四、Rabbitmq 集群添加节点

①、将server2、server3加入server1组集群
因为server1建过管理账号,所以将server2、server3加入到server1,加入后通过登录server2、server3可以看到在后两台服务器没有新建管理账号的情况下,admin账号已经同步到server2和server3服务器。

[root@server2 ~]# rabbitmqctl stop_app
[root@server2 ~]# rabbitmqctl join_cluster --ram rabbit@server1
[root@server2 ~]# rabbitmqctl start_app
[root@server2 ~]# rabbitmq-plugins enable rabbitmq_management


[root@server3 ~]# rabbitmqctl stop_app
[root@server3 ~]# rabbitmqctl join_cluster --ram rabbit@server1
[root@server3 ~]# rabbitmqctl start_app
[root@server3 ~]# rabbitmq-plugins enable rabbitmq_management

②、打开网页管理页面查看 nodes
在这里插入图片描述
③、搭建 rabbitmq 的镜像高可用模式集群
镜像队列机制就是将队列在 N 个节点之间设置主从关系,消息会在 N 个节点之间进行自动同步,且如果其中一个节点不可用,并不会导致消息丢失或服务不可用的情况,提升 MQ 集群的整体高可用性。
这里在rabbitmq1节点操作(在任意节点操作都是可以的)
这一节要参考的文档是:http://www.rabbitmq.com/ha.html
首先镜像模式要依赖 policy 模块,这个模块是做什么用的呢?
policy 中文来说是政策,策略的意思就是要设置那些Exchanges或者queue的数据需要如何复制,同步。

[root@server1 ~]# rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'

ha-all:为策略名称。
:为匹配符,只有一个代表匹配所有,^qfedu为匹配名称为qfedu的exchanges或者queue。
ha-mode:为匹配类型,他分为3种模式:
all-所有(所有的 queue),
exctly-部分(需配置ha-params参数,此参数为int类型, 比如3,众多集群中的随机3台机器),
nodes-指定(需配置ha-params参数,此参数为数组类型比如[“rabbit@F”,“rabbit@G”]这样指定为F与G这2台机器。)。

[root@server1 src]# rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
Setting policy "ha-all" for pattern "^" to "{"ha-mode":"all"}" with priority "0" for vhost "/" ...

五、部署haproxy,实现访问5672端口时,轮询访问3个节点(明日补上)

六、部署Keepalived,实现主从热备、秒级切换(明日补上)

参考:https://blog.csdn.net/m0_49821830/article/details/108686163
参考:https://blog.csdn.net/qq_23191379/article/details/107065591
参考:https://blog.51cto.com/11134648/2155934

版权声明:本文为xjjj064原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/xjjj064/article/details/110822339

智能推荐

Docker 容器内运行 Dubbo 服务

原文:http://www.aqcoder.com/post/content?id=41 在使用 Docker 容器内运行 Dubbo 服务的时候一个令人很头痛的问题就是服务地址注册。 Docker 容器内有自己的 IP 段,和宿主主机是隔离的,Dubbo 会使用容器内的 IP 注册到 zookeeper 注册中心上。这样其他的服务是无法访问的。 方式一:–host 一个很直接的方案就...

python基础教程

Python基础教程 一、简介 1.1 python语言介绍 python的创始人:Guido Van Rossum Python下载地址:https://www.python.org/ Python文档下载地址:https://www.python.org/doc/ Pycharm下载地址:https://www.runoob.com/w3cnote/pycharm-windows-instal...

1、Git安装与配置

1、Git安装与配置 一:版本控制 定义:版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。 为什么要用版本控制:在起初的项目开发中,我们会不断的编写代码,但是,害怕有一天系统突然挂掉了,完蛋,辛苦写的代码就这么没了,所有为了防止这一点,都会开发一点就以目录拷贝的形式保存下来,自己这么1.0、2.0、3.0…的这么去标记,开始的还好,后面的话你压根就不知道...

Golang net/rpc 包的深度解读和学习

Golang 提供了一个开箱即用的RPC服务,实现方式简约而不简单。本文对net/rpc 包做深度解读和学习实战。 RPC 简单介绍 远程过程调用 (Remote Procedure Call,RPC) 是一种计算机通信协议。允许运行在一台计算机的程序调用另一个地址空间的子程序(一般是开放网络中的一台计算机),而程序员就像调用调用本地程序一样,无需额外做交互编程。RPC 是一种 CS (Clien...

merge sort

归并排序(merge sort) 具体算法: I.对原数组进行分组:对数组进行遍历,每检测出一个有序序列则记录一个分组,一般分组都是上升序列,下降序列也会被转换成上升序列 II.对两两相邻的分组进行合并,合并后的分组也将被记录 III.迭代合并之前合并后的分组直到出现最后的一个有序的大分组,也就是排序的最终结果 java.util.DualPivotQuicksort类中的static void ...

猜你喜欢

Java函数的学习

java学习 百知教育学习 - 胡鑫喆 - Java函数的学习 01_函数的定义 函数的定义 概念:实现特定功能的一段代码,可反复使用 定义语法: 函数名称许遵循命名规范 函数定义在类的内部,与main函数并列,并且使函数产生作用,需进行函数的调用 使用函数去掉冗余代码 02_函数的参数 函数的参数(函数名称() 其中()就是一个参数表) 无参函数(01_函数的定义中的下划线就为无参函数) 有参函...

03-段寄存器属性探测

1.段属性探测 要点回顾: 要点回顾: 上一节课我们讲过段寄存器有96位: 我们可以通过MOV指令进行读写(LDTR和TR除外) 但我们只能看见16位,那如果证明Attribute、Base、Limit的存在呢? 1、段寄存器成员简介 2、探测Attribute 3、探测Base 3、探测Limit 课后练习:...

解决swagger返回map复杂结构不能解析 Resolver error at definitions

解决:  没错,重点就是加上alternateTypeRules进行解析。   关注公众号获取更多内容,有问题也可在公众号提问哦:   强哥叨逼叨 叨逼叨编程、互联网的见解和新鲜事...

Android 插件化实现中遇错: PackageParser$PackageParserException: Failed to parse xxx

本文解决以下两个问题 一、在尝试使用apk本地路径获取packageInfo时,报出: 二、使用newInstance()时,报出: 解决问题 1. 第一个错误确实没找到原因,只在模拟器会出现,真机没有任何问题 在使用apk本地路径获取packageInfo时, 也就是调用这样一个api, 假设我本地apk存储的路径为: /storage/emulated/0/a.apk 返回给我的package...

php文件上传

php文件上传 文件目录 index.php upload.php list.php 文件上上传 选中文件 上传完成 文件列表...