HTAP混合交易概述
在 HTAP 场景下数据库产品的资源隔离能力至关重要,目前巨杉数据库的资源隔离方案有:
- 基于多租户架构规划:一个数据库通常承载着多种业务系统,为了避免不同业务之间的性能影响,根据业务系统的存储量、并发大小、数据生命周期等划分不同的数据域承载相应的数据读写;
- 基于副本的资源隔离:不同业务通过连接不同的分区副本,实现 OLTP 与 OLAP 业务资源隔离,进而提高整体性能;
由于业务形式的发展,越来越多的需求需要对交易数据进行实时分析,例如推荐、决策、监控等,传统的处理办法是使用 ETL 的方式把 OLTP 业务产生的数据同步到 OLAP 的数据数据库,导致了数据需要在不同的数据库之间流转,耗费时间成本的同时需要耗费人力成本运维多套数据库产品。
SequoiaDB 巨杉数据库采用“计算存储分离”架构,支持 MySQL、PostgreSQL 与 SparkSQL 三种关系型数据库实例、类 MongoDB 的 JSON 文档类数据库实例、以及 S3 对象存储与 Posix 文件系统的非结构化数据实例。在事务场景可以利用 SDBAPI、MySQL 和 PGSQL 实例对数据进行操作,在分析场景借助分布式计算框架 Spark 的并发计算性能,提高计算效率。
在 MySQL 实例创建表
在 SequoiaSQL-MySQL 实例中创建的表将会默认使用 SequoiaDB 数据库存储引擎。
1)登录 MySQL Shell;
1 | /opt/sequoiasql/mysql/bin/mysql -h 127.0.0.1 -P 3306 -u root |
2)创建数据库,并切换到该数据库;
1 | CREATE DATABASE company; |
3)创建包含自增主键字段的 employee 表;
1 | CREATE TABLE employee |
4)向表中插入数据;
1 | INSERT INTO employee (ename, age) VALUES ("Jacky", 36); |
5)查看数据情况;
1 | SELECT * FROM employee; |
6)查看 MySQL 实例读写数据连接的协调节点;
1 | SHOW VARIABLES LIKE '%sequoiadb_conn_addr%'; |
Note:
MySQL 的访问隔离是通过其连接的协调节点预读策略实现的。
7)退出 MySQL Shell ;
1 | \q |
SequoiaDB 巨杉数据库访问隔离设置
数据库访问隔离功能的实现主要是通过修改数据库节点配置参数 instanceid 、 preferedinstance 和 preferedinstancemode、preferedstrict 来实现。
关于数据库配置的更多说明,请参考如下链接:
修改数据节点配置
1)使用 Linux 命令行进去 SequoiaDB Shell ;
1 | sdb |
2)使用 javascript 语法连接协调节点,获取数据库连接;
1 | var db = new Sdb("localhost", 11810); |
Note:
以下 3-5 步骤会报 -264 错误,这个是因为修改数据节点 instanceid 参数需要重启节点后才生效,可通过 getLastErrObj() 接口获取详细信息。
3)修改 11820 数据节点实例 id 为 1;
1 | db.updateConf( { instanceid: 1 }, { svcname: { "$in": [ "11820" ] } } ); |
4)修改 21820 数据节点实例 id 为 2;
1 | db.updateConf( { instanceid: 2 }, { svcname: { "$in": [ "21820" ] } } ); |
5)修改 31820 数据节点实例 id 为 3;
1 | db.updateConf( { instanceid: 3 }, { svcname: { "$in": [ "31820" ] } } ); |
操作截图:
修改协调节点配置
1)修改 11810 协调节点读取数据时的读取策略;
1 | db.updateConf( { preferedinstance: "1,2,3", preferedinstancemode: "ordered", preferedstrict: true }, { GroupName: "SYSCoord", svcname: "11810" } ); |
2)修改 21810 协调节点读取数据时的读取策略;
1 | db.updateConf( { preferedinstance: "2,1,3", preferedinstancemode: "ordered", preferedstrict: true }, { GroupName: "SYSCoord", svcname: "21810" } ); |
3)修改 31810 协调节点读取数据时的读取策略;
1 | db.updateConf( { preferedinstance: "3,2,1", preferedinstancemode: "ordered", preferedstrict: true }, { GroupName: "SYSCoord", svcname: "31810" } ); |
preferedinstance 指定执行读请求时优先选择的实例。上面命令为三个协调节点分配了不同的读取策略。例如:31810优先读取实例id为3的数据节点,即31820。
操作截图:
4)退出 SequoiaDB Shell;
1 | quit; |
重启 SequoiaDB 数据节点
数据节点 instanceid 参数为需要节点重启后生效,修改完参数后,重启数据节点。
1 | sdbstop -r data |
操作截图:
查看节点参数修改状态
1)进入 SequoiaDB Shell;
1 | sdb |
2)使用 javascript 语法连接协调节点,获取数据库连接;
1 | var db=new Sdb("localhost", 11810); |
3)查看数据节点参数修改状态;
1 | db.snapshot(SDB_SNAP_CONFIGS, { Role: "data" }, { NodeName: "", instanceid: "" } ); |
此时,所有数据节点的 instanceid 均已修改完成。
操作截图:
4)查看协调节点参数修改状态;
1 | db.snapshot(SDB_SNAP_CONFIGS, { Role: "coord" }, { NodeName: "", preferedinstance: "" } ); |
操作截图:
此时,所有数据节点的 preferedinstance 均已修改完成。
5)退出 SequoiaDB Shell;
1 | quit; |
SparkSQL 设置
SparkSQL 用于处理 OLAP 类的业务,例如推荐、决策、监控等。
1)登录 Beeline 客户端,连接 SparkSQL 实例;
1 | /opt/spark/bin/beeline -u 'jdbc:hive2://localhost:10000' |
2)创建 company 数据库;
1 | CREATE DATABASE company; |
3)在 SparkSQL 中创建表并设置预读数据节点实例 id 顺序为优先使用实例 3,再使用实例 2;
1 | CREATE TABLE company.employee |
更多的 SparkSQL 创建表参数说明,请参考如下链接:
3)数据的查询,此时 SparkSQL 从副本 3 读取数据;
1 | SELECT * FROM company.employee; |
操作截图: