zoukankan      html  css  js  c++  java
  • rabbitmq运维

    rabbitmq集群功能和原理:

      设计集群目的:

        允许消费者和生产者在RabbitMQ节点崩溃的情况下继续运行

        通过增加更多的节点来扩展消息通信的吞吐量

    rabbitmq可以通过三种方式来部署分布式集群系统,分别是:cluster、federation、shovel

      cluster:

        不支持夸网段,用于同一个网段内的局域网

        可以随意动态的增加和减少

        节点之间需要运行相同版本的rabbitmq和erlang

      federation:应用于广域网,允许单台服务器上的交换机或队列接收发布到另一台服务器交换机或队列的消息,可以是单独机器或集群。federation队列类似于单向点对点连接,消息会在联盟队列之间转发任意次,直到被消费者接受。通常使用federation来连接internet上的中间服务器,用作订阅分发消息或工作队列

      shovel:连接方式与federation的连接方式类似,但它工作在更低层次,可以应用于广域网

    节点类型

      RAM node:内存节点将所有队列、交换机、绑定、用户、权限、和vhost的元数据定义存储在内存中,好处是可以使得交换机和队列声明等操作更加快捷

      Disk node:将元数据存储在磁盘中,单节点系统只允许磁盘类型的节点,防止重启rabbitmq的时候,丢失系统的配置信息

      说明:rabbitmq要求集群中至少有一个磁盘节点,所有其他节点可以是内存节点,当节点加入或者离开时,必须要将该变更通知一个磁盘节点。如果集群中唯一的磁盘节点崩溃,集群扔可保持运行,但是无法进行其他操作(增删改查),直到节点恢复

      解决方法:设置两个磁盘节点,至少一个是可用的,可以保存元数据的更改

    Erlang Cookie

      Erlang Cookie是保证不同节点可以相互通信的密钥,要保证集群中的不同节点相互通信必须共享相同的Erlang Cookie。

      说明:这就要从rabbitmqctl命令的原理说起,rabbitmq底层是通过erlang架构来实现的,所以rabbitmqctl会启动erlang节点,并基于erlang节点来使用erlang系统连接rabbitmq节点。在连接过程中需要正确的Erlang Cookie和节点名称,Erlang节点通过交换Erlang Cookie以获得认证

    镜像队列

      RabbitMQ的Cluster集群模式一般分为两种,普通模式和镜像模式

        普通模式:默认的集群模式,以两个节点(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高可用性。作用就是消息实体会主动在镜像节点之间实现同步,而不是像普通模式那样,在consumer消费数据时临时读取。缺点就是,集群内部的同步通讯会占用大量的网络带宽

      实现机制
    镜像队列实现了RabbitMQ的高可用性(HA),具体的实现策略如下所示:

    ha-modeha-params功能
    all 镜像队列将会在整个集群中复制。当一个新的节点加入后,也会在这 个节点上复制一份。
    exactly count 镜像队列将会在集群上复制count份。如果集群数量少于count时候,队列会复制到所有节点上。如果大于Count集群,有一个节点crash后,新进入节点也不会做新的镜像。
    nodes node name 镜像队列会在node name中复制。如果这个名称不是集群中的一个,这不会触发错误。如果在这个node list中没有一个节点在线,那么这个queue会被声明在client连接的节点。
    rabbitmqctl set_policy [-p Vhost] Name Pattern Definition [Priority]
    
    -p Vhost: 可选参数,针对指定vhost下的queue进行设置
    Name: policy的名称
    Pattern: queue的匹配模式(正则表达式)
    Definition:镜像定义,包括三个部分ha-mode, ha-params, ha-sync-mode
        ha-mode:指明镜像队列的模式,有效值为 all/exactly/nodes
            all:表示在集群中所有的节点上进行镜像
            exactly:表示在指定个数的节点上进行镜像,节点的个数由ha-params指定
            nodes:表示在指定的节点上进行镜像,节点名称通过ha-params指定
        ha-params:ha-mode模式需要用到的参数
        ha-sync-mode:进行队列中消息的同步方式,有效值为automatic和manual
    priority:可选参数,policy的优先级

    下面的命令来查看那些slaves已经完成同步

    rabbitmqctl list_queues name slave_pids synchronised_slave_pids

    可以通过手动的方式同步一个queue:

    rabbitmqctl sync_queue name

    同样也可以取消某个queue的同步功能:

    rabbitmqctl cancel_sync_queue name

    通常队列由两部分组成:一部分是AMQQueue,负责AMQP协议相关的消息处理,即接收生产者发布的消息、向消费者投递消息、处理消息confirm、acknowledge等等;另一部分是BackingQueue,它提供了相关的接口供AMQQueue调用,完成消息的存储以及可能的持久化工作等

      

    在RabbitMQ中BackingQueue又由5个子队列组成:Q1, Q2, Delta, Q3和Q4。RabbitMQ中的消息一旦进入队列,不是固定不变的,它会随着系统的负载在队列中不断流动,消息的不断发生变化。与这5个子队列对于,在BackingQueue中消息的生命周期分为4个状态:

    • Alpha:消息的内容和消息索引都在RAM中。Q1和Q4的状态。
    • Beta:消息的内容保存在DISK上,消息索引保存在RAM中。Q2和Q3的状态。
    • Gamma:消息内容保存在DISK上,消息索引在DISK和RAM都有。Q2和Q3的状态。
    • Delta:消息内容和索引都在DISK上。Delta的状态

    注意:对于持久化的消息,消息内容和消息所有都必须先保存在DISK上,才会处于上述状态中的一种,而Gamma状态的消息是只有持久化的消息才会有的状态

    上述就是RabbitMQ的多层队列结构的设计,我们可以看出从Q1到Q4,基本经历RAM->DISK->RAM这样的过程。这样设计的好处是:当队列负载很高的情况下,能够通过将一部分消息由磁盘保存来节省内存空间,当负载降低的时候,这部分消息又渐渐回到内存,被消费者获取,使得整个队列具有很好的弹性

    RabbitMQ-官方指南-rabbitmqctl(1) 指南

    名称

    rabbitmqctl — 用于管理中间件的命令行工具

    语法

    rabbitmqctl [-n node] [-t timeout] [-q] {command} [command options…]

    描述

    RabbitMQ是AMQP的实现, 后者是高性能企业消息通信的新兴标准. RabbitMQ server是AMQP 中间件健壮的,可扩展的实现.

    rabbitmqctl 用来管理RabbitMQ中间件的命令行工具.它通过连接中间件节点来执行所有操作。

    如果中间件没有运行,将会显示诊断信息, 不能到达,或因不匹配Erlang cookie而拒绝连接.

    选项

    [-n node]

    默认节点是”rabbit@server”,此处的server是本地主机. 在一个名为”server.example.com”的主机上, RabbitMQ Erlang node 的节点名称通常是rabbit@server (除非RABBITMQ_NODENAME在启动时设置了非默认值). hostname -s 的输出通常是”@” 标志后的东西.查看rabbitmq-server(1)来了解配置RabbitMQ broker的细节.

    [-q]

    使用-q标志来启用宁静(quiet)模式,这会一致消息输出.
    
    • 1
    • 2

    [-t timeout]

    操作超时时间(秒为单位). 只适用于"list" 命令. 默认是无穷大.
    
    • 1
    • 2

    命令

    应用程序和集群管理
    stop [pid_file]

    用于停止运行RabbitMQ的Erlang node.如果指定了pid_file,还将等待指定的过程结束。例如:
    
    rabbitmqctl stop
    
    此命令会终止RabbitMQ node的运行.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    stop_app

    停止RabbitMQ application,但Erlang node会继续运行.此命令主要用于优先执行其它管理操作(这些管理操作需要先停止RabbitMQ application),如. reset.例如:
    
    rabbitmqctl stop_app
    
    • 1
    • 2
    • 3
    • 4

    start_app

    启动RabbitMQ application.
    
    此命令典型用于在执行了其它管理操作之后,重新启动停止的RabbitMQ application。如reset.例如:
    
    rabbitmqctl start_app
    
    此命令来指导RabbitMQ node来启动RabbitMQ application.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    wait {pid_file}

    等待RabbitMQ application启动.此命令用来等待RabbitMQ application来启动node。它会等待创建pid文件,然后等待pid文件中的特定pid过程启动,最后等待RabbitMQ  application 来启动node. 
    
    pid file是通过rabbitmq-server 脚本来创建的.默认情况下,它存放于Mnesia目录中. 修改RABBITMQ_PID_FILE 环境变量可以改变此位置。如:
    
    rabbitmqctl wait /var/run/rabbitmq/pid
    
    此命令会在RabbitMQ node启动后返回.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    reset

    将RabbitMQ node还原到最初状态.包括从所在群集中删除此node,从管理数据库中删除所有配置数据,如已配置的用户和虚拟主机,以及删除所有持久化消息.
    
    执行reset和force_reset之前,必须停止RabbitMQ application ,如使用stop_app.
    
    示例:
    
    rabbitmqctl reset
    
    此命令会重设RabbitMQ node.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    force_reset

    强制RabbitMQ node还原到最初状态.
    
    不同于reset , force_reset 命令会无条件地重设node,不论当前管理数据库的状态和集群配置是什么. 它只能在数据库或集群配置已损坏的情况下才可使用。
    
    执行reset和force_reset之前,必须停止RabbitMQ application ,如使用stop_app.
    
    示例:
    
    rabbitmqctl force_reset
    
    此命令会重设RabbitMQnode.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    rotate_logs {suffix}

    指示RabbitMQ node循环日志文件.
    
    RabbitMQ 中间件会将原来日志文件中的内容追加到原始名称和后辍的日志文件中,然后再将原始日志文件内容复制到新创建的日志上。实际上,当前日志内容会移到以此后辍结尾的文件上。当目标文件不存在时,将会进行创建。如果不指定后辍,则不会发生循环,日志文件只是重新打开。示例:
    
    rabbitmqctl rotate_logs .1
    
    此命令指示RabbitMQ node将日志文件的内容追加到新日志文件(文件名由原日志文件名和.1后辍构成)中。如. rabbit@mymachine.log.1 和 rabbit@mymachine-sasl.log.1. 最后, 日志会在原始位置恢复到新文件中.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    集群管理

    join_cluster {clusternode} [–ram]

    clusternode
    
        加入集群的节点.
    
    [--ram]
    
        如果进行了设置,节点将以RAM节点身份加入集群.
    
    指导节点成为集群中的一员. 在加入集群之前,节点会重置,因此在使用此命令时,必须小心. 这个命令要成功,RabbitMQ应用程序必须先停止,如stop_app.
    
    集群节点可以是两种类型: 磁盘节点(Disc Node) 或 内存节点(RAM Node).磁盘节点会在RAM和磁盘中复制数据, 通过冗余可以防止节点失效事件,并可从断电这种全局事件中进行恢复. RAM节点只在RAM中复制数据(除了队列的内容外,还依赖于队列是否是持久化的或者内容对于内存来说是否过大) ,并主要用于可伸缩性. RAM节点只有当管理资源(如,增加/删除队列,交换机,或绑定)的时候才具有更高的性能.一个集群必须至少有一个磁盘节点,通常来说还不止一个.
    
    默认情况下,节点是磁盘节点.如果你想要创建内存节点,需要提供--ram 标志.
    
    在执行cluster命令之后, 无论何时,当前节点上启动的RabbitMQ 应用程序在节点宕机的情况下,会尝试连接集群中的其它节点。
    
    要脱离集群, 必须重设(reset)节点. 你也可以通过forget_cluster_node 命令来远程删除节点.
    
    更多详情,参考集群指南.
    
    例如:
    
    rabbitmqctl join_cluster hare@elena --ram
    
    此命令用于指示RabbitMQ node以ram节点的形式将 hare@elena 加入集群.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    cluster_status

    按节点类型来分组展示集群中的所有节点,包括当前运行的节点.
    
    例如:
    
    rabbitmqctl cluster_status
    
    此命令会显示集群中的所有节点.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    change_cluster_node_type {disc | ram}

    修改集群节点的类型. 要成功执行此操作,必须首先停止节点,要将节点转换为RAM节点,则此节点不能是集群中的唯一disc节点。
    
    例如:
    
    rabbitmqctl change_cluster_node_type disc
    
    此命令会将一个RAM节点转换为disc节点.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    forget_cluster_node [–offline]

    [--offline]
    
        允许节点从脱机节点中删除. 这只在所有节点都脱机且最后一个掉线节点不能再上线的情况下有用,从而防止整个集群从启动。它不能使用在其它情况下,因为这会导致不一致.
    
    远程删除一个集群节点.要删除的节点必须是脱机的, 而在删除节点期间节点必须是在线的,除非使用了--offline 标志.
    
    当使用--offline 标志时,rabbitmqctl不会尝试正常连接节点;相反,它会临时改变节点以作修改.如果节点不能正常启动的话,这是非常有用的.在这种情况下,节点将变成集群元数据的规范源(例如,队列的存在),即使它不是以前的。因此,如果有可能,你应该在最新的节点上使用这个命令来关闭。
    
    例如:
    
    rabbitmqctl -n hare@mcnulty forget_cluster_node rabbit@stringer
    
    此命令会从节点hare@mcnulty中删除rabbit@stringer节点.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    rename_cluster_node {oldnode1} {newnode1} [oldnode2] [newnode2 …]

    支持在本地数据库中重命名集群节点.
    
    此子命令会促使rabbitmqctl临时改变节点以作出修改. 因此本地集群必须是停止的,其它节点可以是在线或离线的.
    
    这个子命令接偶数个参数,成对表示节点的旧名称和新名称.你必须指定节点的旧名称和新名称,因为其它停止的节点也可能在同一时间重命名.
    
    同时停止所有节点来重命名也是可以的(在这种情况下,每个节点都必须给出旧名称和新名称)或一次停止一个节点来重命名(在这种情况下,每个节点只需要被告知其名句是如何变化的).
    
    例如:
    
    rabbitmqctl rename_cluster_node rabbit@misshelpful rabbit@cordelia
    
    此命令来将节点名称rabbit@misshelpful 重命名为rabbit@cordelia.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    update_cluster_nodes {clusternode}

    clusternode
    
        用于咨询具有最新消息的节点.
    
    指示已集群的节点醒来时联系clusternode.这不同于join_cluster ,因为它不会加入任何集群 - 它会检查节点已经以clusternode的形式存在于集群中了.
    
    需要这个命令的动机是当节点离线时,集群可以变化.考虑这样的情况,节点A和节点B都在集群里边,这里节点A掉线了,C又和B集群了,然后B又离开了集群.当A醒来的时候,它会尝试联系B,但这会失败,因为B已经不在集群中了.update_cluster_nodes -n A C 可解决这种场景.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    force_boot
    确保节点将在下一次启动,即使它不是最后一个关闭的。通常情况下,当你关闭整个RabbitMQ 集群时,你重启的第一个节点应该是最后一个下线的节点,因为它可以看到其它节点所看不到的事情. 但有时这是不可能的:例如,如果整个集群是失去了电力而所有节点都在想它不是最后一个关闭的.

    在这种节点掉线情况下,你可以调用rabbitmqctl force_boot .这就告诉节点下一次无条件的启动节点.在此节点关闭后,集群的任何变化,它都会丢失.
    
    如果最后一个掉线的节点永久丢失了,那么你需要优先使用rabbitmqctl forget_cluster_node --offline, 因为它可以确保在丢失的节点上掌握的镜像队列得到提升。
    
    例如:
    
    rabbitmqctl force_boot
    
    这可以强制节点下次启动时不用等待其它节点.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    sync_queue [-p vhost] {queue}

    queue
        同步队列的名称
    
    指示未同步slaves上的镜像队列自行同步.同步发生时,队列会阻塞(所有出入队列的发布者和消费者都会阻塞).此命令成功执行后,队列必须是镜像的.
    
    注意,未同步队列中的消息被耗尽后,最终也会变成同步. 此命令主要用于未耗尽的队列。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    cancel_sync_queue [-p vhost] {queue}

    queue
    
        取消同步的队列名称.
    
    指示同步镜像队列停止同步.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    purge_queue [-p vhost] {queue}

    queue
    
        要清除队列的名称.
    
    清除队列(删除其中的所有消息).
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    set_cluster_name {name}

    设置集群名称. 集群名称在client连接时,会通报给client,也可用于federation和shovel插件记录消息的来源地. 群集名称默认是来自在群集中的第一个节点的主机名,但可以改变。
    
    例如:
    
    rabbitmqctl set_cluster_name london
    
    设置集群名称为"london".
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    用户管理

    注意rabbitmqctl 管理RabbitMQ 内部用户数据库. 任何来自其它认证后端的用户对于rabbitmqctl来说是不可见的.

    add_user {username} {password}

    username
    
        要创建的用户名称.
    password
    
        设置创建用户登录broker的密码.       
    
    rabbitmqctl add_user tonyg changeit
    
    此命令用于指示RabbitMQ broker 创建一个拥有非管理权限的用户,其名称为tonyg, 初始密码为changeit.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    delete_user {username}

    username
    
        要删除的用户名称.
    
    例如:
    
    rabbitmqctl delete_user tonyg
    
    此命令用于指示RabbitMQ broker删除名为tonyg的用户
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    change_password {username} {newpassword}

    username
    
        要修改密码的用户名称.
    newpassword
    
        用户的新密码.
    
    例如:
    
    rabbitmqctl change_password tonyg newpass
    
    此命令用于指定RabbitMQ broker将tonyg 用户的密码修改为newpass.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    clear_password {username}

    username
    
        要清除密码的用户名称.
    
    例如:
    
    rabbitmqctl clear_password tonyg
    
    此命令会指示RabbitMQ broker清除名为tonyg的用户密码.现在,此用户不能使用密码登录(但可以通过SASL EXTERNAL登录,如果配置了的话).
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    authenticate_user {username} {password}

    username
    
        用户的名称.
    password
    
        用户的密码.
    
    例如:
    
    rabbitmqctl authenticate_user tonyg verifyit
    
    此命令会指示RabbitMQ broker以名称为tonyg, 密码为verifyit来进行验证.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    set_user_tags {username} {tag …}

    username
    
        要设置tag的用户名称.
    tag
    
        用于设置0个,1个或多个tags.任何现有的tags都将被删除.
    
    例如:
    
    rabbitmqctl set_user_tags tonyg administrator
    
    此命令指示RabbitMQ broker用于确保tonyg 是administrator.当通过AMQP来登录时,这没有什么效果,但用户通过其它的途经来登录时,它可用来管理用户,虚拟主机和权限(如使用管理插件).
    
    rabbitmqctl set_user_tags tonyg
    
    此命令会指示RabbitMQ broker删除tonyg上的任何现有的tag.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    list_users

    列出用户. 每个结果行都包含用户名,其后紧跟用户的tags.
    
    例如:
    
    rabbitmqctl list_users
    
    此命令指示RabbitMQ broker列出所有用户.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    访问控制

    注意rabbitmqctl 会管理RabbitMQ的内部用户数据库. 无权限的用户将不能使用rabbitmqctl.

    add_vhost {vhost}

    vhost
    
        要创建虚拟主机名称.
    
    创建一个虚拟主机.
    
    例如:
    
    rabbitmqctl add_vhost test
    
    此命令指示RabbitMQ broker来创建一个新的名为test的虚拟主机.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    delete_vhost {vhost}

    vhost
    
        要删除的虚拟主机的名称.
    
    删除一个虚拟主机.
    
    删除一个虚拟主机,同时也会删除所有交换机,队列,绑定,用户权限,参数和策略.
    
    例如:
    
    rabbitmqctl delete_vhost test
    
    此命令指示RabbitMQ broker删除名为test的虚拟主机.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    list_vhosts [vhostinfoitem …]

    列出所有虚拟主机.
    
    vhostinfoitem 参数用于标识哪些虚拟主机应该包含在结果集中.结果集中的列顺序会匹配参数的顺序.vhostinfoitem 可接受下面的值:
    
    name
    
        虚拟主机的名称.
    tracing
    
        是否对虚拟主机启用追踪.
    
    如果没有指定vhostinfoitem 参数,那么会显示虚拟主机名称.
    
    例如:
    
    rabbitmqctl list_vhosts name tracing
    
    此命令用于指示RabbitMQ broker显示所有虚拟主机.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    set_permissions [-p vhost] {user} {conf} {write} {read}

    vhost
    
        授予用户可访问的虚拟机名称,默认是/.
    user
    
        可访问指定虚拟主机的用户名称.
    conf
    
        一个用于匹配用户在哪些资源名称上拥有配置权限的正则表达式
    write
    
        一个用于匹配用户在哪些资源名称上拥有写权限的正则表达式.
    read
    
        一个用于匹配用户在哪些资源名称上拥有读权限的正则表达式.
    
    设置用户权限.
    
    例如:
    
    rabbitmqctl set_permissions -p /myvhost tonyg "^tonyg-.*" ".*" ".*"
    
    此命令表示RabbitMQ broker授予tonyg 用户可访问 /myvhost虚拟主机,并在资源名称以"tonyg-"开头的所有资源上都具有配置权限,并在所有资源上都拥有读写权限。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    clear_permissions [-p vhost] {username}

    vhost
    
        用于设置禁止用户访问的虚拟主机名称,默认为/.
    username
    
        禁止访问特定虚拟主机的用户名称.
    
    设置用户权限.
    
    例如:
    
    rabbitmqctl clear_permissions -p /myvhost tonyg
    
    此命令用于指示RabbitMQ broker禁止tonyg 用户访问/myvhost虚拟主机.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    list_permissions [-p vhost]

    vhost
    
        用于指定虚拟主机名称,将会列出所有可访问此虚拟主机的所有用户名称和权限.默认为/.
    
    显示虚拟机上权限.
    
    例如:
    
    rabbitmqctl list_permissions -p /myvhost
    
    此命令指示RabbitMQ broker列出所有已授权访问/myvhost 虚拟主机的用户,同时也会列出这些用户能在虚拟主机资源可操作的权限.注意,空字符串表示没有任何授予的权限。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    list_user_permissions {username}

    username
    
        要显示权限的用户名称.
    
    列出用户权限.
    
    例如:
    
    rabbitmqctl list_user_permissions tonyg
    
    此命令指示RabbitMQ broker列出tonyg可授权访问的所有虚拟主机名称,以及在这些虚拟主机上的操作.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    参数管理

    RabbitMQ的某些特性(如联合插件)是动态控制的. 每个参数都是与特定虚拟主机相关的组件名称, name和value构成的. 组件名称和name都是字符串,值是Erlang term. 参数可被设置,清除和显示.通常你可以参考文档来了解如何设置参数.

    set_parameter [-p vhost] {component_name} {name} {value}

    设置一个参数.
    
    component_name
    
        要设置的组件名称.
    name
    
        要设置的参数名称.
    value
    
        要设置的参数值,作不JSON项。在多数shells中,你更喜欢将其引起来.
    
    例如:
    
    rabbitmqctl set_parameter federation local_username '"guest"'
    
    此命令用于在默认虚拟主机上设置federation 组件的local_username 参数值"guest".
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    clear_parameter [-p vhost] {component_name} {key}

    清除参数.
    
    component_name
    
        要清除参数的组件名称.
    name
    
        要清除的参数名称.
    
    例如:
    
    rabbitmqctl clear_parameter federation local_username
    
    此命令用于清除默认虚拟主机上的federation 组件的local_username 参数值.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    list_parameters [-p vhost]

    列出虚拟主机上的所有参数.
    
    示例:
    
    rabbitmqctl list_parameters
    
    此命令用于列出默认虚拟主机上的所有参数.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    策略管理

    策略用于在集群范围的基础上用于控制和修改队列和交换机的行为. 策略应用于虚拟主机,由name, pattern, definition或可选的priority组成. 策略可被设置,清除和列举.

    set_policy [-p vhost] [–priority priority] [–apply-to apply-to] {name} {pattern} {definition}

    设置策略.
    
    name
    
        策略名称.
    pattern
    
        正则表达式, 匹配要应用的资源
    definition
    
        策略的定义,JSON形式.在大多数shells中,你很可能需要引用这个
    priority
    
        策略的整数优先级. 数字越高则优先级越高.默认是0.
    apply-to
    
        策略适用的对象类型,其值可为 "queues", "exchanges" 或 "all".默认是"all".
    
    例如:
    
    rabbitmqctl set_policy federate-me "^amq." '{"federation-upstream-set":"all"}'
    
    此命令在默认虚拟主机上设置策略为federate-me,这样内建的交换器将进行联合.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    clear_policy [-p vhost] {name}

    清除策略.
    
    name
    
        要清除的策略名称.
    
    例如:
    
    rabbitmqctl clear_policy federate-me
    
    此命令来清除默认虚拟主机上的federate-me 策略.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    list_policies [-p vhost]

    显示虚拟主机上的所有策略.
    
    例如:
    
    rabbitmqctl list_policies
    
    此命令会显示默认虚拟主机上的所有策略.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    服务器状态

    服务器状态查询查询服务器返回一个结果以制表符分隔的列表. 某些查询(list_queues, list_exchanges, list_bindings, 和 list_consumers) 接受一个可选的vhost 参数. 如果这个参数出现了,那么它必须指定在查询的后面.

    list_queues, list_exchanges and list_bindings 命令接受一个可选的虚拟主机参数以显示其结果.默认值为”/”.

    list_queues [-p vhost] [queueinfoitem …]

    返回队列的详细信息. 如果无-p标志,将显示/虚拟主机上的队列详情."-p" 标志可用来覆盖此默认值.
    
    queueinfoitem 参数用于指示哪些队列信息项会包含在结果集中.结果集的列顺序将匹配参数的顺序.queueinfoitem 可以是下面列表中的任何值:
    
    name
    
        非ASCII字符的队列名称.
    durable
    
        服务器重启后,队列是否能幸存.
    auto_delete
    
        不再使用时,是否需要自动删除队列.
    arguments
    
        队列参数.
    policy
    
        应用到队列上的策略名称.
    pid
    
        关联队列的Erlang进程ID.
    owner_pid
    
        表示队列专用所有者的代表连接的Erlang进程ID.如果队列是非专用的,此值将为空.
    exclusive
    
        True:如果队列是专用的(即有owner_pid), 反之false
    exclusive_consumer_pid
    
        表示此channel的专用消费者订阅到此队列的Erlang进程Id. 如果没有专用消费者,则为空.
    exclusive_consumer_tag
    
        专用消费者订阅到此队列的Consumer tag.如果没有专用消费者,则为空.
    messages_ready
    
        准备分发给客户端的消息数目.
    messages_unacknowledged
    
        分发到客户端但尚未应答的消息数目.
    messages
    
        准备分发和未应答消息的总和(队列深度).
    messages_ready_ram
    
        驻留在ram中messages_ready的消息数目.
    messages_unacknowledged_ram
    
        驻留在ram中messages_unacknowledged的消息数目.
    messages_ram
    
        驻留在ram中的消息总数.
    messages_persistent
    
        队列中持久化消息的数目(对于瞬时队列总是0).
    message_bytes
    
        队列中所有消息体的大小总和.这不包括消息属性(包括headers) 或任何开销(overhead)。
    message_bytes_ready
    
        类似于message_bytes ,但只统计准备投递给clients的那些消息.
    message_bytes_unacknowledged
    
        类似于message_bytes ,但只统计那些已经投递给clients但还未应答的消息
    message_bytes_ram
    
        类似于message_bytes ,但只统计那些在RAM中的消息
    message_bytes_persistent
    
        类似于message_bytes ,但只统计那些持久化的消息
    head_message_timestamp
    
        如果存在,只显示队列中第1个消息的timestamp属性. 消息的时间戳只出现在分页情况下.
    disk_reads
    
        从队列启动开如,已从磁盘上读取该队列的消息总次数.
    disk_writes
    
        从队列启动开始,已向磁盘队列写消息总次数.
    consumers
    
        消费者数目.
    consumer_utilisation
    
        时间分数(0.0与1.0之间),队列可立即向消费者投递消息. 它可以小于1.0,如果消费者受限于网络堵塞或预提取数量.
    memory
    
        与队列相关的Erlang进程消耗的内存字节数,包括栈,堆以及内部结构.
    slave_pids
    
        如果队列是镜像的,这里给出的是当前slaves的IDs.
    synchronised_slave_pids
    
        如果队列是镜像的,当前slaves的IDs是master同步的- 即它们可在无消息丢失的情况下,接管master.
    state
    
        队列状态.正常情况下是'running', 但如果队列正在同步也可能是"{syncing, MsgCount}". 处于集群下的节点如果掉线了,队列状态交显示'down' (大多数queueinfoitems 将不可用).
    
    如果没有指定queueinfoitems,那么将显示队列名称和队列深度.
    
    例如:
    
    rabbitmqctl list_queues -p /myvhost messages consumers
    
    此命令显示了/myvhost虚拟主机中每个队列的深度和消费者数目.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106

    list_exchanges [-p vhost] [exchangeinfoitem …]

    返回交换器细节.如果没有指定"-p"选项,将返回 / 虚拟主机的细节.  "-p" 选项可用来覆盖默认虚拟主机.
    
    exchangeinfoitem 参数用来表示哪些交换器信息要包含在结果中. 结果集中列的顺序将与参数顺序保持一致. exchangeinfoitem 可接受下面的列表中任何值:
    
    name
    
        交换器名称.
    type
    
        交换器类型(如[direct, topic, headers, fanout]).
    durable
    
        当服务器重启时,交换器是否能复活.
    auto_delete
    
        当不再使用时,交换器是否需要自动删除.
    internal
    
        交换器是否是内部的,即不能由client直接发布.
    arguments
    
        交换器参数
    
    
    policy
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    应用到交换器上的策略名称.

    如果没有指定exchangeinfoitems,那么将会显示交换器类型和类型

    例如:

    rabbitmqctl list_exchanges -p /myvhost name type

    此命令会显示/myvhost中每个交换器的名称和类型.

    list_bindings [-p vhost] [bindinginfoitem …]

    返回绑定细节.默认情况下返回的是 / 虚拟主机上的绑定详情.可使用"-p" 标记来覆盖默认虚拟主机.
    
    bindinginfoitem 参数用来表示结果中包含哪些绑定信息. 结果集中列的顺序将匹配参数的顺序.bindinginfoitem可接受下面列表的任意值:
    
    source_name
    
        绑定中消息来源的名称. C中非ASCII转义字符.
    source_kind
    
        绑定中消息来源的类别.当前总是exchange. C中非ASCII转义字符.
    destination_name
    
        绑定中消息目的地名称.C中非ASCII转义字符.
    destination_kind
    
        绑定中消息目的地的种类. C中非ASCII转义字符.
    routing_key
    
        绑定的路由键,C中非ASCII转义字符.
    arguments
    
        绑定参数.
    
    如果没有指定bindinginfoitems,将会显示所有上述条目.
    
    例如:
    
    rabbitmqctl list_bindings -p /myvhost exchange_name queue_name
    
    此命令来显示/myvhost虚拟主机上绑定的交换器名称和队列名称.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    list_connections [connectioninfoitem …]

    返回TCP/IP连接统计.
    
    connectioninfoitem 参数用来表示在结果中包含哪些连接信息. 结果集中列的顺序将匹配参数的顺序.               connectioninfoitem可接受下面列表的任意值:
    
    pid
    
        与连接相关的Erlang进程ID.
    name
    
        连接的可读名称.
    port
    
        服务器端口.
    host
    
        返回反向DNS获取的服务器主机名称,或 IP地址(反向DNS解析失败) 或者未启用.
    peer_port
    
        Peer 端口.
    peer_host
       返回反向DNS获取的Peer主机名称,或 IP地址(反向DNS解析失败) 或者未启用.
    ssl
    
        用Boolean来表示连接是否是SSL的.
    ssl_protocol
    
        SSL 协议(如. tlsv1)
    ssl_key_exchange
    
        SSL key exchange 算法 (如 rsa)
    ssl_cipher
    
        SSL cipher 算法 (如aes_256_cbc)
    ssl_hash
    
        SSL hash 函数 (如 sha)
    peer_cert_subject
    
        peer的 SSL 安全证书的主体, RFC4514形式.
    peer_cert_issuer
    
        peer的 SSL安全证书的发行者, RFC4514 形式.
    peer_cert_validity
    
        peer的SSL安全证书的有效期.
    state
    
        连接状态(可为[starting, tuning, opening, running, flow, blocking, blocked, closing, closed]其中一个).
    channels
        使用连接的channel数。
    protocol
    
        使用的AMQP协议版本(当前是{0,9,1} 或{0,8,0}). 注意,如果client请求的是AMQP 0-9 连接, 我们会视为AMQP 0-9-1.
    auth_mechanism
    
        使用的SASL认证机制,如PLAIN.
    user
    
        与连接相关的用户名
    vhost
    
        虚拟主机名称,C中非ASCII转义字符.
    timeout
    
        连接超时/协商的心跳间隔,秒为单位.
    frame_max
    
        最大 frame 大小(字节).
    channel_max
            此连接上channel的最大数目.
    client_properties
    
        连接建立期间由client发送的信息属性.
    recv_oct
    
        Octets已收到.
    recv_cnt
    
        Packets 已收到.
    send_oct
    
        Octets 发送.
    send_cnt
    
        Packets 发送.
    send_pend
    
        发送队列大小.
    connected_at
    
        连接建立的日期和时间,当作timestamp.
    
    如果没有connectioninfoitems, 那么会显示user, peer host, peer port,流量控制和内存块状态的时间
    
    例如:
    
    rabbitmqctl list_connections send_pend port
    
    此命令会显示发送队列的大小以及第个连接的服务器端口.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100

    list_channels [channelinfoitem …]

    返回所有当前channel上的信息,逻辑容器执行大部分 AMQP命令.这将包含最初AMQP连接的部分,以及不同插件和其它扩展创建的channels.
    
    channelinfoitem 参数用来表示在结果集中包含哪些channel信息.结果集中列的顺序将匹配参数的顺序. channelinfoitem 可接受下面列表中的任何一个参数:
    
    pid
    
        与连接相关的Erlang进程ID.
    connection
    
        channel所属的连接Erlang进程ID.
    name
    
        channel的可读名称.
    number
    
        channel的数目,在一个连接中,它有唯一的标识符.
    user
    
        与channel相关的用户名称.
    vhost
    
        channel操作的虚拟主机.
    transactional
    
        True:如果channel处于事务模式,其它情况为false.
    confirm
    
        True:如果channel是确认模式,其它情况为false.
    consumer_count
    
        在channel中接收消息的逻辑AMQP消费者数目.
    messages_unacknowledged
    
        在channel中消息已投递但还未应答的消息数目.
    messages_uncommitted
    
        在channel中已收到消息但还没有提交事务的消息个数.
    acks_uncommitted
        确认收到一个还未提交的事务数。
    messages_unconfirmed
        尚未确认已发布消息的数目。在通道不在确认模式下时,这将是0。
    prefetch_count
    
        新消费者QoS预提取限制, 0表示无上限.
    global_prefetch_count
    
        整个channel QoS预提取限制, 0表示无上限.
    
    如果没有指定channelinfoitems,那么将显示pid, user, consumer_count,messages_unacknowledged.
    
    
    例如:
    
    rabbitmqctl list_channels connection messages_unacknowledged
    
    此命令会显示每个channel中连接进程和未应答消息的数目.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57

    list_consumers [-p vhost]

    列举消费者, 即订阅队列的消息流. 每行将打印出由制表符分隔的已订阅队列的名称,创建并管理订阅的channel进程的标识,channel中订阅的consumer tag唯一标识符, boolean值表示投递到此消费者的消息是否需要应答,整数值表示表示预提取限制(为0表示无限制), 以及关于此消费者的任何其它参数.
    
    • 1
    • 2

    status

    显示 broker 状态信息,如当前Erlang节点上运行的应用程序, RabbitMQ 和 Erlang 的版本信息, OS 名称, 内存和文件描述符统计信息. (查看cluster_status 命令来找出那些节点是集群化的以及正在运行的.)
    
    例如:
    
    rabbitmqctl status
    
    此命令显示了RabbitMQ broker的相关信息.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    environment

    显示每个运行程序环境中每个变量的名称和值.
    
    • 1
    • 2

    report

    为所有服务器状态生成一个服务器状态报告,输出应该重定向到一个文件.
    
    例如:
    
    rabbitmqctl report > server_report.txt
    
    此命令创建了一个服务器报告,可将它附着在支持请求的电子邮件中.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    eval {expr}

    执行任意Erlang表达式.
    
    例如:
    
    rabbitmqctl eval 'node().'
    
    此命令用于返回rabbitmqctl连接的节点名称
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    杂项

    close_connection {connectionpid} {explanation}

    connectionpid
    
        要关闭的与连接相关的Erlang进程ID.
    explanation
    
        解释字符串.
    
    指示broker关闭与Erlang进程id相关的连接(可通过list_connections 命令查看), 通过为连接客户端传递解释字符串(作为AMQP连接关闭协议的一部分).
    
    例如:
    
    rabbitmqctl close_connection "<rabbit@tanto.4262.0>" "go away"
    
    此命令指示RabbitMQ broker关闭与Erlang 进程id<rabbit@tanto.4262.0>相关联的连接, 同时向客户端传递go away字符串.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    trace_on [-p vhost]

    vhost
    
        要开启追踪的虚拟主机的名称.
    
    开启追踪.注意,追踪状态不是持久化的; 如果服务器重启,追踪状态将会丢失.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    trace_off [-p vhost]

    vhost
    
        要停止追踪的虚拟主机名称.
    
    停止追踪.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    set_vm_memory_high_watermark {fraction}

    fraction
        当一个浮点数大于或等于0时,会触发流量控制新内存阈值部分。
    
    • 1
    • 2
    • 3

    set_vm_memory_high_watermark absolute {memory_limit}

    memory_limit
    
        流程控制触发的新内存限制, 以字节来表示大于或等于0的整数或以字符串和内存单位来表示(如 512M或1G). 可用的单位是: k, kiB: kibibytes (2^10 bytes) M, MiB: mebibytes (2^20) G, GiB: gibibytes (2^30) kB: kilobytes (10^3) MB: megabytes (10^6) GB: gigabytes (10^9)
    
    • 1
    • 2
    • 3
    • 4

    set_disk_free_limit {disk_limit}

    disk_limit
    
        以整数或字符串单位的可用磁盘下限限制(查看vm_memory_high_watermark), 如 512M or 1G. 一旦可用磁盘空间达到这个限制,就会设置磁盘报警.
    
    • 1
    • 2
    • 3
    • 4

    set_disk_free_limit mem_relative {fraction}

    fraction
    
        相对于整个可用内存的限制,其值为非负浮点数. 当值小于1.0时是很危险的,应该谨慎使用

      

  • 相关阅读:
    Windows Server 2008 IIS7.0 发布html和Asp.net网站
    GS+9.0地统计软件学习
    将Mxd文件压缩并上传到Geodatabase!
    Git代码版本管理
    一台机器,两个Oracle数据库,两个SDE服务!
    翻译:A Picturebox Control to Display Both Remote Sensing and Regular Digital Images
    ENVI处理Modis数据学习
    C#开源资源
    winform中ToString()、DateTime.ToString()、DateTime
    加速Vs2008
  • 原文地址:https://www.cnblogs.com/qinghe123/p/9088263.html
Copyright © 2011-2022 走看看