centos7 rabbitmq集群安装配置管理

下载

http://www.rabbitmq.com/releases/erlang/erlang-19.0-1.el7.centos.x86_64.rpm

https://dl.bintray.com/rabbitmq/rabbitmq-server-rpm/:rabbitmq-server-3.6.12-1.el7.noarch.rpm

 

基础知识:

参考:http://www.cnblogs.com/flying607/p/9505386.html

 

消息和队列可以指定是否持久化,如果指定持久化则会保存到硬盘上 ,不然只在内存里。

 

普通集群模式下持久化的队列不能重建,内存节点和磁盘节点的区别就是将元数据放在了内存还是硬盘,仅此而已,当在集群中声明队列、交换器和绑定 ,这些操作会同步元数据到所有节点

 

元数据必须至少保存在一个硬盘上,内存节点重启会去磁盘节点下载当前集群元数据拷贝,磁盘节点全挂了,那么集群就无法创建新的东西了,但是还能继续使用已有的东西。

 

默认情况下,队列只会保存在一个节点上,其他只是保存元数据,当然消息也会投递到这个队列所在的机器上,所以我们才有了创建镜像队列的需求,镜像队列则需要队列适配了策略。

 

三节点IP

192.168.22.177

192.168.22.178

192.168.22.179

 

# cat /etc/redhat-release 

CentOS Linux release 7.1.1503 (Core) 

 

修改三个节点的/etc/hosts文件,把三个节点IP和对应的主机名分别写入三个节点的文件中。

 

1、安装

三个节点安装

# rpm -ivh erlang-19.0-1.el7.centos.x86_64.rpm

 

# rpm -ivh rabbitmq-server-3.6.12-1.el7.noarch.rpm 

warning: rabbitmq-server-3.6.12-1.el7.noarch.rpm: Header V4 RSA/SHA512 Signature, key ID 6026dfca: NOKEY

error: Failed dependencies:

        socat is needed by rabbitmq-server-3.6.12-1.el7.noarch

# yum install socat

 

# rpm -ivh rabbitmq-server-3.6.12-1.el7.noarch.rpm 

 

启动服务

# rabbitmq-server -detached

 

查看状态

# rabbitmqctl status

 

列出插件

# rabbitmq-plugins list

 

开启页面管理插件

# rabbitmq-plugins enable rabbitmq_management

 

2、创建集群

保持三个节点.erlang.cookie文件一致

# find / -name "*.erlang.cookie*"

/var/lib/rabbitmq/.erlang.cookie

 

# ll /var/lib/rabbitmq/.erlang.cookie 

-r-------- 1 rabbitmq rabbitmq 20 Oct 24 00:00 /var/lib/rabbitmq/.erlang.cookie

 

将177作为主节点,拷贝177上的.erlang.cookie文件到另外两个节点的/var/lib/rabbitmq目录下

并修改拷贝后的文件权限

# chown rabbitmq:rabbitmq .erlang.cookie

 

178、179两个节点

杀掉rabbitmq的进程

# kill -9 

 

把节点加入集群

# rabbitmq-server -detached

 

关闭应用

# rabbitmqctl stop_app

 

加入集群

# rabbitmqctl join_cluster rabbit@rabbitmq-server1

 

启动应用

# rabbitmqctl start_app

 

 

177节点查看

# rabbitmqctl cluster_status 

Cluster status of node 'rabbit@rabbitmq-server1'

[{nodes,[{disc,['rabbit@rabbitmq-server2','rabbit@rabbitmq-server3',

                'rabbit@rabbitmq-server1']}]},

 {running_nodes,['rabbit@rabbitmq-server3','rabbit@rabbitmq-server2',

                 'rabbit@rabbitmq-server1']},

 {cluster_name,<<"rabbit@rabbitmq-server1">>},

 {partitions,[]},

 {alarms,[{'rabbit@rabbitmq-server3',[]},

          {'rabbit@rabbitmq-server2',[]},

          {'rabbit@rabbitmq-server1',[]}]}]

 

3、web管理页面配置  

177创建rabbitmq管理页面管理用户

# rabbitmqctl add_user root Password

# rabbitmqctl set_permissions -p / root ".*" ".*" ".*"

# rabbitmqctl set_user_tags root administrator

 

可以使用用户root通过浏览器登录web管理界面http://192.168.22.177:15672

 

在web界面,登陆后,点击“Admin--Virtual Hosts(页面右侧)”,在打开的页面上的下方的“Add a new virtual host”处增加一个虚拟主机test,同时给用户“root”和“guest”均加上权限

 

177上做

# rabbitmqctl set_policy -p test  ha-all "^" '{"ha-mode":"all"}'

 

"test" vhost名称, "^"匹配所有的队列, ha-all 策略名称为ha-all, '{"ha-mode":"all"}' 策略模式为 all 即复制到所有节点,包含新增节点。

 

则此时镜像队列设置成功。(这里的虚拟主机test是代码中需要用到的虚拟主机,虚拟主机的作用是做一个消息的隔离,本质上可认为是一个rabbitmq-server,是否增加虚拟主机,增加几个,这是由开发中的业务决定,即有哪几类服务,哪些服务用哪一个虚拟主机,这是一个规划)。

 

# rabbitmqctl add_user mquser mqpassword

# rabbitmqctl set_permissions -p test mquser '.*' '.*' '.*'

 

4、安装haproxy

177上安装haproxy

# yum install haproxy

 

# vi /etc/haproxy/haproxy.cfg

 

删除60行之后的内容

#---------------------------------------------------------------------

# main frontend which proxys to the backends

#---------------------------------------------------------------------

......

 

添加

listen rabbitmq_local_cluster 0.0.0.0:5670

    mode tcp

    balance roundrobin

    server rabbit1 192.168.22.177:5672 check inter 5000 rise 2 fall 3

    server rabbit2 192.168.22.178:5672 check inter 5000 rise 2 fall 3

    server rabbit3 192.168.22.179:5672 check inter 5000 rise 2 fall 3

listen private_monitoring :8100

    mode http

    option httplog

    stats enable

    stats uri       /stats

    stats refresh 60s

    stats auth admin:admin

 

# systemctl start haproxy.service

 

http://192.168.22.177:8100/stats

 

结合springboot,类似下面的配置

rabbitmq:

rabbitmq.host: 192.168.22.177

rabbitmq.port: 5670

rabbitmq.username: mquser

rabbitmq.password: mqpassword

rabbitmq.virtual-host: test

 

5、rabbitmq使用的日常命令

启动rabbitmq 

rabbitmq-server -detached

 

查看rabbitmq状态 

rabbitmqctl status

 

节点服务管理

systemctl start rabbitmq-server.service

systemctl stop rabbitmq-server.service

systemctl restart rabbitmq-server.service

 

添加节点到集群

rabbitmqctl stop_app

rabbitmqctl reset

rabbitmqctl join_cluster rabbit@HOSTNAME

rabbitmqctl start_app

 

查看集群状态

rabbitmqctl cluster_status

 

添加账号:

rabbitmqctl add_user admin admin

添加 权限tag

rabbitmqctl set_user_tags admin administrator

 

删除用户(删除guest用户)

rabbitmqctl delete_user guest

 

修改用户的密码

rabbitmqctl  change_password  Username  Newpassword

 

查看当前用户列表

rabbitmqctl  list_users

 

添加vhost

# rabbitmqctl add_vhost test

 

查看vhost

# rabbitmqctl list_vhosts

 

硬盘节点改为内存节点

# rabbitmqctl change_cluster_node_type ram

 

6、两台服务器做集群,一台服务器做硬盘节点,一台服务器做内存节点

 

把rabbitmq用户接入sudo权限

# visudo

rabbitmq       ALL=(ALL:ALL) NOPASSWD:ALL

 

编辑hosts文件,两台服务器做解析

$ sudo vi /etc/hosts

 

两台服务器安装启动服务

# su rabbitmq

 

$ sudo yum install erlang-19.0-1.el7.centos.x86_64.rpm

 

$ sudo yum install rabbitmq-server-3.6.12-1.el7.noarch.rpm

 

$ rabbitmq-server -detached

 

$ sudo rabbitmqctl status

 

$ sudo rabbitmq-plugins list

 

$ sudo rabbitmq-plugins enable rabbitmq_management

 

同步文件

A服务器拷贝文件到B服务器

$ sudo scp /var/lib/rabbitmq/.erlang.cookie [email protected]:/var/lib/rabbitmq/

 

B服务器

$ sudo chown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie

 

重启两台服务

杀掉进程

sudo rabbitmq-server -detached  

 

B服务器加入A服务器

$ sudo rabbitmqctl stop_app

 

serverA是A服务器主机名

$ sudo rabbitmqctl join_cluster --ram rabbit@serverA

 

$ sudo rabbitmqctl cluster_status

Cluster status of node 'rabbit@serverA'

[{nodes,[{disc,['rabbit@serverA']},{ram,['rabbit@serverB']}]},

 {running_nodes,['rabbit@serverA']},

 {cluster_name,<<"rabbit@serverA">>},

 {partitions,[]},

 {alarms,[{'rabbit@serverA',[]}]}]

 

从上面可以看出A服务器为disc,即硬盘模式,B服务器为ram,即内存模式。

 

查看账户

$ sudo rabbitmqctl list_users

Listing users

guest   [administrator]

 

默认用户名:guest 密码:guest

 

为guest用户赋予根的权限

$ sudo rabbitmqctl set_permissions -p / guest ".*" ".*" ".*"

Setting permissions for user "guest" in vhost "/"

 

$ sudo rabbitmqctl set_policy -p /  ha-all "^" '{"ha-mode":"all"}'

Setting policy "ha-all" for pattern "^" to "{\"ha-mode\":\"all\"}" with priority "0"

 

注意:

rabbitmq从3.3.0开始禁止使用guest/guest权限通过除localhost外的访问。如果想使用guest/guest通过远程机器访问,需要在rabbitmq配置文件中(/etc/rabbitmq/rabbitmq.config)中设置loopback_users为[],配置文件不存在创建即可。

 

两个节点添加配置文件

$ sudo vi /etc/rabbitmq/rabbitmq.config

[{rabbit, [{loopback_users, ["admin"]}]}].

 

重启服务

$ sudo systemctl stop rabbitmq-server.service

$ sudo systemctl start rabbitmq-server.service

 

另外好的设计架构可以如下:(参考之前转载的文章)

在一个集群里,有3台以上机器,其中1台使用磁盘模式,其它使用内存模式。内存节点速度更快,因此客户端(consumer、producer)连接访问它们。而磁盘模式的节点,由于磁盘IO相对较慢,作数据备份使用。

 

完整的架构如下:

三个节点组成rabbitma集群,一个硬盘节点,两个内存节点

haproxy做三个节点的负载均衡

keepalived做高可用

可以参考下面这篇博客:

http://www.cnblogs.com/lylife/p/5584019.html

 

参考:

https://blog.csdn.net/u012062455/article/details/80003763

https://www.cnblogs.com/saneri/p/7798251.html

https://blog.csdn.net/jxdl6655/article/details/78194191

http://www.bubuko.com/infodetail-2710921.html

你可能感兴趣的:(消息队列)