RabbitMQ學習筆記01:初識與安裝

前言

本人是一名運維工程師,在此公司接觸到 RabbitMQ ,平時針對此軟件的工作內容就是集羣的安裝以及配置監控等,對其的理解也僅僅是知道其是一種消息隊列的服務,有隊列,隊列中有消息,結合大學時的知識知道隊列是一種先進先出的數據結構。

有的開發同事告訴我你們運維做到這裏就足夠了,但是這樣就不瞭解什麼是生產者和消費者,以及MQ中具體還有什麼概念,每個概念之間的聯繫是怎樣的。

因此我打算從頭開始,結合官網的 documentation 以及書籍《RabbitMQ 實戰指南》來系統性的學習 RabbitMQ 並做隨筆記錄。

 

版本與生命週期

首先我們需要了解 RabbitMQ 的版本,截至目前(2022-12-28),最新的 release 是3.11.5。版本的選擇要基於版本的生命週期,如下表所示。

3.9系列,我們在實驗環境中就可以拋棄它了。 RabbitMQ的更新迭代還是蠻快的,基本一年1-2個minor版本,我覺得不用強求保持最新(很難保持)。

這裏我們需要注意兩個版本過期支持時間

  • General Support: 指的是來自所有用戶反饋的一般性更新。
  • Extended Support: 指的是來自用戶報告的安全或者比較嚴重的問題的更新,這些用戶報告還得是有付費的商業 license 的報告。

In service for: 指的是這個版本從誕生到 End Of Life(即 End of Extend Support) 一共服役了多久。

關於下個版本何時上線也會在生命週期中闡述,比如 3.12 版本會在2023年的第一季度誕生。

闡述 out of support 的版本。

 

安裝

首先, RabbitMQ 的官網是 https://www.rabbitmq.com/

下載和安裝參考:https://www.rabbitmq.com/download.html

這裏我的 Linux distribution 是 CentOS ,並且出於實驗的目的,我會選擇 CentOS Stream 9

MQ的版本就選擇 3.11.5

Erlang的版本選擇要參考對應的mq的版本的 release 中的要求

This release requires Erlang 25.

也可以參考 RabbitMQ Erlang Version Requirements   

我使用虛擬機來安裝,我的筆記本(同時也是宿主機 host)的操作系統是 Windows 10 家庭中文版。

我的虛擬機軟件是 VirtualBox 7.0.4

這裏需要注意的是網絡這塊,虛擬機的網絡是比較複雜的一部分,爲了使得 vm, host, vm1 and vm2 之間可以互相通信,目前我們直接使用橋接(Bridge)的方式。

RabbitMQ 的官方 yum 源 Cloudsmith and Packagecloud 都掛了,repository 中的 baseurl 都無法打開了,資源都找不到,這塊應該是官方自己的問題,這個問題在2022年10月9日我就發現了,直到2022年12月28日都沒有修復。。。

因此我們只好嘗試 Generic 安裝。Generic 安裝適用於

  • 安裝的過程中無法獲取 root 權限的話(比如用戶無法執行 sudo 等)。
  • 可能需要安裝多個版本的 RabbitMQ 在同一臺服務器上。

在正式安裝MQ前我們需要先安裝 Erlang,因爲 Erlang 的 yum repository 也掛了,因此我們只能研究 install Erlang from source 了。

Erlang/OTP 源碼編譯安裝

Erlang/OTP 下載和源碼編譯安裝

Erlang 的下載速度非常慢,還會中斷,我的PC端有FQ,因此是在PC端事先下載然後使用 rz 上傳至虛擬機中。

cd /usr/local/src
wget https://github.com/erlang/otp/releases/download/OTP-25.2/otp_src_25.2.tar.gz
tar -xzf otp_src_25.2.tar.gz
cd otp_src_25.2/
./configure
make && make install

在編譯的過程中遇到的報錯和解決的方式如下

configure: error: no acceptable C compiler found in $PATH
	yum groupinstall "Development Tools"
configure: error: No curses library functions found
	yum install ncurses-devel

安裝成功後可以使用 erl 測試進入類似交互式的界面,隨後使用 q(). 退出。我們只是確保其可以使用即可。

[root@rabbitmq ~]# erl
Erlang/OTP 25 [erts-13.1.3] [source] [64-bit] [smp:2:2] [ds:2:2:10] [async-threads:1] [jit:ns]

Eshell V13.1.3  (abort with ^G)
1> q().
ok
2>

RabbitMQ Generic 安裝

Generic 版本的,基本就是下載解壓即可使用了。

cd /usr/local/src/
wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.11.5/rabbitmq-server-generic-unix-3.11.5.tar.xz
tar -xf rabbitmq-server-generic-unix-3.11.5.tar.xz
mv rabbitmq_server-3.11.5/ /usr/local/

 

文件和目錄結構說明

從上面可以看出我們將其安裝在了/usr/local/rabbitmq_server-3.11.5其中 sbin 目錄是程序文件,一般可以加入PATH環境變量中。包含以下程序文件。

[root@rabbitmq rabbitmq_server-3.11.5]# ls -l sbin/
total 48
-rwxr-xr-x. 1 root root  855 Dec 14 05:28 rabbitmqctl
-rwxr-xr-x. 1 root root  609 Dec 14 05:28 rabbitmq-defaults
-rwxr-xr-x. 1 root root  864 Dec 14 05:28 rabbitmq-diagnostics
-rwxr-xr-x. 1 root root 7164 Dec 14 05:28 rabbitmq-env
-rwxr-xr-x. 1 root root  860 Dec 14 05:28 rabbitmq-plugins
-rwxr-xr-x. 1 root root  859 Dec 14 05:28 rabbitmq-queues
-rwxr-xr-x. 1 root root 5950 Dec 14 05:28 rabbitmq-server
-rwxr-xr-x. 1 root root  857 Dec 14 05:28 rabbitmq-streams
-rwxr-xr-x. 1 root root  858 Dec 14 05:28 rabbitmq-tanzu
-rwxr-xr-x. 1 root root  860 Dec 14 05:28 rabbitmq-upgrade

這些程序文件的具體用法可以參考 Command Line Tools - RabbitMQ 

關於目錄的結構,可以參考 File and Directory Locations — RabbitMQ ,其中RABBITMQ_BASE就是我們解壓的目錄 /usr/local/rabbitmq_server-3.11.5 對照表格

RABBITMQ_CONFIG_FILE 配置文件是空的,只有目錄沒有文件

[root@rabbitmq rabbitmq_server-3.11.5]# ls -l etc/rabbitmq/
total 0

除了配置文件以外,環境變量也可以用來配置mq。其實環境變量也是寫在一個環境變量的配置文件裏面。這些默認情況下都是沒有的,具體參考 Configuration — RabbitMQ 

RABBITMQ_MNESIA_BASE 這個應該是放置mq數據相關的基礎目錄,也就是說具體的內容是放置在base底下的

[root@rabbitmq rabbitmq_server-3.11.5]# ls -l var/lib/rabbitmq/mnesia/
total 12
drwxr-xr-x. 5 root root 4096 Dec 29 11:08 rabbit@rabbitmq
-rw-r--r--. 1 root root  310 Dec 29 11:05 rabbit@rabbitmq-feature_flags
-rw-r--r--. 1 root root    4 Dec 29 11:08 [email protected]
drwxr-xr-x. 2 root root    6 Dec 29 11:08 rabbit@rabbitmq-plugins-expand

比如 RABBITMQ_MNESIA_DIR 就是在 RABBITMQ_MNESIA_BASE 中以節點名稱命名的目錄,即 rabbit@rabbitmq 是我們的節點名稱。

同時也看到了我們的PID 文件

RABBITMQ_PID_FILE
$RABBITMQ_MNESIA_DIR.pid
/usr/local/rabbitmq_server-3.11.5/var/lib/rabbitmq/mnesia/[email protected]

具體需要時再查閱文檔即可,其中有部分文件/目錄(比如數據文件部分)需要至少啓動一次mq之後纔會出現的。

主機名稱與節點名稱和目錄的關係

我們之前說節點名稱是rabbit@rabbitmq,其中@之後的rabbitmq是我的主機名稱,這裏就需要思考,如果我修改了主機名稱,那麼mq是否還可以啓動?

答案應該是不行的,我的測試方式是啓動mq時使用 rabbitmq 作爲主機名,然後修改主機名爲 rabbitmq-01,隨後嘗試停止實例,就會提示我:

Error: unable to perform an operation on node 'rabbit@rabbitmq-01'. Please see diagnostics information and suggestions below.

接下來我將主機名修改回 rabbitmq 隨後停止實例。

然後將主機名修改爲rabbitmq-01,啓動實例,我們會發現節點名稱變爲了rabbit@rabbitmq-01,然後數據目錄也多出了新節點名稱的目錄。

[root@rabbitmq-01 rabbitmq_server-3.11.5]# ls var/lib/rabbitmq/mnesia/
rabbit@rabbitmq     rabbit@rabbitmq-01-feature_flags  rabbit@rabbitmq-01-plugins-expand  rabbit@rabbitmq-plugins-expand
rabbit@rabbitmq-01  [email protected]            rabbit@rabbitmq-feature_flags

由此可見,主機名稱與節點名稱是強相關的,不要隨意修改!或許,如果有配置文件的話,情況可能會有不同。

後續這臺服務器的主機名稱就保持爲rabbitmq-01不變。

 

運行和管理節點

啓動命令 sbin/rabbitmq-server 這個是前臺啓動,當出現 Starting broker... completed with 0 plugins. 就表示啓動成功了。但是這樣會佔用前臺界面。

我們也可以使用後臺啓動的 detached 模式 ,使用命令rabbitmq-server -detached

如果想要停止的話,使用 sbin/rabbitmqctl shutdown 或者 sbin/rabbitmqctl stop 

可以使用./sbin/rabbitmqctl status./sbin/rabbitmq-diagnostics status來查看節點運行狀態。

 

端口訪問

RabbitMQ 打開TCP端口來監聽來自客戶端或者CLI的連接。有時候這些連接可能會被 SELinux 之類的攔截。

CLI工具、mq客戶端以及mq節點也會打開tcp端口(一般是一些高位數的端口)用於連接服務器。

這些端口大概有以下:

  • 4369: epmd, mq節點和cli工具所使用的一種對等發現服務。
  • 5672, 5671: AMQP 0-9-11.0客戶端所使用的不帶TLS和帶TLS的端口。5672應該是no TLS。這個就是位於mq服務器上被客戶端連接的端口。
  • 25672: 用於節點之間和CLI工具溝通的端口,端口號默認情況下是 amqp 5672 + 20000。一般情況下,這個端口是不建議開放的,除非用於比如說集羣之間使用 federation 或者是 CLI 工具在外部的網絡中執行,具體可以參考 Networking and RabbitMQ — RabbitMQ
  • 35672-25682: 用於節點之間和CLI工具溝通的端口,具體可以參考 Networking and RabbitMQ — RabbitMQ
  • 15672: 這個是當 management 插件啓用之後,通過 web 管理 mq 的 http 端口以及使用rabbitmqadmin命令。
  • 61613, 61614: STOMP 客戶端連接的端口,需要STOMP插件的支持。
  • 1883, 8883: MQTT客戶端連接的端口,需要MQTT插件的支持。
  • 15674: STOMP-over-WebSockets clients,需要 Web STOMP 插件的支持。
  • 15675: MQTT-over-WebSockets clients,需要 Web MQTT 插件的支持。
  • 15692: Prometheus 監控用,需要 Prometheus插件

 

默認的用戶訪問

默認情況下,會存在一個用戶名和密碼均爲guest的僅允許從本地連接的測試用戶。

一般在實際的生產環境中,我們應該將其刪除,然後創建其他賬戶。

rabbitmqctl list_users
rabbitmqctl delete_user "guest"
rabbitmqctl add_user "admin"        # 密碼 123456
rabbitmqctl set_permissions "admin" ".*" ".*" ".*"
rabbitmqctl set_user_tags admin administrator

但是我們出於學習的實驗環境,這個賬戶不能刪除,因爲後面關於mq的使用中,官方提供的示例代碼需要使用到此用戶。

如果沒有對應語言的編程基礎,是很難去修改代碼的。

關於用戶和權限,詳細可以參考 Authentication, Authorisation, Access Control — RabbitMQ 

 

小結

關於mq的第一篇博文暫時理解到這裏即可。

有一些思考:

  • 由於我們沒有辦法通過 yum 安裝 RabbitMQ,因此默認情況下我們就沒有 systemd service unit 文件了,因此生產環境爲了方便管理可能需要自己編寫 unit 文件了。
  • 上述的關於主機名和節點名稱的關係以及配置文件。最好是做到修改 hostname 不會影響 RabbitMQ

後續就準備按照官方的 Getstarted Tutorials 中的7步來繼續學習 RabbitMQ

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章