NSQ部署
一、 简介
NSQ主要有三个主要程序和一个Web服务程序:
- nsqd:是守护进程,接收,缓存,并投递消息给客户端
- nsqlookupd:是一个守护进程,为消费者提供运行时发现服务,来查找指定话题(topic)的生产者 nsqd
- nsq_to_http:消费指定的话题(topic)/通道(channel)和执行 HTTP requests (GET/POST) 到指定的端点。
- nsqadmin:是 Web 服务,用来实时的管理你的 NSQ 集群。它通过和 nsqlookupd 实例交流,来确定生产者
除了nsqadmin是独立提供WEB信息以外,三个主要程序组成类似下面的网络拓扑,以提供消息服务:

二、 NSQ获取
三、 部署
以下假设我们要在两台机器上部署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/
NSQ部署的更多相关文章
- NSQ之粗读浅谈
回顾: 以前一直是C++开发(客户端),最近听同事讲go语言不错,随后便决定先从go语法开始投向go的怀抱.由于历史原因学习go语法时,用了半天的时间看完了菜鸟教程上相关资料,后来又看了易百教程上的一 ...
- docker 部署 nsq
这篇文章主要介绍如何使用docker部署 nsq 组件 环境准备 本文基于一台 ubuntu 虚拟机试验 docker 安装 docker 安装方式 使用docker version 命令检查 doc ...
- 基于docker-compose部署 简单nsq 集群
主要目的是搭建一个测试环境,同时使用了nodejs 客户端sdk nsq 简单了解 nsqd:一个负责接收.排队.转发消息到客户端的守护进程 nsqlookupd:管理拓扑信息并提供最终一致性的发现服 ...
- 实时消息平台NSQ的特性
NSQ是GO语言开发的可用于大规模系统中的实时消息服务,但是和RabbitMQ等相比,它具有什么特色,什么场景下选择NSQ呢? NSQ的自身特色很明显,最主要的优势在如下三个方面: 1,性能.在多个著 ...
- nsq初探
一. 安装 参考:http://nsq.io/deployment/installing.htmlhttp://www.baiyuxiong.com/?p=873 (推荐.) 不推荐直接把官方的 ...
- NSQ:分布式的实时消息平台
NSQ是一个基于Go语言的分布式实时消息平台,它基于MIT开源协议发布,代码托管在GitHub,其当前最新版本是0.3.1版.NSQ可用于大规模系统中的实时消息服务,并且每天能够处理数亿级别的消息,其 ...
- openStack kilo 手动Manual部署随笔记录
一 ,基于neutron网络资源主机(控制节点,网络节点,计算节点)网络规划配置 1, controller.cc 节点 网络配置截图
- Node.js~在linux上的部署~pm2管理工具的使用
之前写了两篇关于在linux上部署nodejs的文章,大家如果没有基础可以先看前两篇<Node.js~在linux上的部署>,<Node.js~在linux上的部署~外网不能访问no ...
- Docker部属Nsq集群
用一了段时间NSQ还是很稳定的.除了稳定,还有一个特别值的说的就是部署非常简单.总想写点什么推荐给大家使用nsq来做一些东西.但是就是因为他太简单易用,文档也比较简单易懂.一直不知道要写啥!!!!! ...
随机推荐
- .net学习之.net和C#关系、运行过程、数据类型、类型转换、值类型和引用类型、数组以及方法参数等
1..net 和 C# 的关系.net 是一个平台,C#是种语言,C#语言可以通过.net平台来编写.部署.运行.net应用程序,C#通过.net平台开发.net应用程序2..net平台的重要组成FC ...
- Java Hour 45 Hibernate ( 2 )
基本确定了,一个月后也就是在2014年的开端,我将离开这个公司. 所以我大概还有30个学时. 45.1 你需要一个数据库 首先,必须有一个试验用的数据库,这里我们使用MySQL. 尽管书中的说明是使用 ...
- wamp下php无法保存SESSION问题总汇
由于是在windows 下的iis进行php的环境,所以很多情况下不能像lamp那么简单进行设置.由于工作原因我也遇到很多session无法保存的情况(在wamp下).以下是相信信息的汇总,仅供参考学 ...
- ubuntu apt-get 总结 install xxx -d能下载安装包(含依赖)不安装_和卸载(转载)
[举例] 目前常用的 ========== *更新本机中的数据库缓存: sudo apt-get update *查找包含部分关键字的软件包: sudo apt-cache search <你要 ...
- Codeforces Codeforces Round #316 (Div. 2) C. Replacement set
C. Replacement Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/570/proble ...
- 深入理解DIP、IoC、DI以及IoC容器(转)
深入理解DIP.IoC.DI以及IoC容器 摘要 面向对象设计(OOD)有助于我们开发出高性能.易扩展以及易复用的程序.其中,OOD有一个重要的思想那就是依赖倒置原则(DIP),并由此引申出IoC.D ...
- 回文串+回溯法 URAL 1635 Mnemonics and Palindromes
题目传送门 /* 题意:给出一个长为n的仅由小写英文字母组成的字符串,求它的回文串划分的元素的最小个数,并按顺序输出此划分方案 回文串+回溯:dp[i] 表示前i+1个字符(从0开始)最少需要划分的数 ...
- HDU4859 海岸线(最小割)
题目大概就是说一个n*m的地图,地图上每一块是陆地或浅海域或深海域,可以填充若干个浅海域使其变为陆地,问能得到的最长的陆地海岸线是多少. 也是很有意思的一道题. 一开始想歪了,想着,不考虑海岸线重合的 ...
- POJ2240 Arbitrage(Floyd判负环)
跑完Floyd后,d[u][u]就表示从u点出发可以经过所有n个点回到u点的最短路,因此只要根据数组对角线的信息就能判断是否存在负环. #include<cstdio> #include& ...
- css3 flex流动自适应响应式布局样式类
1.再说css3 flex 一旦一个容器赋予了display:flex属性,将会有以下特点: 项目无法设置浮动. 列表的样式会被清除. 无法使用vertical-align设置垂直对齐方式. 目前互联 ...