一、核心需求与问题
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就能搞定,不用太复杂的监控,大型项目可以加自动化工具进一步提升稳定性,完全能满足不同场景的高可用需求。
评论
围绕“基于ChirpStack开源服务器搭建高可用LoRaWAN网络架构,多网关负载均衡与单点故障应急切换方案”参与讨论