Skip to content

Commit 03b613a

Browse files
authored
Merge pull request #5 from AlioLozy/main
change mongodb to mysql
2 parents 051af4a + 909e382 commit 03b613a

File tree

7 files changed

+216
-198
lines changed

7 files changed

+216
-198
lines changed

docs/infrastructure/01-intro.md

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -11,29 +11,29 @@ FinClip后端服务构建于优秀的开源基础设施之上。这些基础组
1111

1212
FinClip构建于部分优秀的开源组件之上,本章主要涵盖这些开源组件的维护与管理。目前组件主要包含:
1313

14-
| 组件名称 | 运行模式 | 功能 |
15-
| --------------- | -------- | -------------------------------- |
16-
| Redis | 集群模式 | 缓存,用于加速服务读写速度 |
17-
| Zookeeper | 集群模式 | Kafka依赖的集群协调组件 |
18-
| Kafka | 集群模式 | 数据总线集群,用于异步处理数据流 |
19-
| MongoDB | 副本集 | 数据库集群,存储业务数据 |
20-
| Consul | 集群模式 | 用于服务注册、服务发现 |
21-
| Elasticsearch | 集群模式 | 存储用户行为数据、操作日志等 |
22-
| Kong | 容器 | 网关和路由 |
23-
| *Nginx* | *容器* | *负载均衡* |
24-
| *Keepalived* | *容器* | *VIP设置与自动切换* |
25-
| Rancher | 容器 | 容器集群管理 |
26-
| Kubernetes | 集群模式 | 容器编排引擎 |
27-
| *Prometheus* | *容器* | *监控平台 - 数据收集* |
28-
| *Grafana* | *容器* | *监控平台 - 展示面板* |
29-
| *Elasticsearch* | *容器* | *日志平台 - 日志存储* |
30-
| *Graylog* | *容器* | *日志平台 - 日志展示与检索* |
31-
| Kafka | 容器 | 日志平台 - 日志收集缓冲队列 |
32-
| *Envoy* | *容器* | *高性能代理* |
33-
| Docker | 守护进程 | 容器运行时 |
34-
| Docker-compose | CLI | 容器管理 |
35-
36-
> *斜体*标记的为选配服务
14+
| 组件名称 | 运行模式 | 功能 |
15+
| ---------------------- | ------------- | ---------------------------------- |
16+
| Redis | 集群模式 | 缓存,用于加速服务读写速度 |
17+
| Zookeeper | 集群模式 | Kafka依赖的集群协调组件 |
18+
| Kafka | 集群模式 | 数据总线集群,用于异步处理数据流 |
19+
| MongoDB | 副本集 | 数据库集群,存储业务数据 |
20+
| Consul | 集群模式 | 用于服务注册、服务发现 |
21+
| Elasticsearch | 集群模式 | 存储用户行为数据、操作日志等 |
22+
| Kong | 容器 | 网关和路由 |
23+
| <u>*Nginx*</u> | <u>*容器*</u> | <u>*负载均衡*</u> |
24+
| <u>*Keepalived*</u> | <u>*容器*</u> | <u>*VIP设置与自动切换*</u> |
25+
| Rancher | 容器 | 容器集群管理 |
26+
| Kubernetes | 集群模式 | 容器编排引擎 |
27+
| <u>*Prometheus*</u> | <u>*容器*</u> | <u>*监控平台 - 数据收集*</u> |
28+
| <u>*Grafana*</u> | *<u>容器</u>* | <u>*监控平台 - 展示面板*</u> |
29+
| <u>*Elasticsearch*</u> | <u>*容器*</u> | <u>*日志平台 - 日志存储*</u> |
30+
| <u>*Graylog*</u> | <u>*容器*</u> | <u>*日志平台 - 日志展示与检索*</u> |
31+
| Kafka | 容器 | 日志平台 - 日志收集缓冲队列 |
32+
| <u>*Envoy*</u> | <u>*容器*</u> | <u>*高性能代理*</u> |
33+
| Docker | 守护进程 | 容器运行时 |
34+
| Docker-compose | CLI | 容器管理 |
35+
36+
> <u>*标记*</u> 的为选配服务
3737
3838

3939

docs/infrastructure/04-mongo.md

Lines changed: 0 additions & 162 deletions
This file was deleted.

docs/infrastructure/04-mysql.md

Lines changed: 171 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,171 @@
1+
---
2+
title: 数据存储
3+
author: xulishan@finogeeks.com
4+
---
5+
6+
# 数据存储
7+
8+
FinClip 数据存储支持多种数据库,通常我们采用 MySQL 作为主要的数据存储方案。在实际部署中,我们推荐小规模集群的客户使用 MySQL 的半同步 + GTID + 双主模式,满足高性能需求;对于大规模集群部署的客户,我们推荐 一主多从或 Galera 集群,以满足可扩展、高可用的运维需求。
9+
10+
11+
12+
## 部署架构
13+
14+
MongoDB 的拓扑图如下
15+
16+
17+
![mysql](/img/mysql.png)
18+
19+
20+
21+
### 服务配置
22+
23+
**节点(node)**:此中间件默认(最低)交付状态下为**双主**部署。
24+
25+
### 数据目录
26+
27+
| 服务器 | 设计用途 | 路径 |
28+
| ------ | ----------------------- | ----------------------------- |
29+
| 节点 1 | 持久化数据目录 | /mnt/var/lib/container/mysql |
30+
| | docker-compose 文件目录 | /mnt/opt/docker-compose/mysql |
31+
| | | |
32+
| 节点 2 | 持久化数据目录 | /mnt/var/lib/container/mysql |
33+
| | docker-compose 文件目录 | /mnt/opt/docker-compose/mysql |
34+
35+
### 网络
36+
37+
**底层**:此中间件基于 `docker-compose` 启动,`docker-compose` 基于 docker0 虚拟网卡进行通信,因此本中间件在所有服务器上的所有组件,均通过 docker0 网卡划分出的子网进行通信,并且通过 `--network=host` 配置运行。
38+
39+
> 子网网段可以通过 `ifconfig docker0` 进行确认。
40+
41+
**业务层**
42+
43+
| 服务器 | 设计用途 | 端口 |
44+
| ------ | ---------------------------------------------------- | ---- |
45+
| 节点 1 | **[占用宿主机固定端口]** 对外服务 | 3306 |
46+
| | **[占用宿主机固定端口]** Prometheus Metrics 信息提供 | 9216 |
47+
| | | |
48+
| 节点 2 | **[占用宿主机固定端口]** 对外服务 | 3306 |
49+
| | **[占用宿主机固定端口]** Prometheus Metrics 信息提供 | 9216 |
50+
51+
## 状态检查
52+
53+
1. 登录到 MySQL 所在的服务器上,执行 `docker exec -it mysql bash` 进入容器
54+
2. 在容器中的 Shell 执行 `mysql -uroot -p` 命令,输入密码登录,
55+
4. 执行 `show slave status\G` 确认主从状态,``IO_Running``SQL_Running` 需要均为 `YES`。
56+
57+
## 节点增、删
58+
59+
**新增节点**:若需要新增节点,请依照下列步骤操作
60+
61+
1. 确认新节点已经安装好 Docker 19.03 或更高版本、已经安装好 docker-compose 1.27 或更高版本;
62+
2. 确认新节点对于当前 MySQL 所在的**所有服务器**的 3306、9216 均为互相可达状态;
63+
3. 从旧服务器的 “持久化数据目录” 中复制 conf 文件夹的 mysql.cnf 文件到新服务器的同名目录,并修改 `server_id` 递增 1,同时初次启动需要暂时注释 `rpl` 开头的配置项;
64+
4. 从旧服务器的 “docker-compose 文件目录“ 复制 docker-compose.yaml 到新服务器的同名目录
65+
5. 执行 `docker-compose up -d` 启动新 MySQL 实例;
66+
6. 观察日志,启动完成后,反注释掉 conf 文件夹中 mysql.cnf 文件里的 `#rpl` 开头的命令,然后执行 `docker-compose down && docker-compose up -d`
67+
7. 在新的节点上,登录进容器,执行主从创建命令,命令详情见下文;
68+
8. 执行命令 `start slave;``unlock tables;` ,启用主从同步;
69+
9. 稍等一会儿,再次执行 `show slave status\G` 确认集群状态
70+
71+
72+
73+
**删除节点**:若需要移除节点,请依照下列步骤操作
74+
75+
1. 登录到需要移除的节点上,进入 mysql,执行命令主从停止命令,命令详情见下文;
76+
2. 进入 “docker-compose 文件目录“ ,执行 `docker-compose down` 关闭容器
77+
78+
```
79+
主从创建命令
80+
1. 锁表,防止数据不同步
81+
flush tables with read lock;
82+
2. 创建主从
83+
change master to master_host='[主库地址]', master_port=3306, master_user='[主库的主从同步账户名]', master_password='[主库的主从同步密码]', master_auto_position=1;
84+
85+
主从停止命令,也可用于主从配置错误时,清空主从配置
86+
1. 停止主从
87+
stop slave;
88+
2. 清空主从配置
89+
reset slave;
90+
```
91+
92+
93+
94+
## 数据导出、恢复
95+
96+
* 方法一:直接存档数据目录
97+
98+
MySQL 在启动时支持自动载入旧数据,当部署服务器的 IP 不存在变动的情况时,可以选择直接针对数据目录进行压缩存档的方式保存数据库;若存在 IP 变动、节点新增或减少,也仍然可按照此方法分别放置主库与从库的数据存档到相应目录,但需要重新针对数据库的集群信息进行修改。
99+
100+
* 方法二: mysqldump
101+
102+
部署所使用到的 MySQL 镜像中默认包含 mysqldump 命令,可以使用以下命令对 finclip 业务库进行 dump 备份:
103+
104+
```
105+
mongodump -u[用户名] -p[密码] --host=[主库IP] --database finclip > /[文件]/[输出]/[路径].sql
106+
```
107+
108+
参数说明:
109+
110+
`-u`: 用户名,用户名与 -u 之间不带空格
111+
112+
`-p`: 密码,密码与 -p 之间不带空格
113+
114+
`--host`: 数据库访问地址
115+
116+
`--database`: 数据库,默认为 finclip
117+
118+
119+
120+
可以使用以下命令对 finclip 库进行数据恢复:
121+
122+
```
123+
mysql -u[用户名] -p[密码] --host=[主库IP] finclip < /[文件]/[输出]/[路径].sql
124+
```
125+
126+
127+
128+
## 常见灾难场景
129+
130+
MySQL 默认状态下为双主-互为主从式部署,若其中主节点故障下线,另一个主库会挂起写入 30 秒,超时后会继续接受写入,但是与另一主库的同步会从半同步降级到非实时同步,实现一定程度上的故障转移;当下线的主节点恢复上线时,会自动恢复主从并从正在运行的主库里读取缺失的数据。只要保证提供一定数量的从节点,则集群就能拥有一定能力的故障转移能力。
131+
132+
若发生数据库所有节点全部瘫痪的情况,请按照以下步骤进行数据库重新部署流程:
133+
134+
1. 打包并存档数据库目录、数据库配置;
135+
136+
2. 此时业务服务已经无法对数据库进行任何写入了,可以暂停生产上的所有服务;
137+
138+
3. 严格按照路径、文件权限设置,将数据目录与必要文件上传并恢复到新的服务器上;
139+
140+
4. 注释掉 mysql.cnf 配置文件中关于 `rpl` 的配置后,在新服务器上重新执行 docker-compose 拉起数据库;
141+
142+
5. 观察日志,启动完成后,反注释掉 conf 文件夹中 mysql.cnf 文件里的 `#rpl` 开头的命令,然后执行 `docker-compose down && docker-compose up -d`;
143+
144+
6. 数据库启动后,在新的 MySQL 节点上,按照以下步骤进行 IP 变更:
145+
146+
```
147+
1. 登入 mysql
148+
mysql -u <用户名> -p<密码>
149+
150+
2. 停止主从
151+
stop slave;
152+
153+
3. 清空主从配置
154+
reset slave;
155+
156+
4. 锁表,防止数据不同步
157+
flush tables with read lock;
158+
159+
5. 创建主从
160+
change master to master_host='[主库地址]', master_port=3306, master_user='[主库的主从同步账户名]', master_password='[主库的主从同步密码]', master_auto_position=1;
161+
162+
6. 启用主从
163+
start slave;
164+
165+
7. 解锁表
166+
unlock tables;
167+
```
168+
169+
7. 核查启动日志,确保正常启动;
170+
171+
8. 修改 Kubernetes Service 中的 exteral-mysql-server 解析的 IP 地址,指向到新的服务器上。

0 commit comments

Comments
 (0)