Kubernetes教程FG087-Kubernetes表分片与数据库分区实战解析
目录大纲
Part01-基础概念与理论知识
1.1 表分片基础
表分片是将大型表分割成多个小表的过程,包括以下类型:
- 水平分片:按行分割数据,不同行存储在不同的分片
- 垂直分片:按列分割数据,不同列存储在不同的分片
- 复合分片:结合水平和垂直分片
1.2 数据库分区基础
- 范围分区:按范围值分割数据
- 列表分区:按列表值分割数据
- 哈希分区:按哈希值分割数据
- 复合分区:结合多种分区策略
1.3 分片与分区的优势
- 提高查询性能:减少查询范围
- 提高并发处理能力:分散负载
- 提高可扩展性:支持数据量增长
- 提高可用性:单个分片故障不影响整体
- 便于数据管理:按分片进行备份和维护
Part02-生产环境规划与建议
2.1 分片策略选择
根据业务需求选择合适的分片策略。,风哥提示:。。。
- 按时间分片:适合时间序列数据
- 按地域分片:适合地理位置相关数据
- 按用户ID分片:适合用户相关数据
- 按业务类型分片:适合不同业务数据
2.2 分区方案设计
- 范围分区:适合连续值数据,如日期、ID等
- 列表分区:适合离散值数据,如地区、状态等
- 哈希分区:适合均匀分布数据
- 复合分区:结合多种分区策略,提高灵活性
,风哥提示:。
2.3 资源规划
- 存储规划:根据数据量和增长趋势估算存储需求
- 计算资源:根据查询负载估算CPU和内存需求
- 网络带宽:考虑分片间数据传输需求
- 备份策略:制定分片数据的备份计划
Part03-生产环境项目实施方案
3.1 部署分片数据库
3.1.1 部署MySQL分片集群
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql-shard-0
namespace: database
spec:
serviceName: mysql-shard-0
replicas: 3
selector:
matchLabels:
app: mysql
shard: "0"
template:
metadata:
labels:
app: mysql
shard: "0"
spec:
containers:
- name: mysql
image: mysql:8.0
ports:
- containerPort: 3306
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-secret
key: password
- name: MYSQL_DATABASE
value: fgedudb_shard_0
volumeMounts:
- name: mysql-data
mountPath: /var/lib/mysql
volumeClaimTemplates:
- metadata:
name: mysql-data
spec:,学习交流加群风哥微信: itpux-com。
accessModes: ["ReadWriteOnce"]
storageClassName: mysql-storage
resources:
requests:
storage: 100Gi
---
apiVersion: v1
kind: Service
metadata:
name: mysql-shard-0
namespace: database
spec:
selector:
app: mysql
shard: "0"
ports:
- port: 3306
targetPort: 3306
clusterIP: None
3.2 部署分区表
3.2.1 创建分区表
-- 连接到MySQL
kubectl run mysql-client --rm --tty -i --restart='Never' --namespace database --image mysql:8.0 -- mysql -h mysql-shard-0-0.mysql-shard-0.database.svc.cluster.local -u root -p
-- 创建分区表
CREATE TABLE fgedu_sales (
id INT PRIMARY KEY,
product_id INT,
amount DECIMAL(10,2),
sale_date DATE
) PARTITION BY RANGE (YEAR(sale_date)) (
PARTITION p2023 VALUES LESS THAN (2024),
PARTITION p2024 VALUES LESS THAN (2025),
PARTITION p2025 VALUES LESS THAN (2026),
PARTITION pfuture VALUES LESS THAN MAXVALUE
);
执行 →
mysql> CREATE TABLE fgedu_sales (
-> id INT PRIMARY KEY,
-> product_id INT,
-> amount DECIMAL(10,2),
-> sale_date DATE
-> ) PARTITION BY RANGE (YEAR(sale_date)) (
-> PARTITION p2023 VALUES LESS THAN (2024),
-> PARTITION p2024 VALUES LESS THAN (2025),
-> PARTITION p2025 VALUES LESS THAN (2026),
-> PARTITION pfuture VALUES LESS THAN MAXVALUE
-> );
Query OK, 0 rows affected (0.01 sec)
3.3 部署分片中间件
,学习交流加群风哥QQ113257174。
3.3.1 部署ProxySQL
apiVersion: apps/v1
kind: Deployment
metadata:
name: proxysql
namespace: database
spec:
replicas: 2
selector:
matchLabels:
app: proxysql
template:
metadata:
labels:
app: proxysql
spec:
containers:
- name: proxysql
image: proxysql/proxysql:2.5.1
ports:
- containerPort: 6033
- containerPort: 6032
volumeMounts:
- name: proxysql-config
mountPath: /etc/proxysql.cnf
subPath: proxysql.cnf
volumes:
- name: proxysql-config
configMap:
name: proxysql-config
---
apiVersion: v1
kind: Service
metadata:
name: proxysql
namespace: database
spec:
selector:
app: proxysql
ports:
- port: 6033
targetPort: 6033
name: mysql
- port: 6032
targetPort: 6032
name: admin
type: LoadBalancer
Part04-生产案例与实战讲解
4.1 实战案例:使用分片数据库
,更多视频教程www.fgedu.net.cn。
4.1.1 配置分片规则
-- 连接到ProxySQL管理接口 kubectl run proxysql-client --rm --tty -i --restart='Never' --namespace database --image mysql:8.0 -- mysql -h proxysql.database.svc.cluster.local -P 6032 -u admin -padmin -- 添加后端服务器 INSERT INTO mysql_servers (hostgroup_id, hostname, port) VALUES (1, 'mysql-shard-0-0.mysql-shard-0.database.svc.cluster.local', 3306); INSERT INTO mysql_servers (hostgroup_id, hostname, port) VALUES (1, 'mysql-shard-1-0.mysql-shard-1.database.svc.cluster.local', 3306); -- 添加分片规则 INSERT INTO mysql_query_rules (rule_id, active, match_digest, destination_hostgroup, apply) VALUES (1, 1, '^SELECT.*FROM fgedu_users WHERE id =', 1, 1); INSERT INTO mysql_query_rules (rule_id, active, match_digest, destination_hostgroup, apply) VALUES (2, 1, '^INSERT INTO fgedu_users', 1, 1); -- 加载配置 LOAD MYSQL SERVERS TO RUNTIME; SAVE MYSQL SERVERS TO DISK; LOAD MYSQL QUERY RULES TO RUNTIME; SAVE MYSQL QUERY RULES TO DISK;
执行 →
mysql> INSERT INTO mysql_servers (hostgroup_id, hostname, port) VALUES (1, 'mysql-shard-0-0.mysql-shard-0.database.svc.cluster.local', 3306); Query OK, 1 row affected (0.00 sec) mysql> INSERT INTO mysql_servers (hostgroup_id, hostname, port) VALUES (1, 'mysql-shard-1-0.mysql-shard-1.database.svc.cluster.local', 3306); Query OK, 1 row affected (0.00 sec) mysql> INSERT INTO mysql_query_rules (rule_id, active, match_digest, destination_hostgroup, apply) VALUES (1, 1, '^SELECT.*FROM fgedu_users WHERE id =', 1, 1); Query OK, 1 row affected (0.00 sec) mysql> INSERT INTO mysql_query_rules (rule_id, active, match_digest, destination_hostgroup, apply) VALUES (2, 1, '^INSERT INTO fgedu_users', 1, 1); Query OK, 1 row affected (0.00 sec) mysql> LOAD MYSQL SERVERS TO RUNTIME; Query OK, 0 rows affected (0.00 sec) mysql> SAVE MYSQL SERVERS TO DISK; Query OK, 0 rows affected (0.01 sec) mysql> LOAD MYSQL QUERY RULES TO RUNTIME; Query OK, 0 rows affected (0.00 sec) mysql> SAVE MYSQL QUERY RULES TO DISK; Query OK, 0 rows affected (0.01 sec)
4.2 实战案例:使用分区表
4.2.1 插入数据
-- 插入数据 INSERT INTO fgedu_sales (id, product_id, amount, sale_date) VALUES (1, 1001, 100.00, '2023-01-01'), (2, 1002, 200.00, '2023-06-01'), (3, 1003, 300.00, '2024-01-01'), (4, 1004, 400.00, '2024-06-01'), (5, 1005, 500.00, '2025-01-01');
执行 →
mysql> INSERT INTO fgedu_sales (id, product_id, amount, sale_date) VALUES
-> (1, 1001, 100.00, '2023-01-01'),
-> (2, 1002, 200.00, '2023-06-01'),
-> (3, 1003, 300.00, '2024-01-01'),
-> (4, 1004, 400.00, '2024-06-01'),
-> (5, 1005, 500.00, '2025-01-01');
Query OK, 5 rows affected (0.00 sec)
Records: 5 Duplicates: 0 Warnings: 0,更多学习教程公众号风哥教程itpux_com。
4.2.2 查询数据
-- 查询2023年的数据 SELECT * FROM fgedu_sales WHERE sale_date BETWEEN '2023-01-01' AND '2023-12-31'; -- 查询2024年的数据 SELECT * FROM fgedu_sales WHERE sale_date BETWEEN '2024-01-01' AND '2024-12-31'; -- 查询2025年的数据 SELECT * FROM fgedu_sales WHERE sale_date BETWEEN '2025-01-01' AND '2025-12-31';
执行 →
mysql> SELECT * FROM fgedu_sales WHERE sale_date BETWEEN '2023-01-01' AND '2023-12-31'; +----+------------+--------+------------+ | id | product_id | amount | sale_date | +----+------------+--------+------------+ | 1 | 1001 | 100.00 | 2023-01-01 | | 2 | 1002 | 200.00 | 2023-06-01 | +----+------------+--------+------------+ 2 rows in set (0.00 sec) mysql> SELECT * FROM fgedu_sales WHERE sale_date BETWEEN '2024-01-01' AND '2024-12-31'; +----+------------+--------+------------+ | id | product_id | amount | sale_date | +----+------------+--------+------------+ | 3 | 1003 | 300.00 | 2024-01-01 | | 4 | 1004 | 400.00 | 2024-06-01 | +----+------------+--------+------------+ 2 rows in set (0.00 sec) mysql> SELECT * FROM fgedu_sales WHERE sale_date BETWEEN '2025-01-01' AND '2025-12-31'; +----+------------+--------+------------+ | id | product_id | amount | sale_date | +----+------------+--------+------------+ | 5 | 1005 | 500.00 | 2025-01-01 | +----+------------+--------+------------+ 1 row in set (0.00 sec)
4.3 实战案例:管理分区
4.3.1 添加分区
-- 添加2026年分区
ALTER TABLE fgedu_sales REORGANIZE PARTITION pfuture INTO (
PARTITION p2026 VALUES LESS THAN (2027),
PARTITION pfuture VALUES LESS THAN MAXVALUE
);
执行 →
mysql> ALTER TABLE fgedu_sales REORGANIZE PARTITION pfuture INTO (
-> PARTITION p2026 VALUES LESS THAN (2027),
-> PARTITION pfuture VALUES LESS THAN MAXVALUE
-> );
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0。
,from K8S+DB视频:www.itpux.com。
4.3.2 删除分区
-- 删除2023年分区 ALTER TABLE fgedu_sales DROP PARTITION p2023;
执行 →
mysql> ALTER TABLE fgedu_sales DROP PARTITION p2023; Query OK, 0 rows affected (0.00 sec) Records: 0 Duplicates: 0 Warnings: 0
Part05-风哥经验总结与分享
5.1 表分片与数据库分区最佳实践
- 选择合适的分片策略:根据业务需求选择合适的分片键
- 合理设计分区方案:根据数据特点选择分区类型
- 使用分片中间件:简化分片管理和查询路由
- 监控分片状态:及时发现和处理分片故障
- 定期维护分区:添加新分区,删除旧分区
- 备份分片数据:确保数据安全
- 测试分片性能:验证分片效果
- 考虑数据迁移:规划分片间数据迁移策略
5.2 常见问题与解决方案
- 分片键选择不当:导致数据分布不均匀
- 分区管理复杂:使用自动化工具管理分区
- 查询性能问题:优化查询语句,使用索引
- 数据一致性问题:使用事务和数据校验
- 分片故障:实施高可用方案
- 数据迁移困难:使用专业工具进行数据迁移
5.3 风哥提示
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
