RabbitMQ 详解


MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法
MQ则是遵循了AMQP(Advanced Message Queuing Protocol)协议的具体实现和产品
RabbitMQ 基于erlang语言研发

(一) Rabbit MQ 简要介绍

前言:

  • RabbitMQ 架构Channel工作于Queue于Client之间)

Alt text

  • RabbitMQ 安装,配置

 
 
1:安装
yum install -y rabbitmq-server
2:主要程序介绍
# 管理插件的程序
/usr/sbin/rabbitmq-plugins
# 服务程序
/usr/sbin/rabbitmq-server
# 命令行接口程序
/usr/sbin/rabbitmqctl
3:获取插件程序的帮助
rabbitmq-plugins --help
list [-v] [-m] [-E] [-e] [<pattern>]
enable <plugin> ...
disable <plugin> ..
4:查看可用的插件,E表示:启动的插件,e表示:被依赖启动的插件
rabbitmq-plugins list
[e] amqp_client 3.3 .5
[ ] cowboy 0.5 .0-rmq3 .3 .5-git4b93c2d
[ ] eldap 3.3 .5-gite309de4
[e] mochiweb 2.7 .0-rmq3 .3 .5-git680dba8
[ ] rabbitmq_amqp1_0 3.3 .5
[ ] rabbitmq_auth_backend_ldap 3.3 .5
[ ] rabbitmq_auth_mechanism_ssl 3.3 .5
[ ] rabbitmq_consistent_hash_exchange 3.3 .5
[ ] rabbitmq_federation 3.3 .5
[ ] rabbitmq_federation_management 3.3 .5
[E] rabbitmq_management 3.3 .5
[e] rabbitmq_management_agent 3.3 .5
[ ] rabbitmq_management_visualiser 3.3 .5
[ ] rabbitmq_mqtt 3.3 .5
[ ] rabbitmq_shovel 3.3 .5
[ ] rabbitmq_shovel_management 3.3 .5
[ ] rabbitmq_stomp 3.3 .5
[ ] rabbitmq_test 3.3 .5
[ ] rabbitmq_tracing 3.3 .5
[e] rabbitmq_web_dispatch 3.3 .5
[ ] rabbitmq_web_stomp 3.3 .5
[ ] rabbitmq_web_stomp_examples 3.3 .5
[ ] sockjs 0.3 .4-rmq3 .3 .5-git3132eb9
[e] webmachine 1.10 .3-rmq3 .3 .5-gite9359c7
5:启用管理插件
rabbitmq-plugins enable rabbitmq_management
6:启用了新插件,需要重启服务,但是在现在服务没有启动,因此直接启动
# 配置/etc/hosts文件,添加解析地址
192.168 .23 .10 rabbitmq
# 启动服务
systemctl start rabbitmq-server
7:查看服务监听的端口
# rabbitmq监听的端口
::: 5672 :::* LISTEN 3989/beam.smp
# rabbitmq_management监听的端口
0.0 .0 .0: 15672 0.0 .0 .0:* LISTEN 3989/beam.smp
# rabbitmq 集群监听的端口
0.0 .0 .0: 25672 0.0 .0 .0:* LISTEN 3989/beam.smp
8:访问rabbitmq,用户名和密码都是guest
http:// 192.168 .23 .10: 15672
9:通过这个web接口,可以实现对rabbitmq的管理
  • 虚拟主机介绍

 
 
虚拟主机功用:
隔离rabbitmq的各个组件
  • *RabbitMQ 对外提供的配置接口介绍

 
 
1:默认的引导文件,可以指日志文件,主配置文件等路径
/usr/ lib/rabbitmq_server-3.3.5/sbin/rabbitmq-defaults
# 指定主配置文件
CONFIG_FILE=${SYS_PREFIX}/etc/rabbitmq/rabbitmq
# 指定日志文件
LOG_BASE=${SYS_PREFIX}/var/log/rabbitmq
# 指定mnesia配置
MNESIA_BASE=${SYS_PREFIX}/var/ lib/rabbitmq/mnesia
# 指定插件配置文件
ENABLED_PLUGINS_FILE=${SYS_PREFIX}/etc/rabbitmq/enabled_plugins
# 指定插件存放路径
PLUGINS_DIR= "${RABBITMQ_HOME}/plugins"
# 指定环境变量配置文件
CONF_ENV_FILE=${SYS_PREFIX}/etc/rabbitmq/rabbitmq-env.conf
2:主配置文件/etc/rabbitmq/rabbitmq.config
  • rabbitmqctl 的常用命令

 
 
# 查看服务器的状态
rabbitmqctl status
# 查看环境变量
rabbitmqctl environment
# 停止rabbitmq的应用
rabbitmqctl stop_app
# 启动rabbitmq的应用
rabbitmqctl start_app
# 添加用户
rabbitmqctl add_user <username> <password>
rabbitmqctl add_user uplooking 123456
# 列出所有的用户
rabbitmqctl list_users
# 将用户设置为管理员用户
rabbitmqctl set_user_tags uplooking administrator
# 查看虚拟主机
rabbitmqctl list_vhosts
# 添加虚拟主机
rabbitmqctl add_vhost /uplooking
rabbitmqctl add_vhost /uplooking/ops
rabbitmqctl add_vhost /uplooking/java
# 删除虚拟主机
rabbitmqctl delete_vhost /uplooking/java
# 查看默认虚拟主机的权限
rabbitmqctl list_permissions
# 设置用户的权限,.* 表示分别对 组件的配置文件、读权限、写权限
rabbitmqctl set_permissions -p /uplooking uplooking ".*" ".*" ".*"
# 查看虚拟主机的权限
rabbitmqctl list_permissions -p /uplooking
# 组件查看
rabbitmqctl list_queues -p /uplooking

(二) Haproxy + Rabbit 集群 简要介绍

前言:

Alt text

  • 准备两台主机(192.168.23.10--rabbitmq1,192.168.23.11--rabbitmq2)

 
 
# 两台主机都安装上rabbitMQ
yum install -y rabbitmq-server
# 两台主机都配置/etc/hosts文件
192.168 .23 .10 rabbitmq1
192.168 .23 .11 rabbitmq2
# 两台主机都以集群的方式启动rabbitmq-server
rabbitmq-server -detached
# 此时查看 rabbitmqctl cluster_status ,会发现:两台主机在各自的集群上
# 因此,将rabbitmq1加入rabbitmq2的集群中,返过来也可以。先将rabbitmq1的服务停止,再加入到rabbitmq2的集群中,但是node2需要先将cookie文件拷贝到node1。如果碰到问题,需要将node2的rabbitmq进程kill掉,在启动rabbitmq-server服务
rabbitmqctl stop_app(在node1上执行)
scp / var/lib/rabbitmq/.erlang.cookie 192.168 .23 .10:/ var/lib/rabbitmq/.erlang.cookie(在node2上执行)
rabbitmqctl join_cluster "rabbit@rabbitmq2" [--ram](在node1上执行, --ram表示是否为内存节点,如果不加为磁盘disc节点)
1\systemctl stop rabbitmq-server
2\scp
3\systemctl start rabbitmq-server
4\rabbitmqctl stop_app
5\join
6\rabbitmqctl start_app
# 再次启动rabbitmq1
rabbitmqctl start_app
# 再次查看rabbitmq1的集群状态,会发现此时rabbitmq1的集群的集群名称为:"rabbit@rabbitmq2"
rabbitmqctl cluster_status
# 返回web接口
http: //192.168.23.10:15672
# 但是此时可能无法查看到rabbitmq2节点的信息,因为rabbitmq2没有启用rabbitmq_management插件,因此启用插件,在重启服务
rabbitmq-plugins enable rabbitmq_management
systemctl restart rabbitmq-server
# 确保每一个节点的15672、25672、5672端口都是监听的
netstat -lntup
# 此时这两个节点都是disc节点,可以修改为ram节点, 将rabbitmq2改为ram节点
rabbitmqctl stop_app
rabbitmqctl change_cluster_node_type ram
rabbitmqctl start_app
# 再次查看集群状态,发现rabbitmq1已经为ram节点
rabbitmqctl cluster_status

Alt text

  • 设置RabbitMQ镜像功能

 
 
# 在rabbitmq2上创建队列镜像,镜像需要指定策略,策略是用来控制和修改群集范围的队列行为和Exchange行为的
# 创建了一个名为 ha-allqueue策略,“^” 表示所有匹配所有队列名称,策略模式 ha- modeall 即复制到所有节点,包含新增节点。
rabbitmqctl set_policy ha-allqueue "^" '{"ha-mode":"all"}'
  • 搭建haproxy服务器,实现TCP层调度(haproxy:192.168.23.12)

 
 
# 在添加一条主机节点安装haproxy
yum install -y haproxy
# 修改配置文件/etc/haproxy/haproxy.cfg
IP
# 指定日志记录路径,这个local2是需要在/etc/rsyslog.conf文件中指定的,指定了日志存储路径之后,需要重启rsyslog服务哦(在文件中加上本机IP 主机名,,主机名一定要与真实的一样)
log 127.0 .0 .1 local2
# 指定haproxy的运行环境
chroot /var/lib/haproxy
# 指定进程的pid
pidfile /var/run/haproxy.pid
# 指定单个进程的最大并发连接数
maxconn 4000
# 指定允许haproxy的用户
user haproxy
# 指定允许haproxy的组
group haproxy
# 指定haproxy以守护进程模式运行
daemon
# 设置后台运行2个haproxy进程,但是后台运行了3个进程
# nbproc 2
# 指定Unix socket通信(基本没用过)
# stats socket /var/lib/haproxy/stats
# 这里是默认的选项,如何在listen段,backend段,frontend段中将这些选项按需求重新制定
defaults
# 指定默认的模式
mode http
# 指定日志信息使用全局指定的日志存储路径,全局日志是存储在rsyslog服务中
log global
# 将log日志记录到rsyslog日志服务器中,指定日志级别为notice级别
log 192.168 .23 .10 local12 notice
# 日志格式可以不指定,有其默认的值
#log-format %T\ %t\ Some\ Text
# 指定压缩类型
compression algo gzip
# 指定需要压缩的资源类型
compression type text/html text/plain
option httplog
option dontlognull
option http-server- close
# 在后端服务器中可以记录客户端的源IP地址,在日志中加上%{X-Forwarded-For}i
option forwardfor except 127.0 .0 .1/ 8(报错的时候可以注释掉)
# 如果后端服务器不提供服务,那么将会重新di
option redispatch
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
# 指定接受10000个并发
maxconn 10000
# haproxy统计页面配置段
listen stats
# 指定统计页面监听的端口
bind *: 33559
# 指定统计页面运行的模式
mode http
# 指定开启统计页面功能
stats enable
# 如果不设置URI,默认是/haproxy?stats
stats uri /admin
# 指定登入是提示信息,\表示转义空白字符
stats realm HAProxy\ statistics
# 指定用户名和密码
stats auth uplooking: 123456
# 指定统计页面自动刷新的时长
stats refresh 20
# 如果用户认证成功,统计页面可以被访问
stats admin if TRUE
#隐藏统计页面上HAProxy的版本信息
stats hide- version
listen rabbitmq_cluster
bind *: 5672
option tcplog
mode tcp
timeout client 3h
timeout server 3h
balance roundrobin
# inter 2000 是健康状态检测的时间间隔,rise 2:2次请求成功认为服务器可用,fall 3:3次请求不成功认为服务器不可用
server mq1 192.168 .23 .10: 5672 check inter 5s rise 2 fall 3
server mq2 192.168 .23 .11: 5672 check inter 5s rise 2 fall 3
3:检测配置文件
haproxy -c -f /etc/haproxy/haproxy.cfg
4:登入haproxy的管理界面查看是否rabbitmq集群开始工作了
http:// 192.168 .23 .12: 33559/admin
  • haproxy + keepalived 实现高可用(作业)

 
 
同学们自己把这部分文档,用自己的运维思路整理好
  • 使用Python 、 go 语言测试rabbitmq的工作机制(加分项目)

 
 
1:在haproxy 和 rabbitmq上安装Python、python2-pip,默认是Python2
yum install -y python python2-pip
2:在haproxy 和 rabbitmq上使用pip安装pika库
pip install pika== 0.9 .8
3:在haproxy上写一个Python发送消息代码
vi send.py
-------
#!/usr/bin/env python
import pika
connection = pika.BlockingConnection(pika.ConnectionParameters(
host= 'localhost'))
channel = connection.channel()
channel.queue_declare(queue= 'hello')
channel.basic_publish(exchange= '',
routing_key= 'hello',
body= 'Hello Uplooking!')
print "Sent 'Hello Uplooking!'"
connection.close()
-------
4:在rabbitmq上写一个Python接受消息代码
vi receive.py
-------
#!/usr/bin/env python
import pika
connection = pika.BlockingConnection(pika.ConnectionParameters(
host= 'localhost'))
channel = connection.channel()
channel.queue_declare(queue= 'hello')
print ' waiting for messages! press CTRL+C to halt'
def callback(ch, method, properties, body):
print "Received %r" % (body,)
channel.basic_consume(callback,
queue= 'hello',
no_ack= True)
channel.start_consuming()
-------
5:先运行receive.py,在运行send.py
python receive.py
python send.py
  • 以上是Python2代码,请自行查找资料解决Python3如何实现上述的消息队列(加分项目)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值