高级运维管理

弹性扩展能力
创建 company_domain 逻辑域: db.createDomain("company_domain", [ "group1", "group2", "group3" ], { AutoSplit: true } );
创建 company 集合空间: db.createCS("company", { Domain: "company_domain" } );
创建 employee 集合: db.company.createCL("employee", { "ShardingKey": { "_id": 1 }, "ShardingType": "hash", "ReplSize": -1, "Compressed": true, "CompressionType": "lzw", "AutoSplit": true, "EnsureShardingIndex": false } );
使用 JavaScript 的 for 循环向 employee 集合中写入 1000 条数据:

for (var i = 0; i < 1000; i++) 
{
    var record = { empno: i, ename: "TEST", age: 20 };
    db.company.employee.insert(record);
}

通过查看集合快照信息,获取集合分区情况: db.snapshot(SDB_SNAP_COLLECTIONS, { "Name": "company.employee" }, { "Details.GroupName": "", "Details.Group.TotalRecords": "" } );

在这里插入图片描述在这里插入图片描述
在这里插入图片描述新增数据分区:
新增数据组:var dataRG = db.createRG("group4");
添加数据节点: dataRG.createNode("sdbserver1", 11850, "/opt/sequoiadb/database/data/11850/", { logfilenum: 5, transactionon: true } );
启动数据节点组:dataRG.start();
查看数据库扩展后状态: sdblist -t all -l -m local
在这里插入图片描述

原有集合数据重分布:
数据域 company_domain 增加数据组:db.getDomain("company_domain").addGroups( { Groups: [ 'group4' ] } );
查看域信息: db.listDomains();
将集合的部分数据迁移到新的数据组上:

db.company.employee.split("group1", "group4", 25);
db.company.employee.split("group2", "group4", 25);
db.company.employee.split("group3", "group4", 25);

在这里插入图片描述

split方法说明

通过查看集合快照信息,获取集合分区情况:db.snapshot(SDB_SNAP_COLLECTIONS, { "Name": "company.employee" }, { "Details.GroupName": "", "Details.Group.TotalRecords": "" } );

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

for (var i = 1000; i < 2000; i++) 
{
    var record = { empno: i, ename: "TEST", age: 20 };
    db.company.employee.insert(record);
}

通过查看集合快照信息,获取集合分区情况: db.snapshot(SDB_SNAP_COLLECTIONS, { "Name": "company.employee" }, { "Details.GroupName": "", "Details.Group.TotalRecords": "" } );
创建集合,分区方式为 hash ,分区键为 serial_no: db.company.createCL("log", {"ShardingKey": { "serial_no": 1 }, "ShardingType": "hash", "ReplSize": -1, "Compressed": true, "CompressionType": "lzw", "AutoSplit": true, "EnsureShardingIndex": false } );

分布式事务管理
事务的原子性:
登录MySQL:/opt/sequoiasql/mysql/bin/mysql -h 127.0.0.1 -P 3306 -u root -proot
开始事务,执行插入数据与更新数据操作,并查看数据情况后回滚事务;:

BEGIN;
INSERT INTO employee (ename, age) VALUES ("Alice", 18);
UPDATE employee SET age = 37 WHERE ename = "Jacky";
SELECT * FROM employee;
ROLLBACK;

开始事务,执行插入数据并提交事务:

BEGIN;
INSERT INTO employee (ename, age) VALUES ("Susan", 21);
COMMIT;

查看所有节点事务隔离级别: db.snapshot(SDB_SNAP_CONFIGS, {}, { NodeName: "", transactionon: "", transisolation: "" } );
在这里插入图片描述
更多信息

验证 RU 读未提交隔离级别:
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
修改事务隔离级别为 RC:
修改事务隔离级别,1 代表读已提交:db.updateConf( { transisolation: 1 }, { Global: true } );
查询节点事务隔离级别: db.snapshot(SDB_SNAP_CONFIGS, {}, { NodeName: "", transactionon: "", transisolation: "" } );
只有当数 sessionA 据提交后,sessionB 才能看到修改后的数据。

修改事务隔离级别为 RS:
修改事务隔离级别,2 表示隔离界别为读稳定性:db.updateConf( { transisolation: 2 }, { Global: true } );
查询节点事务隔离级别:db.snapshot(SDB_SNAP_CONFIGS, {}, { NodeName: "", transactionon: "", transisolation: "" } );
sessionB 的 update 操作发生等待,只有等 sessionA 执行 rollback 或者 commit 后,sessionB 才能执行成功。

强弱一致性配置
创建 company_domain 逻辑域: db.createDomain("company_domain", [ "group1", "group2", "group3" ], { AutoSplit: true } );
创建 company 集合空间: db.createCS("company", { Domain: "company_domain" } );
创建 employee 集合: db.company.createCL("employee", { "ShardingKey": { "_id": 1 }, "ShardingType": "hash", "ReplSize": -1, "Compressed": true, "CompressionType": "lzw", "AutoSplit": true, "EnsureShardingIndex": false } );
查询集合一致性参数 ReplSize:db.snapshot(SDB_SNAP_CATALOG, { "Name": "company.employee" }, { "ReplSize": "" } );

弱一致性配置:
使用 alter 方法可以修改集合的 ReplSize 参数。 当该参数修改为 -1 时,表示写请求需同步到该复制组若干活跃的节点之后,数据库写操作才返回应答给客户端。
修改集合一致性配置:db.company.employee.alter( { ReplSize: -1 } );
查询集合一致性参数 ReplSize:db.snapshot(SDB_SNAP_CATALOG, { "Name": "company.employee" }, { "ReplSize": "" } );

强一致性配置:
当 ReplSize 参数设置为 0 时,表示写请求需同步到该复制组的所有节点之后,数据库写操作才返回应答给客户端。
修改集合一致性配置:db.company.employee.alter( { ReplSize: 0 } );
查询集合一致性参数 ReplSize:db.snapshot(SDB_SNAP_CATALOG, { "Name": "company.employee" }, { "ReplSize": "" } );

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

CREATE TABLE employee 
(
empno INT AUTO_INCREMENT PRIMARY KEY,
ename VARCHAR(128),
age INT
);

关闭巨杉数据库节点服务:
关闭11820数据节点:sdbstop -p 11820
查看数据库状态: sdblist -t all -l -m local

数据域管理
创建数据域:db.createDomain("company_domain", [ "group1", "group2" ], { AutoSplit: true } );
在这里插入图片描述

查看域信息:db.listDomains();
创建 company 集合空间: db.createCS("company", { Domain: "company_domain" } );
创建 employee 集合: db.company.createCL("employee", { "ShardingKey": { "_id": 1 }, "ShardingType": "hash", "ReplSize": -1, "Compressed": true, "CompressionType": "lzw", "AutoSplit": true, "EnsureShardingIndex": false } );
使用 JavaScript 的 for 循环向 employee 集合中写入 1000 条数据:

for (var i = 0; i < 1000; i++) 
{
    var record = { empno: i, ename: "TEST", age: 20 };
    db.company.employee.insert(record);
}

通过查看集合快照信息,获取集合分区情况: db.snapshot(SDB_SNAP_COLLECTIONS, { "Name": "company.employee" }, { "Details.GroupName": "", "Details.Group.TotalRecords": "" } );

修改数据域:
增加数据组:
获取数据组:var domain = db.getDomain("company_domain");
向已经有的域中添加数据组:domain.addGroups( { Groups: [ "group3" ] } );
查看修改后域的信息: db.listDomains();

数据重新分布:
将 group1 数据组部分数据切分到新加入的数据组中:db.company.employee.split("group1", "group3", 33);
将 group2 数据组部分数据切分到新加入的数据组中:db.company.employee.split("group2", "group3", 33);
在这里插入图片描述
通过查看集合快照信息,获取集合分区情况: db.snapshot(SDB_SNAP_COLLECTIONS, { "Name": "company.employee" }, { "Details.GroupName": "", "Details.Group.TotalRecords": "" } );

减少数据组:
将 company.employee 集合中存储于 group3 数据组部分数据通过范围切把数据切分 group1 数据组中:db.company.employee.split("group3", "group1", { Partition: 1373 }, { Partition: 2048 } );
将 company.employee 集合中存储于 group3 数据组部分数据分别切分 group2 数据组中:db.company.employee.split("group3", "group2", { Partition: 3421 }, { Partition: 4096 } );
将 company.log 集合中存储于 group3 数据组部分数据分别切分 group1 数据组中:db.company.log.split("group3", "group1", { Partition: 2730 }, { Partition: 3413 } );
通过查看集合快照信息,获取集合分区情况: db.snapshot(SDB_SNAP_COLLECTIONS, { "Name": "company.employee" }, { "Details.GroupName": "", "Details.Group.TotalRecords": "" } );
通过查看集合快照信息,获取集合分区情况: db.snapshot(SDB_SNAP_COLLECTIONS, { "Name": "company.log" }, { "Details.GroupName": "", "Details.Group.TotalRecords": "" } );
获取数据域: var domain = db.getDomain("company_domain");
向已有域中删除数据组: domain.removeGroups( { Groups: [ "group3" ] } );
在这里插入图片描述
在这里插入图片描述
多维分区规则:

创建 company_domain 逻辑域: db.createDomain("company_domain", [ "group1", "group2", "group3" ], { AutoSplit: true } );
创建主集合空间: db.createCS("company", { Domain: "company_domain" } );
创建主集合: db.company.createCL("translog", { "IsMainCL": true, "ShardingKey": {"tx_time": 1 }, "ShardingType": "range" } );
创建子集合空间:
创建子集合空间 year2020 :db.createCS("year2020", { "Domain": "company_domain" } );
创建子集合空间 year2021 :db.createCS("year2021", { "Domain": "company_domain" } );
创建子集合 year2020.translog :db.year2020.createCL("translog", { "ShardingKey": { "_id": 1 }, "ShardingType": "hash", "ReplSize": -1, "Compressed": true, "CompressionType": "lzw", "AutoSplit": true, "EnsureShardingIndex": false } );
创建子集合 year2021.translog :db.year2021.createCL("translog", { "ShardingKey": { "_id": 1 }, "ShardingType": "hash", "ReplSize": -1, "Compressed": true, "CompressionType": "lzw", "AutoSplit": true, "EnsureShardingIndex": false } );
挂载子集合:
挂载子集合 year2020.translog :db.company.translog.attachCL("year2020.translog", { "LowBound": { "tx_time": MinKey() }, UpBound: { tx_time: { "$date": "2021-01-01" } } } );
挂载子集合 year2021.translog :db.company.translog.attachCL("year2021.translog", { LowBound: { "tx_time": { "$date": "2021-01-01" } }, "UpBound": { "tx_time": MaxKey() } } );
在这里插入图片描述
SequoiaDB数据类型

MySQL 实例关联多维分区表:
由于 company 集合空间和 translog 集合在 SequoiaDB 数据库已存在,此时 MySQL 的 CREATE DATABASE 和 CREATE TABLE 语句只是映射了 SequoiaDB 的集合空间和集合,做了关联操作。
登录 MySQL 实例: /opt/sequoiasql/mysql/bin/mysql -h 127.0.0.1 -P 3306 -u root
MySQL创建数据库:create database company; use company;
MySQL创建表:

CREATE TABLE translog
(
serial_no INT,
order_id VARCHAR(24),
bus_pay_no VARCHAR(50),
tx_time DATE
);

MySQL实例插入数据:INSERT INTO translog VALUES (3, '20200521009', '3221a297-78b4-2528-7980-cc42a976605', '2020-05-21');

HTAP混合交易分析业务管理
登录MySQL:/opt/sequoiasql/mysql/bin/mysql -h 127.0.0.1 -P 3306 -u root
创建数据库:create database company; use company;
创建包含自增主键字段的employee表:

CREATE TABLE employee 
(
empno INT AUTO_INCREMENT PRIMARY KEY,
ename VARCHAR(128),
age INT
);

查看 MySQL 实例读写数据连接的协调节点: SHOW VARIABLES LIKE '%sequoiadb_conn_addr%';
在这里插入图片描述
SequoiaDB 巨杉数据库访问隔离设置:
在这里插入图片描述
修改 11820 数据节点实例 id 为 1: db.updateConf( { instanceid: 1 }, { svcname: { "$in": [ "11820" ] } } );
修改 21820 数据节点实例 id 为 2: db.updateConf( { instanceid: 2 }, { svcname: { "$in": [ "21820" ] } } );
修改 31820 数据节点实例 id 为 3:db.updateConf( { instanceid: 3 }, { svcname: { "$in": [ "31820" ] } } );

修改协调节点配置:
修改 11810 协调节点读取数据时的读取策略: db.updateConf( { preferedinstance: "1,2,3", preferedinstancemode: "ordered", preferedstrict: true }, { GroupName: "SYSCoord", svcname: "11810" } );
修改 21810 协调节点读取数据时的读取策略: db.updateConf( { preferedinstance: "2,1,3", preferedinstancemode: "ordered", preferedstrict: true }, { GroupName: "SYSCoord", svcname: "21810" } );
修改 31810 协调节点读取数据时的读取策略: db.updateConf( { preferedinstance: "3,2,1", preferedinstancemode: "ordered", preferedstrict: true }, { GroupName: "SYSCoord", svcname: "31810" } );
在这里插入图片描述
在这里插入图片描述

查看节点参数修改状态:
查看数据节点参数修改状态:db.snapshot(SDB_SNAP_CONFIGS, { Role: "data" }, { NodeName: "", instanceid: "" } );
查看协调节点参数修改状态: db.snapshot(SDB_SNAP_CONFIGS, { Role: "coord" }, { NodeName: "", preferedinstance: "" } );

SparkSQL 设置:
登录 Beeline 客户端,连接 SparkSQL 实例: /opt/spark/bin/beeline -u 'jdbc:hive2://localhost:10000'
创建 company 数据库: CREATE DATABASE company;
在 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
);

SparkSQL建表

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

CREATE TABLE employee 
(
empno INT AUTO_INCREMENT PRIMARY KEY,
ename VARCHAR(128),
age INT
);

在这里插入图片描述模拟 MySQL 查询。编写 shell 查询脚本,脚本名为 select.sh,用于模拟前端 MySQL 实例发起的查询:

cat > select.sh <<EOF
#!/bin/bash
i=1
while [ \$i -le 600 ]
do
mysql -uroot -h127.0.0.1 -Dcompany -e "SELECT * FROM employee;"
i=\$((\${i}+1))
sleep 1s
done
EOF

使用 nohup 命令使 select.sh 脚本后台运行: nohup sh select.sh &
查看SDB数据库中的会话: db.snapshot(SDB_SNAP_SESSIONS, { Source: { $regex: 'MySQL.*' } } );
在这里插入图片描述详情

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

保存快照信息:
在 Linux 命令行中输入以下命令,使用嵌入式命令行连接到数据库协调节点:sdb 'var db=new Sdb("localhost", 11810)'
获取集合信息重定向到指定文件:sdb 'db.snapshot(SDB_SNAP_COLLECTIONS, { Name: "company.employee" } )' > /home/sdbadmin/snap_collection.log

诊断日志分析

登录 MySQL Shell:/opt/sequoiasql/mysql/bin/mysql -h 127.0.0.1 -P 3306 -u root
创建数据库:CREATE DATABASE company;USE company;

创建包含自增主键字段的 employee 表:

CREATE TABLE employee 
(
empno INT AUTO_INCREMENT PRIMARY KEY, 
ename VARCHAR(128), 
age INT
);

基本的数据写入操作:

INSERT INTO employee (ename, age) VALUES ("Jacky", 36);
INSERT INTO employee (ename, age) VALUES ("Alice", 18);

在这里插入图片描述
SequoiaSQL-MySQL错误码

查询数据库快照列出当前数据库节点的数据库监视信息:sdb 'db.snapshot(SDB_SNAP_DATABASE, {}, { "ErrNodes": "" } )'
查询协调节点日志文件目录: sdb 'db.list(SDB_LIST_GROUPS, { "GroupName": "SYSCoord" } )'

打开协调节点日志文件: vi /opt/sequoiadb/database/coord/11810/diaglog/sdbdiag.log
在这里插入图片描述根据协调节点日志文件中错误信息,定位具体服务节点,其中 GroupID 和 NodeID 以日志文件中的具体值为准: sdb 'db.list(SDB_LIST_GROUPS, { GroupID: 1002, "Group.NodeID": 1002}, {} );'

打开 11820 数据节点日志文件: more /opt/sequoiadb/database/data/11820/diaglog/sdbdiag.log

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值