親手安裝RabbitMq 3.7.2 並安裝Trace外掛

weixin_33816946發表於2018-01-12

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

 

相關文章