亲手安装RabbitMq 3.7.2 并安装Trace插件
===============================================================================================
1、安装Erlang
yum install ntp -y
ntpdate -u 202.112.10.36
yum install wget xmlto gcc gcc-c++ kernel-devel m4 ncurses-devel openssl-devel unixODBC-devel wxBase wxGTK wxGTK-gl perl -y
cd /usr/local/software
tar zxvf otp_src_19.3.tar.gz
cd otp_src_19.3
./configure --prefix=/usr/local/erlang --with-ssl --enable-threads --enable-smp-support --enable-kernel-poll --enable-hipe --without-javac
make && make install
然后在配置Erlang环境变量,vi /etc/profile文件,增加下面的环境变量:
#set erlang environment
export PATH=$PATH:/usr/local/erlang/bin
source /etc/profile使得文件生效
===============================================================================================
#解压rabbitmq,官方给的包是xz压缩包,所以需要使用xz命令
yum install xz -y
xz -d rabbitmq-server-generic-unix-3.7.2.tar.xz
#xz解压后得到.tar包,再用tar命令解压
tar -xvf rabbitmq-server-generic-unix-3.7.2.tar
#移动目录 看个人喜好
cp -rf ./rabbitmq_server-3.7.2 /usr/local/
cd /usr/local/
#修改文件夹名
mv rabbitmq_server-3.7.2 rabbitmq-3.7.2
#开启管理页面插件
cd ./rabbitmq-3.7.2/sbin/
./rabbitmq-plugins enable rabbitmq_management
#启动命令,该命令ctrl+c后会关闭服务
./rabbitmq-server
#在后台启动Rabbit
./rabbitmq-server -detached
缺点:这是用root用户启动的,是方便了,但可能不太安全
#关闭服务
./rabbitmqctl stop
#关闭服务(kill) 找到rabbitmq服务的pid [不推荐]
ps -ef|grep rabbitmq
kill -9 ****
#进入RabbitMQ安装目录
cd /usr/local/rabbitmq-3.7.2/sbin
#添加用户
#rabbitmqctl add_user Username Password
./rabbitmqctl add_user admin admin
#分配用户标签
#rabbitmqctl set_user_tags User Tag
#[administrator]:管理员标签
./rabbitmqctl set_user_tags admin administrator
./rabbitmqctl set_permissions -p '/' admin '.' '.' '.'
# 查看已安装的插件
./rabbitmq-plugins list
./rabbitmq-plugins enable rabbitmq_tracing
./rabbitmqctl trace_on
上面的软件包下载地址:链接:https://pan.baidu.com/s/1ragGo3q 密码:pyob
=========================================================================================== RabbitMQ内存控制 硬盘控制 https://www.cnblogs.com/haoliansheng/p/6094780.html 故障一例: rabbitmq连接被阻塞,无法接收消息 今天监控服务器无法显示交易信息,经过查看rabbitmq的管理平台,发现一些connection处于blocked状态,队列无法接受消息 查看内存、CPU、磁盘后发现,内存、CPU指标正常,磁盘的剩余空间只剩下500M左右,检查磁盘发现另一个应用产生了大量的日志,导致磁盘空间日益减少,删除部分日志文件后,一切正常,为保证以后的正常运行,再添加一块磁盘。 RabbitMQ磁盘警报 https://www.cnblogs.com/xinxiucan/p/8041418.html =========================================================================================== .NET 平台的网络断开异常处理办法 https://www.tuicool.com/articles/EJBrY3R ===========================================================================================
7,优化配置等
官网的配置
http://www.rabbitmq.com/production-checklist.html
http://www.rabbitmq.com/configure.html
http://www.rabbitmq.com/memory.html
http://www.rabbitmq.com/production-checklist.html#resource-limits-ram
线上优化后配置
[root@rabbitmq76 rabbitmq]# cat rabbitmq.conf
[
{rabbit,
[
{loopback_users, []},
{vm_memory_high_watermark, 0.40}, #最大使用内存40%,erlang开始GC
{vm_memory_high_watermark_paging_ratio, 0.8}, #32G内存,32*0.8*0.2时开始持久化磁盘
{disk_free_limit, "10GB"}, #磁盘使用量剩余10G时,不收发消息
{hipe_compile, true}, #开启hipe,提高erlang性能
{collect_statistics_interval, 10000}, #统计刷新时间默认5秒,改成10秒
{cluster_partition_handling, autoheal} #网络优化参数,不稳定时用这个选项
]
}
].
[root@rabbitmq76 rabbitmq]# cat rabbitmq-env.conf
RABBITMQ_NODENAME=rabbit@rabbitmq76 #节点名字,全局唯一
RABBITMQ_MNESIA_BASE=/data/rabbitmq/data #消息落地存放位置
RABBITMQ_LOG_BASE=/data/rabbitmq/log #日志位置
RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS="+A 128" #默认65,server线程
另外系统参数需要留有swap空间,及打开文件数rabbitmq启动进程至少需要5万,yum安装时rabbitmq启动,源码安装时root启动
[root@rabbitmq76 rabbitmq]# cat /etc/security/limits.conf
* soft nofile 65536
* hard nofile 131072
* soft nproc 10240
* hard nproc 20480
备注
内存控制:
vm_memory_high_watermark 该值为内存阈值,默认为0.4。意思为物理内存的40%。40%的内存并不是内存的最大的限制,它是一个发布的节制,当达到40%时Erlang会做GC。最坏的情况是使用
内存80%。如果把该值配置为0,将关闭所有的publishing 。
rabbitmqctl set_vm_memory_high_watermark 0
Paging 内存阈值,该值为默认为0.5,该值为vm_memory_high_watermark的20%时,将把内存数据写到磁盘。
如机器内存16G,当RABBITMQ占用内存1.28G(16*0.4*0.2)时把内存数据放到磁盘。
硬盘控制:
当RabbitMQ的磁盘空闲空间小于50M(默认),生产者将被BLOCK,
如果采用集群模式,磁盘节点空闲空间小于50M将导致其他节点的生产者都被block
可以通过disk_free_limit来对进行配置。
#服务器端配置详解
http://www.cnblogs.com/zhen-rh/p/6884297.html
.配置文件
一般情况下,RabbitMQ的默认配置就足够了。如果希望特殊设置的话,有两个途径:
一个是环境变量的配置文件 rabbitmq-env.conf ;
一个是配置信息的配置文件 rabbitmq.config;
注意,这两个文件默认是没有的,如果需要必须自己创建。
rabbitmq-env.conf
这个文件的位置是确定和不能改变的,位于:/etc/rabbitmq目录下(这个目录需要自己创建)。
文件的内容包括了RabbitMQ的一些环境变量,常用的有:
RABBITMQ_NODE_PORT= //端口号
HOSTNAME=
RABBITMQ_NODENAME=mq
RABBITMQ_CONFIG_FILE= //配置文件的路径
RABBITMQ_MNESIA_BASE=/rabbitmq/data //需要使用的MNESIA数据库的路径
RABBITMQ_LOG_BASE=/rabbitmq/log //log的路径
RABBITMQ_PLUGINS_DIR=/rabbitmq/plugins //插件的路径
具体的列表见:http://www.rabbitmq.com/configure.html#define-environment-variables
rabbitmq.config
这是一个标准的erlang配置文件。它必须符合erlang配置文件的标准。
它既有默认的目录,也可以在rabbitmq-env.conf文件中配置。
文件的内容详见:http://www.rabbitmq.com/configure.html#config-items
producer.py
# pip install pika # https://www.cnblogs.com/kerwinC/p/5967584.html import pika credentials = pika.PlainCredentials('admin','admin') connection = pika.BlockingConnection(pika.ConnectionParameters( '192.168.1.250',5672,'/',credentials)) channel = connection.channel() # 声明queue channel.queue_declare(queue='durable',durable=True) channel.basic_publish(exchange='', routing_key='durable', body='Hello cheng!', properties=pika.BasicProperties( delivery_mode=2, # make message persistent ) ) print(" [x] Sent 'Hello cheng!'") connection.close()
consumer.py
import pika credentials = pika.PlainCredentials('admin','admin') connection = pika.BlockingConnection(pika.ConnectionParameters( '192.168.1.250',5672,'/',credentials)) channel = connection.channel() # You may ask why we declare the queue again ‒ we have already declared it in our previous code. # We could avoid that if we were sure that the queue already exists. For example if send.py program # was run before. But we're not yet sure which program to run first. In such cases it's a good # practice to repeat declaring the queue in both programs. channel.queue_declare(queue='durable',durable=True) def callback(ch, method, properties, body): print(" [x] Received %r" % body) ch.basic_ack(delivery_tag=method.delivery_tag) channel.basic_consume(callback, queue='durable', #no_ack=True ) print(' [*] Waiting for messages. To exit press CTRL+C') channel.start_consuming()