高性能数据库架构探索:OceanBase 分布式技术深入解析
简介

OceanBase 高性能分布式数据库,解决传统数据库在大规模、高并发场景下的性能瓶颈,通过分布式架构、数据自动分片和强一致性协议,提供高可用性、弹性扩展和出色的性能,支持 MySQL 和 Oracle 兼容模式,方便开发者迁移现有应用
OceanBase社区版Docker安装流程
前期准备
1、Docker安装
bashyum install -y docker-ce
2、Docker启动并设置开机自启动
bashsystemctl start docker systemctl enable docker
3、关闭防火墙和SELinux
bashsystemctl disable firewalld systemctl stop firewalld systemctl status firewalld setenforce 0
OceanBase安装
1、拉取 OceanBase 数据库最新镜像
bashdocker pull oceanbase/oceanbase-ce
2、查看是否拉取成功
bashdocker images
3、启动OceanBase数据库实例
- 根据当前容器部署最大规格实例
bashdocker run -p 2881:2881 --name obstandalone -e MODE=NORMAL -e OB_TENANT_PASSWORD=1234 -d oceanbase/oceanbase-ce
-p 2881:2881
:将宿主机的 2881 端口映射到容器内的 2881 端口--name obstandalone
:指定容器名称为obstandalone
,方便管理和识别这个容器实例-e MODE=NORMAL
:设置环境变量MODE
为NORMAL
,指定OceanBase运行模式-e OB_TENANT_PASSWORD=1234
:设置环境变量OB_TENANT_PASSWORD
,默认租户root
用户密码设置为1234
4、查看是否启动成功
bashdocker ps docker logs obstandalone | tail -1
5、连接 OceanBase数据库实例,进入Docker容器
bashdocker exec -it obstandalone bash
6、连接集群
bashobclient -h172.17.0.2 -P2881 -uroot -Doceanbase -A
- 查看当前数据库
mysqlSELECT DATABASE();
- 列出所有数据库
mysqlSHOW DATABASES;
- 插入数据
mysqlINSERT INTO table_name (id, name) VALUES (1, '名字');
- 删除数据
bashDELETE FROM table_name WHERE id = 1;
- 更新数据
bashUPDATE table_name SET name = '新名字' WHERE id = 1;
- 查询数据
mysqlSELECT * FROM table_name;
租户隔离
租户隔离允许多个租户共享同一个数据库实例,确保每个租户数据、权限、资源等完全独立,拥有自己独立数据库环境,逻辑上互不干扰,提供强隔离性和安全性
1、创建一个新租户 tenant1
mysqlCREATE TENANT tenant1;
2、租户下创建数据库,tenant1 租户下创建一个数据库db1
mysqlCREATE DATABASE db1;
3、租户内创建表,db1创建表 orders
mysqlUSE db1; CREATE TABLE orders ( order_id INT PRIMARY KEY, user_id INT, amount DECIMAL(10, 2), order_date DATE );
4、查询当前租户信息
mysqlSHOW TENANTS;
应用场景:SaaS 平台多租户架构
开发 SaaS 平台时,平台为不同的客户提供基于云的服务,每个客户数据、业务逻辑和配置完全不同,因此需要对每个客户数据进行隔离
1、每个客户创建一个独立的租户, 每个客户业务将被分配到一个独立的租户,可以保证客户之间的数据不会互相影响
mysqlCREATE TENANT tenant_customer1; CREATE TENANT tenant_customer2;
2、租户内创建数据库和表,每个租户内数据库、表结构等是完全独立的,不同客户的数据无法交叉(每个租户的数据和资源完全独立,客户1无法访问客户2的数据,且租户1的负载不会影响租户2的性能)
mysql-- 在租户1下创建数据库与表 CREATE DATABASE customer1_db; USE customer1_db; CREATE TABLE orders (order_id INT PRIMARY KEY, customer_id INT, amount DECIMAL(10, 2)); -- 在租户2下创建数据库与表 CREATE DATABASE customer2_db; USE customer2_db; CREATE TABLE orders (order_id INT PRIMARY KEY, customer_id INT, amount DECIMAL(10, 2));
3、另外还可以按需扩展每个租户资源, 根据不同租户的需求,可以动态调整租户的资源(存储空间、计算资源等)提高系统的灵活性
mysqlobd resource set tenant_customer1 --cpu 4 --memory 8GB;
租户快照
租户快照用于数据备份与恢复,可以对某个租户数据库进行快照,确保在任何时候可以安全地恢复到某个历史时间点,可以用来应对系统故障、操作错误等问题,快速恢复数据
1、创建租户快照(创建快照后,OceanBase 会记录该时间点数据状态)
bashobd snapshot create tenant_customer1 --snapshot_name snapshot_2024_11_12 --desc "init"
tenant_customer1
:租户名称snapshot_2024_11_12
:指定快照名称--desc
:提供快照描述2、查看租户快照,列出
tenant_customer1
租户所有快照
bashobd snapshot list tenant_customer1
3、 恢复租户快照
bashobd snapshot restore tenant_customer1 --snapshot_name snapshot_2024_11_12
tenant_customer1
:需要恢复的租户名称snapshot_2024_11_12
:需要恢复的快照名称4、删除租户快照
bashobd snapshot delete tenant_customer1 --snapshot_name snapshot_2024_11_12
生产环境中,租户快照可以用来在发生数据库故障、操作错误、误删除数据等情况时进行恢复。例如,开发团队在进行系统升级时,误操作导致数据丢失,可以通过恢复之前创建的快照来快速恢复数据,避免影响到业务
物化视图
物化视图工作原理类似于缓存机制,会定期或在指定条件下更新视图的内容,开发者在创建物化视图时,可以指定视图的数据更新方式,比如定时更新或增量更新等
特性 | 普通视图 | 物化视图 |
---|---|---|
数据存储方式 | 不存储数据,只是一个查询定义 | 存储查询结果,实际持久化数据 |
数据更新方式 | 每次查询时都重新计算 | 定期或根据条件更新存储的结果 |
查询性能 | 查询时每次都执行计算 | 直接读取存储的结果,查询速度较快 |
数据一致性 | 保持实时一致性,每次查询返回最新数据 | 需要定期更新,可能存在延迟与不一致的情况 |
OceanBase 中,物化视图是通过
CREATE MATERIALIZED VIEW
语句来创建,支持在查询中定义物化视图,优化大数据量查询场景,尤其是在数据量庞大的时候,能有效提高查询性能
1、创建物化视图
- 创建了一个物化视图
mv_sales_summary
,该视图将存储每个product_id
的销售总金额total_sales
和销售数量sales_count
汇总数据
mysqlCREATE MATERIALIZED VIEW mv_sales_summary AS SELECT product_id, SUM(amount) AS total_sales, COUNT(*) AS sales_count FROM sales GROUP BY product_id;
2、更新物化视图
- 完全刷新:更新整个视图数据,适用于数据变动较大的场景
- 增量刷新:只更新变动部分的数据,适用于数据变动较小的场景
mysqlCREATE MATERIALIZED VIEW mv_sales_summary AS SELECT product_id, SUM(amount) AS total_sales, COUNT(*) AS sales_count FROM sales GROUP BY product_id WITH PRIMARY KEY (product_id) ENABLE ROW MOVEMENT;
3、查询物化视图
mysqlSELECT * FROM mv_sales_summary WHERE product_id = 101;
4、管理物化视图
- 删除物化视图
mysqlDROP MATERIALIZED VIEW mv_sales_summary;
- 查看物化视图的状态
mysqlSELECT * FROM all_mviews WHERE mview_name = '视图名字';
项目开发中,物化视图常用于处理复杂查询的性能优化场景,比如在电商平台的数据分析中,可能需要频繁查询某个商品的总销售额、销售数量等聚合数据,如果每次查询时都从大量原始订单数据中重新计算这些指标,会导致查询性能低下,影响用户体验,这种情况下可以使用物化视图将这些聚合结果预计算并存储,避免每次查询都进行重复计算,提高查询效率。
同时,物化视图可以定期刷新或增量更新,确保数据的时效性和准确性,通过这种方式,项目中的分析报告、实时统计等功能可以更加高效地执行,提升系统整体性能。
总结

高性能数据库架构 OceanBase 数据库,从开发者角度来看,租户隔离技术实现多租户环境下的数据独立与安全,避免了不同业务之间的干扰,适用于SaaS平台、电商网站等场景, 通过隔离不同租户的数据,帮助开发者有效管理和维护每个租户的资源;租户快照可以帮助开发者轻松地创建数据快照并进行恢复,确保系统的高可用性,在金融、医疗等行业避免数据丢失,提供快速恢复的能力;物化视图帮助开发者优化复杂查询的性能,通过预计算并存储查询结果来减少计算压力,提升查询速度,适用于电商订单统计、用户行为分析等数据密集型场景,解决海量数据查询中的性能瓶颈问题。
总体来说,OceanBase 技术为开发者提供了一个高效、安全、易扩展的数据库平台,帮助在实际项目中实现了高并发、大规模数据处理和高效查询,值得大家去学习和体验感受哈!