高级运维管理

一、弹性扩展能力

1. 课程介绍

本课程主要介绍 SequoiaDB 巨杉数据库的弹性扩展能力。但受限于实验环境,分区组扩展仅在一台服务器上演示,扩展步骤和原理与在多台服务器上原理保持一致。完成节点扩展后还将展示基于 split 方法的数据 rebalance,使数据打散到所有分区组中。

SequoiaDB 巨杉数据库是一款金融级别的分布式数据库,可以通过集群的扩容实现集群性能的近线性增长。通过扩容后主要解决两个问题:数据存储的容量问题和整个集群的性能问题。因为数据量的不断增长及上线后的推广使用,所以需要进行扩容来提升集群性能及增加数据存储空间。

部署架构
本课程中的 SequoiaDB 巨杉数据库的集群拓扑结构为三分区单副本。

810-1

关于 SequoiaDB 巨杉数据库系统架构的详细信息,请参考如下链接:

SequoiaDB 系统架构
实验环境
课程使用的实验环境为 Ubuntu Linux 16.04 64 位版本。

2. 切换用户及查看数据库版本

切换到 sdbadmin 用户
部署 SequoiaDB 巨杉数据库和 SequoiaSQL-MySQL 实例的操作系统用户为 sdbadmin。

su - sdbadmin
copy
Note:

用户 sdbadmin 的密码为 sdbadmin

查看巨杉数据库版本
查看 SequoiaDB 巨杉数据库引擎版本:

sequoiadb --version
copy

3. 查看节点启动列表

查看 SequoiaDB 巨杉数据库引擎节点列表:

sdblist

4. 创建域、集合空间、集合

创建数据域、集合空间和集合,为集群扩容后数据重分布做准备。

1)通过 Linux 命令行进入 SequoiaDB Shell;

sdb
copy
2)通过 javascript 语言连接协调节点,获取数据库连接;

var db = new Sdb("localhost", 11810);
copy
3)创建 company_domain 逻辑域;

db.createDomain("company_domain", [ "group1", "group2", "group3" ], { AutoSplit: true } );
copy
4)创建 company 集合空间;

db.createCS("company", { Domain: "company_domain" } );
copy
5)创建 employee 集合;

db.company.createCL("employee", { "ShardingKey": { "_id": 1 }, "ShardingType": "hash", "ReplSize": -1, "Compressed": true, "CompressionType": "lzw", "AutoSplit": true, "EnsureShardingIndex": false } );
copy
6)使用 JavaScript 的 for 循环向 employee 集合中写入 1000 条数据;

for (var i = 0; i < 1000; i++)
{
var record = { empno: i, ename: "TEST", age: 20 };
db.company.employee.insert(record);
}
copy
7)通过查看集合快照信息,获取集合分区情况;

db.snapshot(SDB_SNAP_COLLECTIONS, { "Name": "company.employee" }, { "Details.GroupName": "", "Details.Group.TotalRecords": "" } );
copy

5. 分区组弹性扩展语法

本次实验所有扩展均在一台服务器上完成,多服务器扩展原理与此相同。下面是对创建分区组和增加节点的语法说明。

1)新建一个分区组语法;

var rg = db.createRG( < name > );

参数描述:

参数名 参数类型 描述 是否必填
name string 分区组名,同一个数据库对象中,分区组名唯一。 是
2)在当前分区组中创建节点语法;

rg.createNode( < host >, < service >, < dbpath >, [ config ] );

参数描述:

图片说明

6. 新增数据分区

1)新增数据组;

var dataRG = db.createRG("group4");
copy
2)添加数据节点;

dataRG.createNode("sdbserver1", 11850, "/opt/sequoiadb/database/data/11850/", { logfilenum: 5, transactionon: true } );
copy
3)启动数据节点组;

dataRG.start();
copy
4)退出 SequoiaDB Shell;

quit;
copy
5)查看数据库扩展后状态

sdblist -t all -l -m local
copy
操作截图:

810-5

此时新增的数据节点已经加入集群。

Note:

如果是在新服务器上进行扩容,新增服务器的 hostname 和 ip 地址需要被添加到所有服务器的 /etc/hostname 文件中。

7. 原有集合数据重分布

集群扩容后,需要把原有数据域进行修改,新增数据组,并可通过 split 对已存在集合进行数据重新打散,达到集合数据均匀分布。

1)通过 Linux 命令行进入 SequoiaDB Shell;

sdb
copy
2)通过 javascript 语言连接协调节点,获取数据库连接;

var db = new Sdb("localhost", 11810);
copy
3)数据域 company_domain 增加数据组;

db.getDomain("company_domain").addGroups( { Groups: [ 'group4' ] } );
copy
4)查看域信息;

db.listDomains();
copy
操作截图:

810-6

5)将集合的部分数据迁移到新的数据组上;

将 group1 数据组部分数据切分到新的数据组中:

db.company.employee.split("group1", "group4", 25);
copy
将 group2 数据组部分数据切分到新的数据组中:

db.company.employee.split("group2", "group4", 25);
copy
将 group3 数据组部分数据切分到新的数据组中:

db.company.employee.split("group3", "group4", 25);
copy
Note:

以上split的含义是把 group1、group2 和 group3 上的数据分别移 25% 到 group4 上。 split 方法的详细说明请参考:split 方法说明。

操作截图:

810-7

6)通过查看集合快照信息,获取集合分区情况;

db.snapshot(SDB_SNAP_COLLECTIONS, { "Name": "company.employee" }, { "Details.GroupName": "", "Details.Group.TotalRecords": "" } );
copy
操作截图:

810-8

8. 新增数据自动打散

company.employee 集合后续写入的数据会自动均匀打散 group1、group2、group3 和 group4 4个数据组中。

1)使用 JavaScript 的 for 循环向 employee 集合中写入 1000 条数据;

for (var i = 1000; i < 2000; i++)
{
var record = { empno: i, ename: "TEST", age: 20 };
db.company.employee.insert(record);
}
copy
2)通过查看集合快照信息,获取集合分区情况;

db.snapshot(SDB_SNAP_COLLECTIONS, { "Name": "company.employee" }, { "Details.GroupName": "", "Details.Group.TotalRecords": "" } );

9. 新建集合自动拓展到新分区

在 company_domain 数据域中新创建的集合会按照数据域中包含的数据组自动均匀的分布到所有数据组里。

1)创建集合,分区方式为 hash ,分区键为 serial_no;

db.company.createCL("log", {"ShardingKey": { "serial_no": 1 }, "ShardingType": "hash", "ReplSize": -1, "Compressed": true, "CompressionType": "lzw", "AutoSplit": true, "EnsureShardingIndex": false } );
copy
3)使用 JavaScript 的 for 循环向 log 集合中写入 1000 条数据;

for (var i = 0; i < 1000; i++)
{
var record = { serial_no: i, account_id: i + 1000, description: "description log", tx_time: "2020-02-29 00:00:00" };
db.company.log.insert(record);
}
copy
4)通过查看集合信息,获取数据分布;

db.snapshot(SDB_SNAP_COLLECTIONS, { "Name": "company.log" }, { "Details.GroupName": "", "Details.Group.TotalRecords": "" } );
copy
操作截图:

810-7

5)关闭 db 连接;

db.close();
copy
6)退出 SequoiaDB Shell;

quit;

10. 总结

通过本课程,我们学会了如何在已有节点和数据的数据库集群中实现弹性扩容及集合中数据的重新均衡。基于弹性扩容能力 SequoiaDB 巨杉数据库能够适应业务快速发展,有利于降低企业初期的成本。

二、分布式事务管理

1. 课程介绍

本课程主要介绍 SequoiaDB 巨杉数据库的事务功能,分别对当前实验环境 SequoiaSQL-MySQL 实例支持的 RU(读未提交)、RC(读已提交)和 RS(读稳定性)三种隔离级别进行设置和验证。由于实验环境版本为 3.4,故不在此展示 SequoiaDB 巨杉数据库 5.0 版本通过 MVCC(多版本并发控制)实现 RR(可重复读)隔离级别的功能。

部署架构
本课程中 SequoiaDB 巨杉数据库的集群拓扑结构为三分区单副本,其中包括:1 个 SequoiaSQL-MySQL 数据库实例节点、1 个引擎协调节点,1 个编目节点与 3 个数据节点。

820-1

如若详细了解 SequoiaDB 巨杉数据库系统架构,请参考如下链接:

SequoiaDB 系统架构
实验环境
课程使用的实验环境为 Ubuntu Linux 16.04 64 位版本。SequoiaDB 数据库引擎为 3.4 版本。本次实验需要在虚拟机中开启两 3 个终端,分别是“终端1”、“终端2”和“终端3”。

2. 切换用户及查看数据库版本

切换到 sdbadmin 用户
部署 SequoiaDB 巨杉数据库和 SequoiaSQL-MySQL 实例的操作系统用户为 sdbadmin。

1)右键实验环境桌面空白处选择 Open Terminal Here 新开终端,此终端为“终端1”;

820-2

2)切换到 sdbadmin 用户;

su - sdbadmin
copy
Note:

用户 sdbadmin 的密码为 sdbadmin

查看巨杉数据库版本
查看 SequoiaDB 巨杉数据库引擎版本:

sequoiadb --version
copy
操作截图:

3. 查看节点启动列表

查看 SequoiaDB 巨杉数据库引擎节点列表:

sdblist
copy
操作截图:

820-3

Note:

如果显示的节点数量与预期不符,请稍等初始化完成并重试该步骤。

C: 编目节点,S:协调节点,D:数据节点

4. 创建数据库及数据表

进入 MySQL Shell ,连接 SequoiaSQL-MySQL 实例并创建 company 数据库,为接下来验证 SequoiaSQL-MySQL 事务做准备。

登录 MySQL Shell
/opt/sequoiasql/mysql/bin/mysql -h 127.0.0.1 -P 3306 -u root -proot
copy
创建数据库
CREATE DATABASE company;
USE company;
copy
创建数据表
在 SequoiaSQL-MySQL 实例中创建的表将会默认使用 SequoiaDB 数据库存储引擎,包含主键或唯一键的表将会默认以唯一键作为分区键进行自动分区。

1)创建包含自增主键字段的 employee 表;

CREATE TABLE employee
(
empno INT AUTO_INCREMENT PRIMARY KEY,
ename VARCHAR(128),
age INT
);
copy
2)写入数据;

INSERT INTO employee (ename, age) VALUES ("Jacky", 36);
copy
3)查看数据;

SELECT * FROM employee;
copy
4)退出 MySQL Shell;

\q

5. 检查 SequoiaDB 是否开启事务

检查 SequoiaDB 巨杉数据库节点事务是否开启。

1)在 Linux 命令行中进入 SequoiaDB Shell 交互式界面;

sdb
copy
2)使用 JavaScript 连接协调节点,并获取数据库连接;

var db = new Sdb("localhost", 11810);
copy
3)查询节点配置快照;

db.snapshot(SDB_SNAP_CONFIGS, {}, { NodeName: "", transactionon: "" } );
copy
操作截图:

820-2

从图片中可以看到所有数据节点和协调事务功能已经开启(编目节点事务为开启状态且不在此展示)。

4)退出 SequoiaDB Shell;

quit;

6. 事务的原子性

原子性保证在同一个事务内所有操作一起成功或者一起失败。

1)登录 MySQL Shell;

/opt/sequoiasql/mysql/bin/mysql -h 127.0.0.1 -P 3306 -u root -proot
copy
2)切换数据库;

USE company;
copy
3)查看数据;

SELECT * FROM employee;
copy
4)开始事务,执行插入数据与更新数据操作,并查看数据情况后回滚事务;

BEGIN;
INSERT INTO employee (ename, age) VALUES ("Alice", 18);
UPDATE employee SET age = 37 WHERE ename = "Jacky";
SELECT * FROM employee;
ROLLBACK;
copy
5)再次查看数据;

SELECT * FROM employee;
copy
上一步的 rollback 把同一事务内的所有操作进行了回滚。

7. 事务的持久性

1)开始事务,执行插入数据并提交事务;

BEGIN;
INSERT INTO employee (ename, age) VALUES ("Susan", 21);
COMMIT;
copy
2)查询写入数据,确保之前写入的数据被正确提交;

SELECT * FROM employee WHERE ename = "Susan";
copy
由于事务已经被提交,被插入的数据被保存在数据库中。

3)退出 MySQL Shell ;

\q
copy

8. 查看事务的隔离

目前 SequoiaSQL-MySQL 实例支持 RU(读未提交)、RC(读已提交)和 RS(读稳定性)三种隔离级别,管理事务的隔离级别可以在SequoiaDB 巨杉数据库存储引擎中修改。

1)在 Linux 命令行中进入 SequoiaDB Shell 交互式界面;

sdb
copy
2)使用 JavaScript 连接协调节点,并获取数据库连接;

var db = new Sdb("localhost", 11810);
copy
3)查看所有节点事务隔离级别;

db.snapshot(SDB_SNAP_CONFIGS, {}, { NodeName: "", transactionon: "", transisolation: "" } );
copy
操作截图:

820-2

Note:

transisolation 参数指定隔离级别,0 表示隔离级别为读未提交。
transactionon 为 true 表示开启事务功能。
关于更多参数说明,请参考 SequoiaDB 巨杉数据库配置 。

9. 验证 RU 读未提交隔离级别

开启新的终端(切换到 sdbadmin 用户),登录 MySQL,这个终端表示 sessionA,开启事务后修改数据。

1)右键实验环境桌面空白处选择 Open Terminal Here 新开终端,此终端为“终端2”,表示 sessionA;

2)切换到 sdbadmin 用户,用户密码为 sdbadmin;

su - sdbadmin
copy
3)登录 MySQL Shell;

/opt/sequoiasql/mysql/bin/mysql -h 127.0.0.1 -P 3306 -u root -proot
copy
4)开启事务并更新数据;

BEGIN;
UPDATE company.employee SET age = 22 WHERE ename = "Susan";
copy
再次开启新的终端(切换到 sdbadmin 用户),登录 MySQL,表示 sessionB;

1)右键实验环境桌面空白处选择 Open Terminal Here 新开终端,此终端为“终端3”,表示 sessionB;

2)切换到 sdbadmin 用户,用户密码为 sdbadmin;

su - sdbadmin
copy
3)登录 MySQL Shell;

/opt/sequoiasql/mysql/bin/mysql -h 127.0.0.1 -P 3306 -u root -proot
copy
4)使用 sessionB 开启事务后查询;

BEGIN;
SELECT * FROM company.employee;
copy
可以看到,即使 sessionA 未进行提交,sessionB 依然可以看到修改过的数据。

5)sessionA 和 sessionB 提交事务;

COMMIT;
copy

10. 验证 RC 读已提交隔离级别

在 “终端1” 修改事务隔离级别为 RC(读已提交),并对其进行功能验证。

修改事务隔离级别为 RC
1)修改事务隔离级别,1 代表读已提交;

db.updateConf( { transisolation: 1 }, { Global: true } );
copy
2)查询节点事务隔离级别;

db.snapshot(SDB_SNAP_CONFIGS, {}, { NodeName: "", transactionon: "", transisolation: "" } );
copy
验证 RC 读已提交隔离级别
1)使用 sessionA 开启事务更新数据;

BEGIN;
UPDATE company.employee SET age = 32 WHERE ename = "Susan";
copy
2)使用 sessionB 开启事务后查询;

BEGIN;
SELECT * FROM company.employee;
copy
此时 sessionB 无法看到修改后的数据。

3)sessionA 提交后,sessionB 执行查询。

sessionA 执行提交操作;

COMMIT;
copy
sessionB 执行查询;

SELECT * FROM company.employee;
copy
只有当数 sessionA 据提交后,sessionB 才能看到修改后的数据。

sessionB 执行提交操作;

COMMIT;
copy

11. 验证 RS 读稳定性隔离级别

在“终端1”修改事务隔离级别为 RS(读稳定性),并对其进行功能验证。

修改事务隔离级别为 RS
1)修改事务隔离级别,2 表示隔离界别为读稳定性;

db.updateConf( { transisolation: 2 }, { Global: true } );
copy
2)查询节点事务隔离级别;

db.snapshot(SDB_SNAP_CONFIGS, {}, { NodeName: "", transactionon: "", transisolation: "" } );
copy
验证 RS 读稳定性隔离级别
1)使用 sessionA 开启事务后查询数据;

BEGIN;
SELECT * FROM company.employee;
copy
2)使用 sessionB 开启事务更新数据;

BEGIN;
UPDATE company.employee SET age = 42 WHERE ename = "Susan";
copy
sessionB 的 update 操作发生等待,只有等 sessionA 执行 rollback 或者 commit 后,sessionB 才能执行成功。

3)sessionA 执行提交操作;

COMMIT;
copy
4)sessionA 和 sessionB 退出 MySQL Shell ;

\q

12. 总结

通过本课程,我们学习了 SequoiaDB 巨杉数据库事务功能,重点学习隔离级别的设置,并通过 SequoiaSQL-MySQL 实例对目前环境所支持的三种隔离级别进行验证。

三、强弱一致性配置

1. 课程介绍

本课程介绍巨杉数据在不同一致性设置下,数据的同步方式。

部署架构
本课程中的 SequoiaDB 巨杉数据库的集群拓扑结构为三分区单副本。
图片说明
关于 SequoiaDB 巨杉数据库系统架构的详细信息,请参考如下链接:

SequoiaDB 系统架构
实验环境
课程使用的实验环境为 Ubuntu Linux 16.04 64 位版本。SequoiaDB 数据库引擎为 3.4 版本。

2. 切换用户及查看数据库版本

切换到 sdbadmin 用户
部署 SequoiaDB 巨杉数据库的操作系统用户为 sdbadmin。

su - sdbadmin
copy
Note:

用户 sdbadmin 的密码为 sdbadmin

查看巨杉数据库版本
查看 SequoiaDB 巨杉数据库引擎版本:

sequoiadb --version
copy

3. 查看节点启动列表

查看 SequoiaDB 巨杉数据库引擎节点列表:

sdblist

4. 强弱一致性配置

一致性默认设置
创建集合时可以配置一致性参数 ReplSize,该参数默认值为 1。当该值设置为 1 - 7:表示写请求需同步到该复制组指定数量个节点之后,数据库写操作才返回应答给客户端。

1)通过 Linux 命令行进入 SequoiaDB Shell;

sdb
copy
2)通过 javascript 语言连接协调节点,获取数据库连接;

var db = new Sdb("localhost", 11810);
copy
3)创建 company_domain 域;

db.createDomain("company_domain", [ "group1", "group2", "group3" ], { AutoSplit: true } );
copy
4)创建 company 集合空间;

db.createCS("company", { Domain: "company_domain" } );
copy
5)创建 employee 集合;

db.company.createCL("employee", { "ShardingKey": { "_id": 1 }, "ShardingType": "hash", "Compressed": true, "CompressionType": "lzw", "ReplSize": 1, "AutoSplit": true, "EnsureShardingIndex": false } );
copy
6)查询集合一致性参数 ReplSize;

db.snapshot(SDB_SNAP_CATALOG, { "Name": "company.employee" }, { "ReplSize": "" } );

弱一致性配置

使用 alter 方法可以修改集合的 ReplSize 参数。 当该参数修改为 -1 时,表示写请求需同步到该复制组若干活跃的节点之后,数据库写操作才返回应答给客户端。

1)修改集合一致性配置;

db.company.employee.alter( { ReplSize: -1 } );
copy
2)查询集合一致性参数 ReplSize;

db.snapshot(SDB_SNAP_CATALOG, { "Name": "company.employee" }, { "ReplSize": "" } );

强一致性配置

当 ReplSize 参数设置为 0 时,表示写请求需同步到该复制组的所有节点之后,数据库写操作才返回应答给客户端。

1)修改集合一致性配置

db.company.employee.alter( { ReplSize: 0 } );
copy
2)查询集合一致性参数 ReplSize;

db.snapshot(SDB_SNAP_CATALOG, { "Name": "company.employee" }, { "ReplSize": ""} );
copy
操作截图:

830-4

Note:

查询结果显示为 7,这个是因为一个复制组中最多有 7 个节点。

3)关闭 db 连接;

db.close();
copy
4)退出 SequoiaDB Shell;

quit;

7. 总结

通过本课程,我们了解了 SequoiaDB 巨杉数据库引擎如何指定强弱一致性配置。

四、高可用能力

1. 课程介绍

本课程主要介绍巨杉数据库的高可用能力。在一个三副本的高可用集群环境中,当数据组中一个数据节点出现故障后,整个集群依然能对外提供读写服务。

部署架构
本课程中 SequoiaDB 巨杉数据库的集群拓扑结构为一分区三副本,其中包括 3 个引擎协调节点,3 个编目节点与 3 个数据节点并部署了 1 个 SparkSQL 实例节点 和 1 个 SequoiaSQL-MySQL 数据库实例节点。

840-1

关于 SequoiaDB 巨杉数据库系统架构的详细信息,请参考如下链接:

SequoiaDB 系统架构
实验环境
课程使用的实验环境为 Ubuntu Linux 16.04 64 位版本。SequoiaDB 数据库引擎为 3.4 版本。

2. 切换用户及查看数据库版本

切换到 sdbadmin 用户
部署 SequoiaDB 巨杉数据库的操作系统用户为 sdbadmin。

su - sdbadmin
copy
Note:

用户 sdbadmin 的密码为 sdbadmin

查看巨杉数据库版本
查看 SequoiaDB 巨杉数据库引擎版本:

sequoiadb --version

3. 查看节点启动列表

查看 SequoiaDB 巨杉数据库引擎节点列表:

sdblist

4. 创建数据库及数据表

进入 MySQL Shell ,连接 SequoiaSQL-MySQL 实例并创建 company 数据库,为接下来验证 SequoiaDB 巨杉数据库高可用特性做准备。

登录 MySQL Shell
/opt/sequoiasql/mysql/bin/mysql -h 127.0.0.1 -P 3306 -u root
copy
创建数据库
CREATE DATABASE company;
USE company;
copy
创建数据表
在 SequoiaSQL-MySQL 实例中创建的表将会默认使用 SequoiaDB 数据库存储引擎,在 MySQL 上创建表将同步在 SequoiaDB 上创建对应的分区表(hash分区,包含所有分区组)。自动分区时,分区键按顺序优先使用主键字段和唯一索引字段。如果两者都没有,则不做分区。

1)创建包含自增主键字段的 employee 表;

CREATE TABLE employee
(
empno INT AUTO_INCREMENT PRIMARY KEY,
ename VARCHAR(128),
age INT
);
copy
2)基本的数据写入操作;

INSERT INTO employee (ename, age) VALUES ("Jacky", 36);
copy
3)查看数据;

SELECT * FROM employee;
copy
4)退出 MySQL Shell;

\q

5. 关闭巨杉数据库节点服务

关闭数据组 group1 中的一个数据节点,来模拟数据发生故障。

1)关闭 11820 数据节点;

sdbstop -p 11820
copy
2)查看数据库状态;

sdblist -t all -l -m local
copy
操作截图:

6. 验证数据库功能

数据组 group1 中的11820 的节点已经停止,现在进行数据的常规操作是否正常,从而验证数据库的高可用能力。

登录 MySQL 验证
1)登录 MySQL Shell;

/opt/sequoiasql/mysql/bin/mysql -h 127.0.0.1 -P 3306 -u root
copy
2)切换到 company 数据库;

USE company;
copy
3)进行数据写入操作;

INSERT INTO employee (ename, age) VALUES ("Alice", 18);
copy
4)进行数据查询操作;

SELECT * FROM employee;
copy
5)退出 MySQL Shell;

\q
copy

7. 总结

通过本课程,我们验证了节点为三副本时,有 1 个节点故障依然可以提供读写能力,证明了 SequoiaDB 巨杉数据库的高可用能力。

五、数据域管理

1. 课程介绍

本课程讲述巨杉数据库数据域的内容。通过本课程了解域的概念,掌握域的使用方法。

域(Domain)是由若干个复制组(ReplicaGroup)组成的逻辑单元。每个域都可以根据定义好的策略自动管理所属数据,方便实现对多个复制组内数据的统一管理,如数据切片和数据隔离等。

部署架构
本课程中的 SequoiaDB 巨杉数据库的集群拓扑结构为三分区单副本。

850-1

关于 SequoiaDB 巨杉数据库系统架构的详细信息,请参考如下链接:

SequoiaDB 系统架构
实验环境
课程使用的实验环境为 Ubuntu Linux 16.04 64 位版本。SequoiaDB 数据库引擎为 3.4 版本。

2. 切换用户及查看数据库版本

切换到 sdbadmin 用户
部署 SequoiaDB 巨杉数据库的操作系统用户为 sdbadmin。

su - sdbadmin
copy
Note:

用户 sdbadmin 的密码为 sdbadmin

查看巨杉数据库版本
查看 SequoiaDB 巨杉数据库引擎版本:

sequoiadb --version

3. 查看节点启动列表

查看 SequoiaDB 巨杉数据库引擎节点列表:

sdblist
copy
操作截图:

850-3

Note:

如果显示的节点数量与预期不符,请稍等初始化完成并重试该步骤。

C: 编目节点,S:协调节点,D:数据节点

4. 创建数据域

域( Domain )是由若干个复制组( ReplicaGroup )组成的逻辑单元。每个域都可以根据定义好的策略自动管理所属数据,如数据切片和数据隔离等。如若详细了解域的概念,请跳转以下链接:

SequoiaDB 域的概念
1)通过 Linux 命令行进入 SequoiaDB Shell;

sdb
copy
2)通过 javascript 语言连接协调节点,获取数据库连接;

var db = new Sdb("localhost", 11810);
copy
3)创建域;

db.createDomain("company_domain", [ "group1", "group2" ], { AutoSplit: true } );
copy
Note:

这个域包含了两个数据组: group1 和 group2 。 AutoSplit 参数指定自动切分散列分区集合。

4)查看域信息;

db.listDomains();

5. 数据域的使用

创建集合空间时指定了域 company_domain,此后基于这个集合空间所创建的集合,其保存的数据将存储在 company_domain 这个域中的两个数据组上。

1)创建集合空间;

db.createCS("company", { Domain: "company_domain" } );
copy
2)创建集合,分区方式为 hash ,分区键为 empno;

db.company.createCL("employee", { "ShardingKey": { "empno": 1 }, "ShardingType": "hash", "ReplSize": -1, "Compressed": true, "CompressionType": "lzw", "AutoSplit": true, "EnsureShardingIndex": false } );
copy
3)使用 JavaScript 的 for 循环向 employee 集合中写入 1000 条数据;

for (var i = 0; i < 1000; i++)
{
var record = { empno: i, ename: "TEST", age: 20 };
db.company.employee.insert(record);
}
copy
4)通过查看集合信息,获取数据分布;

db.snapshot(SDB_SNAP_COLLECTIONS, { "Name": "company.employee" }, { "Details.GroupName": "", "Details.Group.TotalRecords": "" } );
copy
其中 TotalRecords 记录了每个数据保存的记录数。

操作截图:

6. 修改数据域

数据域可以增加数据组和减少数据组。

增加数据组
增加数据组后,如果需要把原有部分数据放置到这个组上,则可使用 split 方法 对数据进行切分。

1)获取数据域;

var domain = db.getDomain("company_domain");
copy
2)向已有域中添加数据组;

domain.addGroups( { Groups: [ "group3" ] } );
copy
3)查看修改后域的信息;

db.listDomains();
copy

6.1 数据重分布

数据域新增数据组,可通过 split 对已存在该数据域的集合进行数据重新打散,达到集合数据均匀分布。

1)将集合的部分数据迁移到新加入的数据组上;

(1)将 group1 数据组部分数据切分到新加入的数据组中:

db.company.employee.split("group1", "group3", 33);
copy
(2)将 group2 数据组部分数据切分到新加入的数据组中:

db.company.employee.split("group2", "group3", 33);
copy
Note:

以上split的含义时是把 group1 和 group2 上的数据分别移 33% 到 group3 上。 split 方法的详细说明请参考:split 方法说明。

2)通过查看集合快照信息,获取集合分区情况;

db.snapshot(SDB_SNAP_COLLECTIONS, { "Name": "company.employee" }, { "Details.GroupName": "", "Details.Group.TotalRecords": "" } );
copy
操作截图:

850-5

新增数据自动打散
集合 company.employee 集合后续插入的数据会自动打散到 company_domain 数据域所包含的数据组中。

1)使用 JavaScript 的 for 循环向 employee 集合中写入 1000 条数据;

for (var i = 1000; i < 2000; i++)
{
var record = { empno: i, ename: "TEST", age: 20 };
db.company.employee.insert(record);
}
copy
2)通过查看集合快照信息,获取集合分区情况;

db.snapshot(SDB_SNAP_COLLECTIONS, { "Name": "company.employee" }, { "Details.GroupName": "", "Details.Group.TotalRecords": "" } );
copy
操作截图:

850-6

6.2 新增集合自动扩展到新分区

新创建的集合会按照数据域包含的数据组自动分布到新的数据组中。

1)创建集合,分区方式为 hash ,分区键为 serial_no;

db.company.createCL("log", { "ShardingKey": { "serial_no": 1 }, "ShardingType": "hash", "ReplSize": -1, "Compressed": true, "CompressionType": "lzw", "AutoSplit": true, "EnsureShardingIndex": false } );
copy
2)使用 JavaScript 的 for 循环向 log 集合中写入 1000 条数据;

for (var i = 0; i < 1000; i++)
{
var record = { serial_no: i, account_id: i + 1000, description: "description log", tx_time: "2020-02-29 00:00:00" };
db.company.log.insert(record);
}
copy
3)通过查看集合信息,获取数据分布;

db.snapshot(SDB_SNAP_COLLECTIONS, { "Name": "company.log" }, { "Details.GroupName": "", "Details.Group.TotalRecords": "" } );

6.3 减少数据组

删减数据域中的数据组需要把该数据组中的数据 split 到其他数据组中。

1)将集合部分存储在要移除的数据组中的数据迁移到其他数据组中;

(1)将 company.employee 集合中存储于 group3 数据组部分数据通过范围切把数据切分 group1 数据组中:

db.company.employee.split("group3", "group1", { Partition: 1373 }, { Partition: 2048 } );
copy
(2)将 company.employee 集合中存储于 group3 数据组部分数据分别切分 group2 数据组中:

db.company.employee.split("group3", "group2", { Partition: 3421 }, { Partition: 4096 } );
copy
(3)将 company.log 集合中存储于 group3 数据组部分数据分别切分 group1 数据组中:

db.company.log.split("group3", "group1", { Partition: 2730 }, { Partition: 3413 } );
copy
(4)将 company.log 集合中存储于 group3 数据组部分数据分别切分 group2 数据组中:

db.company.log.split("group3", "group2", { Partition: 3413 }, { Partition: 4096 } );
copy
2)通过查看集合信息,获取 company.employee 集合的数据分布;

db.snapshot(SDB_SNAP_COLLECTIONS, { "Name": "company.employee" }, { "Details.GroupName": "", "Details.Group.TotalRecords": "" } );
copy
操作截图:

850-8

3)通过查看集合信息,获取 company.log 集合的数据分布;

db.snapshot(SDB_SNAP_COLLECTIONS, { "Name": "company.log" }, { "Details.GroupName": "", "Details.Group.TotalRecords": "" } );
copy
操作截图: 850-7

4)获取数据域;

var domain = db.getDomain("company_domain");
copy
5)向已有域中删除数据组;

domain.removeGroups( { Groups: [ "group3" ] } );
copy
Note:

删除复制组前必须保证其不包含任何数据。

6)查看修改后域的信息;

db.listDomains();
copy

6.4. 删除数据域

清理数据域,需要确保数据域上没有集合空间。

1)删除集合空间 company;

db.dropCS("company");
copy
2)清理数据域;

db.dropDomain("company_domain");
copy
3)查看 company_domain 域是否已删除;

db.listDomains();
copy
4)关闭 db 连接;

db.close();
copy
5)退出 SequoiaDB Shell;

quit;

7. 总结

本课程讲述了域的概念,同时对域的使用进行了实际操作:数据域中创建集合空间和集合时指定为自动切分数据会打散到数据域包含的所有分区;已有集合的数据域中添加分区需要手动进行切分数据,切分后后续的数据可以切分到所有分区中。

六、多维分区规则

1. 课程介绍

本课程主要介绍 SequoiaDB 巨杉数据库中多维分区的规划和实际操作。

分区方式介绍
水平分区:用户可以通过将一个集合中的数据切分到多个复制组中,以达到并行计算的目的。

垂直分区:用户也可以将一个集合全局关系的属性分成若干子集,并在这些子集上作投影运算,将这些子集映射到另外的集合上,从而实现集合关系的垂直切分。

多维分区是指将集合先通过垂直分区映射到多个子集合中,再通过水平分区将子集合切分到多个复制组中的方式。

多维分区的优势
通常流水类数据选择创建多维分区表进行存放,把不同时间段的数据分布在不同的数据组。多维分区表的好处有:

1)当访问某时间范围的数据能够直接定位到子分区,避免扫描全表数据从而降低 IO。

2)在集群扩容时,把扩展的子表创建在新的机器,无需执行rebalance的操作即可完成表存储空间的扩容。

请点击右侧选择使用的实验环境
环境架构
本课程中 SequoiaDB 巨杉数据库的集群拓扑结构为三分区单副本,其中包括:1 个引擎协调节点,1 个编目节点与 3 个数据节点。

860-1

关于 SequoiaDB 巨杉数据库系统架构的详细信息,请参考如下链接:

SequoiaDB 系统架构
实验环境
课程使用的实验环境为 Ubuntu Linux 16.04 64 位版本。SequoiaDB 巨杉数据库引擎为 3.4 版本。

2. 切换用户及查看数据库版本

切换到 sdbadmin 用户
部署 SequoiaDB 巨杉数据库的操作系统用户为 sdbadmin。

su - sdbadmin
copy
Note:

用户 sdbadmin 的密码为 sdbadmin

查看巨杉数据库版本
查看 SequoiaDB 巨杉数据库引擎版本:

sequoiadb --version
copy

3. 查看节点启动列表

查看 SequoiaDB 巨杉数据库引擎节点列表:

sdblist

4. 创建多维分区表

多维分区表是一个包含有垂直分区和水平分区的分区表,由主集合和子集合两部分组成。主集合为一个逻辑结构,用于连接所有子集合。真正的数据存储于交易日志子集合之中。

1)通过 Linux 命令行进入 SequoiaDB Shell;

sdb
copy
2)通过 javascript 语言连接协调节点,获取数据库连接;

var db = new Sdb("localhost", 11810);
copy
3)创建域;

db.createDomain( "company_domain", [ "group1", "group2", "group3" ], { "AutoSplit": true } );
copy
4)创建主集合空间;

db.createCS("company", { "Domain": "company_domain" } );
copy
5)创建主集合;

db.company.createCL("translog", { "IsMainCL": true, "ShardingKey": {"tx_time": 1 }, "ShardingType": "range" } );
copy
6)创建子集合空间;

创建子集合空间 year2020 :

db.createCS("year2020", { "Domain": "company_domain" } );
copy
创建子集合空间 year2021 :

db.createCS("year2021", { "Domain": "company_domain" } );
copy
7)创建两个子集合;

创建子集合 year2020.translog :

db.year2020.createCL("translog", { "ShardingKey": { "_id": 1 }, "ShardingType": "hash", "ReplSize": -1, "Compressed": true, "CompressionType": "lzw", "AutoSplit": true, "EnsureShardingIndex": false } );
copy
创建子集合 year2021.translog :

db.year2021.createCL("translog", { "ShardingKey": { "_id": 1 }, "ShardingType": "hash", "ReplSize": -1, "Compressed": true, "CompressionType": "lzw", "AutoSplit": true, "EnsureShardingIndex": false } );
copy
8)挂载子集合;

挂载子集合 year2020.translog :

db.company.translog.attachCL("year2020.translog", { "LowBound": { "tx_time": MinKey() }, UpBound: { tx_time: { "$date": "2021-01-01" } } } );
copy
挂载子集合 year2021.translog :

db.company.translog.attachCL("year2021.translog", { LowBound: { "tx_time": { "$date": "2021-01-01" } }, "UpBound": { "tx_time": MaxKey() } } );
copy
挂载完成后,子集合 year2020.translog 保存小于 2021年的数据,而子集合 year2021.translog 保存大于等于 2021 年的数据。

Note:

挂载语句中的 $date 表示字段 tx_time 的数据类型为 date 型。

更多数据类型请参考如下链接:

SequoiaDB 数据类型
9)插入数据;

从主集合插入 2020 年 3 月份的数据:

db.company.translog.insert( { "serial_no": 1, "order_id": "20200302001", "bus_pay_no": "7312a297-21b4-1328-7834-ss21a251708", "tx_time": { "$date": "2020-03-02" } } );
copy
从主集合插入 2021 年 1 月份的数据:

db.company.translog.insert( { "serial_no": 2, "order_id": "20210101008", "bus_pay_no": "4321a297-15b4-4528-9034-cc21a256708", "tx_time": { "$date": "2021-01-01" } } );
copy
10)查询两个子集合数据分布;

year2020.translog 子集合数据量:

db.year2020.translog.count();
copy
year2021.translog 子集合数据量:

db.year2021.translog.count();
copy
11)关闭 db 连接;

db.close();
copy
12)退出 SequoiaDB Shell;

quit;
copy

5. MySQL 实例关联多维分区表

由于 company 集合空间和 translog 集合在 SequoiaDB 数据库已存在,此时 MySQL 的 CREATE DATABASE 和 CREATE TABLE 语句只是映射了 SequoiaDB 的集合空间和集合,做了关联操作。

1)登录 MySQL 实例;

/opt/sequoiasql/mysql/bin/mysql -h 127.0.0.1 -P 3306 -u root
copy
2)MySQL 创建数据库;

CREATE DATABASE company;
USE company;
copy
3)MySQL 创建表;

CREATE TABLE translog
(
serial_no INT,
order_id VARCHAR(24),
bus_pay_no VARCHAR(50),
tx_time DATE
);
copy
4)数据查询;

SELECT * FROM translog;
copy
Note:

此时可以查询到已存在的数据。

5)MySQL 实例中插入数据;

INSERT INTO translog VALUES (3, '20200521009', '3221a297-78b4-2528-7980-cc42a976605', '2020-05-21');
copy
6)数据查询;

SELECT * FROM translog;
copy
通过 MySQL 实例向 translog 表插入的数据,数据最终会保存在 SequoiaDB 巨杉数据库中。

7)退出 MySQL Shell;

\q
copy

6. 总结

本课程介绍了多维分区的概念及优势,操作方面以交易日志表为例子,创建 2020 和 2021 年的子表挂载到主表上从而创建多维分区表,同时介绍了多维分区表关联到 MySQL 实例的表中。

七、HTAP混合交易分析业务管理

1. 课程介绍

本课程主要介绍 SequoiaDB 巨杉数据库的 HTAP 能力,在 HTAP 场景下数据库产品的资源隔离能力至关重要,目前巨杉数据库的资源隔离方案有:

1)基于多租户架构规划:一个数据库通常承载着多种业务系统,为了避免不同业务之间的性能影响,根据业务系统的存储量、并发大小、数据生命周期等划分不同的数据域承载相应的数据读写;

2)基于副本的资源隔离:不同业务通过连接不同的分区副本,实现 OLTP 与 OLAP 业务资源隔离,进而提高整体性能;

由于业务形式的发展,越来越多的需求需要对交易数据进行实时分析,例如推荐、决策、监控等,传统的处理办法是使用 ETL 的方式把 OLTP 业务产生的数据同步到 OLAP 的数据数据库,导致了数据需要在不同的数据库之间流转,耗费时间成本的同时需要耗费人力成本运维多套数据库产品。

SequoiaDB 巨杉数据库采用“计算存储分离”架构,支持 MySQL、PostgreSQL 与 SparkSQL 三种关系型数据库实例、类 MongoDB 的 JSON 文档类数据库实例、以及 S3 对象存储与 Posix 文件系统的非结构化数据实例。在事务场景可以利用 SDBAPI、MySQL 和 PGSQL 实例对数据进行操作,在分析场景借助分布式计算框架 Spark 的并发计算性能,提高计算效率。

部署架构
本课程中 SequoiaDB 巨杉数据库的集群拓扑结构为三分区三副本,其中包括:1 个 SequoiaSQL-MySQL 数据库实例节点、1 个 SparkSQL 实例节点、3 个引擎协调节点,3 个编目节点与 3 个数据节点。
图片说明

关于 SequoiaDB 巨杉数据库系统架构的详细信息,请参考如下链接:

SequoiaDB 系统架构
实验环境
课程使用的实验环境为 Ubuntu Linux 16.04 64 位版本。SequoiaDB 数据库引擎以及 SequoiaSQL-MySQL 实例均为 3.4 版本、SequoiaDB-Spark驱动连接器版本为3.4、 SparkSQL 版本为 2.4.4。

2. 切换用户及查看数据库版本

切换到 sdbadmin 用户
部署 SequoiaDB 巨杉数据库和 SequoiaSQL-MySQL 实例的操作系统用户为 sdbadmin:

su - sdbadmin
copy
Note:

用户 sdbadmin 的密码为 sdbadmin

查看巨杉数据库版本
查看 SequoiaDB 巨杉数据库引擎版本:

sequoiadb --version

3. 查看节点启动列表

查看 SequoiaDB 巨杉数据库引擎节点列表:

sdblist -l

4. 在 MySQL 实例创建表

在 SequoiaSQL-MySQL 实例中创建的表将会默认使用 SequoiaDB 数据库存储引擎。

1)登录 MySQL Shell;

/opt/sequoiasql/mysql/bin/mysql -h 127.0.0.1 -P 3306 -u root
copy
2)创建数据库,并切换到该数据库;

CREATE DATABASE company;
USE company;
copy
3)创建包含自增主键字段的 employee 表;

CREATE TABLE employee
(
empno INT AUTO_INCREMENT PRIMARY KEY,
ename VARCHAR(128),
age INT
);
copy
4)向表中插入数据;

INSERT INTO employee (ename, age) VALUES ("Jacky", 36);
INSERT INTO employee (ename, age) VALUES ("Alice", 18);
copy
5)查看数据情况;

SELECT * FROM employee;
copy
6)查看 MySQL 实例读写数据连接的协调节点;

SHOW VARIABLES LIKE '%sequoiadb_conn_addr%';
copy
Note:

MySQL 的访问隔离是通过其连接的协调节点预读策略实现的。

7)退出 MySQL Shell ;

\q
copy

5. SequoiaDB 巨杉数据库访问隔离设置

数据库访问隔离功能的实现主要是通过修改数据库节点配置参数 instanceid 、 preferedinstance 和 preferedinstancemode、preferedstrict 来实现。

关于数据库配置的更多说明,请参考如下链接:

SequoiaDB 数据库配置
修改数据节点配置
1)使用 Linux 命令行进去 SequoiaDB Shell ;

sdb
copy
2)使用 javascript 语法连接协调节点,获取数据库连接;

var db = new Sdb("localhost", 11810);
copy
Note:

以下 3-5 步骤会报 -264 错误,这个是因为修改数据节点 instanceid 参数需要重启节点后才生效,可通过 getLastErrObj() 接口获取详细信息。

3)修改 11820 数据节点实例 id 为 1;

db.updateConf( { instanceid: 1 }, { svcname: { "$in": [ "11820" ] } } );
copy
4)修改 21820 数据节点实例 id 为 2;

db.updateConf( { instanceid: 2 }, { svcname: { "$in": [ "21820" ] } } );
copy
5)修改 31820 数据节点实例 id 为 3;

db.updateConf( { instanceid: 3 }, { svcname: { "$in": [ "31820" ] } } );
copy
操作截图:

870-4

修改协调节点配置
1)修改 11810 协调节点读取数据时的读取策略;

db.updateConf( { preferedinstance: "1,2,3", preferedinstancemode: "ordered", preferedstrict: true }, { GroupName: "SYSCoord", svcname: "11810" } );
copy
2)修改 21810 协调节点读取数据时的读取策略;

db.updateConf( { preferedinstance: "2,1,3", preferedinstancemode: "ordered", preferedstrict: true }, { GroupName: "SYSCoord", svcname: "21810" } );
copy
3)修改 31810 协调节点读取数据时的读取策略;

db.updateConf( { preferedinstance: "3,2,1", preferedinstancemode: "ordered", preferedstrict: true }, { GroupName: "SYSCoord", svcname: "31810" } );
copy
preferedinstance 指定执行读请求时优先选择的实例。上面命令为三个协调节点分配了不同的读取策略。例如:31810优先读取实例id为3的数据节点,即31820。

操作截图:

870-5

4)退出 SequoiaDB Shell;

quit;
copy

6. 重启 SequoiaDB 数据节点

数据节点 instanceid 参数为需要节点重启后生效,修改完参数后,重启数据节点。

sdbstop -r data
sdbstart -r data
copy

7. 查看节点参数修改状态

1)进入 SequoiaDB Shell;

sdb
copy
2)使用 javascript 语法连接协调节点,获取数据库连接;

var db=new Sdb("localhost", 11810);
copy
3)查看数据节点参数修改状态;

db.snapshot(SDB_SNAP_CONFIGS, { Role: "data" }, { NodeName: "", instanceid: "" } );
copy
此时,所有数据节点的 instanceid 均已修改完成。

操作截图:

870-6

4)查看协调节点参数修改状态;

db.snapshot(SDB_SNAP_CONFIGS, { Role: "coord" }, { NodeName: "", preferedinstance: "" } );
copy
操作截图:

870-6

此时,所有数据节点的 preferedinstance 均已修改完成。

5)退出 SequoiaDB Shell;

quit;

8. SparkSQL 设置

SparkSQL 用于处理 OLAP 类的业务,例如推荐、决策、监控等。

1)登录 Beeline 客户端,连接 SparkSQL 实例;

/opt/spark/bin/beeline -u 'jdbc:hive2://localhost:10000'
copy
2)创建 company 数据库;

CREATE DATABASE company;
copy
3)在 SparkSQL 中创建表并设置预读数据节点实例 id 顺序为优先使用实例 3,再使用实例 2;

CREATE TABLE company.employee
(
empno INT,
ename STRING,
age INT
)
USING com.sequoiadb.spark OPTIONS
(
host 'localhost:11810',
collectionspace 'company',
collection 'employee',
username '',
password '',
preferredinstance '3,2',
preferredinstancemode 'ordered',
preferredinstancestrict true
);
copy
更多的 SparkSQL 创建表参数说明,请参考如下链接:

巨杉数据库 Spark 实例建表说明

3)数据的查询,此时 SparkSQL 从副本 3 读取数据;

SELECT * FROM company.employee;
copy
操作截图:

870-7

9. 总结

本课程通过给数据组的副本设置实例 id 和协调节点设置数据读取的顺序,使得 SparkSQL 实例读取的数据节点实例 id 为 3,2。由于生产环境中 SequoiaDB 巨杉数据库集群部署的节点一般是 1 台机器 1 个数据组为 1个副本,这样的读取顺序能够把两个不同的实例分开,实现资源隔离。

八、Snapshot性能监控

1. 课程介绍

在 SequoiaDB 巨杉数据库中,快照是一种得到系统当前状态的命令,用于监视当前系统状态的方法,通过使用 snapshot 命令,我们可以自由选择监控某个节点的状态信息,从而得到应用的使用情况,进而判断如何对数据库信息进行维护,本课程将带领您在已经部署 SequoiaDB 巨杉数据库引擎及创建了 MySQL 实例的环境中,学习如何正常使用快照查看我们对应的 SequoiaDB 数据库信息情况。

部署架构
本课程中 SequoiaDB 巨杉数据库的集群拓扑结构为三分区单副本,其中包括:1 个 SequoiaSQL-MySQL 数据库实例节点、1 个引擎协调节点,1 个编目节点与3个数据节点。

880-1

关于 SequoiaDB 巨杉数据库系统架构的详细信息,请参考如下链接:

SequoiaDB 系统架构
实验环境
课程使用的实验环境为 Ubuntu Linux 16.04 64 位版本。SequoiaDB 数据库引擎以及 SequoiaSQL-MySQL 实例均为 3.4 版本。

2. 切换用户及查看数据库版本

切换到 sdbadmin 用户
部署 SequoiaDB 巨杉数据库和 SequoiaSQL-MySQL 实例的操作系统用户为 sdbadmin。

su - sdbadmin
copy
Note:

用户 sdbadmin 的密码为 sdbadmin

查看巨杉数据库版本
查看 SequoiaDB 巨杉数据库引擎版本:

sequoiadb --version

3. 查看节点启动列表

查看 SequoiaDB 巨杉数据库引擎节点列表:

sdblist

4. 使用数据表并插入数据

进入 MySQL Shell ,连接 SequoiaSQL-MySQL 实例并创建 company 数据库,为接下来验证 MySQL 语法特性做准备。

登录 MySQL Shell
/opt/sequoiasql/mysql/bin/mysql -h 127.0.0.1 -P 3306 -u root
copy
使用数据库
CREATE DATABASE company;
USE company;
copy
创建数据表
在 SequoiaSQL-MySQL 实例中创建的表将会默认使用 SequoiaDB 数据库存储引擎,包含主键或唯一键的表将会默认以唯一键作为分区键,进行自动分区。

1)创建包含自增主键字段的 employee 表;

CREATE TABLE employee
(
empno INT AUTO_INCREMENT PRIMARY KEY,
ename VARCHAR(128),
age INT
);
copy
2)数据写入操作;

INSERT INTO employee (ename, age) VALUES ("Jacky", 36);
INSERT INTO employee (ename, age) VALUES ("Alice", 18);
copy
3)查看数据情况;

SELECT * FROM employee;
copy
4)退出 MySQL Shell ;

\q
copy

5. SNAPSHOT 监控

本章节列了常用的快照类型,具体性能快照请参考如下链接:

SequoiaDB 快照列表说明
快照列表:

快照标示 快照类型
SDB_SNAP_CONTEXTS 上下文快照
SDB_SNAP_CONTEXTS_CURRENT 当前会话上下文快照
SDB_SNAP_SESSIONS 会话快照
SDB_SNAP_SESSIONS_CURRENT 当前会话快照
SDB_SNAP_COLLECTIONS 集合快照
SDB_SNAP_COLLECTIONSPACES 集合空间快照
SDB_SNAP_DATABASE 数据库快照
SDB_SNAP_SYSTEM 系统快照
SDB_SNAP_CATALOG 编目信息快照
SDB_SNAP_TRANSACTIONS 事务快照
SDB_SNAP_TRANSACTIONS_CURRENT 当前事务快照
SDB_SNAP_ACCESSPLANS 访问计划缓存快照
SDB_SNAP_HEALTH 节点健康检测快照
SDB_SNAP_CONFIGS 配置快照
SDB_SNAP_SVCTASKS 服务任务快照
SDB_SNAP_SEQUENCES 序列快照
1)模拟 MySQL 查询。编写 shell 查询脚本,脚本名为 select.sh,用于模拟前端 MySQL 实例发起的查询;

cat > select.sh <<EOF
#!/bin/bash
i=1
while [ \{i}+1))
sleep 1s
done
EOF
copy
2)使用 nohup 命令使 select.sh 脚本后台运行;

nohup sh select.sh &
copy
3)在 Linux 命令行中进入 SequoiaDB Shell 交互式界面;

sdb
copy
4)使用 JavaScript 连接协调节点,并获取数据库连接;

var db = new Sdb("localhost", 11810);
copy
5)查看SDB数据库中的会话;

db.snapshot(SDB_SNAP_SESSIONS, { Source: { $regex: 'MySQL.*' } } );
copy
通过 LastOpType 字段可以知道当前会话最后一次操作类型,通过 TotalDataRead 和 TotalIndexRead 查看当前会话数据记录读和索引读情况,通过 TotalSelect 字段知道当前会话查询总选取记录数量 ,通过 UserCPU 和 SysCPU 了解当前会话 cpu 资源使用的,通过 LastOpInfo 字段可以查看到当前会话对集合操作的具体信息,而通过LastOpBegin 和 LastOpEnd 可以知道最后一次操作的耗时。

Note:

{ Source:{$regex:'MySQL.*'} 使用正则匹配的方式过滤 Source 列中以 MySQL 为开头的会话信息。

会话快照中查询出来的字段信息,详情请查看:

SequoiaDB 会话快照列表说明
操作截图:

880-4

其中

6)查看数据库状态;

db.snapshot(SDB_SNAP_DATABASE);
copy
如果数据库状态异常,ErrNodes 字段会列出异常信息。

操作截图:

880-4

7)查看集合空间快照;

db.snapshot(SDB_SNAP_COLLECTIONSPACES, { Name: "company" } );
copy
Name 参数指定了需要查看的集合空间名,如果想查看所有集合空间,可以使用如下命令:

db.snapshot(SDB_SNAP_COLLECTIONSPACES);
copy
8)查看集合;

db.snapshot(SDB_SNAP_COLLECTIONS, { Name: "company.employee" } );
copy
Name 参数指定了需要查看的集合,如果想查看所有集合,可以使用如下命令:

db.snapshot(SDB_SNAP_COLLECTIONS);
copy
9)关闭 db 数据库连接;

db.close();
copy
10)退出 SequoiaDB Shell ;

quit;

6. 保存快照信息

若查询的快照信息输出过大,可以把查询结果输出到一个文件中,便于分析。

1)在 Linux 命令行中输入以下命令,使用嵌入式命令行连接到数据库协调节点;

sdb 'var db=new Sdb("localhost", 11810)'
copy
2)获取集合信息重定向到指定文件;

sdb 'db.snapshot(SDB_SNAP_COLLECTIONS, { Name: "company.employee" } )' > /home/sdbadmin/snap_collection.log
copy
3)关闭 db 数据库连接;

sdb 'db.close();'
copy
4)查看重定向的文件内容;

cat /home/sdbadmin/snap_collection.log
copy

7. 总结

SequoiaDB 巨杉数据库提供了多种快照类型,以供我们能够高效准确的定位系统当前的健康状态,判断是否存在某些相应的系统问题,有利于我们快速分析系统问题并作出判断以及对系统的性能进行监控及早预防可能存在的问题。

九、诊断日志分析

1. 课程介绍

本课程为大家模拟集群节点故障时如何正确的使用 SeuoqiaDB 巨杉数据库的诊断日志,高效准确的定位问题所在。

部署架构
本课程中 SequoiaDB 巨杉数据库的集群拓扑结构为三分区单副本,其中包括:1 个 SequoiaSQL-MySQL 数据库实例节点、1 个引擎协调节点,1 个编目节点与 3 个数据节点。

890-1

关于 SequoiaDB 巨杉数据库系统架构的详细信息,请参考如下链接:

SequoiaDB 系统架构
实验环境
课程使用的实验环境为 Ubuntu Linux 16.04 64 位版本。SequoiaDB 数据库引擎以及 SequoiaSQL-MySQL 实例均为 3.4 版本。

2. 切换用户及查看数据库版本

切换到 sdbadmin 用户
部署 SequoiaDB 巨杉数据库和 SequoiaSQL-MySQL 实例的操作系统用户为 sdbadmin。

su - sdbadmin
copy
Note:

用户 sdbadmin 的密码为 sdbadmin

查看巨杉数据库版本
查看 SequoiaDB 巨杉数据库引擎版本:

sequoiadb --version

3. 查看节点启动列表

查看 SequoiaDB 巨杉数据库引擎节点列表:

sdblist

4. 创建数据库及数据表

进入 MySQL Shell ,连接 SequoiaSQL-MySQL 实例并创建表,为接下来日志诊断分析做准备。

登录 MySQL Shell
/opt/sequoiasql/mysql/bin/mysql -h 127.0.0.1 -P 3306 -u root
copy
创建数据库
CREATE DATABASE company;
USE company;
copy
创建数据表
在 SequoiaSQL-MySQL 实例中创建的表将会默认使用 SequoiaDB 巨杉数据库存储引擎,包含主键或唯一键的表将会默认以唯一键作为分区键进行自动分区。

1)创建包含自增主键字段的 employee 表;

CREATE TABLE employee
(
empno INT AUTO_INCREMENT PRIMARY KEY,
ename VARCHAR(128),
age INT
);
copy
2)基本的数据写入操作;

INSERT INTO employee (ename, age) VALUES ("Jacky", 36);
INSERT INTO employee (ename, age) VALUES ("Alice", 18);
copy
3)查看数据情况;

SELECT * FROM employee;
copy
4)退出 MySQL Shell;

\q

5. 模拟节点故障

目前集群为正常状态,我们停止一个数据节点 11820 模拟节点故障的情况。

1)停止 11820 数据节点;

sdbstop -p 11820
copy
2)登录 MySQL Shell ;

/opt/sequoiasql/mysql/bin/mysql -h 127.0.0.1 -P 3306 -u root
copy
3)查询数据;

SELECT * FROM company.employee;
copy
操作截图:

890-4

根据图片中的错误码 40250 计算得出 SequoiaDB 对应错误码为 -250(节点处于业务故障状态)。

关于 SequoiaSQL-MySQL 错误码的详细信息,请参考如下链接:

SequoiaSQL-MySQL 错误码
4)退出 MySQL Shell;

\q

6. 通过快照查询集群情况

在 SequoiaDB 中,快照是一种得到系统当前状态的命令,当集群故障时我们可以使用快照进行初步分析节点;

1)使用嵌入命令模式连接 SequoiaDB 巨杉数据库协调节点;

sdb 'db = new Sdb("localhost", 11810)'
copy
2)查询数据库快照列出当前数据库节点的数据库监视信息;

sdb 'db.snapshot(SDB_SNAP_DATABASE, {}, { "ErrNodes": "" } )'
copy
890-2

从上图中我们可以看出集群中存在错误节点为 11820。

7. 错误日志分析

查找协调节点日志文件所在的文件夹,打开日志文件 sdbdiag.log。

1)查询协调节点日志文件目录;

sdb 'db.list(SDB_LIST_GROUPS, { "GroupName": "SYSCoord" } )'
copy
890-2

2)打开协调节点日志文件;

vi /opt/sequoiadb/database/coord/11810/diaglog/sdbdiag.log
copy
如有关键字 ERROR,则说明数据库有报错,并根据 rc 后面的错误代码查看具体错误信息,本次错误代码为 -79。

890-5

Note:

每次虚拟机环境初始化,数据节点 id 和 所属数据组 id 序号都会有变化。

具体错误代码请参考如下链接:

SequoiaDB 错误码
根据 NodeID 定位到发生错误的具体节点,查看该节点的诊断日志文件。

3)根据协调节点日志文件中错误信息,定位具体服务节点,其中 GroupID 和 NodeID 以日志文件中的具体值为准;

sdb 'db.list(SDB_LIST_GROUPS, { GroupID: 1002, "Group.NodeID": 1002}, {} );'
copy
4)打开 11820 数据节点日志文件;

more /opt/sequoiadb/database/data/11820/diaglog/sdbdiag.log
copy
890-5

Note:

按键盘 shift + g 去到文件最后可以看到节点为正常停止。

5)group1 数据节点服务未启动 , 启动 group1 的 11820 节点;

sdbstart -p 11820
copy
操作截图:

890-7

8. 验证集群是否可用

1)登录 MySQL Shell ;

/opt/sequoiasql/mysql/bin/mysql -h 127.0.0.1 -P 3306 -u root
copy
2)查询数据并向表中插入数据;

SELECT * FROM company.employee;
INSERT INTO company.employee (ename, age) VALUES ("Ben", 21);
copy
此时数据服务已经恢复正常,能够正常写入和查询;

3)退出 MySQL Shell ;

\q

9. 总结

本课程通过模拟了当节点服务出现异常的时候,主要有以下步骤:

1)从快照中初步得出故障节点;

2)找寻日志文件所在的路径;

3)通过日志文件找出相应的错误码;

4)根据文件错误码的提示,进行分析从而得出异常信息出现的原因;

5)最后根据原因寻找合理性的解决方法;

在 SequoiaDB 巨杉数据库使用过程之中,合理性的使用日志文件信息可以准确高效的解决我们所遇到的问题。

十、考试1

考试介绍
此考试是在完成安装部署 SequoiaDB 巨杉数据库的环境中完成集群的弹性扩容、数据库一致性配置、数据域创建、多维分区的使用和集群 Snapshot 监控操作。

随着业务量的不断增长,集群难免会遇到数据存储的容量问题和整个集群的性能问题,此时需要进行集群扩容来提升集群性能及增加数据存储空间,通过一致配置和数据域进行数据存储规划,使用多维分区优化手段处理大数据量流水表,利用快照(Snapshot )进行集群的监控。

Note:

考试内容需在系统用户 sdbadmin 下完成,用户密码为 sdbadmin
SequoiaDB 巨杉数据库安装目录(/opt/sequoiadb)
知识点
1)SequoiaDB 弹性拓展功能

2)数据库强弱一致性配置

3)数据域管理

4)多维分区规划

5)SNAPSHOT 性能监控

考试内容
1)新增数据节点组 group4 并在该数据组中创建 11850 数据节点;

2)创建域 company_domain,其中域包含有 group1,group2,group3;

3)创建集合空间 company,存放于 company_domain 域中;

4)在集合空间 company 创建 ReplSize 为 0 的强一致集合 employee;

5)在 company.employee 表中插入数据为(empno:10001, ename:'Georgi', age:48);

6)在 company 集合空间中创建以 tx_time 为分区键,字段类型为 date 的主集合 log;

7)分别创建 year2020.log 和 year2021.log 子集合,year2020 和year2021 为集合空间名。两个子集合的 hash 分区键字段为 serial_no(log表中的主键字段,为序列号)。并将两个子集合挂载到主集合 company.log,子集合 year2020.log 保存小于 2021年的数据,而子集合 year2021.log 保存大于等于 2021 年的数据;

8)用 snapshot 中的集合快照查看 company.employee 的集合并输出查询结果到 /home/sdbadmin/snap_collection.log 文件中;

9)用 snapshot 中的配置快照查看集群中所有协调节点、编目节点和数据节点的诊断日志路径并输出查询结果到 /home/sdbadmin/snap_diagpath.log 文件中;

考试要求
1)正确创建数据组和数据节点

2)数据域的使用

3)集合强弱一致性配置

4)多维分区规划

5)SNAPSHOT 监控

十一、考试2

考试介绍
此考试是在完成安装部署 SequoiaDB 巨杉数据库环境中完成高可用、事务、和访问隔离的操作。

SequoiaDB 巨杉数据库集群通过部署多副本方式避免出现单点故障,通过事务提供原子性操作,通过访问隔离,连接不同的分区副本,实现 OLTP 与 OLAP 业务资源隔离,进而提高整体性能。

Note:

考试内容需在系统用户 sdbadmin 下完成,用户密码为 sdbadmin
SequoiaDB 巨杉数据库安装目录(/opt/sequoiadb)
SequoiSQL-MySQL 安装目录(/opt/sequoiasql/mysql)
知识点
1)事务隔离级别设置;

2)集群的高可用测试;

3)访问隔离设置;

考试内容
1)通过 SequoiaSQL-MySQL 实例创建 company 数据库以及数据表 employee,字段为(empno INT, ename VARCHAR(128), age INT),其中 empno 为主键自增;

2)写入表 company.employee 数据值为(empno:10001, ename:"Jacky", age:36);

3)在 SequoiaDB Shell 中设置事务隔离级别为 RC(读已提交);

4)登录 MySQL,开始事务,插入数据(ename:'lazhu', age:22),其中 empno 字段为自增字段,无需填写,执行插入后并提交事务。

5)开始 MySQL 事务,更新 empno:10002 的记录年龄为 20( age:20 )并提交事务;

6)关闭 31820 数据节点;

7)开始 MySQL 事务,插入数据( empno:10003, ename:'Susan', age:32 )并提交事务;

8)启动 31820 数据节点;

9)修改 11820 数据节点实例 id 为 1,修改 21820 数据节点实例 id 为 2,配置 11810 协调节点读取数据时的读取策略为优先使用数据节点实例 2,后使用数据节点实例 1 ,重启节点使参数生效;

考试要求
1)通过 SequoiaDB Shell 管理事务;

2)停止单节点进行集群的高可用测试;

3)配置不同协调节点访问不同数据节点实例;

全部评论

相关推荐

牛客583549203号:腾讯还好,况且实习而已,实习生流动性很大,属于正常现象,记得和HR委婉解释
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务