centos7 rabbitmq集群搭建+高可用


高可用負載均衡架構圖

 

 

 

 

虛擬機環境(所有節點)

環境
[root@node1 ~]# cat /etc/redhat-release
CentOS Linux release 7.1.1503 (Core)
[root@node1 ~]# uname -r 3.10.0-229.el7.x86_64
10.0.0.20 node1 ram節點 (rabbitmq )
10.0.0.21 node2 disc節點 (rabbitmq + haproxy + keepalived )
10.0.0.22 node3 ram節點 (rabbitmq + haproxy + keepalived )

搭建(在所有節點執行)

先搭建好基礎集群

添加EPEL源
[root@node1 ~]# rpm -Uvh https://dl.Fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
添加Erlang
[root@node1 ~]# rpm -Uvh http://packages.erlang-solutions.com/erlang-solutions-1.0-1.noarch.rpm
安裝RabbitMQ
[root@node1 ~]# wget http://www.rabbitmq.com/releases/rabbitmq-server/v3.6.6/rabbitmq-server-3.6.6-1.el7.noarch.rpm
[root@node1 ~]# rpm --import https://www.rabbitmq.com/rabbitmq-signing-key-public.asc
[root@node1 ~]# yum install -y rabbitmq-server-3.6.6-1.el7.noarch.rpm
啟動服務
[root@node1 ~]# systemctl enable rabbitmq-server.service
[root@node1 ~]# systemctl start rabbitmq-server.service
查看服務狀態
[root@node1 ~]# systemctl status rabbitmq-server
查看端口監聽狀態 5672為集群間通信端口,15672為web端管理端口
[root@node1 ~]# netstat -lnutp
查看配置路徑
[root@node1 ~]# cd /var/log/rabbitmq/
[root@node1 rabbitmq]# vim rabbit\@node2.log =INFO REPORT==== 20-Aug-2017::08:03:11
=== Starting RabbitMQ 3.6.12 on Erlang R16B03-1
Copyright (C) 2007-2017 Pivotal Software, Inc.
Licensed under the MPL. See http://www.rabbitmq.com/
=INFO REPORT==== 20-Aug-2017::08:03:11 ===
node : rabbit@node2
home dir : /var/lib/rabbitmq
config file(s) : /etc/rabbitmq/rabbitmq.config (not found)
cookie hash : vNIydXbvZSku+QwtRGImSQ==
log : /var/log/rabbitmq/rabbit@node2.log sasl
log : /var/log/rabbitmq/rabbit@node2-sasl.log database
dir : /var/lib/rabbitmq/mnesia/rabbit@node2
 
根據上面的提示發現沒有 rabbitmq.config 文件,可以自己創建
[root@node1 rabbitmq]# cd /etc/rabbitmq/
[root@node1 rabbitmq]# vim rabbitmq.config
 
編輯內容如下
[{rabbit, [{loopback_users, []}]}].
這里的意思是開放使用,rabbitmq默認創建的用戶guest,密碼也是guest,這個用戶默認只能是本機訪問,localhost或者127.0.0.1,從外部訪問需要添加上面的配置 
保存配置后重啟服務
[root@node1 rabbitmq]# systemctl restart rabbitmq-server
此時就可以從外部訪問了,但此時再看log文件,發現內容還是原來的,還是顯示沒有找到配置文件
[root@node1 rabbitmq]# vim rabbit\@node2.log =INFO REPORT==== 20-Aug-2017::08:03:11 ===
Starting RabbitMQ 3.6.12 on Erlang R16B03-1 Copyright (C) 2007-2017
Pivotal Software, Inc. Licensed under the MPL. See http://www.rabbitmq.com/
=INFO REPORT==== 20-Aug-2017::08:03:11 ===
node : rabbit@node2 home dir : /var/lib/rabbitmq
config file(s) : /etc/rabbitmq/rabbitmq.config (not found)
cookie hash : vNIydXbvZSku+QwtRGImSQ== log : /var/log/rabbitmq/rabbit@node2.log
sasl log : /var/log/rabbitmq/rabbit@node2-sasl.log
database dir : /var/lib/rabbitmq/mnesia/rabbit@node2
 
手動刪除這個文件再重啟服務,不過這不影響使用
[root@node1 rabbitmq]# rm rabbit\@node2.log
[root@node1 rabbitmq]# systemctl restart rabbitmq-server
在此查看log文件,OK了
[root@node1 rabbitmq]# vim rabbit\@node2.log
=INFO REPORT==== 20-Aug-2017::08:26:56 ===
Starting RabbitMQ 3.6.12 on Erlang R16B03-1
Copyright (C) 2007-2017 Pivotal Software, Inc.
Licensed under the MPL. See http://www.rabbitmq.com/
=INFO REPORT==== 20-Aug-2017::08:26:56 ===
node : rabbit@node2 home dir : /var/lib/rabbitmq
config file(s) : /etc/rabbitmq/rabbitmq.config
cookie hash : vNIydXbvZSku+QwtRGImSQ== log : /var/log/rabbitmq/rabbit@node2.log
sasl log : /var/log/rabbitmq/rabbit@node2-sasl.log
database dir : /var/lib/rabbitmq/mnesia/rabbit@node2
 
啟用RabbitMQ Web插件
[root@node1 ~]# rabbitmq-plugins enable rabbitmq_management
關閉Rabbitmq Web管理接口
[root@node1 rabbitmq]# rabbitmq-plugins disable rabbitmq_management
 
RabbitMQ用戶管理
添加用戶為:root ,密碼為:admin)
[root@node1 ~]# rabbitmqctl add_user admin admin
設置用戶角色(設置admin用戶為管理員角色)
[root@node1 ~]# rabbitmqctl set_user_tags admin administrator
設置用戶權限(設置admin用戶配置、寫、讀的權限)
[root@node1 ~]# rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"
刪除用戶(刪除guest用戶)
[root@node1 ~]# rabbitmqctl delete_user guest
如果配置防火牆,開啟端口
[root@node2 rabbitmq]# firewall-cmd --zone=public --add-port=15672/tcp --permanent [root@node2 rabbitmq]# firewall-cmd --reload
在Web輸入服務器IP:端口
http://IP:15672
 
RabbitMQ集群配置
設置hosts解析,所有節點配置相同
[root@node1 ~]# vim /etc/hosts 10.0.0.20 node1 10.0.0.21 node2 10.0.0.22 node3
設置Erlang Cookie
RabbitMQ節點之間和命令行工具 (e.g. rabbitmqctl)是使用Cookie互通的,Cookie是一組隨機的數字+字母的字符串。
當RabbitMQ服務器啟動的時候,Erlang VM會自動創建一個隨機內容的Cookie文件。
如果是通過源安裝RabbitMQ的話,Erlang Cookie 文件在/var/lib/rabbitmq/.erlang.cookie。
如果是通過源碼安裝的RabbitMQ,Erlang Cookie文件$HOME/.erlang.cookie。
 
修改node1改文件的權限
[root@node1 ~]# chmod 777 /var/lib/rabbitmq/.erlang.cookie
然后將文件復制到node2、node3上面
node2
[root@node2 ~]# cd /var/lib/rabbitmq
[root@node2 rabbitmq ~]# chmod 777 .erlang.cookie
[root@node2 rabbitmq ~]# scp -r 10.0.0.20:/var/lib/rabbitmq/.erlang.cookie .
[root@node2 rabbitmq ~]# chmod 400 .erlang.cookie
node3
[root@node3 ~]# cd /var/lib/rabbitmq
[root@node3 rabbitmq ~]# chmod 777 .erlang.cookie
[root@node3 rabbitmq ~]# scp -r 10.0.0.20:/var/lib/rabbitmq/.erlang.cookie .
[root@node3 rabbitmq ~]# chmod 400 .erlang.cookie
 
將node1的文件權限恢復過來
[root@node1 ~]# chmod 400 /var/lib/rabbitmq/.erlang.cookie
 
查看三台機器上的 .erlang.cookie的值是一致的
[root@node1 ~]# cat /var/lib/rabbitmq/.erlang.cookie CAWVPZYTTTUGFZTYNUHG
[root@node2 ~]# cat /var/lib/rabbitmq/.erlang.cookie CAWVPZYTTTUGFZTYNUHG
[root@node3 ~]# cat /var/lib/rabbitmq/.erlang.cookie CAWVPZYTTTUGFZTYNUHG
 
使用detached參數,在后台啟動Rabbit Node,要先停止現有的Rabbitmq-server,再重新在后台執行
node1
[root@node1 ~]# rabbitmqctl stop
[root@node1 ~]# rabbitmq-server -detached
[root@node1 ~]# rabbitmqctl cluster_status
Cluster status of node rabbit@node1 ...
[{nodes,[{disc,[rabbit@node1]}]},
{running_nodes,[rabbit@node1]},
{cluster_name,<<"rabbit@node1">>},
{partitions,[]},
{alarms,[{rabbit@node1,[]}]}]
node2
[root@node2 ~]# rabbitmqctl stop
[root@node2 ~]# rabbitmq-server -detached
[root@node2 ~]# rabbitmqctl cluster_status
Cluster status of node rabbit@node2 ...
[{nodes,[{disc,[rabbit@node2]}]},
{running_nodes,[rabbit@node2]},
{cluster_name,<<"rabbit@node2">>},
{partitions,[]},
{alarms,[{rabbit@node2,[]}]}]
node3
[root@node2 ~]# rabbitmqctl stop
[root@node2 ~]# rabbitmq-server -detached
[root@node2 ~]# rabbitmqctl cluster_status
Cluster status of node rabbit@node2 ...
[{nodes,[{disc,[rabbit@node2]}]},
{running_nodes,[rabbit@node2]},
{cluster_name,<<"rabbit@node2">>},
{partitions,[]},
{alarms,[{rabbit@node2,[]}]}]
 
將node1、node2、node3組成集群
因為rabbitmq-server啟動時,會一起啟動節點和應用,它預先設置RabbitMQ應用為standalone模式。
要將一個節點加入到現有的集群中,你需要停止這個應用並將節點設置為原始狀態,然后就為加入集群准備好了。
如果使用./rabbitmqctl stop,應用和節點都將被關閉。所以使用rabbitmqctl stop_app僅僅關閉應用
node1
[root@node1 ~]# rabbitmqctl stop_app Stopping node rabbit@node1 ...
[root@node1 ~]# rabbitmqctl join_cluster --rm rabbit@node2 Clustering node rabbit@node2 with rabbit@node1 ...
[root@node1 ~]# rabbitmqctl start_app Starting node rabbit@node2 ...
 
node3
[root@node3 ~]# rabbitmqctl stop_app Stopping node rabbit@node3 ...
[root@node3 ~]# rabbitmqctl join_cluster --rm rabbit@node2 Clustering node rabbit@node3 with rabbit@node1 ...
[root@node3 ~]# rabbitmqctl start_app Starting node rabbit@node3 ...
 
此時 node1 與 node3 也會自動建立連接
如果要使用內存節點,則可以使用以下命令
[root@node2 ~]# rabbitmqctl join_cluster --ram rabbit@node1
集群配置好后,可以在 RabbitMQ 任意節點上執行 rabbitmqctl cluster_status 來查看是否集群配置成功
[root@node1 ~]# rabbitmqctl cluster_status
Cluster status of node rabbit@node1 ...
[{nodes,[{disc,[rabbit@node2]},{{ram,[rabbit@node1,rabbit@node3]}]},
{running_nodes,[rabbit@node1,rabbit@node2,rabbit@node3]},
{cluster_name,<<"rabbit@node1">>},
{partitions,[]},
{alarms,[{rabbit@node1,[]},{rabbit@node2,[]},{rabbit@node3,[]}]}]
 
RabbitMQ鏡像功能(所有節點執行)
 
設置policy,以所有隊列被鏡像到集群其他所有節點,一個節點掛掉然后重啟后會自動同步隊列消息(我們生產環境采用這個方式)
[root@node1 ~]# rabbitmqctl set_policy ha-all-queue "^" '{"ha-mode":"all","ha-sync-mode":"automatic"}'
 
安裝軟件負載均衡器HAProxy(node3相同操作)
安裝haproxy
[root@node2 ~]# yum install -y haproxy
安裝完以后,配置文件的目錄在/etc/haproxy/haproxy.cfg,以下是我修改后的配置文件
[root@node2 ~]# cd /etc/haproxy/
[root@node2 haproxy]# vim haproxy.cfg
###########全局配置#########
global
  log /dev/log local0
  log /dev/log local1 notice
# chroot /var/lib/haproxy
# 改變當前工作目錄
# stats socket /run/haproxy/admin.sock mode 660 level admin                  # 創建監控所用的套接字目錄
# stats socket /var/lib/haproxy/stats
  pidfile /var/run/haproxy.pid                          # haproxy的pid存放路徑,啟動進程的用戶必須有權限訪問此文件
  maxconn 4000                                           # 最大連接數,默認4000
  user haproxy                                            # 默認用戶
  group haproxy                                        # 默認用戶組
  daemon                                                 # 創建1個進程進入deamon模式運行。此參數要求將運行模式設置為"daemon
 
 
###########默認配置#########
defaults
   log global
   mode http
# option dontlognull
   option httplog
   timeout connect 5000                 # 連接超時時間
   timeout client 50000                  # 客戶端連接超時時間
   timeout server 50000              # 服務器端連接超時時間
   option httpclose                     # 每次請求完畢后主動關閉http通道
   option httplog                        # 日志類別http日志格式
   option forwardfor                 # 如果后端服務器需要獲得客戶端真實ip需要配置的參數,可以從Http Header中獲得客戶端ip
   option redispatch               # serverId對應的服務器掛掉后,強制定向到其他健康的服務器
   timeout connect 10000      # default 10 second timeout if a backend is not found
   maxconn 60000                # 最大連接數
   retries 3                           # 3次連接失敗就認為服務不可用,也可以通過后面設置
#     errorfile 400 /etc/haproxy/errors/400.http
#     errorfile 403 /etc/haproxy/errors/403.http
#     errorfile 408 /etc/haproxy/errors/408.http
#     errorfile 500 /etc/haproxy/errors/500.http
#     errorfile 502 /etc/haproxy/errors/502.http
#     errorfile 503 /etc/haproxy/errors/503.http
#     errorfile 504 /etc/haproxy/errors/504.http
 
####################################################################
 
listen http_front bind 0.0.0.0:1080                #監聽端口
stats refresh 30s                            #統計頁面自動刷新時間
stats uri /haproxy?stats                  #統計頁面url
stats realm Haproxy Manager         #統計頁面密碼框上提示文本
stats auth admin:admin                  #統計頁面用戶名和密碼設置
#stats hide-version                        #隱藏統計頁面上HAProxy的版本信息
 
#####################我把RabbitMQ的管理界面也放在HAProxy后面了
 
###############################
listen rabbitmq_admin
    bind 0.0.0.0:15672
    server node1 10.0.0.20:15672 
    server node2 10.0.0.21:15672
    server node3 10.0.0.22:15672
####################################################################
 
listen rabbitmq_cluster
    bind 0.0.0.0:5672
    option tcplog
    mode tcp
    timeout client 3h
    timeout server 3h
    option clitcpka
    balance roundrobin                             #負載均衡算法(#banlance roundrobin 輪詢,balance source 保存session值,支持static-rr,leastconn,first,uri等參數)
    #balance url_param userid
    #balance url_param session_id check_post 64
    #balance hdr(User-Agent)
    #balance hdr(host)
    #balance hdr(Host) use_domain_only
    #balance rdp-cookie
    #balance leastconn
    #balance source //ip
    server node1 10.0.0.20:5672 check inter 5s rise 2 fall 3
    #check inter 2000 是檢測心跳頻率,rise 2是2次正確認為服務器可用,fall 3是3次失敗認為服務器不可用
    server node2 10.0.0.21:5672 check inter 5s rise 2 fall 3
    server node3 10.0.0.22:5672 check inter 5s rise 2 fall 3
啟動
[root@node2 ~]# systemctl haproxy start
關閉
[root@node2 ~]# service haproxy stop
重啟
[root@node2 ~]# service haproxy restart
加入開機啟動
[root@node2 ~]# systemctl enable haproxy
查看開機啟動的程序
[root@node2 ~]# ls /etc/systemd/system/multi-user.target.wants/
Web訪問
http://10.0.0.21:1080/haproxy?stats
 
配置Haproxy增加日志記錄功能(node3相同操作)
創建日志文件/var/log/haproxy/haproxy.log
[root@node2 ~]# cd /var/log/
[root@node2 log]# mkdir haproxy
[root@node2 log]# cd haproxy
[root@node2 haproxy]# touch haproxy.log
[root@node2 haproxy]# chmod a+w haproxy.log
 
開啟rsyslog的haproxy日志記錄功能,編輯/etc/rsyslog.conf文件,將下列兩句開頭的 # 注釋去掉
[root@node2 ~]# vim /etc/rsyslog.conf
#$ModLoad imudp
#$UDPServerRun 514
$ModLoad imudp
$UDPServerRun 514
# Save boot messages also to boot.log
local7.*                       /var/log/boot.log
之后添加
# Save haproxy log
local0.*                     /var/log/haproxy/haproxy.log
 
修改/etc/sysconfig/rsyslog 文件
[root@node2 ~]# vim /etc/sysconfig/rsyslog
SYSLOGD_OPTIONS=""
改為
SYSLOGD_OPTIONS="-r -m 0 -c 2"
修改/etc/haproxy/haproxy.cfg文件,在global區段添加
log          127.0.0.1 local0
 
重啟rsyslog和haproxy服務
[root@node2 ~]# service haproxy restart
[root@node2 ~]# service rsyslog restart
查看日志
[root@node2 ~]# tail -f /var/log/haproxy/haproxy.log
 
安裝keepalived(node3相同操作 keepalived.conf 配置不同)
 
安裝
[root@node2 ~]# yum -y install keepalived
查看版本
[root@node2 ~]# keepalived -v
配置 keepalived.conf (10.0.0.21)
[root@node2 ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
    notification_email {
    acassen@firewall.loc
    failover@firewall.loc
    sysadmin@firewall.loc
}
    notification_email_from Alexandre.Cassen@firewall.loc
    smtp_server 192.168.200.1
    smtp_connect_timeout 30
    router_id rabbitmq                            #集群名稱,相同集群名稱必須相同
}
 
vrrp_instance VI_1 {
    state MASTER        #主從設置,這里設置為主
    interface eth0 virtual_router_id 51
    priority 150                  #定義訪問優先級,數值越大優先級越高
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
}
    virtual_ipaddress {
        10.0.0.30                     #置虛擬IP,需在相同網段
    }
}
 
配置 10.0.0.22(備)
[root@node4 ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
 
global_defs {
    notification_email {
    acassen@firewall.loc
    failover@firewall.loc
    sysadmin@firewall.loc
}
    notification_email_from Alexandre.Cassen@firewall.loc
    smtp_server 192.168.200.1
    smtp_connect_timeout 30 router_id rabbitmq                           #集群名稱,必須和web01設置相同
}
vrrp_instance VI_1 {
    state BACKUP                  #主從設置,這里設置為從
    interface eth0
    virtual_router_id 51
    priority 100               #定義訪問優先級,從要比主的數值小
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.0.0.30 #設置虛擬IP,必須相同
    }
}
 
重啟服務查看node2(10.0.0.21)網卡上是否有 10.0.0.30 IP
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:e6:36:7b brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.21/24 brd 10.0.0.255 scope global eth0
        valid_lft forever preferred_lft forever
    inet 10.0.0.30/32 scope global eth0
而此是node3(10.0.0.22)的網卡上是沒有10.0.0.30 IP
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:15:ba:84 brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.22/24 brd 10.0.0.255 scope global eth0
    valid_lft forever preferred_lft forever
可以關閉node2(10.0.0.21)的keepalived 服務,查看IP是否轉移到了node3(10.0.0.22)上
node2(10.0.0.21)上已經沒有了10.0.0.30
[root@node1 ~]# systemctl stop keepalived
 
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:e6:36:7b brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.21/24 brd 10.0.0.255 scope global eth0
    valid_lft forever preferred_lft forever
 
查看node3(10.0.0.22)
 
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:15:ba:84 brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.22/24 brd 10.0.0.255 scope global eth0
        valid_lft forever preferred_lft forever
    inet 10.0.0.30/32 scope global eth0
        valid_lft forever preferred_lft forever
 
此時10.0.0.30 已經轉移到了 10.0.0.22上
啟動keepalived即可,10.0.0.30是對外提供的統一地址。
通過10.0.0.30:5672就可以訪問rabbitmq服務
注意:keepalived可能運行多個實例,比如redis和haproxy共存,在這種情況下,必須注意幾點:
 
一、VIP必須各實例不同
二、virtual_router_id必須各實例不同
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM