zoukankan      html  css  js  c++  java
  • RabbitMQ3 单机及集群安装配置及优化

    一、操作系统需求及配置

      1 # 1.1、操作系统推荐配置
      2 4C*8G*40G磁盘
      3 
      4 # 1.2、内核参数优化
      5 # 系统参数需要留有swap空间,rabbitmq 启动进程用户打开文件数至少需要5万,yum安装时rabbitmq启动,源码安装时root启动。修改方法如下:
      6 
      7 # CentOS5/6.X
      8 cat /etc/security/limits.conf
      9 
     10 * soft nofile 100000
     11 * hard nofile 100000
     12 * soft nproc 100000
     13 * hard nproc 100000
     14 * soft core 100000
     15 * hard core 100000
     16 # 在CentOS 7 / RHEL 7的系统中,使用Systemd替代了之前的SysV,因此 /etc/security/limits.conf 文件的配置作用域缩小了一些。
     17 
     18 # limits.conf这里的配置,只适用于通过PAM认证登录用户的资源限制,它对systemd的service的资源限制不生效。
     19 # 登录用户的限制,通过 /etc/security/limits.conf 和 limits.d 来配置。
     20 
     21 # CentOS7.X
     22 cat /etc/security/limits.conf
     23 * soft nofile 65536
     24 * hard nofile 65536
     25 
     26 cat /etc/security/limits.d/20-nproc.conf
     27 
     28 * soft nproc unlimited
     29 * hard nproc unlimited
     30 
     31 vi /etc/pam.d/login最后添加禁止调试文件
     32 session required /lib/security/pam_limits.so
     33 
     34 
     35 # systemd service的资源限制配置:
     36 # 需要修改两个配置文件:
     37 - /etc/security/limits.d/20-nproc.conf
     38 - /etc/systemd/system.conf
     39 
     40 # 全局的配置,放在文件 /etc/systemd/system.conf 和 /etc/systemd/user.conf。
     41 # 同时,也会加载两个对应的目录中的所有.conf文件 /etc/systemd/system.conf.d/*.conf 和 /etc/systemd/user.conf.d/*.conf
     42 # 其中,system.conf 是系统实例使用的,user.conf用户实例使用的。一般的sevice,使用system.conf中的配置即可。
     43 # systemd.conf.d/*.conf 中配置会覆盖system.conf。
     44 
     45 cat /etc/systemd/system.conf
     46 
     47 DefaultLimitNOFILE=1024000 #这里需要修改
     48 DefaultLimitNPROC=1024000  #这里也需要修改
     49 
     50 DefaultLimitCORE=infinity
     51 DefaultLimitNOFILE=655360
     52 DefaultLimitNPROC=655360
     53 
     54 sed -i '/^#DefaultLimitNOFILE=/aDefaultLimitNOFILE=655350' /etc/systemd/system.conf 
     55 sed -i '/^#DefaultLimitNPROC=/aDefaultLimitNPROC=655350' /etc/systemd/system.conf
     56 
     57 # 注意:修改了system.conf后,需要重启系统才会生效。
     58 
     59 # 针对单个Service,也可以设置,以nginx为例。
     60 # 编辑 /usr/lib/systemd/system/nginx.service 文件,或者 /usr/lib/systemd/system/nginx.service.d/my-limit.conf 文件,做如下配置:
     61 
     62 [Service]
     63 LimitCORE=infinity
     64 LimitNOFILE=100000
     65 LimitNPROC=100000
     66 
     67 # 查看一个进程的limit设置:cat /proc/YOUR-PID/limits
     68 
     69 # 注意:
     70 # /etc/security/limits.d/20-nproc.conf文件坑过,里面默认设置了非root用户的最大进程数为4096
     71 
     72 
     73 # 内核优化
     74 
     75 vi /etc/sysctl.d/99.sysctl.conf
     76 
     77 #关闭ipv6
     78 net.ipv6.conf.all.disable_ipv6 = 1
     79 net.ipv6.conf.default.disable_ipv6 = 1
     80 
     81 # 避免放大攻击
     82 net.ipv4.icmp_echo_ignore_broadcasts = 1
     83 
     84 # 开启恶意icmp错误消息保护
     85 net.ipv4.icmp_ignore_bogus_error_responses = 1
     86 
     87 #关闭路由转发
     88 net.ipv4.ip_forward = 0
     89 net.ipv4.conf.all.send_redirects = 0
     90 net.ipv4.conf.default.send_redirects = 0
     91 
     92 #开启反向路径过滤
     93 net.ipv4.conf.all.rp_filter = 1
     94 net.ipv4.conf.default.rp_filter = 1
     95 
     96 #处理无源路由的包
     97 net.ipv4.conf.all.accept_source_route = 0
     98 net.ipv4.conf.default.accept_source_route = 0
     99 
    100 #关闭sysrq功能
    101 kernel.sysrq = 0
    102 
    103 #core文件名中添加pid作为扩展名
    104 kernel.core_uses_pid = 1
    105 
    106 # 开启SYN洪水攻击保护
    107 net.ipv4.tcp_syncookies = 1
    108 
    109 #修改消息队列长度
    110 kernel.msgmnb = 65536
    111 kernel.msgmax = 65536
    112 
    113 #设置最大内存共享段大小bytes
    114 kernel.shmmax = 68719476736
    115 kernel.shmall = 4294967296
    116 
    117 #timewait的数量,默认180000
    118 net.ipv4.tcp_max_tw_buckets = 6000
    119 net.ipv4.tcp_sack = 1
    120 net.ipv4.tcp_window_scaling = 1
    121 net.ipv4.tcp_rmem = 4096 87380 4194304
    122 net.ipv4.tcp_wmem = 4096 16384 4194304
    123 net.core.wmem_default = 8388608
    124 net.core.rmem_default = 8388608
    125 net.core.rmem_max = 16777216
    126 net.core.wmem_max = 16777216
    127 
    128 #每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目
    129 net.core.netdev_max_backlog = 262144
    130 
    131 #限制仅仅是为了防止简单的DoS 攻击
    132 net.ipv4.tcp_max_orphans = 3276800
    133 
    134 #未收到客户端确认信息的连接请求的最大值
    135 net.ipv4.tcp_max_syn_backlog = 262144
    136 net.ipv4.tcp_timestamps = 0
    137 
    138 #内核放弃建立连接之前发送SYNACK 包的数量
    139 net.ipv4.tcp_synack_retries = 1
    140 
    141 #内核放弃建立连接之前发送SYN 包的数量
    142 net.ipv4.tcp_syn_retries = 2
    143 
    144 #启用timewait 快速回收
    145 net.ipv4.tcp_tw_recycle = 1
    146 
    147 #开启重用。允许将TIME-WAIT sockets 重新用于新的TCP 连接
    148 net.ipv4.tcp_tw_reuse = 1
    149 net.ipv4.tcp_mem = 94500000 915000000 927000000
    150 net.ipv4.tcp_fin_timeout = 1
    151 
    152 #当keepalive 起用的时候,TCP 发送keepalive 消息的频度。缺省是2 小时
    153 net.ipv4.tcp_keepalive_time = 30
    154 
    155 #允许系统打开的端口范围
    156 net.ipv4.ip_local_port_range = 1024 65000
    157 
    158 #修改防火墙表大小,默认65536
    159 #net.netfilter.nf_conntrack_max=655350
    160 #net.netfilter.nf_conntrack_tcp_timeout_established=1200
    161 
    162 # 确保无人能修改路由表
    163 net.ipv4.conf.all.accept_redirects = 0
    164 net.ipv4.conf.default.accept_redirects = 0
    165 net.ipv4.conf.all.secure_redirects = 0
    166 net.ipv4.conf.default.secure_redirects = 0
    167 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线程

    人们永远没有足够的时间把它做好,但永远有足够的时间重新来过。 可是,因为并不是总有机会重做一遍,你必须做得更好,换句话说, 人们永远没有足够的时间去考虑到底是不是想要它,但永远有足够的时间去为之后悔。 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ 浅掘千口井,不如深挖一口井!当知识支撑不了野心时,那就静下心来学习吧!运维技术交流QQ群:618354452

    个人微信公众号,定期发布技术文章和运维感悟。欢迎大家关注交流。

  • 相关阅读:
    记一次proc_open没有开启心得感悟
    Nginx 502 Bad Gateway 的错误的解决方案
    Linux安装redis,启动配置不生效(指定启动加载配置文件)
    设置redis访问密码
    LNMP 多版本PHP同时运行
    ***总结:在linux下连接redis并进行命令行操作(设置redis密码)
    设计模式(一)单例模式:3-静态内部类模式(Holder)
    设计模式(一)单例模式:2-懒汉模式(Lazy)
    设计模式(一)单例模式:1-饿汉模式(Eager)
    设计模式(一)单例模式:概述
  • 原文地址:https://www.cnblogs.com/miaocbin/p/11345467.html
Copyright © 2011-2022 走看看