===============================================================================================
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()