下载

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