# 生产环境部署
本文档描述了一种适用于生产环境的部署选项
适用于生产环境的部署可使用 https://github.com/muyantech/installer (opens new window) 一体化安装包进行,该安装包支持如下特性:
- 该一体化安装包中,包含了运行系统所需要的所有相关依赖组件。
- 该一体化安装包基于 Docker Swarm, 及 GlusterFS 分布式文件系统,可支持多节点及高可用。
提示
如果您从 https://lcdp.ai 购买了系统,可以向我们的技术支持团队获取帮助。
# 目标读者
本文档的目标读者为:本系统的实施人员
# 前置条件
- 本安装包当前在英文版本的 Ubuntu 20.04 LTS 及 22.04 LTS 操作系统上经过测试
- 系统中需要创建一个可无密码使用
sudo
执行命令,名为ubuntu
的操作系统用户
# 组件说明
本安装程序会将所有组件安装到 swarm 集群中,名为 my
的 stack 下。
如下列出了所使用的主要相关软件及其版本
软件 | 当前使用版本 | 描述 |
---|---|---|
Docker | 24.0.6 | Docker 引擎 |
glusterfs | 10.1 | GlusterFS 分布式存储软件 |
ntp | 时间服务器 |
如下列出了当前的一体化安装包中包含的服务
组件 | 镜像及版本 | 描述 | Swarm 中的服务名称 |
---|---|---|---|
proxy | nginx:1.25.2 | Web 服务器,运行在 client 和 server 服务前端,用作服务路由 | my_proxy |
client | nginx:1.25.2 | 前端服务 | my_client |
redis | redis:7.0.10 | Redis 服务器,用于后端服务的缓存及队列服务 | my_redis |
database | timescale/timescaledb-ha:pg14-all | 数据库服务器,用于后端服务的数据存储自带时序数据库功能 | my_database |
pgadmin | dpage/pgadmin4:7.7 | 数据库维护工具,用于通过 web 界面连接到数据库并执行 SQL 等 | my_pgadmin |
server | adoptopenjdk:11-jdk-hotspot | 后端服务 | my_server |
# 系统安装
安装步骤如下
- 使用 root 用户登陆,创建 ubuntu 用户并设置其 sudo 权限
# 创建 ubuntu 用户
useradd -m -s /bin/bash ubuntu
# 编辑 sudo 配置文件
visudo
# 在文件最后添加如下行以设置 ubuntu 用户的 sudo 权限
ubuntu ALL=(ALL) NOPASSWD:ALL
# 保存并退出
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
- 从 https://github.com/muyantech/installer (opens new window) 克隆该仓库,其中安装包 等大文件,是使用 git lfs 保存的,需要使用 git lfs 下载
# 安装 git lfs
apt update
apt install git-lfs
# 克隆该仓库
git clone [email protected]:muyantech/installer.git
# 下载所有使用 git lfs 管理的文件
cd installer
git lfs pull
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
- 编辑 .env 文件,修改相关安装参数,相关安装参数详述如下
# Whether to enable GlusterFS (NFS, only needed for multi-node mode)
# 是否启用分布式的 NFS 文件系统,如果系统需要运行在多节点下,请将该选项设置为 true
GLUSTER_ENABLED=false
# Whether to enable HTTPS, if enabled, you need to provide SSL certifacte to /assets/configs/proxy/ssl folder
# 是否启用 HTTPS 访问系统,如果启用,需要将 SSL 证书放在 /assets/configs/proxy/ssl 目录下,然后再开始安装
HTTPS_ENABLED=false
# Extra hosts, will be injected to backend service, the docker swarm service is called my_server
# Format: "hostname:ip"
# Please keep this placeholder even if you don't need it
# 在后端服务的 docker container 中,需要附加的 hosts DNS 映射,该服务在 swarm 集群中的名称为 my_server
# 格式为: "访问主机名:ip 地址"
# 如果不需要,请保留下面的占位行无需修改
EXTRA_HOSTS="samt:192.168.0.1"
# Domain name to access the system
# 访问系统的域名
NGINX_HOST=samt.myddm.com
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
- 在安装包目录下,运行如下命令进行系统安装
# 运行安装器
bash +x cluster-setup.sh
1
2
3
4
2
3
4
如下是安装器的默认界面,请仔细阅读相关提示,并记录安装日志输出文件路径,可以使用
tail -f <安装日志输出路径>
来跟踪详情的安装过程日志。
确认相关配置无误后,输入 y
开始安装过程
系统会显示如下界面并停止当前正在运行中的服务
根据提示,
如果安装系统到单台服务器,则直接输入回车即可。
如果安装系统到多台服务器的集群,则请输入集群中其他服务器的 ip 地址,每输入一 个按回车,输入完成后,按两次回车即可。
输入完成后,系统即开始安装过程,安装完成后,会自动启动所有服务。
# 服务刷新
运行如下的命令,可以刷新某一个或者全部服务
# 刷新某一个服务
bash +x scripts/refresh-service.sh <service-name>
# 刷新全部服务、刷新 Swarm 集群配置,
# 修改了 docker-compose.yml 文件后,可执行下述命令,刷新集群配置
bash +x scripts/refresh-service.sh
1
2
3
4
5
6
2
3
4
5
6
可用的服务名称如下
- my_proxy
- my_client
- my_redis
- my_database
- my_pgadmin
- my_server
# 更新程序
# 更新前端程序
- 将前端编译后的文件整体拷贝到目录
<installer>/assets/applications/client
下, - 在
<installer>
目录下,执行bash +x scripts/refresh-service.sh my_client
完成上述操作,即可部署前端的新版本并刷新对应服务。
# 更新后端程序
- 将前端编译后的
jar
文件拷贝到目录<installer>/assets/applications/server
下,并命名为app.jar
- 在
<installer>
目录下,执行bash +x scripts/refresh-service.sh my_server
完成上述操作,即可部署后端的新版本并刷新对应服务。
# 附加信息
# 程序文件路径
组件 | 目录 | 说明 |
---|---|---|
client | /opt/muyan/runtime/applications/client | 前端服务的 css, html 及 js 文件路径 |
server | /opt/muyan/runtime/applications/server | 后端服务的 jar 文件路径,jar 文件需要被命名为 app.jar |
# 组件配置文件路径
组件 | 配置文件 | 说明 |
---|---|---|
proxy | /opt/muyan/runtime/configs/proxy/proxy.conf.template | Proxy 服务的 nginx 配置 |
client | /opt/muyan/runtime/configs/client/nginx.conf | Client 服务的 nginx 配置 |
database | /opt/muyan/runtime/configs/postgres/postgresql.conf | 数据库服务的主配置 |
database | /opt/muyan/runtime/configs/postgres/pg_hba.conf | 数据库服务的访问权限配置 |
redis | /opt/muyan/runtime/configs/redis/redis.conf | Redis 服务的配置 |
pgadmin | /opt/muyan/runtime/pgadmin/config/servers.json | pgadmin 服务的配置 |
pgadmin | /opt/muyan/runtime/pgadmin/pgpass | pgadmin 服务的 server 配置 |
# 组件数据文件路径
组件 | 目录 | 说明 |
---|---|---|
server | /opt/muyan/runtime/data/attachments | 当附件采用 LOCAL_FILE 存储引擎时,用户在系统中上传的附件文件的存储路径 |
server | /opt/muyan/runtime/data/seed | 种子数据目录,系统启动时会读入该目录的种子数据 |
database | /opt/muyan/runtime/data/postgres | 数据库服务的数据目录 |
redis | /opt/muyan/runtime/data/redis | Redis 服务的数据持久化目录 |
pgadmin | /opt/muyan/runtime/pgadmin/data | pgadmin 服务的数据持久化目录 |
提示
如果在目录 /opt/muyan/runtime/data/seed
中有种子数据,种子数据应该是全量的,该
目录下的种子数据的优先级高于运行的 jar 文件中打包的种子数据的优先级。
# 组件日志目录列表
组件 | 目录 | 描述 |
---|---|---|
proxy | /opt/muyan/runtime/logs/proxy | proxy 服务的 access 和 error logs |
client | /opt/muyan/runtime/logs/client | client 服务的 access 和 error logs |
server | /opt/muyan/runtime/logs/server | server 服务日志 |
database | /opt/muyan/runtime/logs/postgres | database 服务的日志 |
redis | /opt/muyan/runtime/logs/redis | redis 服务的日志 |
pgadmin | /opt/muyan/runtime/pgadmin/log | pgadmin 服务的日志 |
# 命令参考
# Docker swarm 相关命令
- 查看某 service 的 log
# 查看名为 my_client 的服务的日志
docker service logs my_client
1
2
2
- 强制重启某服务
# 强制重启名为 my_client 的服务
docker service update my_client --force
1
2
2
- 查看服务的当前运行 instance 列表和状态
# 查看名为 my_server 的服务的 instance 列表和状态
docker service ps my_server
1
2
2
- 列出 swarm cluster 中所有的节点及其状态
# 列出所有节点
docker node ls
# 查看当前节点的状态
docker node inspect self --pretty
# 查看某一个节点的具体状态
docker node inspect <NODE-ID> --pretty
1
2
3
4
5
6
2
3
4
5
6
- Inspect 查看某个服务
# 查看某个服务的详细状态
docker service inspect --pretty <service_name>
1
2
2
# GlusterFS 相关命令
- 将远程卷挂载到本地目录
# 请注意,glusterfs卷必须被挂载才可以在本地访问
# 且客户端应该写入这个挂载的目录,
# 而不是gluster brick folder
mount -t glusterfs 172.104.32.234:/my-runtime /opt/muyan/runtime
1
2
3
4
2
3
4
- 每十分钟启用自我修复以修复需要修复的文件(待修复)
gluster volume heal my-runtime enable
1
- 查看处于 split brain status 的文件
gluster volume heal my-runtime info split-brain
1
- 根据/etc/fstab挂载磁盘
mount -av
1
- 删除现有卷
gluster volume stop my-runtime
1
- 删除一个 brick, 将副本设置为2 --> 如果副本减少,需要使用force
gluster volume remove-brick my-runtime replica 2 139.177.191.133:/opt/muyan/gluster force
gluster volume remove-brick my-runtime replica 2 172.104.179.24:/opt/muyan/gluster force
1
2
2
- 从 peer pool 中删除一个节点
gluster peer detach 172.104.179.24
1
- 删除卷
gluster volume delete my-runtime
1
# Redis 相关命令
- 监控 Redis 中的条目被删除
# Execute inside redis-cli
# Config event log for redis key changes
# https://stackoverflow.com/questions/40436417/redis-keys-are-getting-deleted-automatically
CONFIG SET notify-keyspace-events AKE
1
2
3
4
2
3
4