下载
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