作者简介:
花名:绪宁,OceanBase 数据库解决方案架构师
创建租户
方法一:OCP 创建
- 确认可分配资源
具体可以分配多少内存,可以通过【资源管理】查看各节点的剩余资源
2. 新建租户
3. 填写租户信息
zone 优先级主要是 primary_zone 设置 leader优先级,如果优先级全部相同,那么 leader 会打散到所有节点上。
方法二:手动创建
1. 确认可分配资源
新租户可以分配的内存大小为 memory_limit - system_memory - sys 租户内存,CPU 数量为 cpu_count - sys 租户 cpu。
# 查询参数
show parameters where name in ('memory_limit','system_memory','cpu_count');
# 查询 sys 租户资源
select * from DBA_OB_UNIT_CONFIGS;
2. 创建租户
# 创建资源规格,5C14G,日志40G,IOPS 10000000。
create resource unit unit_1 max_cpu 5, min_cpu 5, memory_size '15G', log_disk_size '50G', max_iops 10000000;
# 创建资源池,指定 资源规格以及 zone_list。
create resource pool pool_1 unit = 'unit_1', unit_num = 1, zone_list = ('zone1','zone2','zone3');
# 创建租户,指定副本数量3,primary_zone,以及资源池和白名单。
create tenant perf replica_num = 3,primary_zone='RANDOM', resource_pool_list=('pool_1') set ob_tcp_invited_nodes='%';
3. 修改 root 用户密码
创建完租户,默认的 root 密码为空,如果需要可以修改密码。
# 租户的 root 用户登陆后执行修改 sql
set password for root=password('xxx');
连接数据库
主要有两种连接方式:
1. 通过 OBServer 直连(默认端口 2881)
mysql -h xxx.xxx.xxx.xxx -uroot@sys -P2881 -p -c -A oceanbase
2. 通过 OBProxy 连接(默认端口2883)
mysql -h xxx.xxx.xxx.xxx -uroot@sys#obdemo -P2883 -p -c -A oceanbase
使用 OBProxy 连接时,用户信息需要包括【用户名@租户名#集群名】;如果是 OBServer 连接,那么只需要包括【用户名@租户名】。
参数和变量
区别:
参数(parameter)可以控制集群的负载均衡、合并时间、合并方式、资源分配和模块开关等功能,主要针对集群、Zone、OBServer 和 租户级别进行配置。
参数分集群级别和租户级别,可以通过查询 SHOW PARAMETERS LIKE'max_syslog_file_count'; 中的scope 列来确定,cluster为集群级别,tenant为租户级别。
变量(variable)可以控制数据库系统的各种行为,如缓存大小、并发连接数等,主要是针对租户级别内 Global 和 Session 级别进行设置。
查看参数和变量
OBServer 参数 :
# 方法一
show parameters like '%enable_rebalance%';
# 方法二
show parameters where name in ('memstore_limit_percentage','freeze_trigger_percentage','writing_throttling_trigger_percentage');
# 方法三
select * from oceanbase.GV$OB_PARAMETERS where NAME in ('memstore_limit_percentage','freeze_trigger_percentage','writing_throttling_trigger_percentage');
OBProxy 参数:
show proxyconfig like '%query_digest_time_threshold%';
查看变量
show variables like '%timeout%';
修改参数和变量
要注意,这里的参数修改会自动变更到安装目录的 etc 下的配置文件,但是如果是 OBD 创建的集群,不会自动同步到 OBD 的配置文件中,如果后续需要使用 OBD 重启,那么需要手动修改 OBD 的配置,防止启动后配置有差异影响业务。
OBServer 参数 :
alter system set enable_rebalance=False;
OBProxy 参数:
alter proxyconfig set query_digest_time_threshold='101ms';
修改变量
# 设置全局级别变量,当前 session 不生效,新 session 生效。
set global ob_query_timeout=10000000;
# 设置会话级别变量,当前 session 生效,其他 session 不生效。
set session ob_query_timeout=10000000;
转储合并
转储
主动触发转储
## 不带租户则表示所有租户
alter system minor freeze tenant=xxx;
查看进行中的转储任务
SELECT * FROM oceanbase.GV$OB_TABLET_COMPACTION_PROGRESS WHERE TYPE='MINI_MERGE'\G;
需要关注的字段:
- TYPE:表示 Compaction 任务的类型。
- MINOR_MERGE:表示 Minor,多个 Mini SSTable 合成一个 Minor SSTable。
- MINI_MERGE:表示转储,冻结 MemTable 通过转储变成 Mini SSTable。
- MEDIUM_MERGE:表示分区级合并。
- MAJOR_MERGE:表示合并。
- META_MAJOR_MERGE :Buffer 表转储。
- STATUS:表示任务状态。任务正在运行中时,该字段值为 NODE_RUNNING。
- DATA_SIZE:表示需要转储的总数据量。
- UNFINISHED_DATA_SIZE:表示转储未完成的数据量。
- ESTIMATED_FINISH_TIME:表示预计完成时间。
查看转储历史
SELECT * FROM oceanbase.GV$OB_TABLET_COMPACTION_HISTORY WHERE TYPE='MINI_MERGE'\G
合并
手动触发合并
## 不带租户则表示所有租户
ALTER SYSTEM MAJOR FREEZE TENANT = xxx;
查看租户各个zone的合并过程
SELECT*FROM oceanbase.CDB_OB_ZONE_MAJOR_COMPACTION\G
查看所有租户的合并信息
SELECT*FROM oceanbase.CDB_OB_MAJOR_COMPACTION\G
查看合并历史
SELECT * FROM oceanbase.GV$OB_TABLET_COMPACTION_HISTORY where type='MAJOR_MERGE' order by START_TIME desc limit 5\G
问题分析常用
查看耗时超过 5s 的转储合并任务。
SELECT * FROM GV$OB_MERGE_INFO WHERE tenant_id=1002 AND (END_TIME-START_TIME)>5 LIMIT 10;
查看某张表的合并记录。
SELECT * FROM GV$OB_TABLET_COMPACTION_HISTORY WHERE TABLET_ID IN (SELECT TABLET_ID FROM oceanbase.CDB_OB_TABLE_LOCATIONS WHERE TABLE_NAME = 'sbtest1') ORDER BY START_TIME DESC;
查看转储次数以及内存阈值
select * from gv$ob_memstore;
查看转储配置
show parameters where name in ('memstore_limit_percentage','freeze_trigger_percentage','writing_throttling_trigger_percentage','memory_limit');
备份归档
备份
查看备份信息
查看当前所有租户的备份任务
select * from CDB_OB_BACKUP_TASKS\G
SELECT * FROM oceanbase.CDB_OB_BACKUP_JOBS\G
查看历史备份任务
SELECT * FROM oceanbase.CDB_OB_BACKUP_JOB_HISTORY\G
SELECT * FROM oceanbase.CDB_OB_BACKUP_TASK_HISTORY\G
查看备份路径信息
SELECT*FROM oceanbase.CDB_OB_BACKUP_PARAMETER\G
查看备份集的文件状态
SELECT * FROM oceanbase.CDB_OB_BACKUP_SET_FILES
操作备份任务
指定备份路径
ALTER SYSTEM SET DATA_BACKUP_DEST='data_backup_path' [TENANT = mysql_tenant];
启动备份
ALTER SYSTEM BACKUP DATABASE [TENANT = mysql_tenant]; // 系统租户发起则全部租户,业务租户发起则自己
停止备份
ALTER SYSTEM CANCEL BACKUP [TENANT = mysql_tenant];
强制停止备份
ALTER SYSTEM CANCEL BACKUP FORCE;
更改备份目的端。
一定要先停止备份任务,并且保证新的备份目的端所在的目录为空以后再更改
ALTER SYSTEM SET DATA_BACKUP_DEST='data_backup_path' [TENANT = mysql_tenant];
日志归档
查看归档信息
查看租户的归档模式
SELECT TENANT_NAME, LOG_MODE FROM oceanbase.DBA_OB_TENANTS WHERE TENANT_TYPE ='USER‘
查看 piece信息
SELECT * FROM oceanbase.CDB_OB_ARCHIVELOG_PIECE_FILES\G
查看归档状态
SELECT * FROM oceanbase.CDB_OB_ARCHIVELOG\G
查看归档历史
SELECT * FROM oceanbase.CDB_OB_ARCHIVELOG_SUMMARY\G
查看归档参数
SELECT * FROM oceanbase.CDB_OB_ARCHIVE_DEST;
操作日志归档
配置归档目的端
ALTER SYSTEM SET LOG_ARCHIVE_DEST='LOG_ARCHIVE_DEST' [TENANT = mysql_tenant];
设置归档目的端的状态
# 启动
ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE='ENABLE' TENANT = tenant_name;
# 暂停
ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE='DEFER' TENANT = tenant_name;
启动日志归档
ALTER SYSTEM ARCHIVELOG [TENANT = mysql_tenant];
停止日志归档
ALTER SYSTEM NOARCHIVELOG [TENANT = mysql_tenant];
更改归档目的端,跟更改备份目的端同理,一定要先关闭归档,再改目的端
强制取消数据备份+日志备份:
ALTER SYSTEM CANCEL ALL BACKUP FORCE;
物理恢复
可以参考官网
OceanBase分布式数据库-海量数据 笔笔算数
调整资源占用大小
调整 OBServer 的资源占用
CPU扩缩容
注意:集群下的其他配置可能会影响该配置项的生效方式。建议在该配置项配置后,在 GV$OB_SERVERS 内部表中查看 CPU_CAPACITY 字段实际生效的值。若未动态生效,需要重启整个集群。
ALTER SYSTEM SET cpu_count=32;
内存扩缩容
ALTER SYSTEM SET memory_limit='32G'; // 优先级最高
或者
ALTER SYSTEM SET memory_limit_percentage='80';
缩容的话需要注意,memory_limit 的值必须大于 OBServer 节点实际已使用的内存。
SELECT value/1024/1024/1024 used_gb FROM v$sysstat WHERE name LIKE '%observer memory%' AND con_id = 1 AND stat_id=140008 AND name='observer memory used size';
磁盘扩容
ALTER SYSTEM SET datafile_size='80G'; // 优先级最高
或者
ALTER SYSTEM SET datafile_disk_percentage=90;
磁盘缩容
只有单zone情况下不支持缩减磁盘空间,多zone情况下可以缩减磁盘空间;多zone的模式的话,可以先下线observer,然后再上线,上线时可以指定参数启动;
bin/observer -o "datafile_size='100G'"
调整租户的资源占用
举例:ALTER RESOURCE UNIT unit1 MAX_CPU 2, MEMORY_SIZE '5G';
语法:
ALTER RESOURCE UNIT unit_name
MEMORY_SIZE [=] 'size_value',
MAX_CPU [=] cpu_num,
[MIN_CPU [=] cpu_num,]
[MAX_IOPS [=] iops_num,]
[MIN_IOPS [=] iops_num,]
[IOPS_WEIGHT [=]iopsweight,]
[LOG_DISK_SIZE [=] 'size_value'];
统计信息
手动收集
方法一:
# 收集 test 库下的 test3 表
call dbms_stats.gather_table_stats('test','test3');
# 收集 test 下的所有表,并且并行度 128
call dbms_stats.gather_schema_stats('test', degree=>128);
方法二:
ALTER SYSTEM SET enable_sql_extension = true;
ANALYZE TABLE test3 COMPUTE STATISTICS;
详情参照:
OceanBase分布式数据库-海量数据 笔笔算数
查看表的统计信息
select * from DBA_TAB_STATISTICS
执行计划缓存
查看
select * from oceanbase.GV$OB_PLAN_CACHE_PLAN_stat where query_sql like '%xx%';
清空缓存
1、清空指定的计划缓存。
ALTER SYSTEM FLUSH PLAN CACHE sql_id='xxxxxxxxxxx' global; // 不加 global 只会清理本地的plan cache
2、清空 aa、bb两个租户的所有计划缓存
ALTER SYSTEM FLUSH PLAN CACHE TENANT = 'aa','bb' global;
3、清空租户下面某个库的所有计划缓存
ALTER SYSTEM FLUSH PLAN CACHE databases='myob1' tenant='tenant1' GLOBAL;
日志保留
修改方式
通过 ALTER SYSTEM SET enable_syslog_recycle=True;
相关参数
- enable_syslog_wf控制是否生成独立的wf结尾的日志,wf指warn级别以上的日志,关闭这个效果是只存在observer.log了。
注意:关闭后实际还会有一个observer.log.wf,但以时间戳结尾的历史日志文件不会再有对应的wf文件,实现的小问题
- max_syslog_file_count:控制的磁盘里历史日志的最大保留数量。
- enable_syslog_recycle:用于设置是否开启回收系统日志,仅当 max_syslog_file_count设置为非 0 正数时生效。
- enable_async_syslog:是否启用异步写日志功能,默认为 True。关闭后将使用同步方式写日志,可以保证 observer 宕机前写完所有日志,但性能较差,不建议关闭。
- syslog_io_bandwidth_limit:日志限流量,默认为 30M。
- syslog_level:打印的日志的最低级别,日志级别见上文,默认为 WDIAG。
实例启动
启动命令
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/admin/oceanbase/lib
cd /home/admin/oceanbase && bin/observer
配置调整
调整租户配置
修改 primary_zone
ALTER TENANT xxx PRIMARY_ZONE=RANDOM;
修改 unit_num
调大 unit
ALTER RESOURCE TENANT mysql001 UNIT_NUM =2;
调小 unit
unit group 可以通过 DBA_OB_UNITS 查询
方法一:随机删除 unit group
ALTER RESOURCE TENANT mysql001 UNIT_NUM = 1;
方法二:指定 unit group 删除实现调小
ALTER RESOURCE TENANT mysql001 UNIT_NUM = 1 DELETE UNIT_GROUP =(1006);
查看执行状态
SELECT * FROM oceanbase.DBA_OB_TENANT_JOBS WHERE JOB_TYPE='ALTER_RESOURCE_TENANT_UNIT_NUM' AND TENANT_ID=1006;
确认迁移后的信息
SELECT * FROM oceanbase.DBA_OB_UNITS WHERE UNIT_ID =1006;
迁移 unit
租户 mq_t1 中 UNIT_ID = 1006 的 Unit 迁移到同 Zone 的另一个节点。
ALTER SYSTEM migrate unit =1006 destination ='xx.xx.xx.158:2882';
查看状态
SELECT * FROM oceanbase.DBA_OB_UNIT_JOBS WHERE JOB_TYPE ='MIGRATE_UNIT';
确认迁移后的信息
SELECT * FROM oceanbase.DBA_OB_UNITS WHERE UNIT_ID =1006;
修改 Locality
修改
ALTER TENANT mq_t1 locality="F{1}@sa128_obv4_1,F{1}@sa128_obv4_2,F{1}@sa128_obv4_3";
查看状态
SELECT * FROM oceanbase.DBA_OB_TENANT_JOBS WHERE JOB_TYPE ='ALTER_TENANT_LOCALITY';
确认修改结果
SELECT TENANT_ID,TENANT_NAME,TENANT_TYPE,PRIMARY_ZONE,LOCALITY FROM oceanbase.DBA_OB_TENANTS;
RS 切换
切换rs leader
alter system switch rootservice leader zone='z1';
查看 RS 任务
select * from __all_rootservice_event_history order by 1 desc limit 10;
日志流切主
命令
alter system switch replica leader ls=1 server='$z3_ip:$z3_port' tenant='sys';
查询leader的位置
select * from __all_virtual_log_stat where tenant_id=1;
OBProxy
开启后observer show create table输出会完全兼容mysql的语法,建议设置为租户级别。
alter proxyconfig set init_sql='set _show_ddl_in_compat_mode = 1;';