nsq安装与使用
前言
网上很多nsq教程都挺简单明了的,但还是想做一次自己实践的使用教程一、NSQ是什么?
NSQ是一个实时分布式消息传递平台,旨在大规模运行,每天处理数十亿条消息。
它促进了没有单点故障的分布式和分散式拓扑,从而实现了容错能力和高可用性,并提供了可靠的消息传递保证。查看功能和保证。
从操作上讲,NSQ易于配置和部署(所有参数均在命令行上指定,并且编译的二进制文件不具有运行时相关性)。为了获得最大的灵活性,它与数据格式无关(消息可以是JSON,MsgPack,协议缓冲区或其他任何东西)。官方提供了Go和Python库(以及许多其他客户端库),并且,如果您有兴趣构建自己的库,则有一个协议规范。
我们发布了针对linux,darwin,freebsd和Windows的二进制发行版,以及官方Docker映像。
项目地址:https://github.com/nsqio/nsq
二、概述
1.快速开始
:
下面的步骤将在本地机器上运行一个小型NSQ集群,并将消息发布、使用和归档到磁盘。
1.按照安装文档中的说明操作。
安装
二进制发行版本
可以下载用于linux,darwin,freebsd和Windows的预构建二进制文件:
当前稳定版本:当前稳定版本v1.2.0
nsq-1.2.0.darwin-amd64.go1.12.9.tar.gz
nsq-1.2.0.linux-amd64.go1.12.9.tar.gz
nsq-1.2.0.freebsd-amd64.go1.12.9.tar.gz
nsq-1.2.0.windows-amd64.go1.12.9.tar.gz
较旧的稳定版本
nsq-1.1.0.darwin-amd64.go1.10.3.tar.gz
nsq-1.1.0.linux-amd64.go1.10.3.tar.gz
nsq-1.1.0.freebsd-amd64.go1.10.3.tar.gz
nsq-1.1.0.windows-amd64.go1.10.3.tar.gz
Docker
请参阅有关使用Docker部署NSQ的文档。
在Docker容器中部署和运行nsq二进制文件。有一个包含所有NSQ二进制文件的最小nsq镜像。通过在运行Docker时将二进制文件指定为命令可以运行每个二进制文件。
基本格式为:
docker run nsqio/nsq/<conmand>
注意命令前的/nsq。 例如:
docker run nsqio/nsq /nsq_to_file
Docker和镜像链接
拉取并运行nsqlookupd
docker pull nsqio/nsq
docker run --name lookupd -p 4160:4160 -p 4161:4161 nsqio/nsq /nsqlookupd
运行nsqd
首先,获取Docker主机的IP:
ifconfig | grep addr
其次,运行nsqd容器:
docker pull nsqio/nsq
docker run --name nsqd -p 4150:4150 -p 4151:4151 \
nsqio/nsq /nsqd \
--broadcast-address=<host> \
--lookupd-tcp-address=<host>:<port>
将–lookupd-tcp-address标志设置为先前运行的主机的IP和TCP端口 nsqlookupd,即dockerIP:4160:
例如,假设主机IP为172.17.42.1:
docker run --name nsqd -p 4150:4150 -p 4151:4151 \
nsqio/nsq /nsqd \
--broadcast-address=172.17.42.1 \
--lookupd-tcp-address=172.17.42.1:4160
请注意,此端口使用port 4160,这是我们启动nsqlookupd容器时公开的端口(它也是的默认端口nsqlookupd)。
如果要使用非默认端口,请更改-p参数:
docker run --name nsqlookupd -p 5160:4160 -p 5161:4161 nsqio/nsq /nsqlookupd
这将使nsqlookupd在端口5160和5161的Docker主机IP上可用。
使用TLS
要将TLS与容器化的NSQ二进制文件一起使用,您需要包括证书文件,私钥和根CA文件。Docker映像具有/etc/ssl/certs/为此目的可用的卷装载。将包含文件的主机目录挂载到该卷,然后照常在命令行中指定文件:
docker run -p 4150:4150 -p 4151:4151 -p 4152:4152 -v /home/docker/certs:/etc/ssl/certs \
nsqio/nsq /nsqd \
--tls-root-ca-file=/etc/ssl/certs/certs.crt \
--tls-cert=/etc/ssl/certs/cert.pem \
--tls-key=/etc/ssl/certs/key.pem \
--tls-required=true \
--tls-client-auth-policy=require-verify
这会将证书从/home/docker/certsDocker容器加载到运行时使用。
持久化NSQ数据
要将nsqd数据存储在主机磁盘上,请将该 /data目录 用作您的数据目录,该目录可让您挂载到仅数据的Docker容器 或挂载到主机目录:
docker run nsqio/nsq /nsqd \
--data-path=/data
使用docker-compose
要启动nsqd,nsqlookupd以及nsqadmin共同使用docker-compose,然后创建一个docker-compose.yml。
version: '3'
services:
nsqlookupd:
image: nsqio/nsq
command: /nsqlookupd
ports:
- "4160"
- "4161"
nsqd:
image: nsqio/nsq
command: /nsqd --lookupd-tcp-address=nsqlookupd:4160
depends_on:
- nsqlookupd
ports:
- "4150"
- "4151"
nsqadmin:
image: nsqio/nsq
command: /nsqadmin --lookupd-http-address=nsqlookupd:4161
depends_on:
- nsqlookupd
ports:
- "4171"
要开始从与docker-compose.yml先前创建的目录相同的目录中运行以下命令。
docker-compose up -d
将创建一个专用网络,并使用该专用网络启动三个容器。在本地主机上,每个容器将具有一个随机端口,该端口映射到中暴露的端口docker-compose.yml。
查看正在运行的容器状态和映射的端口。
docker-compose ps
查看正在运行的容器中的日志。
docker-compose logs
假设nsqlookupd已将主机端口31001映射到容器端口4161,则可以使用进行简单的ping curl。
curl http://127.0.0.1:31001/ping
OSX
$ brew install nsq
源码编译
先决条件
golang(1.9+需要版本)
dep(依赖管理器)(仅适用于<1.11的golang)
编译中锚链接:编译
NSQ使用go模块或 dep管理依赖关系并生成可靠的构建。
$ git clone https://github.com/nsqio/nsq $GOPATH/src/github.com/nsqio/nsq
$ cd $GOPATH/src/github.com/nsqio/nsq
$ dep ensure
$ make
NSQ保持go get兼容,但不建议这样做,因为它不能保证生成可靠的内部版本(固定的依赖关系需要手动满足)。
测试
$ ./test.sh
2.在一个shell中,启动nsqlookupd:
$ nsqlookupd
3.在另一个shell中,开始nsqd:
$ nsqd --lookupd-tcp-address=127.0.0.1:4160
4.在另一个shell中,开始nsqadmin:
$ nsqadmin --lookupd-http-address=127.0.0.1:4161
5.发布初始消息(也在集群中创建主题):
$ curl -d 'hello world 1' 'http://127.0.0.1:4151/pub?topic=test'
6.最后,在另一个shell中,开始nsq_to_file:
$ nsq_to_file --topic=test --output-dir=/tmp --lookupd-http-address=127.0.0.1:4161
7.发布更多消息至nsqd:
$ curl -d 'hello world 2' 'http://127.0.0.1:4151/pub?topic=test'
$ curl -d 'hello world 3' 'http://127.0.0.1:4151/pub?topic=test'
8.为了验证事情是否按预期进行,请在打开的网络浏览器http://127.0.0.1:4171/中查看nsqadminUI并查看统计信息。另外,检查test.*.log写入的日志文件()的内容/tmp。
这里重要的一课是,nsq_to_file没有明确告知(客户端)test 主题的产生地,它从中检索该信息,nsqlookupd并且尽管连接定时,也不会丢失任何消息。