rabbitmq安裝與測試
阿新 • • 發佈:2019-01-03
1 Erlang舊版解除安裝:cluster叢集中的所有節點的erlang版本和rabbitmq版本必須一致, 否則無法加入clusteron Ubuntu:sudo apt-get purge erlang*on Fedora:sudo yum remove erlang*installed erlang from source:rm -rf {erlang home directory}.2 原始碼安裝Erlangsudo tar -zxvf otp_src_20.1.tar.gzcd otp_src_20.1export ERL_TOP=`pwd`sudo ./configure //ps:預設安裝在 /usr/local/{bin,lib/erlang}sudo makesudo make release_testscd release/tests/test_serversudo $ERL_TOP/bin/erl -s ts install -s ts smoke_test batch -s init stopcd $ERL_TOPsudo make installsudo ln -s /usr/local/lib/erlang/bin/erl /usr/bin/erl //非root使用者也可以訪問瀏覽器開啟檢視test結果: $ERL_TOP/release/tests/test_server/index.html3 安裝rabbitmq二進位制包 sudo xz -d rabbitmq-server-generic-unix-3.6.14.tar.xzsudo tar -xvf rabbitmq-server-generic-unix-3.6.14.tar新增環境變數:sudo vi /etc/profile,最末尾新增,儲存後source /etc/profileRABBITMQ_HOME=/data/project/soft/rabbitmq_server-3.6.14export PATH=${PATH}:${RABBITMQ_HOME}/sbin常用命令:後臺執行:sudo rabbitmq-server -detached停止服務:sudo rabbitmqctl stop啟動/停止應用執行(程序還在,主要用於執行其他變更管理命令如reset):sudo rabbitmqctl stop_appsudo rabbitmqctl start_app查詢狀態:sudo rabbitmqctl status使用者管理: sudo rabbitmqctl add_user admin admin_159753sudo rabbitmqctl delete_user usenamesudo rabbitmqctl change_password usename newpass清除密碼後該使用者將無法登入:sudo rabbitmqctl clear_password usenamesudo rabbitmqctl authenticate_user usename passw設定使用者標籤,可以設定多個,空格分隔 標籤用於控制使用者的管理功能。sudo rabbitmqctl set_user_tags usename administrator啟用管理元件:sudo rabbitmq-plugins enable rabbitmq_management預設guest/guest 使用者只能在localhost登入,需要新建一個使用者,並賦予管理員標籤。刪除預設使用者:sudo rabbitmqctl delete_user guest管理後臺地址:http://ip:15672/修改nodename(vi rabbitmq-env):#Rename the nodeNODENAME='rabbit1'#Config file location and new filename CONFIG_FILE=/data/project/soft/rabbitmq_server-3.6.14/etc/rabbitmq/rabbitmq.config4 同一臺主機啟動多節點(方便測試叢集配置):sudo RABBITMQ_NODE_PORT=5672 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15672}]" RABBITMQ_NODENAME=rabbit1 rabbitmq-server -detachedsudo RABBITMQ_NODE_PORT=5673 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15673}]" RABBITMQ_NODENAME=rabbit2 rabbitmq-server -detachedrabbit2 與rabbit1組成叢集(join_cluster --ram 指定結點型別 為ram,預設為disc,叢集中至少要有一個disc結點):sudo rabbitmqctl -n rabbit2 stop_appsudo rabbitmqctl -n rabbit2 join_cluster [email protected]`hostname -s`sudo rabbitmqctl -n rabbit2 start_apprabbit1脫離叢集:sudo rabbitmqctl -n rabbit1 stop_appsudo rabbitmqctl -n rabbit1 resetsudo rabbitmqctl -n rabbit1 start_app查詢叢集狀態:sudo rabbitmqctl -n rabbit1 cluster_statussudo rabbitmqctl -n rabbit2 cluster_status變更rabbit1 node types為ram:sudo rabbitmqctl -n rabbit1 stop_appsudo rabbitmqctl -n rabbit1 change_cluster_node_type ramsudo rabbitmqctl -n rabbit1 start_app測試環境:4核心 Intel(R) Xeon(R) CPU E5-2630 0 @ 2.30GHz8G記憶體 126G硬碟x86_64 GNU/Linu單機測試資料(100w條20位元組內的文字資料):
叢集測試資料(100w條20位元組內的文字資料):叢集結點 :rabbit1(hello佇列在此結點) rabbit2
結論:單機mq效能最高,當消費者消費的訊息不在當前節點,TPS會下降的30%-50%.叢集主要用於高可用部署以及簡化客戶端接入邏輯。對於追求吞吐量,資料不要求強一致性的業務來說,使用kafka會更適合。要求高可用強一致性的業務,如果業務併發量過大, 可採用按業務分離mq,分散流量。無法拆分的業務,則可以部署多個獨立mq節點,非cluster,通過在mq客戶端做負載均衡,確保每個節點的連線數是均衡的。使用HAproxy可以簡單實現負載,但無法保證所有節點都有合適數量的生產者和消費者。
生產者數量 | 消費者數量 | autoAck | 傳送速率(/s) | 接收速率(/s) | MQ伺服器cpu |
1 | 0 | 1 | 11495 | 0 | 130% |
1 | 1 | 1 | 36230 | 35098 | 280% |
1 | 2 | 1 | 35293 | 17032/個 | 300% |
2 | 1 | 1 | 23932/個 | 47984 | 348% |
1 | 1 | 0 | 20045 | 19,800 | 270% |
1 | 2 | 0 | 19691 | 9,774/個 | 323% |
生產者數量 | 消費者數量 | autoAck | 傳送速率(/s) | 接收速率(/s) | MQ伺服器cpu | 備註 |
1 | 0 | 1 | 13666 | 0 | 130%(rabbit2沒有cpu消耗) | 生產者連線到rabbit1 |
1 | 0 | 1 | 16983 | 0 | 200%(rabbit2高於rabbit1) | 生產者連線到rabbit2 |
1 | 1 | 1 | 19121 | 19,245 | 280% | 生產者連線到rabbit1消費者連線到rabbit2 |
1 | 1 | 1 | 13835 | 13,964 | 160%(相當) | 生產者連線到rabbit2消費者連線到rabbit1 |
1 | 1 | 1 | 14769 | 14,813 | 240%(rabbit2高於rabbit1) | 生產者連線到rabbit2消費者連線到rabbit2 |
1 | 1 | 1 | 36142 | 35980 | 282% | 生產者連線到rabbit1消費者連線到rabbit1 |
1 | 2 | 1 | 29456 | 15408/個 | 300%(rabbit1高) | 生產者連線到rabbit1消費者分別連線到rabbit1 rabbit2 |
1 | 2 | 1 | 35166 | 17809/個 | 320% | 生產者連線到rabbit1消費者全部連線到rabbit1 rabbit1 |
1 | 2 | 1 | 17104 | 8,893/個 | 270%(rabbit2高) | 生產者連線到rabbit2消費者全部連線到rabbit2 |
2 | 2 | 1 | 1791413005 | 1587514768 | 310%(rabbit1高) | 生產者、消費者分別連線到rabbit1、rabbit2 |
關於autoAck引數,如果設定為true,則伺服器傳送之後自動確認,無需等待客戶端確認。這種方式TPS最高,但容易出現訊息丟失。
autoAck設定為false,則訊息不會丟失,客戶端還有可能會收到重複訊息,需要在客戶端做好冪等邏輯。這種情況下,TPS會下降50%