NSQ部署

一、      简介

NSQ主要有三个主要程序和一个Web服务程序:

  1. nsqd:是守护进程,接收,缓存,并投递消息给客户端
  2. nsqlookupd:是一个守护进程,为消费者提供运行时发现服务,来查找指定话题(topic)的生产者 nsqd
  3. nsq_to_http:消费指定的话题(topic)/通道(channel)和执行 HTTP requests (GET/POST) 到指定的端点。
  4. nsqadmin:是 Web 服务,用来实时的管理你的 NSQ 集群。它通过和 nsqlookupd 实例交流,来确定生产者

除了nsqadmin是独立提供WEB信息以外,三个主要程序组成类似下面的网络拓扑,以提供消息服务:

二、      NSQ获取

下载最新的程序。并将NSQ所在目录加入${PATH}中。

三、      部署

以下假设我们要在两台机器上部署NSQ:

192.168.30.54(简称54)

192.168.30.55(简称55)。

其中nsqlookupd和nsqadmin部署到54,nsq两台机器上都部署,以冗余nsqd来实现容灾。

以下假设nsq工具集的路径已包含在${PATH}环境变量中。

1)     54的部署:

当程序未指定—config参数时,程序会尝试从配置文件中读取配置信息。配置文件是以cfg为扩展名,且与程序名同名的文本文件。

nsqlookupd.cfg

一般情况下nsqlookupd不需要配置文件,我们使用它的缺省配置即可,如果需要它在特殊端口上监听或修改某些配置,可以修改配置文件

nsqadmin.cfg

nsqd.cfg

2)     55的部署:

55上只需启动nsqd即可

该上面的配置文件,除了id被设置成2外,与54上全部相同。

四、      监控

4.1 可视化监控

通过http浏览器,我们可以看到NSQ的运行情况,见下图。该图是由nsqadmin提供的。

4.2 自动监控

自动监控脚本,见附录。

自动监控目前主要监控两个指标:

1)  运行中的nsqd的数量。主要监控其是否正常运行。

2)  nsqd上各channel最大堆积的消息数量。主要监控下游处理情况。

自动监控输出示例:

说明:

第一行主要监控nsqd数量,特征字段为nsqd_count,当前系统中有2个nsqd。

第二、三行监控nsqd运行情况,特征字段为nsqd。

warning表明是否有报警。off – 不报警,监控项运行正常;on – 报警,该项运行异常。

例:

第一行,当前运行的nsqd有两个(nsqd_count),系统中应有nsqd数量为2(should_be),不报警(warning[off])

第二行,nsqd地址为192.168.30.54:4151,nsqd运行良好(health[OK], 不报警(warning[off])。

五、      异常处理

当NSQ发生异常时,可以通过http://192.168.30.54:4171观察到,或通过自动监控机制接收到报警。这时可以重启有问题的进程,以使系统恢复。

例如,如果nsqd运行异常,则可以运行如下命令重启nsqd:

目前已知异常的处理:

1)  系统时间向后调整后, nsqd占用100%的CPU

描述:将系统时间由2015-08-25 11:02:00 向后调整2015-08-24 11:02:00后,nsqd占用100%的CPU

分析:由于是时间向后调整,因此造成nsqd定时器,向前追赶新时间,造成定时器被密集调用。

解决方法:不管是向前(跨度较大时),还是向后调整时间,都建议重启nsqd。

六、下游消息处理(nsq_to_http)(SUB)

6.1 GET推送

典型的命令行参数:

nsq_to_http --topic=demo --lookupd-http-address=127.0.0.1:4161 --get=http://localhost/nsqphp/sub?msg=%s

参数—get表明消息将以GET请求向WebServer(SUB)推送。%s以可打印的形式被实际消息替代。

nsq_to_http需要三元组(topic, lookupd的http地址,get推送地址)

6.2 POST推送(非表单数据)

典型的命令行参数

nsq_to_http --topic=demo --lookupd-http-address=127.0.0.1:4161 --post=http://localhost/nsqphp/sub

参数—post表明消息将以POST请求向WebServer(SUB)推送。消息在http的body部分。

此时推送的数据将以二进制推送,也即HTTP请求的Content-Type:application/octet-stream。如果WebServer是以php实现的,则需要以file_get_contents(“php://input”)的形式读取数据。

6.3 POST推送(表单数据)

典型的命令行参数

nsq_to_http --topic=demo --lookupd-http-address=127.0.0.1:4161 --post=http://localhost/nsqphp/sub --content-type="application/x-www-form-urlencoded"

参数—post表明消息将以POST请求向WebServer(SUB)推送。消息在http的body部分。

注意—content-type参数,该参数只有在—post的情况下才有效。该参数表明post的消息是以表单的形式组织的,也即可以通过$_POST[]或$_REQUEST[]的方式取到消息

七、其它

1)   nsqphp向nsqd发送信息时各阶段超时时间


名称


超时时间


说明


connectionTimeout


3秒


连接nsqd的超时时间


readWriteTimeout


3秒


收发数据的超时时间


readWaitTimeout


5秒


接收回应的超时时间

附录:

自动监控脚本:

<?php
/**
 * Created by PhpStorm.
 * User: Lenovo
 * Date: 2015/8/22
 * Time: 18:05
 */

error_reporting(E_ALL || ~E_NOTICE); //ÏÔʾ³ýÈ¥ E_NOTICE Ö®ÍâµÄËùÓдíÎóÐÅÏ¢

// http://192.168.30.54:4161/nodes

function queryLookupdForNsqd($lookupAddrs) {
    foreach ($lookupAddrs as $addr) {
        $text = file_get_contents("http://$addr/nodes");
        // $nodes¸ñʽ
        // {"status_code":200,"status_txt":"OK","data":{"producers":[{"remote_address":"192.168.30.54:38631","hostname":"localhost.localdomain","broadcast_address":"192.168.30.54","tcp_port":4150,"http_port":4151,"version":"0.3.6-alpha","tombstones":[false,false],"topics":["demo","hancj"]},{"remote_address":"192.168.30.55:35621","hostname":"localhost.localdomain","broadcast_address":"192.168.30.55","tcp_port":4150,"http_port":4151,"version":"0.3.6-alpha","tombstones":[false,false],"topics":["demo","hancj"]}]}}
        $nodes = json_decode($text, true);

        $arrNode = array();
        foreach ($nodes[‘data‘][‘producers‘] as $nsqd) {
            $addr = "{$nsqd[‘broadcast_address‘]}:{$nsqd[‘http_port‘]}";
            //echo $addr, PHP_EOL;
            $arrNode[] = $addr;
        }

        return $arrNode;
    }
}

function queryNsqd($nsqdAddr) {
    $httpAddr = "http://$nsqdAddr/stats?format=json";
    // infoµÄ¸ñʽ
    // {"status_code":200,"status_txt":"OK","data":{"version":"0.3.6-alpha","health":"OK","start_time":1440233123,"topics":[{"topic_name":"demo","channels":[{"channel_name":"nsq_to_http","depth":0,"backend_depth":0,"in_flight_count":0,"deferred_count":0,"message_count":7010004,"requeue_count":1046,"timeout_count":649,"clients":[],"paused":false,"e2e_processing_latency":{"count":0,"percentiles":null}}],"depth":0,"backend_depth":0,"message_count":7010004,"paused":false,"e2e_processing_latency":{"count":0,"percentiles":null}},{"topic_name":"hancj","channels":[{"channel_name":"nsq_to_http","depth":1,"backend_depth":0,"in_flight_count":0,"deferred_count":0,"message_count":0,"requeue_count":0,"timeout_count":0,"clients":[],"paused":false,"e2e_processing_latency":{"count":0,"percentiles":null}}],"depth":0,"backend_depth":0,"message_count":0,"paused":false,"e2e_processing_latency":{"count":0,"percentiles":null}}]}}
    $info = json_decode(file_get_contents($httpAddr), true);

    $nsqd = array(‘health‘ => $info[‘data‘][‘health‘], ‘channels‘ => 0, ‘topics‘ => 0);

    foreach ($info[‘data‘][‘topics‘] as $topic) {
        $nsqd[‘topics‘] += 1;
        foreach ($topic[‘channels‘] as $channel) {
            $nsqd[‘channels‘] += 1;
            if ($channel[‘channel_name‘] == ‘nsq_to_http‘) {
                if (!$nsqd[‘max_channel‘] || $nsqd[‘max_channel‘][‘depth‘] < $channel[‘depth‘]) {
                    $nsqd[‘max_channel‘] = $channel;
                }
            }
        }
    }

    return $nsqd;
}

function main($argv) {
    if (count($argv) < 3) {
        echo "Usage: {$argv[0]} nsqd_count nsqlookupd_address...\n";
        exit;
    }

    $nsqdCount = $argv[1];
    $nsqlookupd = array_slice($argv, 2);

    $now = date(‘Y-m-d H:i:s‘);
    $arrNSQD = queryLookupdForNsqd($nsqlookupd);//array("192.168.30.54:4161",));
    $warn = (count($arrNSQD) == $nsqdCount ? "off" : "on");
    echo "$now nsqd_count[" . count($arrNSQD) . "] should_be[{$nsqdCount}] warning[$warn]", PHP_EOL;
    foreach ($arrNSQD as $nsqdAddr) {
        $info = queryNsqd($nsqdAddr);

        $warn = ((!$info || $info[‘health‘] != ‘OK‘ || $info[‘max_channel‘][‘depth‘] > 100000) ? "on" : "off");
        echo "$now nsqd[$nsqdAddr] health[{$info[‘health‘]}] warning[$warn] topics[{$info[‘topics‘]}]";
        echo " channels[{$info[‘channels‘]}] depth[{$info[‘max_channel‘][‘depth‘]}]";
        echo PHP_EOL;
    }
}

main($argv);

  

NSQ官网地址:http://nsq.io/

时间: 2024-10-13 08:43:18

NSQ部署的相关文章

docker 部署 nsq

这篇文章主要介绍如何使用docker部署 nsq 组件 环境准备 本文基于一台 ubuntu 虚拟机试验 docker 安装 docker 安装方式 使用docker version 命令检查 docker 是否安装成功 docker-compose 安装 apt-get install docker-compose nsq docker 部署 nsq 主要有三个组件: nsqlookupd, nsqd, nsqadmin.这三个组件都包含在 nsqio/nsq 镜像中, 每一个组件都可以通过指

实时消息平台NSQ的特性

NSQ是GO语言开发的可用于大规模系统中的实时消息服务,但是和RabbitMQ等相比,它具有什么特色,什么场景下选择NSQ呢? NSQ的自身特色很明显,最主要的优势在如下三个方面: 1,性能.在多个著名网站生产环境中被采用,每天能够处理数亿级别的消息.参见官方提供的性能说明文档 2,易用性.非常易于部署(几乎没有依赖)和配置(所有参数都可以通过命令行进行配置). 3,可扩展性.具有分布式且无单点故障的拓扑结构,支持水平扩展,在无中断情况下能够无缝地添加集群节点.还具有强大的集群管理界面,参见ns

nsq初探

一. 安装 参考:http://nsq.io/deployment/installing.htmlhttp://www.baiyuxiong.com/?p=873    (推荐.) 不推荐直接把官方的Binary Releases版本down下来扔bin目录.建议用“Building From Source”方式(看下面的步骤),这样可以把source下到$GOPATH/src里并同时把程序build到$GOPATH/bin里. (然后可以把这个bin目录添加到环境变量$sudo vi /etc

消息队列 redis vs nsq

为了解决高并发而形成阻塞的问题,通常是通过消息队列来解决问题. 最近研究了下golang消息队列的nsq框架(http://nsq.io),也动手实现了这么个功能:通过nsq的生产者大量生产消息向nsq推送而形成消息队列,然后通过nsq的消费者从消息队列里接收消息,再利用websocket将接收到的消息给所有web客户端进行消息推送.这样所有客户端就都能接收服务器广播的消息. redis是NoSQL数据库,由于redis是将数据写入内存,所以redis处理的速度非常快.其实也可以通过redis来

[译]Kubernetes 分布式应用部署和人脸识别 app 实例

原文地址:KUBERNETES DISTRIBUTED APPLICATION DEPLOYMENT WITH SAMPLE FACE RECOGNITION APP 原文作者:skarlso 译文出自:掘金翻译计划 好的,伙计,让我们静下心来.下面将会是一个漫长但充满希望和有趣的旅程. 我将使用 Kubernetes 部署分布式应用程序.我试图创建一个类似于真实世界 app 的应用程序.显然,由于时间和精力有限,我不得不忽略一些细节部分. 我的重点将放在 Kubernetes 和应用部署上.

golang使用Nsq(转)

为什么要使用Nsq 最近一直在寻找一个高性能,高可用的消息队列做内部服务之间的通讯.一开始想到用zeromq,但在查找资料的过程中,意外的发现了Nsq这个由golang开发的消息队列,毕竟是golang原汁原味的东西,功能齐全,关键是性能还不错.其中支持动态拓展,消除单点故障等特性,  都可以很好的满足我的需求 下面上一张Nsq与其他mq的对比图,看上去的确强大.下面简单记录一下Nsq的使用方法 图片来自golang2017开发者大会 Nsq服务端 Nsq服务端简介 在使用Nsq服务之前,还是有

微信小程序——豆瓣电影——(2):小程序运行部署

Demo 预览 演示视频(流量预警 2.64MB) GitHub Repo 地址 仓库地址:https://github.com/zce/weapp-demo 使用步骤 将仓库克隆到本地: bash $ git clone https://github.com/zce/weapp-demo.git weapp-douban --depth 1 $ cd weapp-douban 打开微信Web开放者工具(注意:必须是0.9.092300版本) 必须是0.9.092300版本,之前的版本不能保证正

Spring Boot 热部署

需要在pom.xml文件中加如下代码: 1 <dependencies> 2 <dependency> 3 <groupId>org.springframework.boot</groupId> 4 <artifactId>spring-boot-devtools</artifactId> 5 <optional>true</optional> 6 </dependency> 7 </depe

Centos7.2部署.Net Core2.0 WebApi

部署前准备 1.VisualStudio2017+.netcore2.0SDK 2.Centos7.2 3.SecureCRT,Xftp(根据自己喜好) 创建WebApi项目 修改Program.cs中的BuildWebHost方法为(不改也可,core默认使用Kestrel作为Server) public static IWebHost BuildWebHost(string[] args) => WebHost.CreateDefaultBuilder(args) .UseKestrel()