【NSQ部署】

发布时间:2023年12月17日

官网: https://nsq.io/

介绍

NSQ是一个基于Go语言的分布式实时消息平台,其设计目标是为在分布式环境下运行的去中心化服务提供一个强大的基础架构。
NSQ具有分布式、去中心化的拓扑结构,该结构具有无单点故障、故障容错、高可用性以及能够保证消息的可靠传递的特征。NSQ非常容易配置和部署,且具有最大的灵活性,支持众多消息协议。

NSQ组件介绍

nsqd:是接收、队列和传送消息到客户端的守护进程。
nsqlookupd:是管理的拓扑信息,并提供了最终一致发现服务的守护进程。
nsqadmin:是一个 Web UI 来实时监控集群(和执行各种管理任务)。

nsq原理图

安装

先决条件

  • golang(1.13+需要版本)

编译
NSQ 使用 go 模块来生成可靠的构建。

git clone https://github.com/nsqio/nsq
cd nsq
make
make install

测试

./test.sh

集群搭建

nqs集群原理
NSQ集群比较简单,主要包含4个部分,一是生产者、二是nsq实例(nsqd)、三是服务发现nsqlookupd、四是消费者(Comsumer)。
这4个部分的工作方式如下:

  1. 生产者
  • 生产者需要指定将消息写入哪个实例nsqd
  • 当一个nsqd实例宕机时,生产者可以选择将消息写到其他的实例
  • 生产者也可以将同一条消息写入两个nsqd(HA)
  1. nsqd
  • 消息不会在nsqd之间传递,生产者把消息写到哪个nsqd就只能在该nsqd消费
  • 不同的nsqd可以接收同一个生产者的相同的消息,参考生产者的说明
  • nsqd会将自己的服务信息广播给集群内的nsqlookupd
  1. 服务发现nsqlookupd
  • nsqlookupd与集群内的所有nsqd建立连接,检测实例的状态,并接收实例广播过来的服务注册
  • nsqlookupd接收消费者客户端的服务发现请求,将对应的实例返回给消费者(这里可以是多个实例)
  • 一个集群可以有多个nsqlookupd
  1. 消费者comsumer
  • 消费者可以与nsqd直连,但为了防止单点故障,不应该有这种固定的关系
  • 官方推荐走服务发现nsqlookupd,参考生产者的说明,当一个nsqd宕机时,生产者可以将消息写入其他的nsqd,或者为了HA,生产者可以双写
    针对上述特性说明,我们可以得出以下结论或支撑系统高可用的方案:
  • 当一个nsqd宕机时,这台机上尚未消费且尚未落盘的消息会丢失;集群本身不提供副本和分片
  • 鉴于上一条,对于幂等且不可丢失的消息,生产者可以选择双写,一条消息同时写两个实例
  • 当正在写的nsqd宕机时,生产者可以选择写入其他的nsqd。前提是消费者通过nsqlookupd完成服务发现,及时感知集群的变化;或者消费者可以同时连上集群内所有的Nsqd实例
  • 生产者可以做一定的负载均衡,将消息分散生产到不同的nsqd中

实际操作

两台机器做集群,机器信息

10.0.0.5
10.0.0.6
  1. 每台机器运行nsqlookupd
nohup ./nsqlookupd &
  1. 启动nsqd
    通过-broadcast-address参数附带上自己机器的IP(这个参数会注册到nsqlookupd以区分不同的nsqd),且须指定nsqlookupd的tcp地址

10.0.0.5机器执行

nohup ./nsqd --broadcast-address=10.0.0.5:4160 --lookupd-tcp-address=10.0.0.6:4160 &

10.0.0.6机器执行

nohup ./nsqd --broadcast-address=10.0.0.6:4160 --lookupd-tcp-address=10.0.0.5:4160 &
  1. 在其中一台机器运行nsqadmin

注意:要指定两个nsqlookupd的http地址

nohup ./nsqadmin --lookupd-http-address=10.0.0.5:4160 --lookupd-http-address=10.0.0.6:4160 &

检测脚本:nsq_check.sh

#!/bin/bash

command_exists() {
  command -v "$1" &>/dev/null
}

# 检查是否安装了go
if ! command_exists go; then
    # 如果未安装go,执行安装操作
    wget https://mirrors.aliyun.com/golang/go1.21rc4.linux-amd64.tar.gz
    tar -C /usr/local -zxvf go1.21rc4.linux-amd64.tar.gz
    echo "export GOROOT=/usr/local/go" >> /etc/profile
    echo "export PATH=\$PATH:\$GOROOT/bin" >> /etc/profile
    source /etc/profile  # 刷新环境变量
    go env -w GOPROXY="https://goproxy.cn"
    go env -w GO111MODULE=on
fi


# 检查是否已安装nsq
if ! command_exists nsqd; then
    # 如果未安装nsq,执行安装操作
    cd ~/ && git clone https://github.com/nsqio/nsq
    cd nsq && make && make install
fi

# 启动 nsqlookupd
if ! pgrep -x "nsqlookupd" > /dev/null; then
    echo "nsqlookupd 未运行,正在启动..."
    nohup nsqlookupd > /dev/null 2>&1 &
else
    echo "nsqlookupd 已经在运行"
fi

# 启动 nsqd,注意哪台机器运行broadcast-address修改为哪台机器的ip
if ! pgrep -x "nsqd" > /dev/null; then
    echo "nsqd 未运行,正在启动..."
    /usr/local/bin/nsqd --broadcast-address=10.0.0.5:4160 --lookupd-tcp-address=10.0.0.6:4160 --data-path=/data/nsq/ > ~/log/nsqd1.log 2>&1 &
else
    echo "nsqd 已经在运行"
fi

# 启动 nsqadmin,注意哪台机器运行broadcast-address修改为哪台机器的ip
if ! pgrep -x "nsqadmin" > /dev/null; then
    echo "nsqadmin 未运行,正在启动..."
    /usr/local/bin/nsqadmin --broadcast-address=10.0.0.5:4160 --lookupd-tcp-address=10.0.0.6:4160  > ~/log/nsqadmin.log 2>&1 &
else
    echo "nsqadmin 已经在运行"
fi
文章来源:https://blog.csdn.net/qq_41816540/article/details/135029693
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。