一、操作系统需求及配置

 # 1.1、操作系统推荐配置
4C*8G*40G磁盘 # 1.2、内核参数优化
# 系统参数需要留有swap空间,rabbitmq 启动进程用户打开文件数至少需要5万,yum安装时rabbitmq启动,源码安装时root启动。修改方法如下: # CentOS5/.X
cat /etc/security/limits.conf * soft nofile
* hard nofile
* soft nproc
* hard nproc
* soft core
* hard core
# 在CentOS / RHEL 7的系统中,使用Systemd替代了之前的SysV,因此 /etc/security/limits.conf 文件的配置作用域缩小了一些。 # limits.conf这里的配置,只适用于通过PAM认证登录用户的资源限制,它对systemd的service的资源限制不生效。
# 登录用户的限制,通过 /etc/security/limits.conf 和 limits.d 来配置。 # CentOS7.X
cat /etc/security/limits.conf
* soft nofile
* hard nofile cat /etc/security/limits.d/-nproc.conf * soft nproc unlimited
* hard nproc unlimited vi /etc/pam.d/login最后添加禁止调试文件
session required /lib/security/pam_limits.so # systemd service的资源限制配置:
# 需要修改两个配置文件:
- /etc/security/limits.d/-nproc.conf
- /etc/systemd/system.conf # 全局的配置,放在文件 /etc/systemd/system.conf 和 /etc/systemd/user.conf。
# 同时,也会加载两个对应的目录中的所有.conf文件 /etc/systemd/system.conf.d/*.conf 和 /etc/systemd/user.conf.d/*.conf
# 其中,system.conf 是系统实例使用的,user.conf用户实例使用的。一般的sevice,使用system.conf中的配置即可。
# systemd.conf.d/*.conf 中配置会覆盖system.conf。 cat /etc/systemd/system.conf DefaultLimitNOFILE=1024000 #这里需要修改
DefaultLimitNPROC=1024000 #这里也需要修改 DefaultLimitCORE=infinity
DefaultLimitNOFILE=655360
DefaultLimitNPROC=655360 sed -i '/^#DefaultLimitNOFILE=/aDefaultLimitNOFILE=655350' /etc/systemd/system.conf
sed -i '/^#DefaultLimitNPROC=/aDefaultLimitNPROC=655350' /etc/systemd/system.conf # 注意:修改了system.conf后,需要重启系统才会生效。 # 针对单个Service,也可以设置,以nginx为例。
# 编辑 /usr/lib/systemd/system/nginx.service 文件,或者 /usr/lib/systemd/system/nginx.service.d/my-limit.conf 文件,做如下配置: [Service]
LimitCORE=infinity
LimitNOFILE=100000
LimitNPROC=100000 # 查看一个进程的limit设置:cat /proc/YOUR-PID/limits # 注意:
# /etc/security/limits.d/20-nproc.conf文件坑过,里面默认设置了非root用户的最大进程数为4096 # 内核优化 vi /etc/sysctl.d/99.sysctl.conf #关闭ipv6
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1 # 避免放大攻击
net.ipv4.icmp_echo_ignore_broadcasts = 1 # 开启恶意icmp错误消息保护
net.ipv4.icmp_ignore_bogus_error_responses = 1 #关闭路由转发
net.ipv4.ip_forward = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0 #开启反向路径过滤
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1 #处理无源路由的包
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0 #关闭sysrq功能
kernel.sysrq = 0 #core文件名中添加pid作为扩展名
kernel.core_uses_pid = 1 # 开启SYN洪水攻击保护
net.ipv4.tcp_syncookies = 1 #修改消息队列长度
kernel.msgmnb = 65536
kernel.msgmax = 65536 #设置最大内存共享段大小bytes
kernel.shmmax = 68719476736
kernel.shmall = 4294967296 #timewait的数量,默认180000
net.ipv4.tcp_max_tw_buckets = 6000
net.ipv4.tcp_sack = 1
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_rmem = 4096 87380 4194304
net.ipv4.tcp_wmem = 4096 16384 4194304
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216 #每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目
net.core.netdev_max_backlog = 262144 #限制仅仅是为了防止简单的DoS 攻击
net.ipv4.tcp_max_orphans = 3276800 #未收到客户端确认信息的连接请求的最大值
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_timestamps = 0 #内核放弃建立连接之前发送SYNACK 包的数量
net.ipv4.tcp_synack_retries = 1 #内核放弃建立连接之前发送SYN 包的数量
net.ipv4.tcp_syn_retries = 2 #启用timewait 快速回收
net.ipv4.tcp_tw_recycle = 1 #开启重用。允许将TIME-WAIT sockets 重新用于新的TCP 连接
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_mem = 94500000 915000000 927000000
net.ipv4.tcp_fin_timeout = 1 #当keepalive 起用的时候,TCP 发送keepalive 消息的频度。缺省是2 小时
net.ipv4.tcp_keepalive_time = 30 #允许系统打开的端口范围
net.ipv4.ip_local_port_range = 1024 65000 #修改防火墙表大小,默认65536
#net.netfilter.nf_conntrack_max=655350
#net.netfilter.nf_conntrack_tcp_timeout_established=1200 # 确保无人能修改路由表
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.default.secure_redirects = 0
vm.max_map_count=655360

操作系统配置修改

二、RabbitMQ-Server 安装配置

rabbitmq-server下载:
http://www.rabbitmq.com/releases/rabbitmq-server/

Erlang版本支持列表:
http://www.rabbitmq.com/which-erlang.html

Erlang下载:
https://github.com/rabbitmq/erlang-rpm/releases
https://pkgs.org/download/erlang
http://rpmfind.net/linux/rpm2html/search.php?query=erlang
http://www.erlang.org/downloads

#rabbitmq-3.6安装
#erlang install
rpm -ivh erlang-19.3.6.4-1.el6.x86_64.rpm

#require pkgs install
yum -y install socat
#(或: rpm -ivh tcp_wrappers tcp_wrappers-libs socat)

#rabbitmq-server install
rpm -ivh rabbitmq-server-3.6.14-1.el6.noarch.rpm

#start rabbitmq-server
/etc/init.d/rabbitmq-server start

#启用插件
rabbitmq-plugins list
rabbitmq-plugins enable rabbitmq_management
rabbitmq-plugins enable rabbitmq_mqtt
rabbitmq-plugins enable rabbitmq_web_mqtt
rabbitmq-plugins list

#用户管理-用户添加
rabbitmqctl list_users
rabbitmqctl add_user mquser 'mqusers@mq!@#'
rabbitmqctl set_user_tags mquser administrator
rabbitmqctl set_permissions -p "/" mquser ".*" ".*" ".*"
rabbitmqctl list_users

#用户管理-用户删除
rabbitmqctl delete_user mquser

#用户管理-修改用户密码
rabbitmqctl change_password mquser 'mquser@mq!@#'

#启用guest用户(不推荐)
vim /usr/lib/rabbitmq/lib/rabbitmq_server-3.6.14/ebin/rabbit.app
删除 loopback_users 后<<"guest">>中的guest,并重启rabbitmq,可通过任意IP使用guest账号登陆管理控制台。
service rabbitmq-server restart
netstat -luntp

打开浏览器登录:http://127.0.0.1:15672 55672也可以,直接跳转到下列web管理
登录 账号密码默认都是 guest

Rabbitmq默认日志路径:/var/log/rabbitmq/
- rabbit@{hostname}.log,输出rabbitmq运行相关的信息,如网络流量、用户、交换器、队列等信息
- rabbit@{hostname}-sasl.log,Erlang运行相关信息

#rabbitmq版本查看
rabbitmqctl -q status

三、RabbitMQ-Server 集群配置

1、修改host文件

192.168.1.22 rabbitmq1

192.168.1.23 rabbitmq2

192.168.1.24 rabbitmq3

PS:我们使用rabbitmq1做主服务,rabbitmq2做节点服务

2、复制cookie内容

首先停止RabbitMQ:rabbitmqctl stop
/etc/init.d/rabbitmq-server stop

修改cookie文件,使得各节点的cookie内容一致
echo YZCUPNLBNOMPTDCUALZC > /var/lib/rabbitmq/.erlang.cookie

cookie同步完成之后启动,以detached方式启动
rabbitmq-server -detached

3、加入集群

将rabbitmq2 节点加入rabbitmq1 作为RAM类型节点

[root@rabbitmq2 ~]#rabbitmqctl stop_app
[root@rabbitmq2 ~]#rabbitmqctl reset
[root@rabbitmq2 ~]#rabbitmqctl join_cluster rabbit@rabbitmq1 --ram
[root@rabbitmq2 ~]#rabbitmqctl start_app

将rabbitmq3 节点加入rabbitmq1 作为disc类型节点

[root@rabbitmq3 ~]#rabbitmq stop_app
[root@rabbitmq3 ~]#rabbitmqctl reset
[root@rabbitmq3 ~]#rabbitmqctl join_cluster rabbit@rabbitmq1
[root@rabbitmq3 ~]#rabbitmqctl start_app
(rabbitmq集群节点有disc 和ram两种类型,一个集群中至少要有一个disc类型的节点,不指定默认加入为disc)

4、查看状态

完成之后可以用rabbitmqctl 命令查看相关信息
rabbitmqctl status //查看应用状态
rabbitmqctl cluster_status //查看集群信息

访问任意管理端界面查看
http://ip:15672
http://10.86.78.110:15672

到此简单集群部署完毕!
(如果某节点显示unavailable检查服务是否启动,管理扩展是否开启
rabbitmq-plugins enable rabbitmq_management)

5、RabbitMQ数据镜像

队列镜像,自动同步
Queue HA配置
默认情况下,集群中的队列存在于集群中单个节点上,这要看创建队列时声明在那个节点上创建,而exchange和binding则默认存在于集群中所有节点。
队列可以通过镜像来提高可用性,HA依赖rabbitmq cluster,所以队列镜像也不适合WAN部署,每个被镜像的队列包含一个master和一个或者多个slave,当master因任何原因故障时,最老的slave被提升为新的master。
发布到队列的消息被复制到所有的slave上,消费者无论连接那个node,都会连接到master;如果master确认要删除消息,那么所有slave就会删除队列中消息。
队列镜像可以提供queue的高可用性,但不能分担负载,因为所有参加的节点都做所有的工作。

5.1、配置队列镜像
通过policy来配置镜像,策略可在任何时候创建,比如先创建一个非镜像的队列,然后在镜像,反之亦然。
镜像队列和非镜像队列的区别是非镜像队列没有slaves,运行速度也比镜像队列快。

设置策略然后设置ha-mode,3中模式:all、exactly、nodes
每个队列都有一个home node,叫做queue master node

(1)、设置policy,以ha.开头的队列将会被镜像到集群其他所有节点,一个节点挂掉然后重启后需要手动同步队列消息
rabbitmqctl set_policy ha-all-queue "^ha\." '{"ha-mode":"all"}'

# 所有队列都镜像到其他节点
rabbitmqctl set_policy ha-all-queue "^" '{"ha-mode":"all","ha-sync-mode":"automatic"}'
说明:ha-sync-mode:automatic 自动同步到镜像节点

(2)、设置policy,以ha.开头的队列将会被镜像到集群其他所有节点,一个节点挂掉然后重启后会自动同步队列消息(我们生产环境采用这个方式)
rabbitmqctl set_policy ha-all-queue "^ha\." '{"ha-mode":"all","ha-sync-mode":"automatic"}'

问题:
配置镜像队列后,其中1台节点失败,队列内容是不会丢失,如果整个集群重启,队列中的消息内容仍然丢失,如何实现队列消息内容持久化那?
我的node也是跑在disk模式,创建见消息的时候也声明了持久化,为什么还是不行那?

因为创建消息的时候需要指定消息是否持久化,如果启用了消息的持久化的话,重启集群消息也不会丢失了,前提是创建的队列也应该是创建的持久化队列。

四、rabbitmq配置优化

配置文件目录:/etc/rabbitmq/rabbitmq.config
#默认是没有这个配置文件的,可以用如下命令生成:
cp /usr/share/doc/rabbitmq-server-3.6.14/rabbitmq.config.example /etc/rabbitmq/rabbitmq.config

RabbitMQ 网络分区问题处理:参考:https://www.jianshu.com/p/97a6395299fa
RabbitMQ网络分区原因:
1、局域网不稳定,网络抖动
2、集群 ABC 服务器之间通讯不稳定
3、...
rabbitmq配置优化:

cat rabbitmq.conf
[
{rabbit,
[
{loopback_users, []},
{vm_memory_high_watermark, 0.40},              #最大使用内存40%,erlang开始GC
#(vm_memory_high_watermark:内存阈值,默认为0.4。意思为物理内存的40%。40%的内存并不是内存的最大的限制,它是一个发布的节制,当达到40%时Erlang会做GC。
# Erlang GC 在最坏情况下会消耗一倍的内存。最坏的情况是使用)
{vm_memory_high_watermark_paging_ratio, 0.8},  #32G内存,32*0.8*0.2时开始持久化磁盘,如机器内存16G,当RABBITMQ占用内存1.28G(16*0.4*0.2)时把内存数据放到磁盘。
{disk_free_limit, "10GB"},                     #磁盘使用量剩余10G时,不收发消息
{hipe_compile, true},                          #开启hipe,提高erlang性能
{collect_statistics_interval, 10000},          #统计刷新时间默认5秒,改成10秒
{cluster_partition_handling, autoheal}        #网络优化参数,不稳定时用这个选项
]
}
].

cat rabbitmq-env.conf

RABBITMQ_NODENAME=rabbit@rabbitmq76             #节点名字,全局唯一
RABBITMQ_MNESIA_BASE=/data/rabbitmq/data        #消息落地存放位置
RABBITMQ_LOG_BASE=/data/rabbitmq/log            #日志位置
RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS="+A 128"    #默认65,server线程

RabbitMQ3 单机及集群安装配置及优化的更多相关文章

  1. hbase单机及集群安装配置,整合到hadoop

    问题导读:1.配置的是谁的目录conf/hbase-site.xml,如何配置hbase.rootdir2.如何启动hbase?3.如何进入hbase shell?4.ssh如何达到互通?5.不安装N ...

  2. hbase单机环境的搭建和完全分布式Hbase集群安装配置

    HBase 是一个开源的非关系(NoSQL)的可伸缩性分布式数据库.它是面向列的,并适合于存储超大型松散数据.HBase适合于实时,随机对Big数据进行读写操作的业务环境. @hbase单机环境的搭建 ...

  3. RabbitMQ集群安装配置+HAproxy+Keepalived高可用

    RabbitMQ集群安装配置+HAproxy+Keepalived高可用 转自:https://www.linuxidc.com/Linux/2016-10/136492.htm rabbitmq 集 ...

  4. CentOS下Hadoop-2.2.0集群安装配置

    对于一个刚开始学习Spark的人来说,当然首先需要把环境搭建好,再跑几个例子,目前比较流行的部署是Spark On Yarn,作为新手,我觉得有必要走一遍Hadoop的集群安装配置,而不仅仅停留在本地 ...

  5. hive集群安装配置

    hive 是JAVA写的的一个数据仓库,依赖hadoop.没有安装hadoop的,请参考http://blog.csdn.net/lovemelovemycode/article/details/91 ...

  6. 集群安装配置Hadoop具体图解

    集群安装配置Hadoop 集群节点:node4.node5.node6.node7.node8. 详细架构: node4 Namenode,secondnamenode,jobtracker node ...

  7. spark集群安装配置

    spark集群安装配置 一. Spark简介 Spark是一个通用的并行计算框架,由UCBerkeley的AMP实验室开发.Spark基于map reduce 算法模式实现的分布式计算,拥有Hadoo ...

  8. 原创:centos7.1下 ZooKeeper 集群安装配置+Python实战范例

    centos7.1下 ZooKeeper 集群安装配置+Python实战范例 下载:http://apache.fayea.com/zookeeper/zookeeper-3.4.9/zookeepe ...

  9. hbase和ZooKeeper集群安装配置

    一:ZooKeeper集群安装配置 1:解压zookeeper-3.3.2.tar.gz并重命名为zookeeper. 2:进入~/zookeeper/conf目录: 拷贝zoo_sample.cfg ...

随机推荐

  1. NumPy使用图解教程

    NumPy是Python中用于数据分析.机器学习.科学计算的重要软件包.它极大地简化了向量和矩阵的操作及处理.python的不少数据处理软件包依赖于NumPy作为其基础架构的核心部分(例如scikit ...

  2. 微信自研生产级paxos类库PhxPaxos实现原理介绍

    转载自:   http://mp.weixin.qq.com/s?__biz=MzI4NDMyNTU2Mw==&mid=2247483695&idx=1&sn=91ea4229 ...

  3. From 虚拟机模板 创建单节点K8S1.14.1的操作步骤

    半年前总结的 还是有记不住的地方... 1. 根据上一篇blog 自己创建了一个虚拟机 里面包含 k8s1.14.1 的k8s集群 这里简单说一下 虚拟机开机之后 如何处理以能够使用k8s 的简单过程 ...

  4. Resin 与 Tomcat 服务器对比

      Resin 与 Tomcat对比(个人总结) 图片来源Tomcat PK Resin 上图对比发现Tomcat对于Resin来说,有诸多优点,但是Resin也有很多优点. 比方说: 速度比较 re ...

  5. java多线程中篇(三) —— 线程的控制(创建,运行,阻塞,中断,结束)

    简介 线程的控制就是程序对线程的主要管理,最重要的就是状态的切换维护. 每种转态都有不同的引发事件(对应线程的方法),每种状态又有各自不同的处理步骤和过程,整个线程控制主要就是涉及这些内容. 正文 线 ...

  6. MATLAB 求一个点周围 voronoi 边的顶点的坐标

    本代码在[MATLAB 2015b] 下编写运行成功,不保证所有版本适用. x=[0 -.5 1 1 -1]; y=[0 -1 -.5 1 1]; voronoi(x,y);axis([-2 2 -2 ...

  7. Python 编程入门

    我喜欢直接了当, 这次主要是推荐蟒营大妈的 Python 入门课(https://py.101.camp), 还有不到一周就要开课了, 欢迎转发推荐~ 点击"夏日大作战:从小白到小能手的 P ...

  8. golang使用一个二叉树来实现一个插入排序

    思路不太好理解,请用断点 package main import "fmt" type tree struct { value int left, right *tree } fu ...

  9. Java内存模型学习笔记(一)—— 基础

    1.并发编程模型的分类 在并发编程中,我们需要处理两个关键的问题:1.线程间如何通信,2.线程间如何同步.通信是指线程之间以何种机制来交换信息,同步是指程序用于不同线程之间操作发生相对顺序的机制. 在 ...

  10. javascript -- 时间转换

    function numFormat(num){ //时间处理 return ('00' + num).substr(-2);    #处理 日期前面有0的情况}function timeFormat ...