边缘连接服务(edge-connection)集群
边缘连接服务是负责设备层的设备连接,数据采集,属性读写,属性计算,报警等功能,其实现较为独立,集群功能不依赖spring cloud服务实现,引入zookeeper作为边缘采集服务的注册,配置和控制调度中心,下图以两个节点实例的集群示意其架构和故障转移实现:
- 图中以两个edge-connection服务实例为例,最少需要2个节点实现高可用,可增加更多的节点扩展服务实例
- edge-connection服务启动后,会将实例信息注册到ZooKeeper集群,ZooKeeper根据实例信息,选举产生Leader节点,如果edge-connection实例1,Leader节点是不确定的,其他节点都有可能选举为Leader节点
- Leader节点实例根据当前所有的设备配置信息,将设备均匀的分配各个实例节点,目前分配策略采用平均分配的方式,如果系统连接有5个设备,将设备1,2,3分配给实例1,设备4,5分配给实例2,达到平均分配的效果,设备分配的过程也是随机的,不是固定不变的
- 当集群中有节点发生异常时,比如edge-connection实例1掉线,ZooKeeper集群会触发选举过程,重新进行leader选举,选举出来的Leader节点(示例中的实例2)重新执行步骤3的设备配置分配过程,将设备重新均匀分配到所有存在的实例中,示例中,edge-connection实例1分配到了所有5个设备的配置
- 当edge-connection实例1重新上线时,ZooKeeper集群会触发选举过程,选举完成后,同样也是执行步骤3配置分配过程,将设备配置均匀分配到各个实例上
边缘连接服务(edge-connection)集群部署
边缘连接服务在部署时,需要配置集群相关的两个选项,在application.yml中配置如下:
iot:
id: 1
name: Edge Connection Service1
cluster:
enable: false
server: 192.168.1.101:2181;192.168.1.102:2181;192.168.1.103:2181
名称 | 说明 | 默认值 |
---|---|---|
iot.id | 节点id,iot.cluster.enable为true时必须设置,保证每个节点实例id不一样 | 1 |
iot.name | 节点名称,集群方式部署时,可设置为不同的名称 | Edge Connection Service |
iot.cluster.enable | 是否启用cluster功能,集群方式部署时,设置为true | false |
iot.cluster.server | 集群控制中心地址,目前为ZooKeeper地址,多个url地址中间用;隔开 | 127.0.0.1:2181 |
边缘连接服务部署时,需要进行以上两个选项的设置,同样的,对边缘连接服务存在API调用的服务,同样需要配置这两个选项,目前依赖边缘连接服务的服务有edge-management,data-process服务
部署前提条件
- 准备两个服务节点(ip地址信息根据实际部署环境进行对应调整)
节点1: 192.168.1.101
节点2: 192.168.1.102
- ZooKeeper集群已经部署完成
ZooKeeper集群url为:192.168.1.101:2181;192.168.1.102:2181;192.168.1.103:2181
- rabbitmq服务已经部署完成
rabbitmq: 以docker的形式运行,container名称为rabbitmq,端口5672,用户名和密码为 guest/guest
docker部署边缘连接服务集群
节点1上运行:
docker run -d --name edge-management --restart always --net iot \
-p 9800:9800 \
-v /opt/setting:/app/setting -v /opt/log:/opt/log -v /opt/plugins:/app/plugins \
-e JAVA_OPTS=" \
-Dserver.port=9800 \
-Diot.id=1 \
-Diot.name=Edge Connection Servcie 1 \
-Diot.cluster.enable=true \
-Diot.cluster.server=192.168.1.101:2181;192.168.1.102:2181;192.168.1.103:2181 \
-Drabbitmq.host=rabbitmq \
-Drabbitmq.port=5672 \
-Drabbitmq.username=guest \
-Drabbitmq.password=guest \
-Dlogging.file.name=/opt/log/equip-connection.log \
-Diot.setting.path=/app/setting \
-Dlogging.level.com.hvisions.iot.connection.collection=info \
-Dlogging.level.com.hvisions.iot=debug \
-Dlogging.level.com.hvisions.iot.drivers.manager.Subscriber=info \
-Dlogging.level.com.hvisions.iot.connection.collection.taskDetail.AlarmProcess=info \
-Dlogging.level.org.reflections=error \
-XX:+HeapDumpOnOutOfMemoryError \
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=9999 \
-Diot.setting.syncAtStart=true \
-Diot.setting.peroidStartDelay=0 \
-Diot.command.type=MQ \
-Dbroker.mqtt.url=tcp://rabbitmq:1883 \
-Dbroker.mqtt.clientId=field-collection-edge \
-Xmx512m \
" \
harbor.hipermatrix.com:10300/edge/edge-connection:1.1.15
节点1上配置iot.id为1,iot.cluster.enable为true启用集群功能
节点2上运行:
docker run -d --name edge-management --restart always --net iot \
-p 9800:9800 \
-v /opt/setting:/app/setting -v /opt/log:/opt/log -v /opt/plugins:/app/plugins \
-e JAVA_OPTS=" \
-Dserver.port=9800 \
-Diot.id=2 \
-Diot.name=Edge Connection Servcie 2 \
-Diot.cluster.enable=true \
-Diot.cluster.server=192.168.1.101:2181;192.168.1.102:2181;192.168.1.103:2181 \
-Drabbitmq.host=rabbitmq \
-Drabbitmq.port=5672 \
-Drabbitmq.username=guest \
-Drabbitmq.password=guest \
-Dlogging.file.name=/opt/log/equip-connection.log \
-Diot.setting.path=/app/setting \
-Dlogging.level.com.hvisions.iot.connection.collection=info \
-Dlogging.level.com.hvisions.iot=debug \
-Dlogging.level.com.hvisions.iot.drivers.manager.Subscriber=info \
-Dlogging.level.com.hvisions.iot.connection.collection.taskDetail.AlarmProcess=info \
-Dlogging.level.org.reflections=error \
-XX:+HeapDumpOnOutOfMemoryError \
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=9999 \
-Diot.setting.syncAtStart=true \
-Diot.setting.peroidStartDelay=0 \
-Diot.command.type=MQ \
-Dbroker.mqtt.url=tcp://rabbitmq:1883 \
-Dbroker.mqtt.clientId=field-collection-edge \
-Xmx512m \
" \
harbor.hipermatrix.com:10300/edge/edge-connection:1.1.15
节点1上配置iot.id为2,iot.cluster.enable为true启用集群功能