集群部署-源码
open-im-server 源码集群部署指南
本指南将指导您在两台机器(A 和 B,内网 IP 分别为 IP_A
和 IP_B
)上集群部署 open-im-server
和 nginx
,并在机器 A 上部署监控组件(Prometheus、Grafana、Alertmanager)。
此文档中假设您已部署 Redis 集群、MongoDB 分片集群、Kafka 集群及 Etcd 集群,具体地址如下:
- Redis 集群地址:
redisAddr1
,redisAddr2
,redisAddr3
- MongoDB 集群地址:
mongoAddr1
,mongoAddr2
,mongoAddr3
- Kafka 集群地址:
kafkaAddr1
,kafkaAddr2
,kafkaAddr3
- Etcd 集群地址:
etcdAddr1
,etcdAddr2
,etcdAddr3
本文假设以上组件都部署在三台机器上,实际上不限于三台,您可根据需求自行选择多台或者一台。
此外,MinIO 的内部服务访问地址配置为 your_minio_internal_address
,外部访问地址配置为 your_minio_external_address
。
A 和 B 两台机器以及组件集群内网互通,且A、B两台机器都有外网IP。
目录结构
前提条件
确保以下组件已正确部署并运行:
- Redis 集群
- MongoDB 分片集群
- Kafka 集群
- Etcd 集群
- MinIO 服务
1. 克隆仓库
在两台机器(A 和 B)上分别执行以下命令以克隆 open-im-server
仓库:
git clone https://github.com/openimsdk/open-im-server
cd open-im-server
2. 配置修改
在机器 A 和 B 上,按照以下步骤修改配置文件,确保各组件正确连接。所有地址字段均采用单行列表格式 address: [addr1, addr2, addr3]
。
2.1 Kafka 配置
编辑 open-im-server/config/kafka.yml
文件,设置 address
字段为 Kafka 集群地址列表:
address: [kafkaAddr1, kafkaAddr2, kafkaAddr3]
2.2 MinIO 配置
编辑 open-im-server/config/minio.yml
文件,设置 internalAddress
和 externalAddress
:
internalAddress: your_minio_internal_address
externalAddress: your_minio_external_address
2.3 MongoDB 配置
编辑 open-im-server/config/mongodb.yml
文件,设置 address
字段为 MongoDB 集群地址列表:
address: [mongoAddr1, mongoAddr2, mongoAddr3]
2.4 Etcd 配置
编辑 open-im-server/config/discovery.yml
文件,设置 etcd.address
字段为 Etcd 集群地址列表:
etcd:
address: [etcdAddr1, etcdAddr2, etcdAddr3]
2.5 Redis 配置
编辑 open-im-server/config/redis.yml
文件,设置 address
字段为 Redis 集群地址列表,并启用集群模式:
address: [redisAddr1, redisAddr2, redisAddr3]
clusterMode: true
3. 配置 nginx
在机器 A 、B上部署 nginx
,参考以下配置。请确保替换为您的实际域名、SSL 证书路径和 SSL 密钥路径。
🚀 提示: 确保替换成您的实际域名、SSL 证书路径和 SSL 密钥。
events {
worker_connections 1024;
}
http {
# open-im-server
upstream msg_gateway {
server IP_A:10001;
server IP_B:10001;
}
upstream im_api {
# IM API 服务器地址,可根据部署情况指定多个
server IP_A:10002;
server IP_B:10002;
}
server {
listen 443 ssl;
server_name your_domain.com; # 替换为您的域名
ssl_certificate /usr/local/nginx/conf/ssl/your_domain_bundle.pem; # 替换为您的证书路径
ssl_certificate_key /usr/local/nginx/conf/ssl/your_domain.key; # 替换为您的证书密钥路径
location ^~/api/ {
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Request-Api $scheme://$host/api;
proxy_pass http://im_api/;
}
location /msg_gateway/ {
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_pass http://msg_gateway/;
}
}
# 可选: HTTP 重定向到 HTTPS
server {
listen 80;
server_name your_domain.com; # 替换为您的域名
return 301 https://$host$request_uri;
}
}
将此配置添加到 nginx
的配置文件中, 并reload使配置生效:
4. 设置 DNS
将您的域名 your_domain.com
指向机器A、B的外网 IP 地址。
5. 启动服务
在两台机器(A 和 B)的 open-im-server
目录下执行以下命令以编译和启动服务:
中国境内建议设置go代理
$ go env -w GO111MODULE=on
$ go env -w GOPROXY=https://goproxy.cn,direct
5.1 编译
mage
5.2 启动服务
mage start
6. 修改客户端 SDK 初始化参数
在客户端 SDK 中,配置初始化参数如下:
apiAddr
:https://your_domain.com/api
wsAddr
:wss://your_domain.com/msg_gateway
常见问题/注意事项
部署
kafka
时,需要修改kafka
广播的端口。如果使用open-im-server
中的docker-compose.yml
部署,修改service.kafka.environment.KAFKA_CFG_ADVERTISED_LISTENERS
中的EXTERNAL
为访问kafka
组件的地址。其他部署方式请自行修改。 例如:KAFKA_CFG_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092,EXTERNAL://192.168.2.36:19094
。多台机器部署需要保证时钟一致,服务才可正常运行。例如
token
的签发允许各个机器的时钟误差在5s
以内。组件端口无法访问:通过回环地址检测组件启动是否正常,若回环地址可访问,则检查是否被防火墙规则过滤。
如果集群机器不在内网中,需要将
autoSetPorts
设置为false
,并修改各个rpc
组件的registerIP
为设置部署etcd
的服务器可访问的ip
地址,并保证各个端口可被访问。如需启用prometheus
,还需要保证各个组件的prometheus.port
端口可被访问。 拥有autoSetPorts
配置的组件如下:openim-api.yml:prometheus.autoSetPorts
openim-msggateway.yml:rpc.autoSetPorts
openim-msgtransfer.yml:prometheus.autoSetPorts
openim-push.yml:rpc.autoSetPorts
openim-rpc-auth.yml:rpc.autoSetPorts
openim-rpc-conversation.yml:rpc.autoSetPorts
openim-rpc-friend.yml:rpc.autoSetPorts
openim-rpc-group.yml:rpc.autoSetPorts
openim-rpc-msg.yml:rpc.autoSetPorts
openim-rpc-third.yml:rpc.autoSetPorts
openim-rpc-user.yml:rpc.autoSetPorts
此外,机器A还需要修改
prometheus.yml
,将其中的所有http_sd_configs
配置项及其子配置项去掉,加上static_configs
配置项,并将其中的targets
改为对应的服务的端口。 例如:openimserver-openim-api
表示api
组件的prometheus
数据抓取,则其target
中的端口地址应和openim-api.yml
中的prometheus.ports
一致。