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

  • 相关阅读:
    不常用的cmd命令
    js获取宽度
    Marshaling Data with Platform Invoke 概览
    Calling a DLL Function 之三 How to: Implement Callback Functions
    Marshaling Data with Platform Invoke 之四 Marshaling Arrays of Types
    Marshaling Data with Platform Invoke 之一 Platform Invoke Data Types
    Marshaling Data with Platform Invoke 之三 Marshaling Classes, Structures, and Unions(用时查阅)
    Calling a DLL Function 之二 Callback Functions
    WCF 引论
    Marshaling Data with Platform Invoke 之二 Marshaling Strings (用时查阅)
  • 原文地址:https://www.cnblogs.com/FRESHMANS/p/10791814.html
Copyright © 2011-2022 走看看