RabbitMQ 详解
来源:互联网 发布:mac os 10.11 cdr迅雷 编辑:程序博客网 时间:2024/06/05 15:30
MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法
MQ则是遵循了AMQP(Advanced Message Queuing Protocol)协议的具体实现和产品
RabbitMQ 基于erlang语言研发
(一)
Rabbit MQ
简要介绍
前言:
RabbitMQ 架构
(Channel
工作于Queue于Client之间)
RabbitMQ 安装,配置
1:安装yum install -y rabbitmq-server2:主要程序介绍# 管理插件的程序/usr/sbin/rabbitmq-plugins# 服务程序/usr/sbin/rabbitmq-server# 命令行接口程序/usr/sbin/rabbitmqctl3:获取插件程序的帮助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-gite9359c75:启用管理插件rabbitmq-plugins enable rabbitmq_management6:启用了新插件,需要重启服务,但是在现在服务没有启动,因此直接启动# 配置/etc/hosts文件,添加解析地址 192.168.23.10 rabbitmq# 启动服务systemctl start rabbitmq-server7:查看服务监听的端口# 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.smp8:访问rabbitmq,用户名和密码都是guesthttp://192.168.23.10:156729:通过这个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.conf2:主配置文件/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 /uplookingrabbitmqctl add_vhost /uplooking/opsrabbitmqctl 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 集群
简要介绍
前言:
准备两台主机(192.168.23.10--rabbitmq1,192.168.23.11--rabbitmq2)
# 两台主机都安装上rabbitMQyum install -y rabbitmq-server# 两台主机都配置/etc/hosts文件192.168.23.10 rabbitmq1192.168.23.11 rabbitmq2# 两台主机都以集群的方式启动rabbitmq-serverrabbitmq-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-server2\scp3\systemctl start rabbitmq-server4\rabbitmqctl stop_app5\join6\rabbitmqctl start_app# 再次启动rabbitmq1rabbitmqctl start_app# 再次查看rabbitmq1的集群状态,会发现此时rabbitmq1的集群的集群名称为:"rabbit@rabbitmq2"rabbitmqctl cluster_status# 返回web接口http://192.168.23.10:15672# 但是此时可能无法查看到rabbitmq2节点的信息,因为rabbitmq2没有启用rabbitmq_management插件,因此启用插件,在重启服务rabbitmq-plugins enable rabbitmq_managementsystemctl restart rabbitmq-server# 确保每一个节点的15672、25672、5672端口都是监听的netstat -lntup# 此时这两个节点都是disc节点,可以修改为ram节点, 将rabbitmq2改为ram节点rabbitmqctl stop_apprabbitmqctl change_cluster_node_type ramrabbitmqctl start_app# 再次查看集群状态,发现rabbitmq1已经为ram节点rabbitmqctl cluster_status
设置RabbitMQ镜像功能
# 在rabbitmq2上创建队列镜像,镜像需要指定策略,策略是用来控制和修改群集范围的队列行为和Exchange行为的# 创建了一个名为ha-allqueue策略,“^” 表示所有匹配所有队列名称,策略模式ha-mode为 all 即复制到所有节点,包含新增节点。rabbitmqctl set_policy ha-allqueue "^" '{"ha-mode":"all"}'
搭建haproxy服务器,实现TCP层调度
(haproxy:192.168.23.12)
# 在添加一条主机节点安装haproxyyum install -y haproxy# 修改配置文件/etc/haproxy/haproxy.cfgIP # 指定日志记录路径,这个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-versionlisten 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 33:检测配置文件haproxy -c -f /etc/haproxy/haproxy.cfg4:登入haproxy的管理界面查看是否rabbitmq集群开始工作了http://192.168.23.12:33559/admin
haproxy + keepalived 实现高可用(作业)
同学们自己把这部分文档,用自己的运维思路整理好
使用Python 、 go 语言测试rabbitmq的工作机制
(加分项目)
1:在haproxy 和 rabbitmq上安装Python、python2-pip,默认是Python2yum install -y python python2-pip2:在haproxy 和 rabbitmq上使用pip安装pika库pip install pika==0.9.83:在haproxy上写一个Python发送消息代码vi send.py-------#!/usr/bin/env python import pikaconnection = 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 pikaconnection = 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.pypython receive.pypython send.py
以上是Python2代码,请自行查找资料解决Python3如何实现上述的消息队列
(加分项目)
阅读全文
0 0
- RabbitMQ详解
- RabbitMQ 详解
- rabbitmq java demo详解
- rabbitmq安装详解
- RabbitMQ技术详解
- rabbitMQ入门详解
- RabbitMQ安装使用详解
- rabbitMQ入门详解
- rabbitmq 配置详解
- RabbitMQ实例详解
- centos+RabbitMQ安装详解
- RabbitMQ Server配置详解
- Yii2 RabbitMQ 使用详解
- springboot(八):RabbitMQ详解
- .Net使用RabbitMQ详解
- RabbitMQ基础概念详解
- RabbitMQ基础概念详解
- RabbitMQ的参数详解
- IT男如何护肤?上班族男性护肤的方法有哪些?[图]
- Redis存储
- sublime 3 注册码
- SpringMVC的Controller和Struts2的Action的区别
- 顺序栈的实现
- RabbitMQ 详解
- 作业
- 栈和队列——求最大子矩阵的大小
- 第十章
- 数据挖掘中常用的距离方法整理
- Disruptor无锁队列浅析
- 个人Java常见问题集合
- JDBC连接MySQL数据库
- optimization on macOS