zoukankan      html  css  js  c++  java
  • Centos7 安装配置 Rabbitmq Cluster

    Rabbitmq介绍

    RabbitMQ 是由 LShift 提供的一个 Advanced Message Queuing Protocol (AMQP) 的开源实现,由以高性能、健壮以及可伸缩性出名的 Erlang 写成,因此也是继承了这些优点。

    AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。它从生产者接收消息并递送给消费者,在这个过程中,根据规则进行路由,缓存与持久化。

    AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。

    RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持AJAX。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。

    RabbitMQ的基础概念

    • Broker:简单来说就是消息队列服务器实体

    • Exchange:消息交换机,它指定消息按什么规则,路由到哪个队列

    • Queue:消息队列载体,每个消息都会被投入到一个或多个队列

    • Binding:绑定,它的作用就是把exchange和queue按照路由规则绑定起来

    • Routing Key:路由关键字,exchange根据这个关键字进行消息投递

    • vhost:虚拟主机,一个broker里可以开设多个vhost,用作不同用户的权限分离

    • producer:消息生产者,就是投递消息的程序

    • consumer:消息消费者,就是接受消息的程序

    • channel:消息通道,在客户端的每个连接里,可建立多个channel,每个channel代表一个会话任务

    RabbitMQ的特性

    • 可靠性:包括消息持久化,消费者和生产者的消息确认

    • 灵活路由:遵循AMQP协议,支持多种Exchange类型实现不同路由策略

    • 分布式:集群的支持,包括本地网络与远程网络

    • 高可用性:支持主从备份与镜像队列

    • 多语言支持:支持多语言的客户端

    • WEB界面管理:可以管理用户权限,exhange,queue,binding,与实时监控

    • 访问控制:基于vhosts实现访问控制

    • 调试追踪:支持tracing,方便调试

    RabbitMQ 安装

    rabbitmq安装分为 rpm安装和binary安装,本节使用rpm安装。官方安装地址如下 https://www.rabbitmq.com/install-rpm.html

    安装过程中,由于需要安装erlang,官网导入的yum 源文件访问比较慢,所以果断使用阿里云yum 源。注意版本问题,参考这里

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

    下载rabbitmq rpm安装文件

    wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.7.14/rabbitmq-server-3.7.14-1.el7.noarch.rpm && yum localinstall rabbitmq-server-3.7.14-1.el7.noarch.rpm

    默认会自动安装erlang

    rabbitmq默认配置文件

    /usr/lib/rabbitmq/lib/rabbitmq_server-3.7.14/sbin/rabbitmq-defaults,里面定义了数据目录和日志目录等

    启动rabbitmq

    systemctl start rabbitmq-server

    查看进程

    $ ps -ef |grep rabbitmq
    root     13397 16602  0 17:14 pts/0    00:00:00 grep --color=auto rabbitmq
    rabbitmq 26797     1  1 15:30 ?        00:01:58 /usr/lib64/erlang/erts-9.3.3.6/bin/beam.smp -W w -A 64 -MBas ageffcbf -MHas ageffcbf -MBlmbcs 512 -MHlmbcs 512 -MMmcs 30 -P 1048576 -t 5000000 -stbt db -zdbbl 128000 -K true -- -root /usr/lib64/erlang -progname erl -- -home /var/lib/rabbitmq -- -pa /usr/lib/rabbitmq/lib/rabbitmq_server-3.7.14/ebin  -noshell -noinput -s rabbit boot -sname rabbit@k8s_node2 -boot start_sasl -kernel inet_default_connect_options [{nodelay,true}] -sasl errlog_type error -sasl sasl_error_logger false -rabbit lager_log_root "/var/log/rabbitmq" -rabbit lager_default_file "/var/log/rabbitmq/rabbit@k8s_node2.log" -rabbit lager_upgrade_file "/var/log/rabbitmq/rabbit@k8s_node2_upgrade.log" -rabbit enabled_plugins_file "/etc/rabbitmq/enabled_plugins" -rabbit plugins_dir "/usr/lib/rabbitmq/plugins:/usr/lib/rabbitmq/lib/rabbitmq_server-3.7.14/plugins" -rabbit plugins_expand_dir "/var/lib/rabbitmq/mnesia/rabbit@k8s_node2-plugins-expand" -os_mon start_cpu_sup false -os_mon start_disksup false -os_mon start_memsup false -mnesia dir "/var/lib/rabbitmq/mnesia/rabbit@k8s_node2" -kernel inet_dist_listen_min 25672 -kernel inet_dist_listen_max 25672
    rabbitmq 27167 26797  0 15:30 ?        00:00:00 erl_child_setup 32768
    rabbitmq 27191 27167  0 15:30 ?        00:00:00 inet_gethost 4
    rabbitmq 27192 27191  0 15:30 ?        00:00:00 inet_gethost 4

    $ netstat -ntlp | grep 5672

    查看状态

    $ systemctl status rabbitmq-server.service

    $ rabbitmqctl status

    安装管理插件

    web管理插件
    rabbitmq-plugins list      #查看插件列表
    rabbitmq-plugins enable rabbitmq_management
     
    日志跟踪插件
    rabbitmq-plugins enable rabbitmq_tracing  #rabbitmq启用trace插件
    rabbitmqctl trace_on      #打开trace的开关
    rabbitmqctl trace_on -p test #打开trace的开关(test为需要日志追踪的vhost)
    rabbitmqctl trace_off     #关闭trace的开关
    安装rabbitmq_delayed_message_exchange(延时队列)
     
    默认插件目录:
    cd /usr/lib/rabbitmq/lib/rabbitmq_server-3.7.14/plugins/
    wget https://dl.bintray.com/rabbitmq/community-plugins/rabbitmq_delayed_message_exchange-0.0.1.ez
     
    rabbitmq-plugins enable rabbitmq_delayed_message_exchange
    The following plugins have been enabled:
    rabbitmq_delayed_message_exchange
     
    Applying plugin configuration to v01-app-rabbit@localhost... started 1 plugin.

    至此3台上面的rabbitmq都已安装完成,并且启动正常,现在开始配置集群服务。

    日志文件:

    参考默认配置文件

    Rabbitmq配置集群

    rabbitmq的集群是依附于erlang的集群来工作的,所以必须先构建起erlang的集群镜像。Erlang的集群中各节点是经由过程一个magic cookie来实现的。这个cookie存放在 ${rabbitmq_home}/.erlang.cookie 中,本节使用rpm安装的,所以.erlang.cookie就放在/var/lib/rabbitmq/中

    erlang.cookie是erlang实现分布式的必要文件,erlang分布式的每个节点上要保持相同的.erlang.cookie文件,同时保证文件的权限是400,不然节点之间就无法通信。

    打开文件然后需要先把其中的一台服务器的.erlang.cookie中的内容复制到别的机器上,最好是复制内容,因为文件权限不对的话会出现问题。

    也可是直接使用scp传过去,记得文件权限和用户属主属组如scp .erlang.cookie root@10.20.200.232:/tmp

    erlang.cookie复制完成后,逐个重启节点服务:

    systemctl restart rabbitmq-server.service

    添加节点到集群

    将rabbit@k8s_node1作为集群主节点,在节点k8s_node2和节点k8s_node3上面分别执行如下命令,以加入集群中.

    $ rabbitmqctl stop_app
    Stopping rabbit application on node rabbit@k8s_node3 ...
    $ rabbitmqctl join_cluster rabbit@k8s_node1 Clustering node rabbit@k8s_node3 with rabbit@k8s_node1
    $ rabbitmqctl start_app Starting node rabbit@k8s_node3 ... completed with 3 plugins.

    查看集群状态

    $ rabbitmqctl cluster_status
    Cluster status of node rabbit@k8s_node3 ...
    [{nodes,[{disc,[rabbit@k8s_node1,rabbit@k8s_node2,rabbit@k8s_node3]}]},
     {running_nodes,[rabbit@k8s_node1,rabbit@k8s_node2,rabbit@k8s_node3]},
     {cluster_name,<<"rabbit@k8s_node1">>},
     {partitions,[]},
     {alarms,[{rabbit@k8s_node1,[]},{rabbit@k8s_node2,[]},{rabbit@k8s_node3,[]}]}]

    从集群中移除节点

    $ rabbitmqctl stop_app
    Stopping rabbit application on node 'rabbit@k8s_node2'
    $ rabbitmqctl reset Resetting node 'rabbit@k8s_node2'
    $ rabbitmqctl start_app Starting node 'rabbit@v01-app-rabbitmq02'

    #首先将要移除的节点停机.
    $ rabbitmqctl stop
    Stopping and halting node 'k8s_node2' ...

    #然后在主节点,也就是发起进群的主机上进行节点的移除.
    $ rabbitmqctl forget_cluster_node k8s_node2

    #然后查看集群状态
    $ rabbitmqctl cluster_status
     

    RABBITMQ集群重启

    集群重启时,最后一个挂掉的节点应该第一个重启,如果因特殊原因(比如同时断电),而不知道哪个节点最后一个挂掉。可用以下方法重启:

    #先在一个节点上执行
    $ rabbitmqctl force_boot
    
    $ systemctl  start rabbitmq-server 
    
    #在其他节点上执行
    $ systemctl start rabbitmq-server
    
    #查看cluster状态是否正常(要在所有节点上查询)。
    $ rabbitmqctl cluster_status

    如果有节点没加入集群,可以先退出集群,然后再重新加入集群。

    上述方法不适合内存节点重启,内存节点重启的时候是会去磁盘节点同步数据,如果磁盘节点没起来,内存节点一直失败。

    改变集群节点类型
    加入集群时指定节点类型:

    rabbitmqctl stop_app
    rabbitmqctl join_cluster --ram rabbit@k8s_node2
    rabbitmqctl start_app

    --ram 指定内存节点类型,--disc指定磁盘节点类型,默认为磁盘节点类型

    修改节点类型

    rabbitmqctl stop_app
    rabbitmqctl change_cluster_node_type disc
    rabbitmqctl start_app

    Haproxy 配置

    haproxy.cfg

    frontend rabbitMQ_cluster_frontend
    mode tcp
    option tcpka
    log 127.0.0.1 local0 debug
    bind 0.0.0.0:5672
    use_backend rabbitMQ_cluster_backend
    
    backend rabbitMQ_cluster_backend
    balance roundrobin
    server rabbitmq-node1 10.20.200.231:5672 check inter 3s rise 1 fall 2
    server rabbitmq-node2 10.20.200.232:5672 check inter 3s rise 1 fall 2
    server rabbitmq-node3 10.20.200.233:5672 check inter 3s rise 1 fall 2
    

      

    Rabbitmq 管理

    用户角色

    按照个人理解,用户角色可分为五类,超级管理员, 监控者, 策略制定者, 普通管理者以及其他。

    (1) 超级管理员(administrator)

    可登陆管理控制台(启用management plugin的情况下),可查看所有的信息,并且可以对用户,策略(policy)进行操作。

    (2) 监控者(monitoring)

    可登陆管理控制台(启用management plugin的情况下),同时可以查看rabbitmq节点的相关信息(进程数,内存使用情况,磁盘使用情况等)

    (3) 策略制定者(policymaker)

    可登陆管理控制台(启用management plugin的情况下), 同时可以对policy进行管理。但无法查看节点的相关信息。

    (4) 普通管理者(management)

    仅可登陆管理控制台(启用management plugin的情况下),无法看到节点信息,也无法对策略进行管理。

    (5) 其他

    无法登陆管理控制台,通常就是普通的生产者和消费者。

    了解了这些后,就可以根据需要给不同的用户设置不同的角色,以便按需管理。

    设置用户角色的命令为

    rabbitmqctl  set_user_tags  User  Tag

    User为用户名, Tag为角色名(对应于上面的administrator,monitoring,policymaker,management,或其他自定义名称)。

    也可以给同一用户设置多个角色,例如

    rabbitmqctl  set_user_tags  hncscwc  monitoring  policymaker

    账号管理

    添加账号:
    $rabbitmqctl add_user admin admin
    
    添加 权限tag $ rabbitmqctl set_user_tags admin administrator 删除用户(删除guest用户) $ rabbitmqctl delete_user guest Deleting user "guest" 修改用户的密码 $rabbitmqctl change_password Username Newpassword $ rabbitmqctl change_password admin 0GM1aol4z8GeSZY99 Changing password for user "admin" 查看当前用户列表 $ rabbitmqctl list_users Listing users admin [administrator]

    用户权限

    用户权限指的是用户对exchange,queue的操作权限,包括配置权限,读写权限。配置权限会影响到exchange,queue的声明和删除。

    读写权限影响到从queue里取消息,向exchange发送消息以及queue和exchange的绑定(bind)操作。

    例如: 将queue绑定到某exchange上,需要具有queue的可写权限,以及exchange的可读权限;向exchange发送消息需要具有exchange的可写权限;从queue里取数据需要具有queue的可读权限。详细请参考官方文档中"How permissions work"部分。

    相关命令为:

    # 设置用户权限
    $ rabbitmqctl  set_permissions  -p  VHostPath  User  ConfP  WriteP  ReadP
    
    # 查看(指定hostpath)所有用户的权限信息
    $ rabbitmqctl  list_permissions  [-p  VHostPath]
    
    # 查看指定用户的权限信息
    $ rabbitmqctl  list_user_permissions  User_name
    
    # 清除用户的权限信息
    $ rabbitmqctl  clear_permissions  [-p VHostPath]  User

    删除队列

    rabbitmqctl eval 'rabbit_amqqueue:internal_delete({resource,<<"/">>,queue,<<"queue_name">>}).'

    可参考这里

    web管理

    ip:15672

  • 相关阅读:
    event对象之与onmouse相关的事件触发
    对文档树进行导航
    event对象的onkeydown使用
    event的onchange方法
    函数名-函数参数坑-迭代器
    函数进阶-名称空间
    初识函数
    文件管理
    基础数据类型补充-编码进阶
    集合-缓存机制-深浅copy
  • 原文地址:https://www.cnblogs.com/FRESHMANS/p/10791814.html
Copyright © 2011-2022 走看看