前面讲述了RabbitMQ的架构,下面是来实战演练一下。
RabbitMQ 安装
准备工作
准备3台机器,系统为centos7(其他版本也OK)。
192.168.99.63 rabbit1 192.168.99.65 rabbit2 192.168.99.67 rabbit3
修改hostname(每台都需要)
$ hostname rabbit1 $ hostname rabbit2 $ hostname rabbit3
centos7永久更改hostname的命令为:
$ hostnamectl --static set-hostname [主机名]
修改host file(每台都需要修改)
$ vim /etc/hosts 192.168.99.63 rabbit1 192.168.99.65 rabbit2 192.168.99.67 rabbit3
根据操作系统不同, 官网提供了相应的安装说明:Windows、Debian / Ubuntu、RPM-based Linux、Mac
这里是Redhat的安装方式
通过yum安装依赖包
$ yum install epel-release $ yum makecache $ yum -y install socat compat-readline5
安装erlang
安装 RabbitMQ 之前要安装 Erlang ,可以去Erlang官网下载。
各个erlang的版本:https://github.com/rabbitmq/erlang-rpm/releases
centos6: https://github.com/rabbitmq/erlang-rpm/releases/download/v21.1.1/erlang-21.1.1-1.el6.x86_64.rpm centos7: https://github.com/rabbitmq/erlang-rpm/releases/download/v21.1.1/erlang-21.1.1-1.el7.centos.x86_64.rpm
直接wget下来,安装就完事了
安装rabbitmq
接着去RabbitMQ官网下载安装包。
安装文档: https://www.rabbitmq.com/install-rpm.html
各个版本的安装包: https://github.com/rabbitmq/rabbitmq-server/releases
centos6: https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.7.8/rabbitmq-server-3.7.8-1.el6.noarch.rpm centos7: https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.7.8/rabbitmq-server-3.7.8-1.el7.noarch.rpm
直接wget下来,安装就完事了(需要先安装socat)
修改最大连接数
With systemd (Recent Linux Distributions)
在使用systemd的发行版上,操作系统限制通过/etc/systemd/system/rabbitmq-server.service.d/limits.conf中的配置文件进行控制
[Service] LimitNOFILE=300000
Without systemd (Older Linux Distributions)
在不使用systemd的发行版上调整RabbitMQ的每用户限制的最直接方法是编辑rabbitmq-env.conf并在服务启动之前调用ulimit
$ ulimit -S -n 4096
开机自启动
$ chkconfig rabbitmq-server on
启动
$ /sbin/service rabbitmq-server start
安装插件
常用的插件:http://www.rabbitmq.com/community-plugins.html
进入插件安装目录{rabbitmq-server}/plugins/(可以查看一下当前已存在的插件)
$ cd /usr/lib/rabbitmq/lib/rabbitmq_server-3.7.8/plugins
rabbitmq_delayed_message_exchange
$ wget https://dl.bintray.com/rabbitmq/community-plugins/3.7.x/rabbitmq_delayed_message_exchange/rabbitmq_delayed_message_exchange-20171201-3.7.x.zip -O rabbitmq_delayed_message_exchange-20171201-3.7.x.zip $ unzip rabbitmq_delayed_message_exchange-20171201-3.7.x.zip $ rabbitmq-plugins enable rabbitmq_delayed_message_exchange
rabbitmq_management
$ rabbitmq-plugins enable rabbitmq_management $ rabbitmq-plugins list
默认的用户名为:guest 默认的密码为:guest, rabbitmq从3.3.0开始禁止使用guest/guest权限通过除localhost外的访问添加一个用户,用来访问
这里要提一下, RabbitMQ的用户角色分类:
none、management、policymaker、monitoring、administrator
$ rabbitmqctl add_user admin admin $ rabbitmqctl set_user_tags admin administrator
rabbitmq更多的权限信息可以参考: RabbitMQ用户角色及权限控制
访问web控制台
$ curl http://server-name:15672
复制配置文件
RabbitMQ等数据服务通常具有许多可调参数。有些配置对开发很有意义,但并不适合生产。没有一种配置适合每个用例。因此,在投入生产之前评估系统配置非常重要。
默认配置文件路径:/etc/rabbitmq/ 为空,需要复制模板进去修改
$ cp -rpv /usr/share/doc/rabbitmq-server-3.7.8/rabbitmq.config.example /etc/rabbitmq/rabbitmq.config
如果elang版本支持HIPE,那么可以把hipe_compile开启
$ vim /etc/rabbitmq/rabbitmq.config {hipe_compile, true}
注意: HiPE代表高性能Erlang。启用HiPE后,Erlang应用程序在执行之前会预编译为机器代码。我们的基准测试显示,这使RabbitMQ的性能提升高达30%。(如果您遇到这种情况,可以在此处找到基准测试详细信息,结果在此处。)
以这种方式执行操作的缺点是,在编译Erlang应用程序时,应用程序初始启动时间会显着增加。使用HiPE,第一个RabbitMQ启动大约需要2分钟。
另一个微妙的缺点是,如果启用了HiPE,调试RabbitMQ可能会很困难,因为HiPE可以破坏错误回溯,使其无法读取。
若日志出现
erlang vm segfaults
,应关掉。默认的MQ使用端口情况
4369 (epmd), 25672 (Erlang distribution) 5672, 5671 (AMQP 0-9-1 without and with TLS) n15672 (if management plugin is enabled) 61613, 61614 (if STOMP is enabled) 1883, 8883 (if MQTT is enabled)
注意: 将上述的步骤在每一台rabbitmq server上执行
RabbitMQ集群设置
设置 Erlang Cookie
需要有相同的Erlang Cookie,否则不能进行通信,为保证cookie的完全一致,采用从一个节点copy的方式,
注意:
官方在介绍集群的文档中提到过.erlang.cookie一般会存在这两个地址:第一个是$home/.erlang.cookie也就是/root 目录下,第二个地方就是/var/lib/rabbitmq/.erlang.cookie。如果我们使用解压缩方式安装部署的rabbitmq,那么这个文件会在${home}目录下,也就是$home/.erlang.cookie。如果我们使用rpm等安装包方式进行安装的,那么这个文件会在/var/lib/rabbitmq目录下。这个文件权限是 400!
$ chmod 400 /var/lib/rabbitmq/.erlang.cookie $ chown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie
修改rabbitmq-env.conf(RABBITMQ_NODENAME值需要根据/etc/hosts修改)
$ mkdir -pv /data/rabbitmq/{mnesia,logs} $ chown -R rabbitmq:rabbitmq /data/rabbitmq $ chmod 750 /data/rabbitmq/mnesia $ chmod 755 /data/rabbitmq/logs $ vim /etc/rabbitmq/rabbitmq-env.conf RABBITMQ_NODENAME=rabbit@rabbit1 RABBITMQ_MNESIA_BASE=/data/rabbitmq/mnesia RABBITMQ_LOG_BASE=/data/rabbitmq/logs
启动/重启各节点
$ systemctl daemon-reload $ systemctl start rabbitmq-server $ systemctl stop rabbitmq-server $ systemctl restart rabbitmq-server # 开机启动 $ systemctl enable rabbitmq-server
加入集群
$ rabbitmqctl stop_app $ rabbitmqctl reset # 默认都是磁盘节点,如果要使自己成为内存节点,则加上--ram参数 # **在RabbitMQ集群里,必须至少有一个磁盘节点存在。** $ rabbitmqctl join_cluster rabbit@rabbit1 $ rabbitmqctl start_app # 查看集群状态 $ sudo rabbitmqctl cluster_status
配置策略: 镜像模式(可选)
在任一集群节点上运行
$ sudo rabbitmqctl set_policy -p / ha-allqueue "^" '{"ha-mode":"all"}'
备注:这行命令在名称为”/“的vhost上创建了一个策略,策略名称为 ha-allqueue,策略模式为 all 即复制到所有节点,包含新增节点,策略正则表达式为“^”表示所有匹配所有队列名称
在高可用模式(镜像模式)下,每个镜像队列包含一个 master 和若干 slaver,他们之间存在着复制的关系,当 master 因为各种原因突然消失(挂掉),最老的 slaver 会自动变成新的 master
或者如果只是想匹配以ha开头的队列名称,则:
$ rabbitmqctl set_policy ha-all "^ha\." "{""ha-mode"":""all""}"
配置调整(会另起一个章节来写)
$ sudo vim /etc/rabbitmq/rabbitmq.config [ { rabbit, [ {tcp_listeners, [{"127.0.0.1", 5672}, {"192.168.99.63", 5672}]}, {cluster_partition_handling, pause_minority}, {log_levels, [{connection, info}, {channel, info}]}, {vm_memory_high_watermark, 0.5}, {vm_memory_high_watermark_paging_ratio, 0.5}, {memory_monitor_interval, 2500}, {hipe_compile, true}, {disk_free_limit, "300MB"}, %% Set the default AMQP heartbeat delay (in seconds). %% {heartbeat, 60}, %% Set the max permissible size of an AMQP frame (in bytes). %% {frame_max, 131072}, %% Set the max frame size the server will accept before connection %% tuning occurs %% {initial_frame_max, 4096}, %% Set the max permissible number of channels per connection. %% 0 means "no limit". %% {channel_max, 512} ] } ].
参考链接
https://www.rabbitmq.com/configure.html
https://www.rabbitmq.com/production-checklist.html