參考文獻: https://blog.csdn.net/licusliu/article/details/85248192
1.1 名詞解釋
術語和縮寫 |
解釋 |
nameServer |
專門為RocketMQ設計的輕量級名稱服務 |
Producer |
消息生產者,負責生產消息,一般由業務系統負責生產消息 |
Consumer |
消息消費者,負責消費消息,一般是后台系統負責異步消息 |
Broker |
消息中轉角色,負責存儲消息,轉發消息 |
Master |
Broker中的主節點 |
Slave |
Broker中的副節點 |
異步復制 |
消息寫入master節點,再由master節點異步復制到slave節點 |
同步雙寫 |
消息同時寫入master節點和slave節點 |
異步刷盤 |
Broker的一種持久化策略,消息寫入pagecache后,直接返回。由異步線程直接將pagecache寫入硬盤 |
同步刷盤 |
Broker的一種持久化策略,消息寫入pagecache后,由同步線程直接將pagecache寫入硬盤 |
TPS |
每秒發送消息個數 |
1.2 安裝部署
1.2.1 硬件環境
Cpu4核、內存8g
軟件環境
Linux環境
Jdk1.8或以上版本64位
Gradle 3.3或以上
1.2.2 單機部署
1、查看JAVA環境
(1)輸入命令 Java -version
(2)顯示jdk版本,如果jdk版本不低於1.8則繼續下一步,如果低於1.8則需要安裝jdk1.8或以上版本
2、下載rocketmq
可通過命令或者在官網下載:
wget http://mirrors.hust.edu.cn/apache/rocketmq/4.2.0/rocketmq-all-4.2.0-bin-release.zip下載
官網:http://rocketmq.apache.org/dowloading/releases
3、 解壓rocketmq
輸入命令 unzip rocketmq-all-4.6.0-bin-release.zip -d ./rocketmq
可將rocketmq解壓到當前目錄的rocketmq文件夾內
4、創建存儲路徑
mkdir -p ../rocketmq/store/{store,commitlog,consumequeue,index}
5、配置RocketMq環境變量
RockeMq一般部署於非root用戶下,vi /home/${user}/.bash_profile 或 vi /etc/profile,添加如下內容:
export NAMESRV_ADDR=0.0.0.0(內網ip):9876
6、設置broker配置
(1)輸入命令創建配置
vi rocketmq/conf/default-broker.properties 或 vi ../conf/broker.conf
(2)輸入內容
#ip為服務器內網地址,port可自由設置一般為9876 namesrvAddr=ip(內網ip):port; messageIndexSafe=true #是否允許Broker 自動創建。Topic,建議線下開啟,線上關閉 autoCreateTopicEnable=true waitTimeMillsInSendQueue=5000 #發送消息線程池數量 sendMessageThreadPoolNums=64 useReentrantLockWhenPutMessage=true defaultReadQueueNums = 16 defaultWriteQueueNums = 16 #ip設置外網ip,不需要連接外網的話,可以在參數前面加#注釋掉 brokerIP1=ip(外網ip) #默認值為DefaultCluster,可以修改為broker所屬的哪個集群 brokerClusterName=DefaultCluster #原始值為本機主機名,Broker名稱 brokerName=broker-a #BrokerId,必須是大等於 0 的整數,0 表示Master,>0 表示 Slave,一個 Master 可以掛多個 Slave,Master 與 Slave通過 BrokerName 來配對,原始值為0 brokerId=0 deleteWhen=04 fileReservedTime=48 brokerRole=ASYNC_MASTER flushDiskType=ASYNC_FLUSH #port可自由設置,一般設置10911 listenPort=port storePathRootDir=/usr/local/rocketmq/store storePathCommitLog= /usr/local/rocketmq/store/commitlog storePathConsumeQueue=/usr/local/rocketmq/store/consumequeue storePathIndex=/usr/local/rocketmq/store/index
(3)最后按esc鍵,輸入:wq保存配置
(4)實例:我自己本地的配置
namesrvAddr =#.#.#.#:9876 brokerClusterName = DefaultCluster brokerName = broker-a listenPort=10911 brokerId = 0 deleteWhen = 04 fileReservedTime = 48 brokerRole = ASYNC_MASTER flushDiskType = ASYNC_FLUSH storePathRootDir=/opt/usr/rocketmq-4.6/store/store storePathCommitLog= /opt/usr/rocketmq-4.6/store/commitlog storePathConsumeQueue=/opt/usr/rocketmq-4.6/store/consumequeue storePathIndex=/opt/usr/rocketmq-4.6/store/index
7、修改啟動腳本參數,根據自己linux的配置進行調整
vi bin/runbroker.sh JAVA_OPT="${JAVA_OPT} -server -Xms1g -Xmx1g -Xmn512m -XX:PermSize=128m -XX:MaxPermSize=320m" vi bin/runserver.sh JAVA_OPT="${JAVA_OPT} -server -Xms1g -Xmx1g -Xmn512m -XX:PermSize=128m -XX:MaxPermSize=320m"
注意:Xms和Xmx至少是1G 否則啟動不起來 Xmn一般是前者的一半,這邊設置的內存不能大於機器實際的內存,根據實際情況調整
8、啟動NameSrv
nohup sh mqnamesrv >/opt/usr/rocketmq/rocketmq4.6.0/logs/mqnamesrv.log 2>&1 &
9、啟動broker
nohup sh mqbroker -c ../conf/broker.conf >/opt/usr/rocketmq/rocketmq4.6.0/logs/broker.log 2>&1 &
10、停止broker
其中default-broker.properties為上面第5步設置的broker配置文件名
sh mqshutdown broker
11、停止namesrv
sh mqshutdown namesrv
備注:停止這兩個任務時不能用kill,如果用kill的話,重新啟動的話,broker是啟動不了的。
12、驗證
(1)在ROCKETMQ_HOME路徑下執行以下命令模擬Producer發消息:
sh bin/tools.sh org.apache.rocketmq.example.quickstart.Producer
(2)觀察結果:會發出很多條下面的命令,說明發送成功:
(3)在ROCKETMQ_HOME路徑下執行以下命令模擬Consumer發消息:
sh tools.sh org.apache.rocketmq.example.quickstart.Consumer
(4)觀察結果:會收到和上面一樣多的命令,說明接收成功,可證明RocketMQ部署成功。
1.3 安裝過程中遇到的坑
問題一:Failed to obtain the host name
啟動brokerserver任務時,會報以下錯誤:這是由於啟動的時候找不到自己的主機名對應的ip地址而造成的。
解決上述問題只需修改/etc/hosts文件,在該文件中添加本機配置,就可以了
vim /etc/hosts
添加: 內網ip:主機名
問題二:connect to null failed
首先先檢查下namesrvAdrr 是否為空,若為空,則rocketmq沒連接上namesrv的ip地址,查看方式:
sh /bin/mqbroker -m
正常情況下,namesrvAddr=內網ip:9876,報上述錯誤時,namesrvAddr=后面是沒有值的,這種情況下,需檢查rocketmq的配置環境。
vim /etc/profile export NAMESRV_ADDR=0.0.0.0(內網ip):9876 是否已經配置
問題三:connect to <121.41.110.225:10911> failed
配置文件中的內網地址時,測試時能測通。
sh bin/tools.sh org.apache.rocketmq.example.quickstart.Producer
修改為外網地址時,會報上述錯誤
查看防火牆,如果防火牆開啟,則需關閉防火牆,重啟后測試是否能通。若仍不能測通,可能是本服務器的外網ip沒有對外開放,需要找運維開放或自己開放下。
查看防火牆的命令:
CentOS 6 vi /etc/sysconfig/iptables #編輯防火牆配置文件 systemctl status iptables systemctl restart iptables.service #最后重啟防火牆使配置生效 systemctl enable iptables.service #設置防火牆開機啟動
CentOS 7 systemctl status firewalld #查看防火牆是否啟動 systemctl start firewalld #啟動防火牆 systemctl stop firewalld #關閉防火牆 cat /etc/firewalld/zones/public.xml #防火牆文件 firewall-cmd --list-all #防火牆端口list