# 分布式集群

### Coolpy7分布集群设计

Coolpy7消息服务器集群基于Gossip协议作为服务发现，基于UDP作为集群节点间消息转发通信的分布式设计，集群原理可简述为下述几条规则:

1. 所有节点独立维护自有的身份验证、订阅、取消订阅事件处理
2. 集群之间只会转发PUBLISH消息，并且消息体少于64K的消息
3. 节点内组播消息不被转发，只在当前节点有效
4. 集群之间不保证消息不丢失，只转发消息到所有在线节点，转发会忽略离线节点
5. 客户端连接某一个节点后，将会收到来自其他节点给它的消息（于订阅的主题）

Coolpy7集群架构图

![](https://33059891-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LPz4APWKTuf0FRQG1lh%2F-MhM20AXz73u2WwISlwP%2F-MhM3dteVnXRES-qXOnv%2FCoolpy7%E9%9B%86%E7%BE%A4.png?alt=media\&token=da651a66-e678-4a7b-827a-2a27c9eea0ae)

消息分发流

![](https://33059891-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LPz4APWKTuf0FRQG1lh%2F-M00VEFSWQMqnM3Gs3l8%2F-M01Kyn6mjSjwYoXbILA%2Fcoolpy7%E9%9B%86%E7%BE%A4%E6%B6%88%E6%81%AF%E6%B5%81.png?alt=media\&token=c0623252-0d45-4f6b-8a38-c64ccc632500)

### 手动配置管理集群

假设部署三台服务器 192.168.1.100, 192.168.1.101, 192.168.1.102 上部署集群:

| 节点名                  | IP            |
| -------------------- | ------------- |
| node1\@192.168.1.100 | 192.168.1.100 |
| node2\@192.168.1.101 | 192.168.1.101 |
| node3\@192.168.1.102 | 192.168.1.102 |

{% hint style="warning" %}
1.节点名不允许重复，否则群集将无法自动维护集群状态

2.当使用外网IP或域名进行跨数据中心集群时，通过“节点名@IP地址或域名”进行指定IP设置。
{% endhint %}

#### 节点1：192.168.1.100节点设置

```
# 下载服务器端
wget https://github.com/Coolpy7/Coolpy7/raw/master/go_build_Coolpy7_go_linux.zip
# 解压文件
unzip go_build_Coolpy7_go_linux.zip
# 提权
chmod -R 777 go_build_Coolpy7_go_linux
# 启动Coolpy7 启动参数
# csk 集群服务同步验证token，集群各节点转发消息时验证此口令，防止恶意入侵集群
# nid 集群节点名称，必须集群中唯一
# mbs 连接集群其他节点,只需填其他节点信息，以半角豆号分隔多个节点信息
./go_build_Coolpy7_go_linux -csk=12345678 -nid=node1@192.168.1.100 -mbs=192.168.1.101:7946,192.168.1.102:7946

# 启动成功后会打印如下信息，即说明服务端已正常启动，host于1883端口，请确保相关防火墙配置可用
2020/02/14 14:48:27 cluster on udp 192.168.1.100:7946
2020/02/14 14:48:27 cluster sync on udp port 7947
2020/02/14 14:48:27 Coolpy7 v7.3.2.3 tcp [::]:1883 plugin build golang v1.13.1
```

{% hint style="info" %}
打印消息提示，群集使用UDP的7946端口进行集群服务发现，UDP的7947端口进行消息同步服务。

如需自定义端口可通过启动参数

-crp int 集群发现端口(UDP) (default 7946)&#x20;

-csp int 集群同步端口(UDP) (default 7947)
{% endhint %}

#### 节点2：192.168.1.101节点设置

```
# 下载服务器端
wget https://github.com/Coolpy7/Coolpy7/raw/master/go_build_Coolpy7_go_linux.zip
# 解压文件
unzip go_build_Coolpy7_go_linux.zip
# 提权
chmod -R 777 go_build_Coolpy7_go_linux
# 启动Coolpy7 启动参数
# csk 集群服务同步验证token，集群各节点转发消息时验证此口令，防止恶意入侵集群
# nid 集群节点名称，必须集群中唯一
# mbs 连接集群其他节点,只需填其他节点信息，以半角豆号分隔多个节点信息
./go_build_Coolpy7_go_linux -csk=12345678 -nid=node2@192.168.1.101 -mbs=192.168.1.100:7946,192.168.1.102:7946

# 启动成功后会打印如下信息，即说明服务端已正常启动，host于1883端口，请确保相关防火墙配置可用
2020/02/14 14:48:27 cluster on udp 192.168.1.101:7946
2020/02/14 14:48:27 cluster sync on udp port 7947
2020/02/14 14:48:27 Coolpy7 v7.3.2.3 tcp [::]:1883 plugin build golang v1.13.1
```

#### 节点3：192.168.1.102节点设置

```
# 下载服务器端
wget https://github.com/Coolpy7/Coolpy7/raw/master/go_build_Coolpy7_go_linux.zip
# 解压文件
unzip go_build_Coolpy7_go_linux.zip
# 提权
chmod -R 777 go_build_Coolpy7_go_linux
# 启动Coolpy7 启动参数
# csk 集群服务同步验证token，集群各节点转发消息时验证此口令，防止恶意入侵集群
# nid 集群节点名称，必须集群中唯一
# mbs 连接集群其他节点,只需填其他节点信息，以半角豆号分隔多个节点信息
./go_build_Coolpy7_go_linux -csk=12345678 -nid=node3@192.168.1.102 -mbs=192.168.1.100:7946,192.168.1.101:7946

# 启动成功后会打印如下信息，即说明服务端已正常启动，host于1883端口，请确保相关防火墙配置可用
2020/02/14 14:48:27 cluster on udp 192.168.1.102:7946
2020/02/14 14:48:27 cluster sync on udp port 7947
2020/02/14 14:48:27 Coolpy7 v7.3.2.3 tcp [::]:1883 plugin build golang v1.13.1
```

至此集群搭建完毕，现在即可通过MQTT客户端工具（MQTTLens）等进行相关集群功能测试。可从A节点连接的客户端推送消息，然后B,C节点的客户端如果订阅了相同主题将会收到相关跨节点消息。

### 自动愈合，自动清除异常节点

集群自动恢复功能说明:

1. 节点网络异常离线各节点会发现ping包没有响应，
2. 随后邀请其他在线节点向异常节点发起ping测试，
3. 如经过三轮周期没有得到异常节点响应
4. 当前节点设置该节点为离线状态
5. 移出在线节点列表。
6. 异常节点再次上线
7. 所有在线节点收到状态信号
8. 所有节点设置该节点为在线
9. 添加该节点到在线列表

### 消息桥接

![消息桥接示意图](https://33059891-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LPz4APWKTuf0FRQG1lh%2Fuploads%2FaGCZNWJ6tYURscvOZa43%2Fcoolpy7%E6%B6%88%E6%81%AF%E6%A1%A5%E6%8E%A5.png?alt=media\&token=34a681bb-dda3-4c51-8bf2-415891aa9c57)

消息桥接是为CP7集群各节点间的消息同步提供可配置性的相关功能。

通过启动参数进行配置相关桥接主题指定主题消息过滤桥接。默认参数值以 # 号表示全量消息桥接。需指定特定主题是以半角豆号隔开多个主题，如：aaa/#,bbb/#&#x20;

### 防火墙设置

Coolpy7使用UDP协议进行集群节点状态信号和消息同步通信，所以需要开启相关UDP端口防火墙

### 关于docker部署方式

最新版本docker镜像已更新到latest标签版本下，docker hub地址：<https://hub.docker.com/r/coolpy7/coolpy7_core> ，docker相关部署方式请参阅本手册相关章节。[Docker部署(Windows运行CP7)/kai-shi-shi-yong/docker-bu-shu-windows-yun-hang-cp7](https://app.gitbook.com/@coolpy7/s/coolpy7book/~/drafts/-M01tIdWUQD8ib-M3rRb/kai-shi-shi-yong/docker-bu-shu-windows-yun-hang-cp7)
