RabbitMq集群环境搭建

序言

在centos7的环境下搭建RabbitMq.RabbitMq和Erlang 都是采用的最新版本.且都是官网上推荐的下载地址下载的.另外欢迎骚扰:[email protected]

RabbitMQ 基于Erlang实现的,所以在安装rabbitmq之前需要先安装erlang,安装的时候需要注意erlang的版本号与rabbitmq的版本号。 

安装注意:erlang版本号需要兼顾rabbitmq版本。版本不对,是无法启动rabbitmq的(另外erlang和rabbitmq的安装文件区分了Centos6 centos7 centos8 一定要对应下载.下载地址官方有,你不会下可以联系[email protected])。 
官网版本对应表:http://www.rabbitmq.com/which-erlang.html

RabbitMq集群模式

  • 单一模式:即单机情况不做集群,就单独运行一个rabbitmq而已。
  • 普通模式:默认模式,以两个节点(rabbit01、rabbit02)为例来进行说明。对于Queue来说,消息实体只存在于其中一个节点rabbit01(或者rabbit02),rabbit01和rabbit02两个节点仅有相同的元数据,即队列的结构。当消息进入rabbit01节点的Queue后,consumer从rabbit02节点消费时,RabbitMQ会临时在rabbit01、rabbit02间进行消息传输,把A中的消息实体取出并经过B发送给consumer。所以consumer应尽量连接每一个节点,从中取消息。即对于同一个逻辑队列,要在多个节点建立物理Queue。否则无论consumer连rabbit01或rabbit02,出口总在rabbit01,会产生瓶颈。当rabbit01节点故障后,rabbit02节点无法取到rabbit01节点中还未消费的消息实体。如果做了消息持久化,那么得等rabbit01节点恢复,然后才可被消费;如果没有持久化的话,就会产生消息丢失的现象。
  • 镜像模式:  把需要的队列做成镜像队列,存在与多个节点属于RabbitMQ的HA方案该模式解决了普通模式中的问题,其实质和普通模式不同之处在于,消息实体会主动在镜像节点间同步,而不是在客户端取数据时临时拉取。该模式带来的副作用也很明显,除了降低系统性能外,如果镜像队列数量过多,加之大量的消息进入,集群内部的网络带宽将会被这种同步通讯大大消耗掉。所以在对可靠性要求较高的场合中适用。(这个是不是Master与Slaves模式有待验证)

RabbitMq集群设计图(本测试要实现的环境搭建)

RabbitMQ的集群节点包括内存节点、磁盘节点。

RabbitMQ支持消息的持久化也就是数据写在磁盘上,最合适的方案就是既有内存节点,又有磁盘节点。

RabbitMq安装步骤

单机版RabbitMq

首先从官方(https://packagecloud.io/rabbitmq):上下载 Erlang(erlang-22.1.5-1.el7.x86_64.rpm)和RabbitMq

按照如下命令就可以启动一个单机版的RabbitMq.RabbitMQ启动之后,默认的名称是Rabbit,监听的端口是5672,web服务的端口是15672

#首先更新升级或者安装一些基础库和erlang的依赖
[root@slave1 [email protected]]#  yum -y install make gcc gcc-c++ kernel-devel m4 ncurses-devel openssl-devel gtk3-devel binutils-devel mesa* freeglut*


#安装erlang依赖
[root@slave1 [email protected]]#  rpm -ivh erlang-22.1.5-1.el7.x86_64.rpm 

#安装rabbitmq
[root@slave1 [email protected]]# rpm -ivh rabbitmq-server-3.8.1-1.el7.noarch.rpm 


#设置配置文件权限--这个是启动报错的是后才用
[root@slave1 [email protected]]# chown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie


#设置配置文件权限--这个是启动报错的是后才用
[root@slave1 [email protected]]# chmod 400 /var/lib/rabbitmq/.erlang.cookie 

#启动rabbitmq
[root@slave1 [email protected]]# systemctl start rabbitmq-server

#查看rabbitmq启动状态
[root@slave1 [email protected]]# systemctl status rabbitmq-server

#查看rabbitmq自带的一些插件.所有的都包含在这里了
[root@slave1 [email protected]]# rabbitmq-plugins list

#RabbitMQ网页管理的端口是15672,但是现在还不能访问,需要添加网页插件才能访问
#可以不需要关闭rabbitmq就可以添加插件
[root@slave1 [email protected]]# rabbitmq-plugins enable rabbitmq_management

#添加账号密码:cuiyaonan2000/cuiyaonan2000
[root@slave1 [email protected]]# rabbitmqctl add_user cuiyaonan2000 cuiyaonan2000

#为刚才的账号添加权限-----致此可以用该账号密码登陆
[root@slave1 [email protected]]# rabbitmqctl set_permissions -p "/" cuiyaonan2000 ".*" ".*" ".*"

#修改用户角色 这个明显是管理员角色
[root@slave1 [email protected]]# rabbitmqctl set_user_tags cuiyaonan2000  administrator

如下的是用户操作的常用命令当然是基于web插件的基础上;

# 新增一个用户
rabbitmqctl add_user Username Password
# 删除一个用户
rabbitmqctl delete_user Username
# 修改用户的密码
rabbitmqctl change_password Username Newpassword
# 查看当前用户列表
rabbitmqctl list_users

# 用户角色:
(1) 超级管理员(administrator)
可登陆管理控制台(启用management plugin的情况下),可查看所有的信息,并且可以对用户,策略(policy)进行操作。

(2) 监控者(monitoring)
可登陆管理控制台(启用management plugin的情况下),同时可以查看rabbitmq节点的相关信息(进程数,内存使用情况,磁盘使用情况等)

(3) 策略制定者(policymaker)
可登陆管理控制台(启用management plugin的情况下), 同时可以对policy进行管理。但无法查看节点的相关信息(上图红框标识的部分)。
与administrator的对比,administrator能看到这些内容

(4) 普通管理者(management)
仅可登陆管理控制台(启用management plugin的情况下),无法看到节点信息,也无法对策略进行管理。

(5) 其他
无法登陆管理控制台,通常就是普通的生产者和消费者。

# 设置用户角色的命令为:
rabbitmqctl set_user_tags User Tag
# User为用户名, Tag为角色名(对应于上面的administrator,monitoring,policymaker,management,或其他自定义名称)。
# 也可以给同一用户设置多个角色,例如
rabbitmqctl set_user_tags hncscwc monitoring policymaker

# 允许用户远程访问
rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*"

 

剩余的常用命令如下:

# 停止服务
rabbitmqctl -n rabbit@izuf6e78y3y0pi1watmli4z stop_app
# 加入集群 --ram 类型为内存节点;不加此参数默认为磁盘节点
rabbitmqctl -n rabbit@izuf6e78y3y0pi1watmli4z join_cluster --ram rabbit@izuf6ghdadtcqh6fnjs6zgz
# 启动服务
rabbitmqctl -n rabbit@izuf6e78y3y0pi1watmli4z start_app
# 查看节点的集群状态
rabbitmqctl -n rabbit_2@izuf6ghdadtcqh6fnjs6zgz cluster_status
# 启动界面管理服务插件
rabbitmq-plugins -n rabbit_2@izuf6ghdadtcqh6fnjs6zgz enable rabbitmq_management
# 将节点移除集群
rabbitmqctl -n rabbit_2@izuf6e78y3y0pi1watmli4z reset

# 更改节点类型 disc:磁盘节点;ram:内存节点
rabbitmqctl -n rabbit@izuf6ghdadtcqh6fnjs6zgz change_cluster_node_type disc
查看rabbitMq进程:ps -ef | grep rabbitmq

默认监听端口15672/5672:netstat -anplt | grep LISTEN rabbitmq

普通集群

Rabbitmq的集群是依附于erlang的集群来工作的,所以必须先构建起erlang的集群镜像。Erlang的集群中各节点是经由过程一个magic cookie来实现的,这个cookie存放在 $home/.erlang.cookie 中,我的是用rpm安装的,所以.erlang.cookie就放在/var/lib/rabbitmq中  另外 .erlang.cookie是隐藏的,需要用命令显示出来~~~

# .erlang.cookie 路径
cd /var/lib/rabbitmq

# 修改其他节点服务器的的.erlang.cookie 保证所有服务器的 .erlang.cookie文件保持一致
# 修改文件权限(可编辑):
chmod 777  /var/lib/rabbitmq/.erlang.cookie
# 修改完 .erlang.cookie 后必须改回文件权限(启动前必须设置400,只有owner拥有权限即可,否则启动rabbitmq服务失败)
chmod 400  /var/lib/rabbitmq/.erlang.cookie

erlang.cookie复制完成后,逐个重启节点服务:

systemctl restart rabbitmq-server.service
systemctl status rabbitmq-server.service

添加到集群.将rabbit@Master作为集群主节点,在节点slave1和节点slave2上面分别执行如下命令,以加入集群中.(同时注意可以再添加节点的时候设置节点是磁盘服务器还是内存服务器,默认是磁盘服务器)

[root@slave1 [email protected]]   rabbitmqctl stop_app
[root@slave1 [email protected]]   rabbitmqctl reset
[root@slave1 [email protected]]   rabbitmqctl join_cluster rabbit@Master
[root@slave1 [email protected]]   rabbitmqctl start_app

每台都克以查看集群状态(master是与slave上的展示内容是不一样的)

rabbitmqctl cluster_status

账号管理

添加账号:
rabbitmqctl add_user admin admin
添加 权限tag
rabbitmqctl set_user_tags admin administrator
 
删除用户(删除guest用户)
[root@v01-app-rabbitmq01 rabbitmq]# rabbitmqctl delete_user guest
Deleting user "guest"
 
修改用户的密码
rabbitmqctl  change_password  Username  Newpassword
 
[root@v01-app-rabbitmq01 ~]# rabbitmqctl  change_password  admin 0GM1aol4z8GeSZY99
Changing password for user "admin"
 
查看当前用户列表
rabbitmqctl  list_users
Listing users
admin   [administrator]

访问WEB地址:192.168.2.108:15672 然后又 finsh.当然还有多熟悉命令.这里肯能不全.自行百度吧如果有问题欢迎骚扰:[email protected]

集群镜像模式

镜像模式就是集群的高可用,同步么~~~~防止数据丢失.有两种设置方式.一种是用命令,另外一种是在web上直接设置.

命令模式如下

设置镜像队列策略(注意设置镜像队列~~~~~~~~~~~~~而非镜像服务器)

# 在任意一个节点上执行:
rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'

# 查看策略
rabbitmqctl list_policies
在cluster中任意节点启用策略,策略会自动同步到集群节点

rabbitmqctl set_policy -p hrsystem ha-allqueue"^" '{"ha-mode":"all"}'

这行命令在vhost名称为hrsystem创建了一个策略,
策略名称为ha-allqueue,
策略模式为 all 即复制到所有节点,包含新增节点,
策略正则表达式为 “^” 表示所有匹配所有队列名称。

例如rabbitmqctl set_policy -p hrsystem ha-allqueue "^message" '{"ha-mode":"all"}'
注意:"^message" 这个规则要根据自己修改,
这个是指同步"message"开头的队列名称,
我们配置时使用的应用于所有队列,所以表达式为"^"

官方set_policy说明参见
set_policy [-p vhostpath] {name} {pattern} {definition} [priority]
(http://www.rabbitmq.com/man/rabbitmqctl.1.man.html)

 

web端创建

1.点击admin菜单-->右侧的Virtual Hosts选项- Add a new virtual host 

2.点击admin菜单-->右侧的Policies选项-->左侧最下下边的Add / update a policy

添加一个queues队列

关于镜像队列的一些命令

新建队列: virtual_host: rabbitmqctl add_vhost  xxx
撤销队列: virtual_host: rabbitmqctl delete_vhost  xxx
删除队列:rabbitmqctl -p /activity purge_queue activity_register

关于RabbitMq的Vhost(这个都是细节~~关于权限)

      vhost是rabbitmq分配权限的最小细粒度。

      比如我们可以为一个用户分配一个可以访问哪个或者哪一些vhost的权限。但是不能为用户分配一个可以访问哪一些exchange,或者queue的权限, 因为rabbitmq的权限细粒度没有细化到交换器和队列,他的最小细粒度是vhost(vhost中包含许多的exchanges,queues,bingdings)。

     所以如果exchangeA 和queueA 只能让用户A访问,exchangeB 和queueB 只能让用户B访问,要达到这种需求,只能为exchangeA 和queueA创建一个vhostA,为exchangeB 和queueB 创建vhostB,这样就隔离开来了。

补充:一个broker可以开设多个vhost,用于不同用户的权限分离

 

 
发布了62 篇原创文章 · 获赞 50 · 访问量 13万+

猜你喜欢

转载自blog.csdn.net/cuiyaonan2000/article/details/102948818