rabbitmq
5672:消费者访问的 端口
15672:web管理端口
25672:集群状态通信端口
使用epel源
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
yum install epel-release -y
yum install -y rabbitmq-server
修改HOSTS
echo -e "192.168.10.201 rabbitmq1
192.168.10.202 rabbitmq2
192.168.10.203 rabbitmq3" >> /etc/hosts
cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.10.201 rabbitmq1
192.168.10.202 rabbitmq2
192.168.10.203 rabbitmq3
启动服务
systemctl start rabbitmq-server
开启web管理界面插件
[root@rabbitmq1 ~]# rabbitmq-plugins enable rabbitmq_management
The following plugins have been enabled:
mochiweb
webmachine
rabbitmq_web_dispatch
amqp_client
rabbitmq_management_agent
rabbitmq_management
Plugin configuration has changed. Restart RabbitMQ for changes to take effect.
重启rabbitMQ服务
systemctl restart rabbitmq-server
浏览器访问
http://192.168.10.201:15672/#/
用户名和密码均为guest
部署 rabbitMQ 集群
Rabbitmq 的集群是依赖于 erlang 的集群来工作的,所以必须先构建起 erlang 的集群环境。而 Erlang 的集群中各节点是通过一个 magic cookie 来实现的,这个 cookie 存放在 /var/lib/rabbitmq/.erlang.cookie 中,文件是 400 的权限。所以必须保证各节点 cookie 保持一致,否则节点之间就无法通信。
将各节点 cookie 保持一致
cat /var/lib/rabbitmq/.erlang.cookie
重启节点
systemctl restart rabbitmq-server
查看各 rabbitMQ 服务的集群状态
当前是独立运行的
[root@rabbitmq1 ~]# rabbitmqctl cluster_status
Cluster status of node rabbit@rabbitmq1 ...
[{nodes,[{disc,[rabbit@rabbitmq1]}]},
{running_nodes,[rabbit@rabbitmq1]},
{cluster_name,<<"rabbit@rabbitmq1">>},
{partitions,[]}]
...done.
[root@rabbitmq2 ~]# rabbitmqctl cluster_status
Cluster status of node rabbit@rabbitmq2 ...
[{nodes,[{disc,[rabbit@rabbitmq2]}]},
{running_nodes,[rabbit@rabbitmq2]},
{cluster_name,<<"rabbit@rabbitmq2">>},
{partitions,[]}]
...done.
[root@rabbitmq3 ~]# rabbitmqctl cluster_status
Cluster status of node rabbit@rabbitmq3 ...
[{nodes,[{disc,[rabbit@rabbitmq3]}]},
{running_nodes,[rabbit@rabbitmq3]},
{cluster_name,<<"rabbit@rabbitmq3">>},
{partitions,[]}]
...done.
将 rabbitMQ 的节点添加到集群
将rabbitmq2添加为内存节点
#停止应程序
[root@rabbitmq2 ~]# rabbitmqctl stop_app
Stopping node rabbit@rabbitmq2 ...
...done.
#清空元数据
[root@rabbitmq2 ~]# rabbitmqctl reset
Resetting node rabbit@rabbitmq2 ...
...done.
#将此节点添加至rabbitmq1中,并成为内存节点,不加--ram默认是磁盘节点
[root@rabbitmq2 ~]# rabbitmqctl join_cluster rabbit@rabbitmq1 --ram
Clustering node rabbit@rabbitmq2 with rabbit@rabbitmq1 ...
...done.
#启动应程序
[root@rabbitmq2 ~]# rabbitmqctl start_app
Starting node rabbit@rabbitmq2 ...
...done.
将rabbitmq3添加为磁盘节点
rabbitmqctl stop_app #停止应程序
rabbitmqctl reset #清空元数据
rabbitmqctl join_cluster rabbit@rabbitmq1#将rabbitmq1添加到集群当中,并成为磁盘节点,不加--ram默认是磁盘节点
rabbitmqctl start_app #启动应程序
使用浏览器访问
更改为镜像模式
rabbitmqctl set_policy ha-all "#" '{"ha-mode":"all"}' #"#"为任意0个或多个即为所有,也可以使用"^test"匹配开头,还可以使用其他正则匹配
[root@rabbitmq3 ~]# rabbitmqctl set_policy ha-all "#" '{"ha-mode":"all"}' #"#"
Setting policy "ha-all" for pattern "#" to "{"ha-mode":"all"}" with priority "0" ...
...done.
![enter description here enter description here](./images/1565159858478.png)
enter description here
任意节点验证
rabbitmqctl list_queues
安装 pika 模块
epel源
yum install python-pip
pip install pika
生产者代码
[root@Final ~]# cat mq.py
#!/bin/env python
#coding:utf-8
import pika
#用户名密码
cert = pika.PlainCredentials("guest","guest")
#连接到rabbitMQ服务器
conn = pika.BlockingConnection(pika.ConnectionParameters("192.168.10.201",5672,"/",cert))
#创建频道
chanel = conn.channel()
#声明消息队列,如果队列不存在就创建,存在就将消息在此队队列中创建,如果将消息发送到不存在的队列,则rabbitMQ会自动清除这些消息
chanel.queue_declare(queue="test1")
#exchange告诉消息去往的队列,routing_key是队列名,body是要传递的消息内容
chanel.basic_publish(exchange="",
routing_key="test",
body="hello world!")
print("开始队列")
#消息写入完成,关闭连接
conn.close()
消费者代码
[root@Final ~]# cat test.py
#!/bin/env python
#coding:utf-8
import pika
#用户名
cert = pika.PlainCredentials("guest","guest")
#连接到服务器
conn = pika.BlockingConnection(pika.ConnectionParameters("192.168.10.201",5672,"/",cert))
#创建频道
channel = conn.channel()
#声明消息队列,如果不存在就创建
channel.queue_declare(queue="test1")
# 定义一个回调函数来处理,这边的回调函数就是将信息打印出来。
def callback(ch,method,properties,body):
print("[x] Received %r" % body)
channel.basic_consume('test',callback,
auto_ack=False,
exclusive=False,
consumer_tag=None,
arguments=None)
print(' [*] Waiting for messages. To exit press CTRL+C')
# 开始接收信息,并进入阻塞状态,队列里有信息才会调用callback进行处理。按ctrl+c退出。
channel.start_consuming()
执行结果
![rabbitmq rabbitmq](./images/1565161460120.png)
rabbitmq