zoukankan      html  css  js  c++  java
  • rabbitmq 简单应用

    运行模式介绍

    单一模式:即单机情况不做集群,就单独运行一个rabbitmq而已。

    普通模式:默认模式,以两个节点(rabbit01、rabbit02)为例来进行说明。对于Queue来说,消息实体只存在于其中一个节点rabbit01(或者rabbit02),rabbit01和rabbit02两个节点仅有相同的元数据,即队列的结构。当消息进入rabbit01节点的Queue后,consumer从rabbit02节点消费时,RabbitMQ会临时在rabbit01、rabbit02间进行消息传输,把A中的消息实体取出并经过B发送给consumer。所以consumer应尽量连接每一个节点,从中取消息。即对于同一个逻辑队列,要在多个节点建立物理Queue。否则无论consumer连rabbit01或rabbit02,出口总在rabbit01,会产生瓶颈。当rabbit01节点故障后,rabbit02节点无法取到rabbit01节点中还未消费的消息实体。如果做了消息持久化,那么得等rabbit01节点恢复,然后才可被消费;如果没有持久化的话,就会产生消息丢失的现象。

    镜像模式:把需要的队列做成镜像队列,存在与多个节点属于RabbitMQ的HA方案。该模式解决了普通模式中的问题,其实质和普通模式不同之处在于,消息实体会主动在镜像节点间同步,而不是在客户端取数据时临时拉取。该模式带来的副作用也很明显,除了降低系统性能外,如果镜像队列数量过多,加之大量的消息进入,集群内部的网络带宽将会被这种同步通讯大大消耗掉。所以在对可靠性要求较高的场合中适用。

    安装rabbitmq

    http://www.rabbitmq.com/install-rpm.html
    
    https://github.com/rabbitmq/erlang-rpm
    

    rabbitmq 与erlang的依赖关系

    RabbitMQ Minimum required Erlang/OTP Maximum supported Erlang/OTP
    3.7.7 19.3.6.4 21.0.x
    3.7.6 3.7.5 3.7.4 3.7.3 3.7.2 3.7.1 3.7.0 19.3 20.3.x
    3.6.16 3.6.15 19.3 20.3.x
    3.6.14 3.6.13 3.6.12 3.6.11 R16B03 20.1.x
    3.6.10 3.6.9 3.6.8 3.6.7 3.6.6 3.6.5 3.6.4 R16B03 19.3.x
    3.6.3 3.6.2 3.6.1 3.6.0 R16B03 18.3.x
    3.5.x R14B04 17.5.x
    3.4.x R13B03 16B03

    本次安装erlang版本为21.0.x,rabbitmq的版本为3.7.7

    安装erlang,使用一个支持rabbimq但删除删除多余模块的erlang rpm包安装

    # cat /etc/yum.repos.d/erlang.repo 
    [rabbitmq-erlang]
    name=rabbitmq-erlang
    baseurl=https://dl.bintray.com/rabbitmq/rpm/erlang/21/el/7
    gpgcheck=1
    gpgkey=https://dl.bintray.com/rabbitmq/Keys/rabbitmq-release-signing-key.asc
    repo_gpgcheck=0
    enabled=1
    
    # yum install erlang -y
    # rpm -qa|grep erlang
    erlang-21.0.3-1.el7.centos.x86_64
    
    

    下载rabbimq 安装包

    # wget https://dl.bintray.com/rabbitmq/all/rabbitmq-server/3.7.7/rabbitmq-server-3.7.7-1.el7.noarch.rpm
    # rpm -ivh rabbitmq-server-3.7.7-1.el7.noarch.rpm
    

    rabbitmq的数据目录和日志目录分别为 /var/lib/rabbitmq /var/log/rabbitmq ,使用docker 运行rabbitmq数据持久化要将他们挂载到宿主机

    启动rabbitmq

    rabbitmq在第一次启动的时候会进行初始化创建一个guest用户,密码也是guest,并给其一个administrator的tags

    systemctl start rabbitmq-server
    

    查看状态

    rabbitmqctl status
    

    停止服务

    rabbitmqctl stop_app
    

    启动服务

    rabbitmqctl start_app
    

    启动web管理插件

    rabbitmq-plugins enable rabbitmq_management
    

    创建一个用户,并设置为administrator权限

    rabbitmqctl add_user admin admin
    rabbitmqctl set_user_tags admin administrator
    

    查询全部用户

    rabbitmqctl list_users
    

    对用户进行授权命令:rabbitmqctl set_permissions [-p vhostpath] username regexp regexp regexp

    对用户pan授予对全部host的全部权限:

    rabbitmqctl  set_permissions  -p  /  pan  '.*'  '.*'  '.*'
    

    列出用户权限命令:rabbitmqctl list_user_permissions username

    使用rabbitmqctl change_password username newpassword 进行密码修改

    删除用户命令: rabbitmqctl delete_user username

    列出用户权限命令:rabbitmqctl list_user_permissions username

    创建普通集群

    hostname ip
    rabb-1 192.168.226.42
    rabb-2 192.168.226.43

    先确保.erlang.cookie文件在集群内的每个机器一致,.erlang.cookie 在$HOME 或者/var/lib/rabbitmq下面,保证其权限为 600

    在rabb-1上面操作
    首先停止服务

    rabbitmqctl stop_app
    

    加入集群

    rabbitmqctl join_cluster --ram rabbit@rabb-2
    
    --ram 和 --disc 的区别介绍 https://www.cnblogs.com/me-sa/archive/2012/11/12/rabbitmq_ram_or_disk_node.html
    

    启动服务

    rabbitmqctl start_app
    

    这个时候就发现在rabb-1上面的配置全部消失,在次创建用户,登陆网页查看吧

    这个时候集群处在普通模式,下面我们将创建镜像高可用模式集群

    镜像高可用模式集群

    镜像集群其实通过普通集群开启策略来实现的
    在普通集群开启如下策略:

    rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
    
    ha-all:为策略名称。
    
    ^:为匹配符,只有一个^代表匹配所有,^zlh为匹配名称为zlh的exchanges或者queue。
    
    ha-mode:为匹配类型,他分为3种模式:all-所有(所有的queue),exctly-部分(需配置ha-params参数,此参数为int类型比如3,众多集群中的随机3台机器),nodes-指定(需配置ha-params参数,此参数为数组类型比如["3rabbit@F","rabbit@G"]这样指定为F与G这2台机器。)。
    

    查看集群状态:

    # rabbitmqctl cluster_status
    Cluster status of node rabbit@rabb-1 ...
    [{nodes,[{disc,['rabbit@rabb-2']},{ram,['rabbit@rabb-1']}]},
     {running_nodes,['rabbit@rabb-2','rabbit@rabb-1']},
     {cluster_name,<<"rabbit@rabb-1">>},
     {partitions,[]},
     {alarms,[{'rabbit@rabb-2',[]},{'rabbit@rabb-1',[]}]}]
    

    nodename 设置

    linux环境下如果没有指定rabbitmq的nodename将使用默认值 rabbit@$HOSTNAME

    可以在启动前设置环境变量 RABBITMQ_NODENAME 来指定rabbitmq的nodename

    修改web端口

    编辑文件/etc/rabbitmq/rabbitmq.config如下,将web端口修改为16672

    cat /etc/rabbitmq/rabbitmq.config
    [{rabbit, [{loopback_users, []}, {cluster_partition_handling, ignore}]}, {kernel, [{net_ticktime, 120}]}, {rabbitmq_management, [{listener, [{port, 16672}]}]}].
    

    修改rabbimq的服务端口RABBITMQ_NODE_PORT和用于节点和CLI工具连接的端口

    服务端口RABBITMQ_NODE_PORT 默认为5672,可以在启动rabbitmq前使用 自定义环境变量 RABBITMQ_NODE_PORT 来修改

    RABBITMQ_DIST_PORT 默认为 服务端口+20000 ,可以在启动rabbitmq前使用 自定义环境变量 RABBITMQ_DIST_PORT 来修改

    erlang 集群端口ERL_EPMD_PORT 修改

    erlang 集群端口默认为4369 , ,可以在启动rabbitmq前使用 自定义环境变量 "ERL_EPMD_PORT 来修改

    参考文档

    https://www.cnblogs.com/knowledgesea/p/6535766.html
    
    https://www.cnblogs.com/huangxincheng/p/6113891.html
    
    https://www.cnblogs.com/wangiqngpei557/p/6158094.html
    
    https://www.cnblogs.com/flat_peach/archive/2013/04/07/3004008.html
    
    https://www.cnblogs.com/zhen-rh/p/6884297.html
  • 相关阅读:
    freemark生成静态网页乱码问题
    使用JedisCluster出现异常:java.lang.NumberFormatException
    [程序员代码面试指南]第9章-一种消息接收并打印的结构(链表)
    [程序员代码面试指南]字符串问题-最小包含子串的长度
    [程序员代码面试指南]二叉树问题-判断t1树是否包含t2树的全部拓扑结构、[LeetCode]572. 另一个树的子树
    [程序员代码面试指南]二叉树问题-在二叉树中找到两个节点的最近公共祖先、[LeetCode]235. 二叉搜索树的最近公共祖先(BST)(非递归)
    [Codeforces1174B]Ehab Is an Odd Person
    [CF571B]Minimization(贪心+DP)
    [HDU2577]How to Type(DP)
    [POJ1050]To the Max(最大子段和)
  • 原文地址:https://www.cnblogs.com/panjunbai/p/9412823.html
Copyright © 2011-2022 走看看