安装Rabbit MQ集群操作过程
一、创建一台单机MQ
先是以最小化功能安装一个CentOS7虚拟机,配置好网络。
在root权限下,试着直接yum install erlang,自然没有找到。按照说明文档,在/etc/yum.repos.d目录下,创建一个文件,rabbitmq.repo。
vi /etc/yum.repos.d/rabbitmq.repo
[rabbitmq_erlang]
name=rabbitmq_erlang
baseurl=https://packagecloud.io/rabbitmq/erlang/el/7/$basearch
repo_gpgcheck=1
gpgcheck=0
enabled=1
gpgkey=https://packagecloud.io/rabbitmq/erlang/gpgkey
sslverify=1
sslcacert=/etc/pki/tls/certs/ca-bundle.crt
metadata_expire=300
[rabbitmq_erlang-source]
name=rabbitmq_erlang-source
baseurl=https://packagecloud.io/rabbitmq/erlang/el/7/SRPMS
repo_gpgcheck=1
gpgcheck=0
enabled=1
gpgkey=https://packagecloud.io/rabbitmq/erlang/gpgkey
sslverify=1
sslcacert=/etc/pki/tls/certs/ca-bundle.crt
metadata_expire=300
然后再用yum install erlang,就可以了。试着运行erl,能看到Eshell。
仍是按说明文档,试图安装rabbitmq Server却不成功,我是先安装秘钥
rpm --import https://github.com/rabbitmq/signing-keys/releases/download/2.0/rabbitmq-release-signing-key.asc
再在刚才的rabbitmq.repo中,增加一个段
[bintray-rabbitmq-server]
name=bintray-rabbitmq-rpm baseurl=https://dl.bintray.com/rabbitmq/rpm/rabbitmq-server/v3.7.x/el/7/
gpgcheck=0
repo_gpgcheck=0
enabled=1
然后试图Yum安装
yum install rabbitmq-server-3.7.17-1.el7.noarch.rpm
却不成功。
只好直接下载rpm文件到本地,然后用WinSCP传到服务器上。 然后在当前目录下运行
rpm -ivh rabbitmq-server-3.7.17-1.el7.noarch.rpm
提示需要socat 直接用yum install socat,可安装。
完成后,再运行上述文件,很快就安装成功
注册成系统启动
chkconfig rabbitmq-server on
用命令行可使其启动或停止
/sbin/service rabbitmq-server start
/sbin/service rabbitmq-server stop
也可以用下面的命令看运行状态
/sbin/service rabbitmq-server status
或
/sbin/rabbitmqctl status
用下面命令打开Web管理界面
/sbin/rabbitmq-plugins enable rabbitmq_management
查看插件列表可用 rabbitmq-plugins list
这时用http://192.168.11.191:15672,还是不能访问,这是因为防火墙的原因,先看一下防火墙的状态
firewall-cmd –state
然后用 systemctl stop firewalld
这是实时关闭,重启后又会恢复。
用 systemctl disable firewalld 是重启后也关闭。
增加用户,因为guest只能本地访问
rabbitmqctl add_user admin passwd
设置角色:
rabbitmqctl set_user_tags admin administrator
设置默认vhost(”/”)访问权限
rabbitmqctl set_permissions -p “/” admin “.” “.” “.*”
在本地查看用户命令是
rabbitmqctl list_users
当然,最好在创建好新用户后,将原来的guest用户删除。现在是状态是MQ基本上已经安装好了,可以试一试各个管理命令了。这篇文章里有一些关于管理命令的有用的说明
二、准备集群
看文档,rabbitMQ的集群有三种模式:clustering, Federation, 和使用Shovel插件。
clustering是传统的集群方式,就是多台节点两两互联,对外而言,只有一个接口,多节点之间通过erlang之间的网络协议互相通信,在同一数据中心,在网络通信可以保证的情况下,使用这种模式比较高效,多节点之间,同步元数据,如果消息不在本节点上,则通过元数据查找到消息所在节点。看起来有一个问题,一旦一个节点宕机,可能会有消息丢失。但是,它还有一个消息镜像的功能,看来没有问题了。
Federation正如其名“联盟”一样,是多个独立的MQ服务器,通过协议接收对方的消息队列,它主要用在广域网中。
Shovel(铲子)和Federation的功能类似,但它的级别更低,Federation还可以看作是做消息同步,而Shovel可以简单地认为是两个rabbitMQ之间的消息消费关系。
这样的话,我们要做的集群,只是能clustering,为了更安全,可以考虑牺牲部分效率,做一个消息镜像。
按上文要求,要做clustering,必须相同版本的MQ和erlang。
在另一台虚拟上,按第一部分的步骤安装RabbitMQ。保证erlang和MQ的版本一致。
要做集群时,发现我在安装CentOS时,直接用的机器名是localhost,这样就分不清节点了,先修改服务器的hostname
hostnamectl set-hostname mq01.xb969.com
然后vi /etc/hosts
在127.0.0.1行最后加上一个 mq01.xb969.com
我试着用rabbitmqctl stop_app,然后rabbitmqctl start_app,但在再用Web登录后,Cluster name仍没有变化,于是在Web页面修改了Cluster name。
在另一台上也这样修改了。
试着用rabbitmqctl status查看状态时却出现下面的提示
[root@mq01 ~]# rabbitmqctl start_app
Starting node rabbit@mq01 ...
Error: unable to perform an operation on node 'rabbit@mq01'. Please see diagnostics information and suggestions below.
Most common reasons for this are:
* Target node is unreachable (e.g. due to hostname resolution, TCP connection or firewall issues)
* CLI tool fails to authenticate with the server (e.g. due to CLI tool's Erlang cookie not matching that of the server)
* Target node is not running
In addition to the diagnostics info below:
* See the CLI, clustering and networking guides on https://rabbitmq.com/documentation.html to learn more
* Consult server logs on node rabbit@mq01
* If target node is configured to use long node names, don't forget to use --longnames with CLI tools
DIAGNOSTICS
===========
attempted to contact: [rabbit@mq01]
rabbit@mq01:
* connected to epmd (port 4369) on mq01
* epmd reports node 'rabbit' uses port 25672 for inter-node and CLI tool traffic
* can't establish TCP connection to the target node, reason: timeout (timed out)
* suggestion: check if host 'mq01' resolves, is reachable and ports 25672, 4369 are not blocked by firewall
Current node details:
* node name: 'rabbitmqcli-17902-rabbit@mq01'
* effective user's home directory: /var/lib/rabbitmq
* Erlang cookie hash: Bc+Vr8CsA92g480nT5lY/g==
在网上搜了一会,按说明,将/var/lib/rabbitmq下面的mnesia删除,重启,后发现它重建了一个目录,但是用rabbitmqctl status仍无法联接,但是用/sbin/service rabbitmq-server status却能看到它已经启动了。用Web访问,能看到登录界面,却显示用户名密码错误。看起来是权限问题。但是找不到原因。
我突然想到,是不是我的hostname问题,我设成mq01.xb969.com,而本机上dns其实是能找到xb969.com的解析的,这样就出现了mq01.xb969.com不能指向本机了。
于是,我重新修改了hostname。
hostnamectl set-hostname mq01,
这次没有域名了,只有mq01。然后用rabbitmqctl status,能看到正常的信息了。用admin也能登录Web页面,不过,右上角的cluster name又回到了rabbitmq@localhost,我将其修改成rabbitmq@mq01。
相同地,在mq02上也做了一遍,重启后,会创建新的目录和数据库,这时,原来加上的用户就不能用了,只有再创建一遍,Web才能管理
rabbitmqctl add_user admin passwd
rabbitmqctl set_user_tags admin administrator
rabbitmqctl set_permissions -p "/" admin "." "." ".*"
做集群前,先要做两件事
1)将主节点上,/var/lib/rabbitmq目录下,隐藏的文件.erlang.cookie拷下来,我用winscp,拷到本地,然后再覆盖到mq02上,拷好后,要确定文件的所有者和权限 和mq01上的相同(用winscp可以方便地点右键修改)。
2)在所有节点,编辑hosts文件,让mq01、mq02等能正确映射。
做好后,可能 要重启一下服务。
然后在mq02上执行下面的命令,相当于将mq02加到mq01为主节点的集群中。
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster rabbit@mq01
rabbitmqctl start_app
上面第一、二行,就是将消息队列复位一下,第三行是加入,第四行相当于同步消息了。
然后可以用
rabbitmqctl cluster_status
看集群的消息。
在两台机器上看到的内容应该是相同的,而在web界面上也能看到有2个node了。
理论上说,集群就做好,如果在前面加一个SLB,就直接向客户端暴露使用就行了。
下一步就是,将节点修改成内存或磁盘模式之类的配置管理了。
感觉拷cookie文件这个动作很Low,为什么不能在join命令时自动完成呢?
三、在阿里云上实践
1、预配置
在阿里云上买一个ECS,2vCPU/4G,选择经典网络,购买后将hostname修改成rabbitMQ01。
adduser admin
passwd admin
vi /etc/sudoers
在sudoers文件中,
在root ALL=(ALL) ALL这行下增加一行
admin ALL=(ALL) ALL
:w!
:q
退出
这么做的目的是以后在当前用户下,直接加上sudo,就能使用root权限 ,当然,如果不怕麻烦,su切换一下,也是一样,就不需要增加这一行了。
然后
vi /etc/ssh/sshd_config
找到PermitRootLogin yes这一行, 将yes修改成no。这样就不能用root登录了。
2、安装erlang
重新登录后,su到root权限
yum install erlang
直接能安装,但是用erl命令看一下,版本好像不对啊,R16B03-1(erts-5.10.4),而Eshell v5.10.4,而我自己安装的是Erlang/OTP 22 [erts-10.4.4],Eshell V10.4.4 。好吧,用yum remove erlang删除这个包。
先到官网下载源代码
wget http://erlang.org/download/otp_src_22.0.tar.gz
根据阿里云的帮助文档,为了能正确编译源代码,还要安装依赖包
yum -y install make gcc gcc-c++ m4 ncurses-devel openssl-devel unixODBC-devel
mkdir /usr/local/erlang
cd otp_src_22.0
./configure --prefix=/usr/local/erlang --without-javac
make && make install
满屏滚动后,一切停止了,也不知道是否成功,最后几行没有出现error,就算它没问题吧。
试着运行erl,发现版本还是原来的R16B03,难道原来的yum remove命令没有起作用?进入目录/usr/local/erlang/bin,运行./erl,才显示Erlang/OTP 22,Eshell v10.4。这就尴尬了。
重新试一下,这次用
sudo yum remove erlang-*
完成后再输入erl,显示没有如此文件了,而再进入/usr/local/erlang/bin目录运行,也能进入正确版本了。
再按说明文档继续配置路径什么的
vi /etc/profile,在最后加上export PATH=$PATH:/usr/local/erlang/bin,这一步,我原来没有提权,结果是能打开文件,但保存时提示一直找不到文件。su后才能执行。
执行source /etc/profile,使配置生效。再用erl -version能看到版本对头了。
3、安装rabbitMQ
先下载rpm包,再导入签名密钥,然后运行安装
wget -P /root "https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.7.17/rabbitmq-server-3.7.17-1.el7.noarch.rpm"
rpm --import https://github.com/rabbitmq/signing-keys/releases/download/2.0/rabbitmq-release-signing-key.asc
[root@rabbitMQ01 ~]#cd /root
[root@rabbitMQ01 ~]# yum install rabbitmq-server-3.7.17-1.el7.noarch.rpm
出现下面的错误
Error: Package: rabbitmq-server-3.7.17-1.el7.noarch (/rabbitmq-server-3.7.17-1.el7.noarch)
Requires: erlang >= 20.3
Available: erlang-R16B-03.18.el7.x86_64 (epel)
erlang = R16B-03.18.el7
而我确定已经安装了otp/22啊,在这篇文章里有一个解释,就是用yum安装时,它会检查仓库中的依赖库,而系统中自带的仓库中erlang的版本比较低,就是我原来用yum安装时的R16B,所以它会有提醒,那篇文章也有一个解决方案,就是将系统仓库更新。具体是创建一个新的repo文件,(vi/etc/yum.repos.d/rabbitmq-erlang.repo)将其中的baseurl指向的版本达到要求,然后先后运行yum clean all 、yum makecache后再用yum安装。
既然我已经知道了原因,就用另一个文章中介绍的方法来硬装。
先安装socat,然后用rpm指定不检查依赖库的方式来硬装
yum install socat
rpm -ivh --nodeps rabbitmq-server-3.7.17-1.el7.noarch.rpm
再回到阿里云的部署教程,先允许RabbitMQ开机自启动,再启动RabbitMQ
sudo systemctl enable rabbitmq-server
sudo systemctl start rabbitmq-server
可惜,仍然不行:
[root@rabbitMQ01 lib]# systemctl start rabbitmq-server
Job for rabbitmq-server.service failed because the control process exited with error code. See "systemctl status rabbitmq-server.service" and "journalctl -xe" for details.
[root@rabbitMQ01 sbin]# rabbitmqctl status
Error: unable to perform an operation on node 'rabbit@rabbitMQ01'. Please see diagnostics information and suggestions below.
Most common reasons for this are:
* Target node is unreachable (e.g. due to hostname resolution, TCP connection or firewall issues)
* CLI tool fails to authenticate with the server (e.g. due to CLI tool's Erlang cookie not matching that of the server)
* Target node is not running
In addition to the diagnostics info below:
* See the CLI, clustering and networking guides on https://rabbitmq.com/documentation.html to learn more
* Consult server logs on node rabbit@rabbitMQ01
* If target node is configured to use long node names, don't forget to use --longnames with CLI tools
DIAGNOSTICS
===========
attempted to contact: [rabbit@rabbitMQ01]
rabbit@rabbitMQ01:
* connected to epmd (port 4369) on rabbitMQ01
* epmd reports: node 'rabbit' not running at all
no other nodes on rabbitMQ01
* suggestion: start the node
Current node details:
* node name: 'rabbitmqcli-31110-rabbit@rabbitMQ01'
* effective user's home directory: /var/lib/rabbitmq
* Erlang cookie hash: s8t0hQx4j6UrLJXrHl7BNw==
按提示找问题
[root@rabbitMQ01 etc]# systemctl status rabbitmq-server.service
● rabbitmq-server.service - RabbitMQ broker
Loaded: loaded (/usr/lib/systemd/system/rabbitmq-server.service; enabled; vendor preset: disabled)
Active: activating (auto-restart) (Result: exit-code) since Thu 2019-09-12 15:37:49 CST; 3s ago
Process: 28891 ExecStop=/usr/sbin/rabbitmqctl shutdown (code=exited, status=127)
Process: 28717 ExecStart=/usr/sbin/rabbitmq-server (code=exited, status=127)
Main PID: 28717 (code=exited, status=127)
Sep 12 15:37:49 rabbitMQ01 systemd[1]: Failed to start RabbitMQ broker.
Sep 12 15:37:49 rabbitMQ01 systemd[1]: Unit rabbitmq-server.service entered failed state.
Sep 12 15:37:49 rabbitMQ01 systemd[1]: rabbitmq-server.service failed.
[root@rabbitMQ01 etc]# journalctl -xe
--
-- The result is failed.
Sep 12 15:38:50 rabbitMQ01 systemd[1]: Unit rabbitmq-server.service entered failed state.
Sep 12 15:38:50 rabbitMQ01 systemd[1]: rabbitmq-server.service failed.
Sep 12 15:39:00 rabbitMQ01 systemd[1]: rabbitmq-server.service holdoff time over, scheduling restart.
Sep 12 15:39:00 rabbitMQ01 systemd[1]: Starting RabbitMQ broker...
-- Subject: Unit rabbitmq-server.service has begun start-up
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Unit rabbitmq-server.service has begun starting up.
Sep 12 15:39:00 rabbitMQ01 rabbitmq-server[30517]: /usr/lib/rabbitmq/bin/rabbitmq-server: line 187: erl: command not found
Sep 12 15:39:00 rabbitMQ01 systemd[1]: rabbitmq-server.service: main process exited, code=exited, status=127/n/a
Sep 12 15:39:00 rabbitMQ01 rabbitmqctl[30691]: /usr/lib/rabbitmq/bin/rabbitmq-env: line 428: exec: erl: not found
Sep 12 15:39:00 rabbitMQ01 systemd[1]: rabbitmq-server.service: control process exited, code=exited status=127
Sep 12 15:39:00 rabbitMQ01 systemd[1]: Failed to start RabbitMQ broker.
-- Subject: Unit rabbitmq-server.service has failed
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Unit rabbitmq-server.service has failed.
--
-- The result is failed.
Sep 12 15:39:00 rabbitMQ01 systemd[1]: Unit rabbitmq-server.service entered failed state.
Sep 12 15:39:00 rabbitMQ01 systemd[1]: rabbitmq-server.service failed.
Sep 12 15:39:10 rabbitMQ01 systemd[1]: rabbitmq-server.service holdoff time over, scheduling restart.
Sep 12 15:39:10 rabbitMQ01 systemd[1]: Starting RabbitMQ broker...
-- Subject: Unit rabbitmq-server.service has begun start-up
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Unit rabbitmq-server.service has begun starting up.
Sep 12 15:39:11 rabbitMQ01 rabbitmq-server[30774]: /usr/lib/rabbitmq/bin/rabbitmq-server: line 187: erl: command not found
Sep 12 15:39:11 rabbitMQ01 systemd[1]: rabbitmq-server.service: main process exited, code=exited, status=127/n/a
Sep 12 15:39:11 rabbitMQ01 rabbitmqctl[30947]: /usr/lib/rabbitmq/bin/rabbitmq-env: line 428: exec: erl: not found
Sep 12 15:39:11 rabbitMQ01 systemd[1]: rabbitmq-server.service: control process exited, code=exited status=127
Sep 12 15:39:11 rabbitMQ01 systemd[1]: Failed to start RabbitMQ broker.
-- Subject: Unit rabbitmq-server.service has failed
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Unit rabbitmq-server.service has failed.
--
-- The result is failed.
Sep 12 15:39:11 rabbitMQ01 systemd[1]: Unit rabbitmq-server.service entered failed state.
Sep 12 15:39:11 rabbitMQ01 systemd[1]: rabbitmq-server.service failed.
lines 2283-2328/2328 (END)
重启后,用sudo rabbitmqctl status,这次直接出现:
/usr/lib/rabbitmq/bin/rabbitmq-env: line 428: exec: erl: not found
用这行关键词来搜索,有人说是路径问题,我想,可能和我的硬装有关,决定先删除,重装,用yum来安装,保证各种依赖问题。在/etc/yum.repos.d目录下增加一个rabbit-earlang.repo文件,加上下面的一段
[rabbitmq-erlang]
name=rabbitmq-erlang
baseurl=https://dl.bintray.com/rabbitmq/rpm/erlang/20/el/7
gpgcheck=1
gpgkey=https://dl.bintray.com/rabbitmq/Keys/rabbitmq-release-signing-key.asc
repo_gpgcheck=0
enabled=1
仍不行,将yum.repos.d目录下的,epel.repo文件更名备份,这下提示有点变化了,说明上面的文件起作用了,只是版本还是低了。问题在于,我已经安装了erlang,为什么不起作用?我现在是用自定义的帐号登录的,发现我直接输入erl能运行,而用sudo erl却显示找不到命令。而erlang是我在su后,用源代码编译的。
先找一下,为什么加sudo后就不行呢?这篇文章有一个解释。我也按他的说明将/etc/sudoers这个文件中的 Defaults env_reset 修改成Defaults !env_resetsu,但是好像并不起作用。再按上文的内容,干脆在secure_path后加上/usr/local/erlang/bin这个路径,这下是可以了的。
但是用yum安装时,仍提示要求erlang>=20.3
4、重新安装
暂时没有什么好办法,我想问题可能出现在我是用源代码编译的方式安装erl的,这时用yum安装rabbitMq时,它找不到yum安装库中erl的资料。
所以,我回到开头,这次直接su到root,不再用sudo 的方式用其它用户执行root权限,按说这个没什么关系,但是还是su更安心些。
先删除原来的erlang,因为不是yum安装的,所以不能用yum remove来删除,只有直接到/usr/local目录下,直接rm -rf erlang这个目录。
然后按第一段的方式,将yum.repos.d目录下的epel.repo文件更名为epel.repo.bak,加上一个rabbitmq-erlang.repo,里面直接复制了第一段的内容,再用yum install erlang,这次安装成功了。
为了不出意外,准备严格再按原来的方法走一遍,所以我试图导入密钥
rpm --import https://github.com/rabbitmq/signing-keys/releases/download/2.0/rabbitmq-release-signing-key.asc
这次却得到的
[root@rabbitMQ01 xiben]# rpm --import https://github.com/rabbitmq/signing-keys/releases/download/2.0/rabbitmq-release-signing-key.asc
curl: (6) Could not resolve host: github-production-release-asset-2e65be.s3.amazonaws.com; Unknown error
error: https://github.com/rabbitmq/signing-keys/releases/download/2.0/rabbitmq-release-signing-key.asc: import read failed(2).
[root@rabbitMQ01 xiben]#
很明显是网络不通,但是我原来在本地是可以运行的,在本地也可以直接下载,想到原来已经安装过,也许可以不用管它,所以直接用
[root@rabbitMQ01 xiben]# rpm -ivh rabbitmq-server-3.7.17-1.el7.noarch.rpm
Preparing... ################################# [100%]
Updating / installing...
1:rabbitmq-server-3.7.17-1.el7 ################################# [100%]
看起来是安装成功了。
[root@rabbitMQ01 xiben]# rabbitmqctl status
/usr/lib/rabbitmq/bin/rabbitmq-env: line 86: cd: /var/lib/rabbitmq/mnesia/rabbit@rabbitMQ01: Permission denied
WARNING: RABBITMQ_CONFIG_FILE is located inside RABBITMQ_MNESIA_DIR
RABBITMQ_LOG_BASE is located inside RABBITMQ_MNESIA_DIR
RABBITMQ_PID_FILE is located inside RABBITMQ_MNESIA_DIR
RABBITMQ_FEATURE_FLAGS_FILE is located inside RABBITMQ_MNESIA_DIR
/usr/lib/rabbitmq/bin/rabbitmq-env: line 86: cd: /var/lib/rabbitmq/mnesia/rabbit@rabbitMQ01-plugins-expand: Permission denied
RABBITMQ_PLUGINS_EXPAND_DIR is equal to RABBITMQ_MNESIA_DIR
RABBITMQ_ENABLED_PLUGINS_FILE is located inside RABBITMQ_MNESIA_DIR
RABBITMQ_PLUGINS_DIR is located inside RABBITMQ_MNESIA_DIR
RABBITMQ_LOGS is located inside RABBITMQ_MNESIA_DIR
RABBITMQ_UPGRADE_LOG is located inside RABBITMQ_MNESIA_DIR
=> Auto-clustering will not work ('cluster_nodes' in rabbitmq.config)
Error: unable to perform an operation on node 'rabbit@rabbitMQ01'. Please see diagnostics information and suggestions below.
Most common reasons for this are:
* Target node is unreachable (e.g. due to hostname resolution, TCP connection or firewall issues)
* CLI tool fails to authenticate with the server (e.g. due to CLI tool's Erlang cookie not matching that of the server)
* Target node is not running
In addition to the diagnostics info below:
* See the CLI, clustering and networking guides on https://rabbitmq.com/documentation.html to learn more
* Consult server logs on node rabbit@rabbitMQ01
* If target node is configured to use long node names, don't forget to use --longnames with CLI tools
DIAGNOSTICS
===========
attempted to contact: [rabbit@rabbitMQ01]
rabbit@rabbitMQ01:
* connected to epmd (port 4369) on rabbitMQ01
* epmd reports: node 'rabbit' not running at all
no other nodes on rabbitMQ01
* suggestion: start the node
Current node details:
* node name: 'rabbitmqcli-10027-rabbit@rabbitMQ01'
* effective user's home directory: /var/lib/rabbitmq
* Erlang cookie hash: s8t0hQx4j6UrLJXrHl7BNw==
但是不太完美,为什么会有权限问题呢?可能是历史遗留问题吧。先用/sbin/service rabbitmq-server stop停止这个服务,然后到/var/lib/rabbitmq目录下,将mnesia这个目录改名,mv mnesia mnesia_bak,再用/sbin/service rabbitmq-server start一下,这次一切正常了。
chkconfig rabbitmq-server on
rabbitmqctl add_user xiben passwd
rabbitmqctl set_user_tags xiben administrator
rabbitmqctl set_permissions -p / xiben ".*" ".*" ".*"
rabbitmqctl delete_user guest
rabbitmqctl list_users
rabbitmq-plugins enable rabbitmq_management
rabbitmq-plugins list
5、创建集群
在rabbitMQ01这台ECS上,按相同的配置再买一台服务器,修改hostname,增加用户,禁止root登录。这次直接到/etc/yum.repos.d目录下增加repo文件。然后直接运行yum install erlang。很快就安装好了。
再次导入rabbit的密钥
rpm --import https://github.com/rabbitmq/signing-keys/releases/download/2.0/rabbitmq-release-signing-key.asc
这次却意外一次性成功了。好吧,再用wget拉rpm文件,当然,如果网络不好,用winscp直接拷也行,反正已经下载过了。这次试着用yum来安装。
yum install rabbitmq-server-3.7.17-1.el7.noarch.rpm
也是一切顺利,它会自动安装socat。
chkconfig rabbitmq-server on
/sbin/service rabbitmq-server start
rabbitmqctl status
再按上节的方法,安装Web管理界面,删除guest账号。很快就完成了。
下一步,将MQ01上的.erlang.cookie拷到MQ02上,因为我关闭了root登录,用WinSCP拷文件时总是会有一个权限问题,所以,我直接在MQ01上,先su到root,然后vi /var/lib/rabbitmq/.erlang.cookie ,拷出那个里面唯一的字符串,f替换MQ02上的相同文件。在分别在两台机器上vi /etc/hosts文件加上对方的解析。再在MQ02上, service rabbitmq-server stop 停一下服务再启一下,要不然,因为cookie的hash值变化 了,用rabbitmqctl status会连不上节点。
然后在MQ02上执行
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster rabbit@rabbitMQ01
rabbitmqctl start_app
这时能在Web界面和用rabbitmqctl cluster_status能看到集群安装成功。最后一步,在阿里云购买SLB服务,因为我们的消息来自私网,所以选择私网实例。然后配置好服务器组,最后做好5672的端口映射。这就可以交付开发人员了。不过开发人员说不需要SLB,可以在客户端连接RabbitMQ时,通过配置直接实现集群访问。对于java开发来说,Spring里打包了一种使用集群的方式,如:
spring:
rabbitmq:
addresses:ip1:port1,ip2:port2,ip3:port3
username: your_username
password: your_password