一 rabbitmq 生產(chǎn)部署
RabbitMQ 常用的三種自定義服務(wù)器的通用方法:
- 配置文件 rabbitmq.conf
- 環(huán)境變量文件 rabbitmq-env.conf
- 補充配置文件 advanced.config
rabbitmq.conf和rabbitmq-env.conf的位置
- 在二進制安裝中路徑是在 :安裝目錄下的/etc/rabbitmq/
- rpm 安裝: /etc/rabbitmq/
如果rabbitmq.conf和rabbitmq-env.conf 的兩個文件不存在,那么我們可以創(chuàng)建該文件,然后我們可以通過環(huán)境變量
指定該文件的位置。
補充 :
- rabbitmqctl rabbitmqctl 是管理虛擬主機和用戶權(quán)限的工具
- rabbitmq-plugins 是管理插件的工具
1.1 rabbitmq.conf
在rabbitmq 3.7.0 之前,rabbitmq.conf 使用了Erlang語法配置格式,新的版本使用了sysctl 格式.
sysctl 語法:
- 單個信息都在一行里面
- 配置信息以key value 的形式保存。
- ‘#’開頭表示注釋。
配置示例文件:rabbitmq.conf.example
配置屬性和描述(官網(wǎng)鏈接)
屬性 | 描述 | 默認值 |
---|---|---|
listeners | 要監(jiān)聽 AMQP 0-9-1 and AMQP 1.0 的端口 | listeners.tcp.default = 5672 |
num_acceptors.tcp | 接受tcp連接的erlang 進程數(shù) | num_acceptors.tcp = 10 |
handshake_timeout | AMQP 0-9-1 超時時間,也就是最大的連接時間,單位毫秒 | handshake_timeout = 10000 |
listeners.ssl | 啟用TLS的協(xié)議 | 默認值為none |
num_acceptors.ssl | 接受基于TLS協(xié)議的連接的erlang 進程數(shù) | num_acceptors.ssl = 10 |
ssl_options | TLS 配置 | ssl_options =none |
ssl_handshake_timeout | TLS 連接超時時間 單位為毫秒 | ssl_handshake_timeout = 5000 |
vm_memory_high_watermark | 觸發(fā)流量控制的內(nèi)存閾值,可以為相對值(0.5),或者絕對值 vm_memory_high_watermark.relative = 0.6 ,vm_memory_high_watermark.absolute = 2GB | 默認vm_memory_high_watermark.relative = 0.4 |
vm_memory_calculation_strategy | 內(nèi)存使用報告策略,assigned:使用Erlang內(nèi)存分配器統(tǒng)計信息 rss:使用操作系統(tǒng)RSS內(nèi)存報告。這使用特定于操作系統(tǒng)的方法,并可能啟動短期子進程。legacy:使用遺留內(nèi)存報告(運行時認為將使用多少內(nèi)存)。這種策略相當(dāng)不準確。erlang 與legacy一樣 是為了向后兼容 | vm_memory_calculation_strategy = allocated |
vm_memory_high_watermark_paging_ratio | 當(dāng)內(nèi)存的使用達到了50%后,隊列開始將消息分頁到磁盤 | vm_memory_high_watermark_paging_ratio = 0.5 |
total_memory_available_override_value | 該參數(shù)用于指定系統(tǒng)的可用內(nèi)存總量,一般不使用,適用于在容器等一些獲取內(nèi)存實際值不精確的環(huán)境 | 默認未設(shè)置 |
disk_free_limit | Rabbitmq存儲數(shù)據(jù)的可用空間限制,當(dāng)?shù)陀谠撝档臅r候,將觸發(fā)流量限制,設(shè)置可參考vm_memory_high_watermark參數(shù) | disk_free_limit.absolute = 50MB |
log.file.level | 控制記錄日志的等級,有info,error,warning,debug | log.file.level = info |
channel_max | 最大通道數(shù),但不包含協(xié)議中使用的特殊通道號0,設(shè)置為0表示無限制,不建議使用該值,容易出現(xiàn)channel泄漏 | channel_max = 2047 |
channel_operation_timeout | 通道操作超時,單位為毫秒 | channel_operation_timeout = 15000 |
heartbeat | 表示連接參數(shù)協(xié)商期間服務(wù)器建議的心跳超時的值。如果兩端都設(shè)置為0,則禁用心跳,不建議禁用 | heartbeat = 60 |
default_vhost | rabbitmq安裝后啟動創(chuàng)建的虛擬主機 | default_vhost = / |
default_user | 默認創(chuàng)建的用戶名 | default_user = guest |
default_pass | 默認用戶的密碼 | default_pass = guest |
default_user_tags | 默認用戶的標(biāo)簽 | default_user_tags.administrator = true |
default_permissions | 在創(chuàng)建默認用戶是分配給默認用戶的權(quán)限 | default_permissions.configure = .* default_permissions.read = .* default_permissions.write = .* |
loopback_users | 允許通過回環(huán)地址連接到rabbitmq的用戶列表,如果要允許guest用戶遠程連接(不安全)請將該值設(shè)置為none,如果要將一個用戶設(shè)置為僅localhost連接的話,配置loopback_users.username =true(username要替換成用戶名) | loopback_users.guest = true(默認為只能本地連接) |
cluster_formation.classic_config.nodes | 設(shè)置集群節(jié)點cluster_formation.classic_config.nodes.1 = rabbit@hostname1 | |
cluster_formation.classic_config.nodes.2 = rabbit@hostname2 | 默認為空,未設(shè)置 | |
collect_statistics | 統(tǒng)計收集模式,none 不發(fā)出統(tǒng)計信息事件,coarse每個隊列連接都發(fā)送統(tǒng)計一次,fine每發(fā)一條消息的統(tǒng)計數(shù)據(jù) | collect_statistics = none |
collect_statistics_interval | 統(tǒng)計信息收集間隔,以毫秒為單位 | collect_statistics_interval = 5000 |
delegate_count | 用于集群內(nèi)通信的委托進程數(shù)。在多核的服務(wù)器上我們可以增加此值 | delegate_count = 16 |
tcp_listen_options | 默認的套接字選項 | tcp_listen_options.backlog = 128 ….. |
hipe_compile | 設(shè)置為true以使用HiPE預(yù)編譯RabbitMQ的部分,HiPE是Erlang的即時編譯器,啟用HiPE可以提高吞吐量兩位數(shù),但啟動時會延遲幾分鐘。Erlang運行時必須包含HiPE支持。如果不是,啟用此選項將不起作用。HiPE在某些平臺上根本不可用,尤其是Windows。 | hipe_compile = false |
cluster_keepalive_interval | 節(jié)點應(yīng)該多長時間向其他節(jié)點發(fā)送keepalive消息(以毫秒為單位),keepalive的消息丟失不會被視為關(guān)閉 | cluster_keepalive_interval = 10000 |
queue_index_embed_msgs_below | 消息的字節(jié)大小,低于該大小,消息將直接嵌入隊列索引中 bytes | queue_index_embed_msgs_below = 4096 |
mnesia_table_loading_retry_timeout | 等待集群中Mnesia表可用的超時時間,單位毫秒 | mnesia_table_loading_retry_timeout = 30000 |
mnesia_table_loading_retry_limit | 集群啟動時等待Mnesia表的重試次數(shù),不適用于Mnesia升級或節(jié)點刪除。 | mnesia_table_loading_retry_limit = 10 |
mirroring_sync_batch_size | 要在隊列鏡像之間同步的消息的批處理大小 | mirroring_sync_batch_size = 4096 |
queue_master_locator | 隊列主節(jié)點的策略,有三大策略 min-masters,client-local,random | queue_master_locator = client-local |
proxy_protocol | 如果設(shè)置為true ,則連接需要通過反向代理連接,不能直連接 | proxy_protocol = false |
management.listener.port | rabbitmq web管理界面使用的端口 | management.listener.port = 15672 |
查看rabbitmq的有效配置
rabbitmqctl environment
1.2 advanced.config
示例文件
某些配置設(shè)置不可用或難以使用sysctl格式進行配置。因此,可以使用Erlang術(shù)語格式的其他配置文件advanced.config
它將與rabbitmq.conf 文件中提供的配置合并。
配置屬性和描述(官網(wǎng)鏈接)
屬性 | 描述 | 默認值 |
---|---|---|
msg_store_index_module | 設(shè)置隊列索引使用的模塊 | {rabbit,[ {msg_store_index_module,rabbit_msg_store_ets_index} ]} |
backing_queue_module | 隊列內(nèi)容的實現(xiàn)模塊。 | {rabbit,[ {backing_queue_module,rabbit_variable_queue} ]} |
msg_store_file_size_limit | 消息儲存的文件大小,現(xiàn)有的節(jié)點更改是危險的,可能導(dǎo)致數(shù)據(jù)丟失 | 默認值16777216 |
trace_vhosts | 內(nèi)部的tracer使用,不建議更改 | {rabbit,[ {trace_vhosts,[]} ]} |
msg_store_credit_disc_bound | 設(shè)置消息儲存庫給隊列進程的積分,默認一個隊列進程被賦予4000個消息積分 | {rabbit, [{msg_store_credit_disc_bound, {4000, 800}}]} |
queue_index_max_journal_entries | 隊列的索引日志超過該閾值將刷新到磁盤 | {rabbit, [{queue_index_max_journal_entries, 32768}]} |
lazy_queue_explicit_gc_run_operation_threshold | 在內(nèi)存壓力下為延遲隊列設(shè)置的值,該值可以觸發(fā)垃圾回收和減少內(nèi)存使用,降低該值,會降低性能,提高該值,會導(dǎo)致更高的內(nèi)存消耗 | {rabbit,[{lazy_queue_explicit_gc_run_operation_threshold, 1000}]} |
queue_explicit_gc_run_operation_threshold | 在內(nèi)存壓力下,正常隊列設(shè)置的值,該值可以觸發(fā)垃圾回收和減少內(nèi)存使用,降低該值,會降低性能,提高該值,會導(dǎo)致更高的內(nèi)存消耗 | {rabbit, [{queue_explicit_gc_run_operation_threshold, 1000}]} |
1.3 rabbitmq-env.conf
官網(wǎng)鏈接
通過rabbitmq-env.conf 來定義環(huán)境變量
RABBITMQ_NODENAME 指定節(jié)點名稱
屬性 | 描述 | 默認值 |
---|---|---|
RABBITMQ_NODE_IP_ADDRESS | 綁定的網(wǎng)絡(luò)接口 | 默認為空字符串表示綁定本機所有的網(wǎng)絡(luò)接口 |
RABBITMQ_NODE_PORT | 端口 | 默認為5672 |
RABBITMQ_DISTRIBUTION_BUFFER_SIZE | 節(jié)點之間通信連接的數(shù)據(jù)緩沖區(qū)大小 | 默認為128000,該值建議不要使用低于64MB |
RABBITMQ_IO_THREAD_POOL_SIZE | 運行時用于io的線程數(shù) | 建議不要低于32,linux默認為128 ,windows默認為64 |
RABBITMQ_NODENAME | rabbitmq節(jié)點名稱,集群中要注意節(jié)點名稱唯一 | linux 默認節(jié)點名為 rabbit@$hostname |
RABBITMQ_CONFIG_FILE | rabbitmq 的配置文件路徑,注意不要加文件的后綴(.conf) | 默認 $RABBITMQ_HOME/etc/rabbitmq/rabbitmq(二進制安裝) /etc/rabbitmq/rabbitmq(rpm 安裝) |
RABBITMQ_ADVANCED_CONFIG_FILE | advanced.config文件路徑 | 默認 $RABBITMQ_HOME/etc/rabbitmq/advanced(二進制安裝) /etc/rabbitmq/advanced(rpm 安裝) |
RABBITMQ_CONF_ENV_FILE | 環(huán)境變量配置文件路徑 | 默認 $RABBITMQ_HOME/etc/rabbitmq/rabbitmq-env.conf(二進制安裝) /etc/rabbitmq/rabbitmq-env.conf(rpm 安裝) |
RABBITMQ_SERVER_CODE_PATH | 在使用HiPE 模塊時需要使用 | 默認為空 |
RABBITMQ_LOGS | 指定日志文件位置 | 默認為 $RABBITMQ_HOME/etc/var/log/rabbitmq/ |
網(wǎng)絡(luò)設(shè)置 http://www.rabbitmq.com/networking.html
RABBITMQ_DISTRIBUTION_BUFFER_SIZE 節(jié)點間通信緩沖區(qū)大小,默認值 128Mb,節(jié)點流量比較多的集群中,可以提升該值,建議該值不要低于64MB。
tcp 緩存區(qū)大小
下示例將AMQP 0-9-1連接的TCP緩沖區(qū)設(shè)置為192 KiB:
tcp_listen_options.backlog = 128 tcp_listen_options.nodelay = true tcp_listen_options.linger.on = true tcp_listen_options.linger.timeout = 0 tcp_listen_options.sndbuf = 196608 tcp_listen_options.recbuf = 196608
1.4 在生產(chǎn)環(huán)境中不適用的策略。
官網(wǎng)鏈接
- 1.4.1 vhost
在生產(chǎn)中,如果rabbitmq只為單個系統(tǒng)提供服務(wù)的時候,我們使用默認的(/)是可以的。在為多個系統(tǒng)提供的服務(wù)時,我們建議使用單獨的vhost.
- 1.4.2 user
對于生產(chǎn)環(huán)境,請刪除默認用戶(guest),默認用戶只能從localhost 連接。
我們可以創(chuàng)建指定權(quán)限的單獨用戶為每個應(yīng)用提供服務(wù)。對于開啟權(quán)限用戶來說,我們可以使用證書,和源ip地址過濾,和身份驗證。來加強安全性。
- 1.4.3 最大打開文件限制
在生產(chǎn)環(huán)境我們可能需要調(diào)整一些系統(tǒng)的默認限制,以便處理大量的并發(fā)連接和隊列。
需要調(diào)整的值有打開的最大文件數(shù)。在生產(chǎn)環(huán)境為rabbitmq 運行的用戶設(shè)定為65536,但是對于大多數(shù)開發(fā)環(huán)境來說,4096就已經(jīng)足夠了。
查看默認的打開文件的最大數(shù)量。
ulimit -n
更改方式:
- 1 臨時修改
ulimit -n 65536
- 2 永久修改
- 2.1如果是systemed 來進行管理的話我們可以編輯systemed配置文件來進行控制
[service] LimitNOFILE=300000
-
2.2 如果不是systemed 來進行管理的話,我們可以更改rabbitmq的啟動加載的環(huán)境配置文件 rabbitmq-env.conf。在里面開頭添加ulimit -S -n 4096,但該值不能超過系統(tǒng)的默認值的最大值。
ulimit -S -n 4096
-
2.3 系統(tǒng)級別更改
更改配置文件:/etc/security/limits.conf
在文件末尾前面加入rabbitmq(啟動的用戶名) - nofile 65536
如果更改前用戶已經(jīng)登錄的話,需要重新登錄下才能生效。
-
1.4.4 內(nèi)存
當(dāng)rabbitmq 檢測到它使用的內(nèi)存超過系統(tǒng)的40%,它將不會接受任何新的消息,這個值是由參數(shù) vm_memory_high_watermark來控制的,默認值是一個安全的值,修改該值需要注意。 rabbitmq 的至少需要128MB,建議vm_memory_high_watermark 值為 0.4~0..66 ,不要使用大于0.7的值。 -
1.4.5 磁盤
磁盤默認的儲存數(shù)據(jù)閾值是50MB,當(dāng)?shù)陀谠撝档臅r候,將觸發(fā)流量限制。50MB 只適用于開發(fā)環(huán)境,生產(chǎn)環(huán)境需要調(diào)高該值,不然容易由磁盤空間不足導(dǎo)致節(jié)點故障,也可能導(dǎo)致數(shù)據(jù)丟失。在生產(chǎn)環(huán)境中我們設(shè)置的值
- 建議的最小值 {disk_free_limit, {mem_relative, 1.0}}
它是基于mem_relative的值,例如在具有4GB內(nèi)存的rabbitmq主機上,那么該磁盤的閾值就是4G,如果磁盤可用空間低于4G,所有生產(chǎn)者和消息都將拒絕。在允許恢復(fù)發(fā)布之前,通常需要消費者將隊列消息消費完。
- 建議的更安全值 {disk_free_limit, {mem_relative, 1.5}}
在具有4GB內(nèi)存的RabbitMQ節(jié)點上,如果可用磁盤空間低于6GB,則所有新消息都將被阻止,但是如果我們在停止的時候rabbitmq需要儲存4GB的數(shù)據(jù)到磁盤,再下一次啟動的時候,就只有2G空間了。
- 建議的最大值 {disk_free_limit, {mem_relative, 2.0}}
這個是最安全的值,如果你的磁盤有足夠多的空間話,建議設(shè)置該值。但該值容易觸發(fā)警告,因為在具有4GB內(nèi)存的rabbitmq主機上,需要最低空間大于8G,如果你的磁盤空間比較少的話,不建議設(shè)置該值。
-
1.4.6 連接
少使用短連接,使用連接池或者長連接。 - 1.4.7 TLS
建議盡可能使用TLS連接,使用TLS會對傳輸?shù)臄?shù)據(jù)加密,但是對系統(tǒng)的吞吐量產(chǎn)生很大的影響 -
-1.4.8 更改默認端口
我們常用的web界面的端口 15672 和AMQP 0-9-1 協(xié)議端口 5672 ,建議更改,web界面更改,配置參數(shù) management.listener.port ,AMQP 0-9-1 協(xié)議端口配置參數(shù) listeners.tcp.default。