Nsq集群介绍

Nsq(Nanosecond Queue)是一个高性能的分布式消息队列系统,旨在提供实时的消息传递和处理能力。以下是对Nsq集群的基本介绍:

基本概念

  • 消息队列:Nsq允许不同的应用程序之间通过异步方式进行通信,发送者将消息发布到队列中,而接收者可以从队列中获取这些消息。

  • 分布式架构:Nsq支持水平扩展,可以在多台机器上运行,以提高系统的可用性和吞吐量。

架构

  • Producer(生产者):负责将消息发送到Nsq集群。

  • NSQD:核心组件,负责接收、存储和转发消息。每个NSQD实例可以独立工作,也可以组成集群。

  • Consumer(消费者):订阅特定主题,从NSQD中获取并处理消息。

  • NSQ Lookup Daemon(nsqlookupd):用于服务发现,帮助消费者找到可用的NSQD实例。

工作原理

  1. 生产者将消息发送到指定主题的NSQD实例。

  2. NSQD将收到的消息存储在内存或磁盘中,并根据配置进行持久化。

  3. 消费者通过nsqlookupd查询可用的NSQD实例,并订阅感兴趣的主题。

  4. NSQD向消费者推送新到达的消息,消费者处理完后确认收到。

部署与管理

  • Nsqd和nsqlookupd可以在同一台机器上运行,也可以分开部署以适应不同规模的需求。

  • 可以使用Docker等容器技术简化部署过程,并利用监控工具来观察系统性能和健康状态。


集群IP示例

master

192.168.1.1

slave

192.168.1.2

arbiter

192.168.1.3

镜像

nsqio/nsq:v1.2.1


Nsq集群的优缺点

  • 优点

    • 高可用性:Redis 哨兵能够自动监控主从节点的状态,并在主节点故障时快速进行故障转移,确保系统持续可用。

    • 自动化管理:哨兵集群能够自动处理节点的监控、故障检测和配置更新,减少了人工干预的需求,提高了运维效率。

    • 服务发现:客户端可以动态获取当前主节点的信息,无需手动配置,从而简化了应用程序的连接管理。

    • 灵活性:支持多种部署方式,可以根据业务需求灵活调整主从关系和节点数量。

    • 实时监控:哨兵定期检查各个节点的健康状态,能够及时发现问题并采取措施,增强了系统的稳定性。

    • 扩展性:Redis 哨兵集群可以轻松扩展,通过增加更多的从节点来分担负载,提高系统性能。

    • 简化运维:由于大部分操作是自动化的,运维人员可以将精力集中在其他重要任务上,而不必频繁手动处理故障。

  • 缺点

    • 复杂性:引入哨兵集群后,系统架构变得更加复杂,需要更多的配置和管理工作。尤其是在大型系统中,需要仔细设置哨兵参数,并确保所有节点之间的通信正常。

    • 单点故障风险:虽然哨兵本身提供高可用性,但如果所有哨兵实例都出现问题,可能导致整个系统失去监控能力。因此,在设计时需要考虑冗余部署多个哨兵实例,以降低这一风险。

    • 性能开销:哨兵需要定期监控主从节点的状态,这会带来一定的性能开销。频繁的心跳检查和状态更新可能会影响 Redis 实例的整体性能,尤其是在高负载情况下。

    • 延迟问题:在故障转移过程中,可能会产生短暂的数据不可用或延迟。这是因为新的主节点需要时间来接管并更新其他从节点的信息。在此期间,客户端请求可能会失败或返回过期数据。

    • 一致性问题:在某些情况下,由于网络分区或其他原因,可能导致数据不一致。例如,如果一个从节点在主节点失效后被提升为新主节点,而旧主节点恢复在线,则可能出现数据冲突。

    • 依赖于网络稳定性:Redis 哨兵集群依赖于网络连接的稳定性。如果网络不稳定,会影响哨兵与 Redis 节点之间的通信,从而影响监控和故障转移能力。


部署前置服务*Docker


导入镜像

  • 部署所在服务器:master slave arbiter

docker load < nsq.tar

创建数据文件夹

  • 部署所在服务器:master slave arbiter

mkdir -p /docker/docker/nsq/{data,conf,log}

启动lookupd组件

  • 部署所在服务器:master

docker run -d --name lookupd -p 4160:4160 --privileged=true  -p 4161:4161 --restart=always -v /etc/hosts:/etc/hosts nsqio/nsq:v1.2.1 /nsqlookupd -http-address 0.0.0.0:4161 -tcp-address 0.0.0.0:4160 -broadcast-address 192.168.1.1
  • 部署所在服务器:slave

docker run -d --name lookupd -p 4160:4160 --privileged=true  -p 4161:4161 --restart=always -v /etc/hosts:/etc/hosts nsqio/nsq:v1.2.1 /nsqlookupd -http-address 0.0.0.0:4161 -tcp-address 0.0.0.0:4160 -broadcast-address 192.168.1.2

命令解析

  • docker run: 这是 Docker 命令,用于创建并运行一个新的容器。

  • -d: 这个选项表示以“分离模式”运行容器,也就是说容器在后台运行。

  • --name lookupd: 这部分指定了容器的名称为 lookupd,方便后续对该容器进行管理。

  • -p 4160:4160: 这个选项将容器的 4160 端口映射到主机的 4160 端口。这样,主机上的应用可以通过访问 localhost:4160 来与容器内的服务进行通信。

  • --privileged=true: 这个选项赋予容器额外的权限,使其能够执行某些特权操作。

  • -p 4161:4161: 这个选项将容器的 4161 端口映射到主机的 4161 端口,类似于第 4 步的端口映射。

  • --restart=always: 这个选项设置容器在停止后自动重启,确保服务的高可用性。

  • -v /etc/hosts:/etc/hosts: 这个选项将主机的 /etc/hosts 文件挂载到容器的 /etc/hosts 文件。这样,容器内的应用可以访问主机的 hosts 文件中的映射。

  • nsqio/nsq:v1.2.1: 这是要使用的 Docker 镜像的名称和版本号。

  • /nsqlookupd: 这是容器启动后执行的命令,表示要运行 NSQ 的 lookupd 服务。

  • -http-address 0.0.0.0:4161: 这个参数指定 lookupd 服务的 HTTP 地址和端口,0.0.0.0 表示监听所有网络接口。

  • -tcp-address 0.0.0.0:4160: 这个参数指定 lookupd 服务的 TCP 地址和端口,类似于 HTTP 地址,监听所有网络接口。

  • -broadcast-address 192.168.1.1: 这个参数指定 lookupd 的广播地址,通常用于在网络中发现服务。


启动Nsqd组件

  • 部署所在服务器:master

docker run -d --name nsqd -p 4150:4150 --privileged=true -p 4151:4151 --restart=always -v /etc/hosts:/etc/hosts -v /docker/docker/nsq/data:/usr/local/nsq/bin/data  nsqio/nsq:v1.2.1 /nsqd -tcp-address 0.0.0.0:4150 -data-path /usr/local/nsq/bin/data --http-address 0.0.0.0:4151 -lookupd-tcp-address 192.168.1.1:4160 -lookupd-tcp-address 192.168.1.2:4160 -broadcast-address 192.168.1.1
  • 部署所在服务器:slave

docker run -d --name nsqd -p 4150:4150 --privileged=true -p 4151:4151 --restart=always -v /etc/hosts:/etc/hosts -v /docker/docker/nsq/data:/usr/local/nsq/bin/data  nsqio/nsq:v1.2.1 /nsqd -tcp-address 0.0.0.0:4150 -data-path /usr/local/nsq/bin/data --http-address 0.0.0.0:4151 -lookupd-tcp-address 192.168.1.1:4160 -lookupd-tcp-address 192.168.1.2:4160 -broadcast-address 192.168.1.2

命令解析

  • docker run: 这是 Docker 命令,用于创建并运行一个新的容器。

  • -d: 这个选项表示以“分离模式”运行容器,即容器在后台运行。

  • --name nsqd: 这部分指定了容器的名称为 nsqd,方便后续对该容器进行管理。

  • -p 4150:4150: 这个选项将容器的 4150 端口映射到主机的 4150 端口。主机上的应用可以通过访问 localhost:4150 来与容器内的服务进行通信。

  • --privileged=true: 这个选项赋予容器额外的权限,使其能够执行某些特权操作。

  • -p 4151:4151: 这个选项将容器的 4151 端口映射到主机的 4151 端口,类似于第 4 步的端口映射。

  • --restart=always: 这个选项设置容器在停止后自动重启,确保服务的高可用性。

  • -v /etc/hosts:/etc/hosts: 这个选项将主机的 /etc/hosts 文件挂载到容器的 /etc/hosts 文件。这样,容器内的应用可以访问主机的 hosts 文件中的映射。

  • -v /docker/docker/nsq/data:/usr/local/nsq/bin/data: 这个选项将主机的 /docker/docker/nsq/data 目录挂载到容器的 /usr/local/nsq/bin/data 目录。这样,容器内的数据可以持久化到主机上,避免容器重启或删除时丢失数据。

  • nsqio/nsq:v1.2.1: 这是要使用的 Docker 镜像的名称和版本号。

  • /nsqd: 这是容器启动后执行的命令,表示要运行 NSQ 的 nsqd 服务。

  • -tcp-address 0.0.0.0:4150: 这个参数指定 nsqd 服务的 TCP 地址和端口,0.0.0.0 表示监听所有网络接口。

  • -data-path /usr/local/nsq/bin/data: 这个参数指定 nsqd 服务数据存储的路径,数据将被存储在容器内的 /usr/local/nsq/bin/data 目录。

  • --http-address 0.0.0.0:4151: 这个参数指定 nsqd 服务的 HTTP 地址和端口,0.0.0.0 表示监听所有网络接口,HTTP API 将在 4151 端口提供服务。

  • -lookupd-tcp-address 192.168.1.1:4160: 这个参数指定 nsqd 要连接的 lookupd 服务的 TCP 地址,通常用于发现可用的消息队列。

  • -lookupd-tcp-address 192.168.1.2:4160: 这个参数指定另一个 lookupd 服务的 TCP 地址,允许 nsqd 连接到多个 lookupd 实例以实现高可用性。

  • -broadcast-address 192.168.1.2: 这个参数指定 nsqd 的广播地址,通常用于在网络中发现服务。


启动Nsqadmin组件

  • 部署所在服务器:arbiter

docker run -d --name nsqadmin --privileged=true -p 4171:4171 --restart=always -v /etc/hosts:/etc/hosts nsqio/nsq:v1.2.1 /nsqadmin --lookupd-http-address 192.168.1.1:4160 -lookupd-http-address 192.168.1.2:4160

总结

了解Nsq集群的优缺点有助于在实际项目中做出更明智的技术选择。在选择消息队列解决方案时,应根据具体需求权衡这些优缺点,以确保所选技术能够有效支持业务目标。