一、核心需求与问题

1.1 为什么需要高可用的LoRaWAN网络?

当前很多物联网项目都用LoRaWAN传数据,比如小区智能水表、农场土壤传感器、城市垃圾桶监测,这些场景要求数据7*24小时不中断。但传统单服务器+网关的架构很脆弱,网关断个电、服务器卡一下,当天的水费、灌溉数据就收不到,不仅麻烦还可能影响实际业务。所以高可用不是锦上添花,是解决实际问题的刚需。

1.2 要解决哪两个核心问题?

我们要搞定两个核心:一是多个网关怎么分摊数据压力,别让一个网关扛所有设备的请求;二是如果某个服务器节点或网关坏了,怎么快速把任务转到其他正常节点,不影响传感器数据的上传。

二、搭建前的准备与技术栈选择

2.1 选啥技术栈?

为了让不同基础的开发者都能上手,我们选Docker+ChirpStack全栈的方案,因为Docker不用额外装各种依赖,直接拉镜像就能跑,适合快速测试和部署。具体的单一技术栈是:Docker容器、ChirpStack开源服务器、PostgreSQL主从数据库、HAProxy负载均衡,这套组合既能满足高可用需求,又不会太复杂。

2.2 需要的基础条件

至少2台服务器(配置4核8G足够)、2个LoRa网关(覆盖不同区域,避免一个区域断网),再加上装了Docker和Docker Compose的Linux系统(比如Ubuntu 20.04,大部分人都在用)。

三、具体搭建与高可用方案实现

3.1 多网关负载均衡的配置方法

ChirpStack的Gateway Server是专门和网关通信的模块,我们启动2个Gateway Server节点,再用HAProxy做负载均衡,把网关的请求均匀分到两个节点上。这样不管网关连哪个节点,只要节点正常就能传数据,还能避免某个节点过载。 这里是HAProxy的配置示例,带详细注释:

# HAProxy配置文件,用于分发LoRa网关请求到ChirpStack Gateway Server集群
global
    log /dev/log local0  # 日志输出到本地设备
    daemon               # 后台运行
defaults
    log global           # 继承全局日志配置
    mode tcp            # 用TCP协议传输,适合LoRa网关的长连接
    option tcplog       # 记录TCP连接日志
    timeout connect 5000ms  # 连接超时5秒
    timeout client 50000ms  # 客户端请求超时50秒
    timeout server 50000ms   # 服务器响应超时50秒
# 定义前端端口,对应LoRa网关的接入端口(ChirpStack默认1700)
frontend lora_gateway
    bind *:1700
    default_backend gateway_servers  # 请求转发到后面的网关服务器集群
# 后端两个ChirpStack Gateway Server节点,IP换成你自己的节点地址
backend gateway_servers
    balance roundrobin  # 轮询算法,均匀分配请求到每个节点
    server gs1 192.168.1.10:1700 check  # check参数自动检测节点健康,坏了就移除
    server gs2 192.168.1.11:1700 check

另外要保证两个Gateway Server连同一个PostgreSQL数据库,这样设备、网关的数据能同步,不会出现数据不一致的问题。

3.2 单点故障应急切换的实现

故障切换分三个部分:数据库切换、服务器节点切换、网关自动接管,具体实现如下: 首先是数据库用PostgreSQL主从复制,主节点写数据,从节点读,要是主节点挂了,从节点自动升级为主,ChirpStack节点会自动连新的主节点。 然后用Keepalived做ChirpStack应用服务器的故障切换,给两个应用节点配一个虚拟IP,外部用户访问虚拟IP就行,节点挂了会自动把虚拟IP切换到正常节点,用户感知不到变化。 这里是Keepalived的配置示例:

# Keepalived配置,实现ChirpStack应用服务器的故障切换
global_defs {
   router_id lora_app_server  # 当前节点标识,随便取名
}
# 自定义健康检查脚本,检测ChirpStack应用是否正常
vrrp_script check_chirp {
    script "/usr/bin/curl -s http://127.0.0.1:8080/health | grep '\"status\":\"healthy\"' -q"
    interval 2  # 每2秒检查一次节点状态
    weight -20  # 检查失败时,优先级减20,自动触发切换
}
# VRRP实例,配置虚拟IP和切换规则
vrrp_instance VI_1 {
    state MASTER  # 主节点设为MASTER,备节点设为BACKUP
    interface eth0  # 服务器网卡名,换成你自己的(用ip a命令查看)
    virtual_router_id 51  # 两个节点的路由ID必须一致,范围1-255
    priority 100  # 主节点优先级要高于备节点(备节点设为90)
    advert_int 1  # 每1秒发送一次心跳包,检测节点存活
    authentication {  # 心跳包验证,防止恶意节点入侵
        auth_type PASS
        auth_pass lora123  # 生产环境要改成复杂密码
    }
    virtual_ipaddress {  # 对外提供的虚拟IP,用户用这个访问服务
        192.168.1.200
    }
    track_script {  # 关联健康检查脚本,异常时触发切换
        check_chirp
    }
}

网关故障的话,ChirpStack的Network Server会定期扫描网关,某个网关离线后,新的传感器数据会自动分给在线的网关,不用手动改配置。

四、方案的应用场景与优缺点分析

4.1 适合的应用场景

第一个是智慧抄表,小区里的智能水表每天要传用水量,用这个方案不会因为网关或服务器故障漏传数据,物业统计和居民缴费都不会出问题;第二个是农业物联网,大棚的温湿度传感器、土壤监测设备,网关要覆盖几亩地,多个网关做负载均衡,一个网关坏了,备用网关马上接管,不会影响灌溉决策;第三个是城市公共设施,路边的垃圾桶满溢监测、路灯控制,需要全年无休,这个方案能保障服务稳定。

4.2 技术优缺点

优点很突出:一是高可用性,单节点故障不影响整体网络,避免数据丢失;二是扩展性好,设备多了只要加网关和ChirpStack节点就行,不用改现有配置;三是成本低,全是开源组件,不用买商业LoRa服务。缺点也明显:一是运维稍复杂,要会配置Docker、HAProxy这些工具,排查故障比单节点麻烦;二是需要额外硬件,至少2台服务器和2个网关,比单节点成本高;三是对时间同步要求高,所有节点要准同步NTP时间,不然数据包校验会失败,传不过去。

4.3 关键注意事项

第一,所有网关和服务器必须同步NTP时间,要是时间差超过1秒,LoRa数据包的校验就会失败,直接丢数据;第二,PostgreSQL数据库要定期备份,哪怕从节点也可能出问题,每周备份一次,万一整个集群坏了能快速恢复;第三,要监控所有节点的状态,比如用Prometheus+Grafana,看CPU、内存使用率,网关在线数,要是某个节点负载过高就加节点;第四,网关的频段要和ChirpStack配置的一致,国内通用是470-510MHz,要是设错频段,网关连不上服务器。

五、方案总结

这个基于ChirpStack的高可用LoRaWAN网络,核心思路就是把单点拆成多个冗余节点,用负载均衡分摊压力,再用故障切换机制保证节点异常时无缝接管任务。这套方案不管是中小项目快速部署,还是大型物联网项目长期运行都适用,中小项目用Docker就能搞定,不用太复杂的监控,大型项目可以加自动化工具进一步提升稳定性,完全能满足不同场景的高可用需求。