天天看点

Rabbitmq-Peer Discovery on AWS (EC2)Rabbitmq-Peer Discovery on AWS (EC2)

Rabbitmq-Peer Discovery on AWS (EC2)

AWS上的对等发现(EC2)

aws(ec2)特定发现机制可以通过插件获得,它为节点提供了两种发现其对等点的方法:

1.使用ec2实例标记

2.使用aws自动标度组成员

这两种方法都依赖于aws特定的API,因此无法在其他IaaS环境中工作。

一旦检索到集群成员实例列表,最终节点名称使用实例主机名或IP地址计算。

使用AWS对等发现机制时,节点将延迟启动以获取随机选择的值,以降低初始群集形成期间竞争条件的可能性。

1.创建角色和Accesskey

在aws平台创建一个角色绑定一个用户,具体步骤不演示,角色权限如下图:

内容:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "autoscaling:DescribeAutoScalingInstances",
                "ec2:DescribeInstances"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}      

 为上述角色绑定的用户创建访问密钥:

请妥善保管密钥下面将使用密钥等信息

 2.Rabbitmq部署

准备搭建Rabbitmq的镜像和机器,因为此对等发现只针对AWS-EC2,所以选用AWS的镜像

启动实例选择镜像:

Amazon Linux 2 AMI (HVM), SSD Volume Type - ami-b70554c8

这里选用的Amazon Linux 2  也就是我们常用的Centos镜像,根据自己需求设置好相关安区组子网等选项启动实例。

说明:通过插件可以获得更多的对等发现机制。从3.7.0开始,RabbitMQ附带对等发现插件,所以我们安装的Rabbitmq-server要选择大于等于3.7.0的版本

3.配置AWS CLI

对等发现机制及aws内部服务调用很多都是通过aws cli去调用API执行的,此步很重要。

aws configure

根据提示输入:

AWS Access Key ID、密码、可用区、输出格式,这里的access key 信息就是之前在用户界面创建的。

4.安装Erlang

vim /etc/yum.repos.d/rabbitmq-erlang.repo
[rabbitmq-erlang]
name=rabbitmq-erlang
baseurl=https://dl.bintray.com/rabbitmq/rpm/erlang/20/el/7
gpgcheck=1
gpgkey=https://www.rabbitmq.com/rabbitmq-release-signing-key.asc
repo_gpgcheck=0
enabled=1

yum install erlang -y
      

5.安装Rabbitmq-server

wget https://dl.bintray.com/rabbitmq/all/rabbitmq-server/3.7.6/rabbitmq-server-3.7.6-1.el7.noarch.rpm
rpm --import https://dl.bintray.com/rabbitmq/Keys/rabbitmq-release-signing-key.asc
yum install rabbitmq-server-3.7.6-1.el7.noarch.rpm -y
      

 6.启动插件并设计Rabbitmq开机启动

rabbitmq-plugins --offline enable rabbitmq_peer_discovery_aws   #aws对等发现插件(一定在启动rabbitmq之前启动)
 rabbitmq-plugins enable rabbitmq_management (管理插件)
 systemctl enable rabbitmq-server
      

7.修改Rabbitmq可用guest登录方式

vim /usr/lib/rabbitmq/lib/rabbitmq_server-3.7.6/ebin/rabbit.app
#修改39行把[]里的内容去掉,修改后的结果如下:

{loopback_users, []}, 
      

8.优化系统限制

运行生产工作负载的RabbitMQ安装可能需要系统限制和内核参数调整,以便处理更多的并发连接和队列。需要调整的主要设置是打开文件的最大数量,ulimit -n

许多操作系统上的默认值太低(例如,在几个Linux发行版上为1024),个人建议在生产环境中为用户rabbitmq至少允许65536个文件描述符。

有两个限制操作系统内核允许的最大打开文件数(fs.file-max)和每个用户限制(ulimit -n),前者必须高于后者

fs.file-max设置

echo 'fs.file-max = 65535' >> /etc/sysctl.conf      

解除 Linux 系统的最大进程数和最大文件打开数限制

cat /etc/security/limits.conf

root soft nofile 65535
root hard nofile 65535
* soft nofile 65535
* hard nofile 65535
##以上4行在文档末尾添加
=====================================
#为了避免重启失效,加入rc.local
echo 'ulimit -SHn 65535' > /etc/rc.local
      

 rabbitmq-server配置

sed -i '11a LimitNOFILE=20000' /etc/systemd/system/multi-user.target.wants/rabbitmq-server.service
在[Service]模块中添加LimitNOFILE=20000 (具体参数根据需求调整)      

systemctl daemon-reload 修改完Rabbitmq服务需要重新加载服务

9.修改.erlang.cookie 权限 

cd /var/lib/rabbitmq/ && chown rabbitmq.rabbitmq .erlang.cookie      

 默认安装完服务属主属组都是root,在启动rabbitmq时会报错,所以在启动前先修改一下,另外对等发现注册依赖于.erlang.cookie 所以注册节点必须和主节点的 cookie值必须一致,

 我们制作成镜像应用autoscaling自行扩展所以就不会存在cooke不一致的问题了。

10.Rabbitmq配置文件

vim /etc/rabbitmq/rabbitmq.conf
#1.这部分设置了access_key等相关信息和告诉Rabbitmq后端的对等发现模式是 autoscaling_grou

cluster_formation.peer_discovery_backend = rabbit_peer_discovery_aws
cluster_formation.aws.region = us-east-1

cluster_formation.aws.access_key_id = AKIAIMYGK*********

cluster_formation.aws.secret_key = d9O6apD/Vyc9t*********************
cluster_formation.aws.use_autoscaling_group = true

#2.这部分设置了rabbitmq的一些基本优化

listeners.tcp.default = 5672                      #要侦听AMQP连接的端口或主机名   
vm_memory_high_watermark.relative = 0.8           #触发流控制的内存阈值。可以是绝对的,也可以是相对于操作系统可用的RAM数量
cluster_partition_handling = pause_minority       #如何处理网络分区,默认值为ignore
loopback_users = none                             #允许默认来宾用户远程连接 需要修改为none 默认值为localhost
heartbeat = 60                                    #表示服务器在connection.tune帧中发送的心跳延迟(以秒为单位)的值。如果设置为0,则禁用心跳,禁用心跳可能会在具有大量连接的情况下提高性能,但可能会导致在存在关闭非活动连接的网络设备时连接中断。
vm_memory_high_watermark_paging_ratio = 0.75      #队列开始将消息分页到磁盘以释放内存的高水位限制的分数
disk_free_limit.absolute = 2GB                    #RabbitMQ存储数据的分区的磁盘可用空间限制。当可用磁盘空间低于此限制时,将触发流量控制。该值可以相对于RAM总量设置,也可以设置为绝对值(以字节为单位),或者以信息单位(例如“50MB”或“5GB”)设置
collect_statistics = coarse                       #统计收集模式。主要与管理插件相关 这里选择粗略统计
collect_statistics_interval = 2500                #统计信息收集间隔(毫秒)。主要与管理插件相关。单位:毫秒
queue_master_locator = random                     #队列master策略,默认值:client-local 这里选择随机             
cluster_keepalive_interval = 2500                 #节点应该多长时间向其他节点发送keepalive消息(以毫秒为单位)。请注意,这与net_ticktime不同;错过的keepalive消息不会导致节点被视为关闭。
hipe_compile = true                               #设置为true以使用HiPE预编译RabbitMQ的部分,HiPE是Erlang的即时编译器。这将以增加启动时间为代价来增加服务器吞吐量。您可能会在启动时延迟几分钟后看到20-50%的性能提升。这些数字与工作负载和硬件有很大关系。

#3.管理插件的一些优化参数

management.sample_retention_policies.global.minute    = 5
management.sample_retention_policies.global.hour  = 60
management.sample_retention_policies.global.day = 1200

management.sample_retention_policies.basic.minute   = 5
management.sample_retention_policies.basic.hour = 60

management.sample_retention_policies.detailed.10 = 5
      

  

11.启动Rabbitmq-server

systemctl start rabbitmq-server      

12.封装镜像

在安装rabbitmq的创建AMI镜像,通过此镜像创建启动配置,创建auto scaling组验证结果

13.创建启动配置和Auto Scaling组

注意创建Auto Scaling组的安全组的时候,相关端口要设置允许,否则影响对等发现

组大小设置为2,为了验证Auto Scaling创建的2个实例是否可以完成自动发现,自动注册并形成集群

登录机器验证:

[root@ip-172-31-11-83 ~]# rabbitmqctl cluster_status 
Cluster status of node rabbit@ip-172-31-11-83 ...
[{nodes,[{disc,['rabbit@ip-172-31-11-83','rabbit@ip-172-31-25-160']}]},
 {running_nodes,['rabbit@ip-172-31-25-160','rabbit@ip-172-31-11-83']},
 {cluster_name,<<"[email protected]">>},
 {partitions,[]},
 {alarms,[{'rabbit@ip-172-31-25-160',[]},{'rabbit@ip-172-31-11-83',[]}]}]      

经过查看通过AutoScaling创建的2个主机自动注册发现实验成功,这样后续配合监控等相关信息,可以基于封装好AMI自动扩容,缩容了。