# 生产环境部署

本文档描述了一种适用于生产环境的部署选项

适用于生产环境的部署可使用 https://github.com/muyantech/installer (opens new window) 一体化安装包进行,该安装包支持如下特性:

  1. 该一体化安装包中,包含了运行系统所需要的所有相关依赖组件。
  2. 该一体化安装包基于 Docker Swarm, 及 GlusterFS 分布式文件系统,可支持多节点及高可用。

提示

如果您从 https://lcdp.ai 购买了系统,可以向我们的技术支持团队获取帮助。

# 目标读者

本文档的目标读者为:本系统的实施人员

# 前置条件

  1. 本安装包当前在英文版本的 Ubuntu 20.04 LTS 及 22.04 LTS 操作系统上经过测试
  2. 系统中需要创建一个可无密码使用 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

# 系统安装

安装步骤如下

  1. 使用 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
  1. 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
  1. 编辑 .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
  1. 在安装包目录下,运行如下命令进行系统安装

# 运行安装器
bash +x cluster-setup.sh

1
2
3
4

如下是安装器的默认界面,请仔细阅读相关提示,并记录安装日志输出文件路径,可以使用 tail -f <安装日志输出路径> 来跟踪详情的安装过程日志。

确认相关配置无误后,输入 y 开始安装过程

系统会显示如下界面并停止当前正在运行中的服务

根据提示,

  1. 如果安装系统到单台服务器,则直接输入回车即可。

  2. 如果安装系统到多台服务器的集群,则请输入集群中其他服务器的 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

可用的服务名称如下

  • my_proxy
  • my_client
  • my_redis
  • my_database
  • my_pgadmin
  • my_server

# 更新程序

# 更新前端程序

  1. 将前端编译后的文件整体拷贝到目录 <installer>/assets/applications/client 下,
  2. <installer> 目录下,执行 bash +x scripts/refresh-service.sh my_client

完成上述操作,即可部署前端的新版本并刷新对应服务。

# 更新后端程序

  1. 将前端编译后的 jar 文件拷贝到目录 <installer>/assets/applications/server 下,并命名为 app.jar
  2. <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
  • 强制重启某服务
# 强制重启名为 my_client 的服务
docker service update my_client --force
1
2
  • 查看服务的当前运行 instance 列表和状态
# 查看名为 my_server 的服务的 instance 列表和状态
docker service ps my_server
1
2
  • 列出 swarm cluster 中所有的节点及其状态
# 列出所有节点
docker node ls
# 查看当前节点的状态
docker node inspect self --pretty
# 查看某一个节点的具体状态
docker node inspect <NODE-ID> --pretty
1
2
3
4
5
6
  • Inspect 查看某个服务
# 查看某个服务的详细状态
docker service inspect --pretty <service_name>
1
2

# GlusterFS 相关命令

  • 将远程卷挂载到本地目录
# 请注意,glusterfs卷必须被挂载才可以在本地访问
# 且客户端应该写入这个挂载的目录,
# 而不是gluster brick folder
mount -t glusterfs 172.104.32.234:/my-runtime /opt/muyan/runtime
1
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
  • 从 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
Last Updated: 2024/9/13 15:41:28