# 分布式集群

### Coolpy7分布集群设计

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

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

Coolpy7集群架构图

![](/files/-MhM3dteVnXRES-qXOnv)

消息分发流

![](/files/-M01Kyn6mjSjwYoXbILA)

### 手动配置管理集群

假设部署三台服务器 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. 添加该节点到在线列表

### 消息桥接

![消息桥接示意图](/files/I3EhxFZkXJHkWr9TXcvS)

消息桥接是为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)


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://coolpy7.gitbook.io/coolpy7book/kai-shi-shi-yong/fen-bu-ji-qun.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
