Rabbitmq集群(双磁盘双内存节点) + Haproxy + keepalived

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hiyun9/article/details/79614860

一、系统功能概述

Rabbitmq:
AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持AJAX。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。

Haproxy:
HAProxy 是一款提供高可用性、负载均衡以及基于TCP(第四层)和HTTP(第七层)应用的代理软件,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。 HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在时下的硬件上,完全可以支持数以万计的 并发连接。

Keepalived:
Keepalived是一个免费开源的,用C编写的类似于layer3, 4 & 7交换机制软件,具备我们平时说的第3层、第4层和第7层交换机的功能。主要提供loadbalancing(负载均衡)和 high-availability(高可用)功能,负载均衡实现需要依赖Linux的虚拟服务内核模块(ipvs),而高可用是通过VRRP协议实现多台机器之间的故障转移服务。


二、应用/系统拓扑图


三、系统部署安装

部署环境

主机 角色 操作系统 软件版本 备注
mq-01(172.16.2.70) haproxy,keepalived,rabbitmq(disk) CentOS Linux release 7.3.1611 (Core) haproxy-1.5.18-3.el7_3.1.x86_64,keepalived-1.2.13-9.el7_3.x86_64,rabbitmq3.6.5 haproxy + keepalived 主节点,rabbitmq磁盘节点
mq-02(172.16.2.47) haproxy,keepalived,rabbitmq(memory) CentOS Linux release 7.3.1611 (Core) haproxy-1.5.18-3.el7_3.1.x86_64,keepalived-1.2.13-9.el7_3.x86_64,rabbitmq3.6.5 haproxy + keepalived 备节点,rabbitmq内存节点
mq-03(172.16.2.118) rabbitmq(memory) CentOS Linux release 7.3.1611 (Core) rabbitmq3.6.5 rabbitmq内存节点
mq-04(172.16.2.160) rabbitmq(disk) CentOS Linux release 7.3.1611 (Core) rabbitmq3.6.5 rabbitmq磁盘节点


四、Haproxy + keepalived部署安装

Haproxy安装及配置

  • Haproxy安装
[root@mq1]#yum install haproxy   
  • Haproxy配置
[root@mq1]#vim /etc/haproxy/haproxy.cfg
    global
        # log /yougo/haproxy/home/log    local0
        # log /yougo/haproxy/home/log    local1 notice
        # chroot /yougo/haproxy         # 改变当前工作目录
        # stats socket /yougo/haproxy/home/admin.sock mode 660 level admin   # 创建监控所用的套接字目录
        pidfile  /var/run/haproxy.pid   # haproxy的pid存放路径,启动进程的用户必须有权限访问此文件 
        maxconn  4000                   # 最大连接数,默认4000
        #  user   haproxy               # 默认用户
        #  group   haproxy              # 默认用户组
        daemon                          # 创建1个进程进入deamon模式运行。此参数要求将运行模式设置为"daemon
        # Default SSL material locations
        # ca-base /etc/ssl/certs
        # crt-base /etc/ssl/private
        # Default ciphers to use on SSL-enabled listening sockets.
        # For more information, see ciphers(1SSL). This list is from:
        #  https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/
        # ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS
        # ssl-default-bind-options no-sslv3
    ###########默认配置#########
    defaults
        log global
        mode    http                # 默认的模式mode { tcp|http|health },tcp是4层,http是7层,health只会返回OK
        option  httplog             # 采用http日志格式
        option  dontlognull         # 启用该项,日志中将不会记录空连接。所谓空连接就是在上游的负载均衡器或者监控系统为了探测该服务是否存活可用时,
                                    # 需要定期的连接或者获取某一固定的组件或页面,或者探测扫描端口是否在监听或开放等动作被称为空连接;
                                    # 官方文档中标注,如果该服务上游没有其他的负载均衡器的话,建议不要使用
                                    # 该参数,因为互联网上的恶意扫描或其他动作就不会被记录下来
        timeout connect 5000        # 连接超时时间
        timeout client  50000       # 客户端连接超时时间
        timeout server  50000       # 服务器端连接超时时间
        option  httpclose        # 每次请求完毕后主动关闭http通道 
        option  httplog          # 日志类别http日志格式 
        #option  forwardfor      # 如果后端服务器需要获得客户端真实ip需要配置的参数,可以从Http Header中获得客户端ip  
        option  redispatch       # serverId对应的服务器挂掉后,强制定向到其他健康的服务器
        timeout connect 10000    # default 10 second timeout if a backend is not found
        maxconn     60000        # 最大连接数
        retries     3            # 3次连接失败就认为服务不可用,也可以通过后面设置 
        # errorfile 400 /yougo/haproxy/home/errors/400.http
        # errorfile 403 /yougo/haproxy/home/errors/403.http
        # errorfile 408 /yougo/haproxy/home/errors/408.http
        # errorfile 500 /yougo/haproxy/home/errors/500.http
        # errorfile 502 /yougo/haproxy/home/errors/502.http
        # errorfile 503 /yougo/haproxy/home/errors/503.http
        # errorfile 504 /yougo/haproxy/home/errors/504.http
    ####################################################################
    listen http_front
            bind 0.0.0.0:8888           #监听端口  
            stats refresh 30s           #统计页面自动刷新时间  
            stats uri /haproxy?stats    #统计页面url  
            stats realm Haproxy Manager #统计页面密码框上提示文本  
            stats auth admin:admin      #统计页面用户名和密码设置  
            #stats hide-version         #隐藏统计页面上HAProxy的版本信息
    #####################RabbitMQ的管理界面也放在HAProxy后面了###############################
    #listen rabbitmq_admin 
    #    bind 0.0.0.0:8004
    #   server node1 192.168.0.31:15672
    #    server node2 192.168.0.32:15672
    #    server node3 192.168.0.33:15672
    ####################################################################
    listen rabbitmq_cluster
        bind 0.0.0.0:8889                #rabbitmq集群调用的端口
        option tcplog
        mode tcp
        timeout client  3h
        timeout server  3h
        option          clitcpka
        balance roundrobin      #负载均衡算法(#banlance roundrobin 轮询,balance source 保存session值,支持static-rr,leastconn,first,uri等参数)
        #balance url_param userid
        #balance url_param session_id check_post 64
        #balance hdr(User-Agent)
        #balance hdr(host)
        #balance hdr(Host) use_domain_only
        #balance rdp-cookie
        #balance leastconn
        #balance source //ip
        server   rabbitmq1  172.16.2.70:5672 check inter 5s rise 2 fall 3   #check inter 2000 是检测心跳频率,rise 2是2次正确认为服务器可用,fall 3是3次失败认为服务器不可用
        server   rabbitmq2  172.16.2.47:5672 check inter 5s rise 2 fall 3
        server   rabbitmq3  172.16.2.118:5672 check inter 5s rise 2 fall 3
        server   rabbitmq4  172.16.2.160:5672 check inter 5s rise 2 fall 3

mq2操作一致。


五、Keepalived安装及配置

  • 配置VIP
[root@mq1]#ifconfig eth0:0 172.16.2.243 netmask 255.255.255.0 up
  • Keepalived安装
[root@xx]#yum install keepalived
  • Keepalived配置
[root@xx]#vim /etc/keepalived/keepalived.conf
    ! Configuration File for keepalived
    vrrp_script chk_http_port {
    script "/etc/keepalived/check_haproxy.sh"
    interval 2
    weight 2
    global_defs {
    router_id LVS_DEVEL
    }
    vrrp_instance VI_1 {
    state MASTER   #mq-02上改为BACKUP
    interface eth0
    virtual_router_id 51
    priority 150   #mq-02上改为120
    advert_int 1
    authentication {
    auth_type PASS
    auth_pass 1111
    }
    track_script {
    chk_http_port
    }
    virtual_ipaddress {
    172.16.2.243
    }
    }
    }
  • 监控haproxy运行脚本
#!/bin/bash
    A=`ps -C haproxy --no-header |wc -l`
    if [ $A -eq 0 ];then
        systemctl restart haproxy
        sleep 3
    if [ `ps -C haproxy --no-header |wc -l` -eq 0 ];then
        /etc/init.d/keepalived stop
    fi
    fi

五、rabbitmq 安装配置

  • rabbitmq环境及服务安装
# 因为rabbitmq基于erl,所以要先安装erl环境
# https://pan.baidu.com/s/11gvOqe7DumS_nDlYtUuc2w  密码:lr2u  rabbimq_server下载地址
# https://pan.baidu.com/s/1L_gpZBAfTkI3ymOJqFtGRA  密码:k9ih  erlang下载地址
# 下载之后解压就可以用了,然后再配置环境变量
 
# vim /etc/profile
ERL_HOME=/usr/local/bin/erlang
PATH=$ERL_HOME/bin:$PATH
export ERL_HOME
export RABBIT_HOME=/yougo/rabbitmq_server-3.6.5/
export PATH=/$RABBIT_HOME/sbin:$PATH:$ERL_HOME/bin

# source /etc/profile

rabbitmq集群配置

  • 设置 Erlang Cookie

    RabbitMQ节点之间和命令行工具 (e.g. rabbitmqctl)是使用Cookie互通的,Cookie是一组随机的数字+字母的字符串。当RabbitMQ服务器启动的时候,Erlang VM会自动创建一个随机内容的Cookie文件。如果是通过源安装RabbitMQ的话,Erlang Cookie 文件在/var/lib/rabbitmq/.erlang.cookie。如果是通过源码安装的RabbitMQ,Erlang Cookie文件$HOME/.erlang.cookie。

  • 本文演示的实例是用源码安装,由于这个文件权限是 400,所以需要先修改所有mq节点中的该文件权限为 777:

[root@xx]#chmod 777 /root/.erlang.cookie
# 然后将.erlang.cookie复制到其他节点。并在所有节点上执行此命令,完成后将所有节点的权限更改回原来的,并确认所有节点的cookie内容一致:
[root@xx]#scp -r root@mq-01:/root/.erlang.cookie /root
[root@xx]#chmod 400 .erlang.cookie
[root@xx]#cat /root/.erlang.cookie 
DZXTQGRNIMJQMSAHLZMK
  • 使用detached参数,在后台启动Rabbit Node,每个节点都一样
[root@xx]#rabbitmqctl stop                   #停止先有的rabbitmq
[root@xx]#rabbitmq-server -detached          #mq在后台启动
[root@xx]#rabbitmqctl cluster_status         #查看集群状态
  • 将所有节点组成集群
# 因为rabbitmq-server启动时,会一起启动节点和应用,它预先设置RabbitMQ应用为standalone模式。
要将一个节点加入到现有的集群中,你需要停止这个应用并将节点设置为原始状态,然后就为加入集群准备好了。
如果使用rabbitmqctl stop,应用和节点都将被关闭。所以使用rabbitmqctl stop_app仅仅关闭应用。

[root@xx]#rabbitmqctl stop_app                                 #关闭应用
[root@xx]#rabbitmqctl join_cluster rabbit@hz01-qa-base-mq-01   #默认以磁盘节点方式加入集群
[root@xx]#rabbitmqctl start_app                                #开启应用
[root@xx]#rabbitmqctl join_cluster --ram rabbit@hz01-qa-base-mq-01  #以内存节点方式加入集群
  • 查看控制台,我们把域名绑定vip然后访问控制台。


六、操作手册

  • rabbitmq权限管理


[root@xx]#rabbitmqctl add_user username passwd #添加mq账号密码
[root@xx]#rabbitmqctl add_vhost /vhostname     #添加vhost
[root@xx]#rabbitmqctl set_permissions -p /vhostname username '.*' '.*' '.*'   #将vhost权限赋予某个用户
[root@xx]#rabbitmqctl set_user_tags username management   #设置用户权限
[root@xx]#rabbitmqctl list_users     #查看用户列表
[root@xx]#rabbitmqctl list_user_permissions username  #查看用户权限
[root@xx]#rabbitmqctl  change_password  username  Newpassword  #重置账号密码
  • rabbitmq插件管理
[root@xx]#rabbitmq-plugins enable {插件名}     #开启某个插件
[root@xx]#rabbitmq-plugins enable {插件名}     #关闭某个插件
有关插件名可以在rabbitmq的安装目录下的plugins目录中查看:$RABBITMQ_HOME/plugins
举例:
[root@xx]#rabbitmq-plugins enable rabbitmq_management  
[root@xx]#rabbitmq-plugins list
  • rabbitmq集群管理
[root@xx]#rabbitmqctl stop_app # 关闭mq应用
[root@xx]#rabbitmqctl reset    # 使用此命令会将节点信息清空,然后再执行加入集群的相关操作。
[root@xx]#rabbitmqctl join_cluster {rabbit_node_name}    #以磁盘节点方式加入集群
[root@xx]#rabbitmqctl join_cluster --ram rabbit@hz01-qa-base-mq-01    #以内存节点方式加入集群
[root@xx]#rabbitmqctl start_app     #开启mq应用
[root@xx]#rabbitmqctl cluster_status    #查看集群状态
[root@xx]#rabbitmqctl forget_cluster_node {rabbit_node_name}   #剔除某个节点
  • rabbitmq自动分区后处理方式
[root@hz01-qa-base-mq-01]# cd /yougo/rabbitmq_server-3.6.5/etc/rabbitmq
[root@hz01-qa-base-mq-01]# vim rabbitmq.config
    [
        {rabbit,[{cluster_partition_handling,pause_minority}]}
    ].
    #添加此配置参数,当出现分区情况下,会将集群中节点数较多的对外提供服务。
    #配置添加完成后需要执行:
    [root@hz01-qa-base-mq-01]# rabbitmqctl stop
    [root@hz01-qa-base-mq-01]# rabbitmq-server -detached
    [root@hz01-qa-base-mq-01]# rabbitmqctl environment
    .....
    {rabbit,
         [{auth_backends,[rabbit_auth_backend_internal]},
          {auth_mechanisms,['PLAIN','AMQPLAIN']},
          {backing_queue_module,rabbit_priority_queue},
          {**cluster_partition_handling,pause_minority**},
          {channel_max,0},
    .....

文中的配置文件及代码的地址我放在git上了:https://github.com/jinyuchen724/rabbitmq.git

有什么问题可以直接加我微信hiyun9!

喜欢的话支付宝扫个赏金,,谢谢各位老板



猜你喜欢

转载自blog.csdn.net/hiyun9/article/details/79614860