本文档风哥主要介绍Podman分表分库,包括分表分库的概念、类型、架构以及分表分库的部署、集成和管理等内容。风哥教程参考Podman官方文档Sharding部分,适合容器管理员和开发人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。
Part01-基础概念与理论知识
1.1 分表分库概念
分表分库是指将一个大的数据库表或数据库分成多个小的表或数据库,以提高系统性能和可扩展性。Podman分表分库是指使用Podman容器技术部署和管理分表分库系统,包括水平分表分库和垂直分表分库等方式。更多视频教程www.fgedu.net.cn
- 提高查询性能:减少单表数据量,提高查询速度
- 提高写入性能:分散写入压力,提高写入速度
- 提高可扩展性:支持数据量的增长
- 提高可用性:减少单点故障的影响
1.2 分表分库类型
Podman分表分库的类型主要包括:
- 水平分表:将一个大表分成多个小表,每个表的结构相同,数据不同
- 水平分库:将一个大数据库分成多个小数据库,每个数据库的结构相同,数据不同
- 垂直分表:将一个大表的列分成多个小表,每个表的行相同,列不同
- 垂直分库:将一个大数据库的表分成多个小数据库,每个数据库的表不同
1.3 分表分库架构
Podman分表分库的架构主要包括:
- 应用层:应用程序,负责处理业务逻辑
- 中间件层:分表分库中间件,如ShardingSphere、ProxySQL等
- 数据库层:多个数据库实例,存储分片数据
- 存储层:数据持久化存储
Part02-生产环境规划与建议
2.1 分表分库策略
生产环境中Podman分表分库的策略:
## 分片策略
– 范围分片:按数据范围分片,如按时间、ID范围
– 哈希分片:按数据哈希值分片,如按用户ID哈希
– 列表分片:按数据列表分片,如按地区、类型
– 复合分片:结合多种分片策略
## 路由策略
– 直接路由:根据分片键直接路由到对应的分片
– 广播路由:将请求广播到所有分片
– 结果合并:合并多个分片的查询结果
## 扩容策略
– 水平扩容:添加更多分片
– 垂直扩容:增加分片的资源
– 数据重分布:重新分配分片数据
## 一致性策略
– 最终一致性:允许短暂的数据不一致
– 强一致性:确保数据实时一致
– 事务处理:支持分布式事务
2.2 分表分库需求
生产环境中Podman分表分库的需求:
## 功能需求
– 数据分片:支持水平和垂直分片
– 路由管理:自动路由请求到对应的分片
– 结果合并:合并多个分片的查询结果
– 事务支持:支持分布式事务
## 性能需求
– 查询性能:快速响应查询请求
– 写入性能:高效处理写入请求
– 可扩展性:支持数据量的增长
– 可靠性:确保系统稳定运行
## 技术需求
– 容器化:使用Podman容器技术
– 中间件:使用分表分库中间件
– 监控:监控系统状态
– 备份:定期备份数据
## 非功能需求
– 安全性:数据安全和访问控制
– 可维护性:易于管理和维护
– 成本效益:合理的资源利用
– 合规性:满足法规要求
2.3 分表分库设计
生产环境中Podman分表分库的设计:
- 分片键选择:选择合适的分片键,确保数据均匀分布
- 分片数量:根据数据量和性能需求确定分片数量
- 中间件选择:选择合适的分表分库中间件
- 数据库设计:设计合理的数据库结构和索引
- 监控设计:建立完善的监控系统,及时发现和解决问题
Part03-生产环境项目实施方案
3.1 分表分库部署
3.1.1 部署ShardingSphere中间件
# 运行ShardingSphere Proxy容器
$ podman run -d –name fgedu-shardingsphere \
–cpus 4 \
–memory 8g \
-v /Podman/fgdata/shardingsphere/conf:/opt/shardingsphere-proxy/conf:z \
-v /Podman/fgdata/shardingsphere/lib:/opt/shardingsphere-proxy/lib:z \
-p 3307:3307 \
docker.io/apache/shardingsphere-proxy:5.4.0
# 配置ShardingSphere
$ cat > /Podman/fgdata/shardingsphere/conf/server.yaml << EOF
rules:
- !AUTHORITY
users:
- user: root@% password: root
- user: sharding@% password: sharding
provider:
type: ALL_PRIVILEGES_PERMITTED
props:
max-connections-size-per-query: 1
kernel-executor-size: 16 # Infinite by default.
proxy-frontend-flush-threshold: 128 # The default value is 128.
proxy-transaction-type: LOCAL
proxy-opentracing-enabled: false
proxy-hint-enabled: false
sql-show: false
check-table-metadata-enabled: false
lock-wait-timeout-milliseconds: 50000 # The maximum time to wait for a lock
show-process-list-enabled: false
metadata-repository-class-name: io.shardingsphere.metadata.repository.file.FileMetadataRepository
proxy-frontend-executor-size: 0 # Proxy frontend executor size. The default value is 0, which means let Netty decide.
proxy-frontend-max-connections: 0 # Less than or equal to 0 means no limit
sql-federation-enabled: false
proxy-mysql-default-version: 8.0.29
proxy-default-port: 3307
EOF
# 配置分片规则
$ cat > /Podman/fgdata/shardingsphere/conf/config-sharding.yaml << EOF
schemaName: fgedudb
dataSources:
ds_0:
url: jdbc:mysql://192.168.1.10:3306/fgedudb_0?serverTimezone=UTC&useSSL=false
username: root
password: fgedu123
connectionTimeoutMilliseconds: 30000
idleTimeoutMilliseconds: 60000
maxLifetimeMilliseconds: 1800000
maxPoolSize: 50
ds_1:
url: jdbc:mysql://192.168.1.11:3306/fgedudb_1?serverTimezone=UTC&useSSL=false
username: root
password: fgedu123
connectionTimeoutMilliseconds: 30000
idleTimeoutMilliseconds: 60000
maxLifetimeMilliseconds: 1800000
maxPoolSize: 50
rules:
- !SHARDING
tables:
fgedu_order:
actualDataNodes: ds_${0..1}.fgedu_order_${0..1}
tableStrategy:
standard:
shardingColumn: order_id
shardingAlgorithmName: t_order_inline
databaseStrategy:
standard:
shardingColumn: user_id
shardingAlgorithmName: database_inline
shardingAlgorithms:
database_inline:
type: INLINE
props:
algorithm-expression: ds_${user_id % 2}
t_order_inline:
type: INLINE
props:
algorithm-expression: fgedu_order_${order_id % 2}
EOF
# 重启ShardingSphere
$ podman restart fgedu-shardingsphere
# 查看容器状态
$ podman ps
# 输出日志
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7890123456ab docker.io/apache/shardingsphere-proxy /opt/shardingsph… 2 minutes ago Up 2 minutes ago 0.0.0.0:3307->3307/tcp fgedu-shardingsphere
3.2 分表分库集成
3.2.1 部署MySQL分片数据库
# 在节点1上运行MySQL容器
$ podman run -d –name fgedu-mysql-0 \
–cpus 4 \
–memory 8g \
-v /Podman/fgdata/mysql/0/data:/var/lib/mysql:z \
-v /Podman/fgdata/mysql/0/conf:/etc/mysql/conf.d:z \
-e MYSQL_ROOT_PASSWORD=fgedu123 \
-p 3306:3306 \
docker.io/library/mysql:8.0
# 在节点2上运行MySQL容器
$ podman run -d –name fgedu-mysql-1 \
–cpus 4 \
–memory 8g \
-v /Podman/fgdata/mysql/1/data:/var/lib/mysql:z \
-v /Podman/fgdata/mysql/1/conf:/etc/mysql/conf.d:z \
-e MYSQL_ROOT_PASSWORD=fgedu123 \
-p 3306:3306 \
docker.io/library/mysql:8.0
# 创建分片数据库
$ podman exec -it fgedu-mysql-0 mysql -u root -p
# 输出日志
Enter password:
mysql> CREATE DATABASE fgedudb_0;
mysql> USE fgedudb_0;
mysql> CREATE TABLE fgedu_order_0 (
-> order_id BIGINT PRIMARY KEY,
-> user_id BIGINT,
-> order_amount DECIMAL(10, 2),
-> order_time DATETIME
-> );
mysql> CREATE TABLE fgedu_order_1 (
-> order_id BIGINT PRIMARY KEY,
-> user_id BIGINT,
-> order_amount DECIMAL(10, 2),
-> order_time DATETIME
-> );
mysql> exit
$ podman exec -it fgedu-mysql-1 mysql -u root -p
# 输出日志
Enter password:
mysql> CREATE DATABASE fgedudb_1;
mysql> USE fgedudb_1;
mysql> CREATE TABLE fgedu_order_0 (
-> order_id BIGINT PRIMARY KEY,
-> user_id BIGINT,
-> order_amount DECIMAL(10, 2),
-> order_time DATETIME
-> );
mysql> CREATE TABLE fgedu_order_1 (
-> order_id BIGINT PRIMARY KEY,
-> user_id BIGINT,
-> order_amount DECIMAL(10, 2),
-> order_time DATETIME
-> );
mysql> exit
3.3 分表分库管理
3.3.1 部署Prometheus监控
# 运行Prometheus容器
$ podman run -d –name fgedu-prometheus \
–cpus 2 \
–memory 4g \
-v /Podman/fgdata/prometheus/conf:/etc/prometheus:z \
-p 9090:9090 \
docker.io/prom/prometheus:v2.43.0
# 配置Prometheus
$ cat > /Podman/fgdata/prometheus/conf/prometheus.yml << EOF
global:
scrape_interval: 15s
evaluation_interval: 15s
rule_files:
# - "first_rules.yml"
# - "second_rules.yml"
scrape_configs:
- job_name: "prometheus"
static_configs:
- targets: ["localhost:9090"]
- job_name: "mysql"
static_configs:
- targets: ["192.168.1.10:9104", "192.168.1.11:9104"]
- job_name: "shardingsphere"
static_configs:
- targets: ["192.168.1.12:9104"]
EOF
# 重启Prometheus
$ podman restart fgedu-prometheus
# 运行Grafana容器
$ podman run -d --name fgedu-grafana \
--cpus 2 \
--memory 4g \
-v /Podman/fgdata/grafana/data:/var/lib/grafana:z \
-p 3000:3000 \
docker.io/grafana/grafana:9.5.0
# 查看容器状态
$ podman ps
# 输出日志
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7890123456ab docker.io/prom/prometheus /bin/prometheus 5 minutes ago Up 5 minutes ago 0.0.0.0:9090->9090/tcp fgedu-prometheus
1234567890ab docker.io/grafana/grafana grafana-server 2 minutes ago Up 2 minutes ago 0.0.0.0:3000->3000/tcp fgedu-grafana
Part04-生产案例与实战讲解
4.1 水平分表分库
4.1.1 水平分表分库实施
# 连接ShardingSphere
$ mysql -h localhost -P 3307 -u root -p
# 输出日志
Enter password:
mysql> USE fgedudb;
mysql> INSERT INTO fgedu_order (order_id, user_id, order_amount, order_time) VALUES
-> (1, 1, 100.00, NOW()),
-> (2, 2, 200.00, NOW()),
-> (3, 1, 300.00, NOW()),
-> (4, 2, 400.00, NOW());
# 输出日志
Query OK, 4 rows affected (0.01 sec)
Records: 4 Duplicates: 0 Warnings: 0
# 查询数据
mysql> SELECT * FROM fgedu_order;
# 输出日志
+———-+———+————–+———————+
| order_id | user_id | order_amount | order_time |
+———-+———+————–+———————+
| 1 | 1 | 100.00 | 2026-04-10 10:00:00 |
| 2 | 2 | 200.00 | 2026-04-10 10:00:00 |
| 3 | 1 | 300.00 | 2026-04-10 10:00:00 |
| 4 | 2 | 400.00 | 2026-04-10 10:00:00 |
+———-+———+————–+———————+
4 rows in set (0.01 sec)
# 验证分片数据
$ podman exec -it fgedu-mysql-0 mysql -u root -p fgedudb_0
# 输出日志
Enter password:
mysql> SELECT * FROM fgedu_order_0;
# 输出日志
+———-+———+————–+———————+
| order_id | user_id | order_amount | order_time |
+———-+———+————–+———————+
| 1 | 1 | 100.00 | 2026-04-10 10:00:00 |
| 3 | 1 | 300.00 | 2026-04-10 10:00:00 |
+———-+———+————–+———————+
2 rows in set (0.00 sec)
mysql> SELECT * FROM fgedu_order_1;
# 输出日志
Empty set (0.00 sec)
$ podman exec -it fgedu-mysql-1 mysql -u root -p fgedudb_1
# 输出日志
Enter password:
mysql> SELECT * FROM fgedu_order_0;
# 输出日志
Empty set (0.00 sec)
mysql> SELECT * FROM fgedu_order_1;
# 输出日志
+———-+———+————–+———————+
| order_id | user_id | order_amount | order_time |
+———-+———+————–+———————+
| 2 | 2 | 200.00 | 2026-04-10 10:00:00 |
| 4 | 2 | 400.00 | 2026-04-10 10:00:00 |
+———-+———+————–+———————+
2 rows in set (0.00 sec)
4.2 垂直分表分库
4.2.1 垂直分表分库实施
# 连接ShardingSphere
$ mysql -h localhost -P 3307 -u root -p
# 输出日志
Enter password:
mysql> USE fgedudb;
mysql> CREATE TABLE fgedu_user (
-> user_id BIGINT PRIMARY KEY,
-> user_name VARCHAR(255),
-> user_email VARCHAR(255)
-> );
mysql> CREATE TABLE fgedu_user_detail (
-> user_id BIGINT PRIMARY KEY,
-> user_address VARCHAR(255),
-> user_phone VARCHAR(20),
-> FOREIGN KEY (user_id) REFERENCES fgedu_user(user_id)
-> );
# 插入数据
mysql> INSERT INTO fgedu_user (user_id, user_name, user_email) VALUES
-> (1, ‘User1’, ‘user1@example.com’),
-> (2, ‘User2’, ‘user2@example.com’);
mysql> INSERT INTO fgedu_user_detail (user_id, user_address, user_phone) VALUES
-> (1, ‘Address1’, ‘13800138001’),
-> (2, ‘Address2’, ‘13800138002’);
# 查询数据
mysql> SELECT u.user_id, u.user_name, u.user_email, d.user_address, d.user_phone
-> FROM fgedu_user u
-> JOIN fgedu_user_detail d ON u.user_id = d.user_id;
# 输出日志
+———+———–+——————+————-+————-+
| user_id | user_name | user_email | user_address | user_phone |
+———+———–+——————+————-+————-+
| 1 | User1 | user1@example.com | Address1 | 13800138001 |
| 2 | User2 | user2@example.com | Address2 | 13800138002 |
+———+———–+——————+————-+————-+
2 rows in set (0.01 sec)
4.3 分表分库实施
4.3.1 使用ProxySQL实现分表分库
# 运行ProxySQL容器
$ podman run -d –name fgedu-proxysql \
–cpus 2 \
–memory 4g \
-v /Podman/fgdata/proxysql/conf:/etc/proxysql:z \
-p 6032:6032 \
-p 6033:6033 \
docker.io/proxysql/proxysql:2.5.4
# 配置ProxySQL
$ podman exec -it fgedu-proxysql mysql -u admin -padmin -h 127.0.0.1 -P 6032
# 输出日志
Welcome to the MySQL monitor. Commands end with ; or \g.
mysql> INSERT INTO mysql_servers (hostgroup_id, hostname, port, weight, max_connections, max_replication_lag, use_ssl, max_latency_ms, comment) VALUES
-> (1, ‘192.168.1.10’, 3306, 1, 100, 0, 0, 0, ‘MySQL Server 1’),
-> (1, ‘192.168.1.11’, 3306, 1, 100, 0, 0, 0, ‘MySQL Server 2’);
mysql> INSERT INTO mysql_users (username, password, active, default_hostgroup, max_connections, default_schema, comment) VALUES
-> (‘fgedu’, ‘fgedu123’, 1, 1, 100, ‘fgedudb’, ‘User for sharding’);
mysql> LOAD MYSQL SERVERS TO RUNTIME;
mysql> SAVE MYSQL SERVERS TO DISK;
mysql> LOAD MYSQL USERS TO RUNTIME;
mysql> SAVE MYSQL USERS TO DISK;
# 退出ProxySQL
mysql> exit
# 测试ProxySQL连接
$ mysql -h localhost -P 6033 -u fgedu -p
# 输出日志
Enter password:
mysql> SHOW DATABASES;
# 输出日志
+——————–+
| Database |
+——————–+
| information_schema |
| fgedudb_0 |
| fgedudb_1 |
+——————–+
3 rows in set (0.01 sec)
Part05-风哥经验总结与分享
5.1 分表分库最佳实践
Podman分表分库的最佳实践:
- 合理选择分片键:选择分布均匀、查询频繁的字段作为分片键
- 适当分片数量:根据数据量和性能需求确定分片数量,避免分片过多或过少
- 使用中间件:使用成熟的分表分库中间件,如ShardingSphere、ProxySQL等
- 数据迁移:制定合理的数据迁移策略,确保数据安全
- 监控管理:建立完善的监控系统,及时发现和解决问题
- 备份恢复:定期备份数据,确保数据安全
- 性能优化:优化查询语句和索引,提高查询性能
- 容量规划:根据业务增长,提前规划分片容量
5.2 分表分库性能优化
Podman分表分库的性能优化:
## 查询优化
– 使用分片键查询:减少跨分片查询
– 优化SQL语句:避免全表扫描
– 使用索引:为频繁查询的字段创建索引
– 批量操作:减少网络交互
## 写入优化
– 批量插入:减少网络交互
– 异步写入:提高写入性能
– 批量提交:减少事务开销
– 避免热点:均匀分布写入压力
## 存储优化
– 使用SSD存储:提高I/O性能
– 配置存储驱动:overlay2
– 合理设置卷大小:避免空间不足
– 定期清理:清理无用数据,释放空间
## 网络优化
– 使用高速网络连接:10Gbps或更高
– 配置网络参数:优化TCP/IP参数
– 本地部署:减少网络延迟
– 网络隔离:使用VLAN或VXLAN
5.3 分表分库维护
Podman分表分库的维护:
## 定期备份
– 分片数据备份:备份每个分片的数据
– 配置备份:备份分表分库中间件配置
– 容器备份:备份容器镜像
## 定期检查
– 分片数据一致性:确保分片数据一致
– 分片性能:检查分片性能指标
– 中间件状态:检查中间件运行状态
– 网络连接:检查网络连接状态
## 扩容管理
– 水平扩容:添加更多分片
– 垂直扩容:增加分片的资源
– 数据重分布:重新分配分片数据
– 负载均衡:调整分片负载
## 故障处理
– 建立故障处理流程:快速响应和解决故障
– 制定应急预案:应对各种故障情况
– 定期演练:测试故障恢复流程
– 持续改进:总结故障处理经验
## 性能调优
– 监控性能指标:识别性能瓶颈
– 优化配置:调整系统和应用配置
– 负载测试:测试系统在高负载下的表现
– 持续优化:根据测试结果调整
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
