Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >技术分享 | OceanBase 4.1 全面测评及部署流程,看这篇就够了【建议收藏】

技术分享 | OceanBase 4.1 全面测评及部署流程,看这篇就够了【建议收藏】

作者头像
爱可生开源社区
发布于 2023-08-18 11:42:14
发布于 2023-08-18 11:42:14
97800
代码可运行
举报
运行总次数:0
代码可运行

作者:杨家鑫

多点⾼级 DBA ,擅⻓故障分析与性能优化,喜欢探索新技术,爱好摄影。

本文来源:原创投稿

* 爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。


1背景

测试 OceanBase 对比 MySQL,TiDB 的性能表现,数据存储压缩,探索多点内部项目一个数据库场景落地 Oceanbase(MySQL->OceanBase)。

2单机测试

准备

OBD 方式部署单机

文件准备
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
wget https://obbusiness-private.oss-cn-shanghai.aliyuncs.com/download-center/opensource/oceanbase-all-in-one/7/x86_64/oceanbase-all-in-one-4.1.0.0-100120230323143519.el7.x86_64.tar.gz?Expires=1681878350&OSSAccessKeyId=LTAI5tGVLeRRycCRGerZJMNC&Signature=4E8%2FW77U1MAqq1ttNvuljadkTq0%3D

mv oceanbase-all-in-one-4.1.0.0-100120230323143519.el7.x86_64.tar.gz?Expires=1681878350 oceanbase-all-in-one-4.1.0.0-100120230323143519.el7.x86_64.tar.gz

tar -zxf oceanbase-all-in-one-4.1.0.0-100120230323143519.el7.x86_64.tar.gz -C /usr/local
安装相关包
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/usr/local/oceanbase-all-in-one/bin/install.sh
.......
#####################################################################
 Install Finished 
=====================================================================
Setup Environment:     source ~/.oceanbase-all-in-one/bin/env.sh 
Start Web Service:     obd web 
Quick Start:           obd demo 
More Details:          obd -h 
=====================================================================
修改配置文件

包含组件:oceanbase-ce、obproxy-ce、obagent、grafana、Prometheus

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cp /usr/local/oceanbase-all-in-one/obd/usr/obd/example/all-components.yaml ./

vi all-components.yaml
  • memory_limit 64G observer 总内存(租户内存+系统内存)
  • system_memory 30G 系统内存
  • datafile_size 1500G 数据文件大小(启动就会预分配)
  • log_disk_size 日志文件大小(启动就会预分配)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# all-components.yaml
oceanbase-ce:
  servers:
    - name: server1
      ip: 127.0.0.1
  global:
    devname: lo
    memory_limit: 64G # The maximum running memory for an observer
    system_memory: 30G
    datafile_size: 1500G # Size of the data file. 
    log_disk_size: 800G # The size of disk space used by the clog files.
.......
server1:
........
    zone: zone1
obproxy-ce:
  depends:
    - oceanbase-ce
  servers:
    - 127.0.0.1
  global:
......
obagent:
  depends:
    - oceanbase-ce
  servers:
    - name: server1
      ip: 127.0.0.1
  global:
    home_path: /data/obagent1
ocp-express:
  depends:
    - oceanbase-ce
    - obproxy-ce
    - obagent
  servers:
    - 127.0.0.1
  global:
.....

部署启动

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
obd cluster deploy obtest -c all-components.yaml
+--------------------------------------------------------------------------------------------+
|                                          Packages                                          |
+--------------+---------+------------------------+------------------------------------------+
| Repository   | Version | Release                | Md5                                      |
+--------------+---------+------------------------+------------------------------------------+
| oceanbase-ce | 4.1.0.0 | 100000192023032010.el7 | 8439ecf8db5e0649bd49671b41ea9e8c85756b63 |
| obproxy-ce   | 4.1.0.0 | 7.el7                  | 2a9d9bf67f179dcca2a8c9e7c77373d94e7e2abe |
| obagent      | 1.3.0   | 22.el7                 | d57fbb4962b2fbecb6282358c59295fdfba4d6ac |
| ocp-express  | 1.0.0   | 100000432023032015.el7 | 42c6fc921063f24f9e1072d75bfa7f21f42146e3 |
+--------------+---------+------------------------+------------------------------------------+
------

obd cluster start obtest
 ...
+---------------------------------------------+
|                   observer                  |
+-----------+---------+------+-------+--------+
| ip        | version | port | zone  | status |
+-----------+---------+------+-------+--------+
| 127.0.0.1 | 4.1.0.0 | 4000 | zone1 | ACTIVE |
+-----------+---------+------+-------+--------+
obclient -h127.0.0.1 -P4000 -uroot -Doceanbase -A

+---------------------------------------------+
|                   obproxy                   |
+-----------+------+-----------------+--------+
| ip        | port | prometheus_port | status |
+-----------+------+-----------------+--------+
| 127.0.0.1 | 2883 | 2884            | active |
+-----------+------+-----------------+--------+
obclient -h127.0.0.1 -P2883 -uroot -Doceanbase -A
+------------------------------------------------------------------+
|                             obagent                              |
+---------------+--------------------+--------------------+--------+
| ip            | mgragent_http_port | monagent_http_port | status |
+---------------+--------------------+--------------------+--------+
| 10.xxxx | 8089               | 8088               | active |
+---------------+--------------------+--------------------+--------+
+------------------------------------------------------------------+
|                           ocp-express                            |
+---------------------------+----------+------------------+--------+
| url                       | username | default_password | status |
+---------------------------+----------+------------------+--------+
| http://10.xxxx:8180 | admin    | oceanbase        | active |
+---------------------------+----------+------------------+--------+

创建 MySQL 用户

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
create resource unit ut1 max_cpu 32,memory_size '16G';

create resource pool p1 unit 'ut1',unit_num 1;

create tenant mysql resource_pool_list=('p1') set ob_tcp_invited_nodes='%';

重要配置

OceanBase

TiDB

MySQL

社区版本

v4.1.0

v6.1.5

v5.7.16

内存配置

租户memory_size 16G

block_cache_size 16G

innodb_buffer_pool_size 16G

单机器配置

32C RAID10 SSD

32C RAID10 SSD

32C RAID10 SSD

刷盘配置

默认强制刷盘(无刷盘相关配置参数)

sync-log=1

sync_binlog=1

并发数

5,10,20,30,60,120

5,10,20,30,60,120

5,10,20,30,60,120

测试模式

read_write,read_only,write_only

read_write,read_only,write_only

read_write,read_only,write_only

单次测试时间

300s共 18 种测试(并发数x测试模式)

300s共18种测试(并发数x测试模式)

300s共 18 种测试(并发数x测试模式)

每种测试方法

obd test sysbench(OBD 自带) 先 prepare、再 run、再 cleanup

sysbench preparesysbench runsysbench cleanup

sysbench preparesysbench runsysbench cleanup

  • 架构层级:
    • MySQL 一层架构、OceanBase 二层架构(OBProxy + OBServer)、TiDB 三层架构(TiDB+PD+TiKV);
    • 每多一层网络层面的延迟消耗会增加。
  • QPS:平均延迟 OceanBase 表现相对于 MySQL 表现均可以
    • QPS 延迟时间相对是 MySQL 的 1/3(最低 QPS 也过万,最低平均延迟 3ms);
    • 数据压缩率(表仅 2 数值、2 字符字段)是 MySQL 的 3/5。
  • sysbench 表相对简单和实践生产场景表有一定差异,本次测试作为参考
  • 每种测试(每类数据库共 18 种测试)均会生成测试数据(prepare)、跑测试(run)、清理测试数据(cleanup)。

QPS 表现

延迟表现

存储压缩

MySQL:数据 test 库物理空间占用 69G

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mysql> select count(*) from sbtest10;
+----------+
| count(*) |
+----------+
| 30000000 |
+----------+
1 row in set (4.62 sec)

TiDB:数据 test 库物理空间占用 39G

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mysql> select count(*) from sbtest10;
+----------+
count(*) |
+----------+
30000000 |
+----------+
1 row in set (0.00 sec)

OceanBase:数据 test 库物理空间占用 43G。预分配机制,启动就是占用 1.2T 空间(实际具体库物理空间通过 OB 节点资源消耗查询)。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mysql> select count(*) from sbtest1;
+----------+
| count(*) |
+----------+
| 30000000 |
+----------+
1 row in set (0.00 sec)

binlog 兼容

  • 迁移服务 OMS[1] 能通过 OMS 同步数据变更至下游 Kafka
  • 能兼容 MySQL binlog 协议同步下游 Kafka 很友好(我们这类场景多 MySQL->Kafka->Hive);
  • 暂未有类似 MySQL binlog 原始文件功能,据说爱可生近期发布基于 OceanBase 的商业发行版 ActionDB 对于此功能正在规划中,十分期待

3集群测试

集群方式目前暂对数据存储压缩率方式做了测试(生产监控场景 MySQL 迁移至 OceanBase),后续还会对比监控场景 MySQL 中各类型报表查询 SQL 在 OceanBase 的表现。

机器资源

节点类型

集群方式

中控管理节点

10.xxx16C 64G /data 3.7T

数据节点

10.xxx32C 50G /data3 15T

数据节点

10.xxx32C 50G /data3 15T

数据节点

10.xxx32C 50G /data3 15T

OCP 管理组件嵌入到了 OBD 集群的部署流程中,机器相关初始化参考官方文档。

部署准备

在线部署准备

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
yum install -y yum-utils
yum-config-manager --add-repo https://mirrors.aliyun.com/oceanbase/OceanBase.repo
yum install -y ob-deploy 
source /etc/profile.d/obd.sh

离线部署准备

https://www.oceanbase.com/softwarecenter 下载 all-in-one 包。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
tar -xzf oceanbase-all-in-one-*.tar.gz
cd oceanbase-all-in-one/bin/
./install.sh
source ~/.oceanbase-all-in-one/bin/env.sh

白屏部署

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
obd web -p 80

推荐白屏方式部署,可视化直观,有各种检查项。

预检查阶段会做全面 check。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
obd cluster display oceanbase41
Get local repositories and plugins ok
Open ssh connection ok
Cluster status check ok
Connect to observer ok
Wait for observer init ok
+-------------------------------------------------+
|                     observer                    |
+---------------+---------+------+-------+--------+
| ip            | version | port | zone  | status |
+---------------+---------+------+-------+--------+
| 10.xxxx.208   | 4.1.0.0 | 5000 | zone2 | ACTIVE |
| 10.xxxx.209   | 4.1.0.0 | 5000 | zone1 | ACTIVE |
| 10.xxxx.210   | 4.1.0.0 | 5000 | zone3 | ACTIVE |
+---------------+---------+------+-------+--------+
obclient -h10.xxxx.208 -P5000 -uroot -p'xxxx' -Doceanbase -A

Connect to obproxy ok
+-------------------------------------------------+
|                     obproxy                     |
+---------------+------+-----------------+--------+
| ip            | port | prometheus_port | status |
+---------------+------+-----------------+--------+
| 10.xxxx.209   | 2883 | 2884            | active |
| 10.xxxx.208   | 2883 | 2884            | active |
| 10.xxxx.210   | 2883 | 2884            | active |
+---------------+------+-----------------+--------+
obclient -h10.xxxx.209 -P2883 -uroot -p'xxxx' -Doceanbase -A
Connect to Obagent ok
+------------------------------------------------------------------+
|                             obagent                              |
+---------------+--------------------+--------------------+--------+
| ip            | mgragent_http_port | monagent_http_port | status |
+---------------+--------------------+--------------------+--------+
| 10.xxxx.209   | 8089               | 8088               | active |
| 10.xxxx.208   | 8089               | 8088               | active |
| 10.xxxx.210   | 8089               | 8088               | active |
+---------------+--------------------+--------------------+--------+
Connect to ocp-express ok
+------------------------------------------------------------------+
|                           ocp-express                            |
+---------------------------+----------+------------------+--------+
| url                       | username | default_password | status |
+---------------------------+----------+------------------+--------+
| http://10.xxxx.209:8180   | admin    | oceanbase        | active |
+---------------------------+----------+------------------+--------+
Trace ID: c3049c64-efa3-11ed-bf3a-525400b51421

创建 OCP 管理平台域名 Nginx 转发

办公环境仅能访问生产 80 端口,DNS 域名->nginx 80->10.xxxx.209:8180(OCP 管理平台)http://ob-ocp-xxxx.db.dmall.com/

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cat oceanbase-ocp.conf 
server { 
           listen       80; 
           server_name  ob-ocp-gz01.db.dmall.com; 

           location / { 
               proxy_pass http://10.xxxx.209:8180; 
               index  index.html index.htm index.jsp; 
           } 
       } 

创建 MySQL 租户

命令行中创建租户存在 timeout 错误,登录时失败(和官方人员沟通后在 OCP 平台创建租户正常成功,推测命令行创建租户 memory_size 过大,OCP 中创建限制为 10G)。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 创建资源单元
create resource unit ut1 max_cpu 30, memory_size '16G';

# 创建资源池
create resource pool p1 unit 'ut1',unit_num 1,ZONE_LIST ('zone1', 'zone2' ,'zone3');

# 创建租户
select now(); create tenant if not exists mysql CHARSET='utf8mb4', ZONE_LIST=('zone1','zone2','zone3'), PRIMARY_ZONE='zone1,zone2,zone3',resource_pool_list=('p1') set ob_tcp_invited_nodes='%';select now();
ERROR 4012 (HY000): Timeout

# MySQL 租户登录
obclient -h127.0.0.1 -P5000 -uroot@mysql -Doceanbase -A
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 4725 (HY000): tablet does not exist

创建分区表示例

OceanBase 分布式分片基于分区表实现,大表必须创建分区。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CREATE TABLE `snapshot_innodb_status_log` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `stat_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
  ......
   PRIMARY KEY (`id`,stat_time),
  KEY `idx_port` (`port`),
  KEY `idx_ip` (`ip`),
  KEY `idx_stat_time` (`stat_time`)
)  partition by range (year(stat_time)*100+month(stat_time)) (
PARTITION p0  VALUES LESS THAN(202201),
PARTITION p1  VALUES LESS THAN(202203),
PARTITION p2  VALUES LESS THAN(202205),
PARTITION p3  VALUES LESS THAN(202207),
PARTITION p4  VALUES LESS THAN(202209),
PARTITION p5  VALUES LESS THAN(202211),
PARTITION p6  VALUES LESS THAN(202301),
PARTITION p7  VALUES LESS THAN(202303),
PARTITION p8  VALUES LESS THAN(202305),
PARTITION p9  VALUES LESS THAN(202307),
PARTITION p10  VALUES LESS THAN(202309),
PARTITION p11  VALUES LESS THAN(202311),
PARTITION p12  VALUES LESS THAN MAXVALUE
);

CREATE TABLE `redis_app_minute_command_statistics` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `app_id` int(11) NOT NULL COMMENT '应用id',
  `collect_time` datetime NOT NULL,
  .........
  PRIMARY KEY (`id`,collect_time),
  UNIQUE KEY `app_id` (`app_id`,`collect_time`,`command_name`),
  KEY `idx_create_time` (`create_time`),
  KEY `idx_collect_time_app_id_command_name` (`collect_time`,`app_id`,`command_name`)
)  ENGINE=InnoDB  
partition by range (year(collect_time)*100+month(collect_time)) (
PARTITION p0  VALUES LESS THAN(202201),
PARTITION p1 VALUES LESS THAN(202203),
PARTITION p2 VALUES LESS THAN(202205),
PARTITION p3 VALUES LESS THAN(202207),
PARTITION p4 VALUES LESS THAN(202209),
PARTITION p5 VALUES LESS THAN(202211),
PARTITION p6 VALUES LESS THAN(202301),
PARTITION p7 VALUES LESS THAN(202303),
PARTITION p8 VALUES LESS THAN(202305),
PARTITION p9 VALUES LESS THAN(202307),
PARTITION p10 VALUES LESS THAN(202309),
PARTITION p11 VALUES LESS THAN(202311),
PARTITION p12 VALUES LESS THAN MAXVALUE
);

注意:OceanBase 数据库社区版 4.1 暂不支持 utf8mb4_unicode_ciutf16_unicode_ci,主键(多列)和唯一索引(多列)必须包含分区键。否则创建分区表报错:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ERROR 1503 (HY000): A UNIQUE INDEX must include all columns in the table's partitioning function
ERROR 1503 (HY000): A PRIMARY KEY must include all columns in the table's partitioning function

时间分区键必须是 datetime,不能是 timestamp,否则报错。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ERROR 1486 (HY000): Constant or random or timezone-dependent expressions in (sub)partitioning function are not allowed

更多分区表[2] 的使用建议。

DRC 同步 MySQL 至 OceanBase

我们 DRC 自研同步工具支持 MySQL->OceanBase(DRC 还能支持 MySQL->MySQL,MySQL->TiDB),官方 OMS 迁移工具安装管理者工具 OAT[3]。内部 MySQL 监控快照库空间 660G(单副本) 迁移至 OceanBase 单副本空间 110G,压缩率约为 1/6

MySQL 单副本:

OceanBase 单副本:

MySQL->OceanBase 数据简单一致校验:

MySQL 采用 show table status;,OceanBase 查询 information_schema.tablesshow table status 中无 rows 信息,也和官方人员确认过)。

实践中因有 2 张上百 G 大表在 DRC 工具全量期间目标 OB 时常有异常报错,2 张上百 G 大表全量采用 mydumper + myloader 手动备份还原至 OceanBase,DRC 工具增量同步。

DRC 同步期间存在 OceanBase 目标端出现错误问题:目标端执行 SQL 出现错误。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
!io.ReadFull(header) failed. err EOF: connection was bad,Table [redis_monitor_data_min -> redis_monitor_data_min]

因 DRC 同步大表时频繁出现以上错误,大表改为 mydumper 多线程逻辑备份还原也偶尔出现异常。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# myloader 多线程还原出现异常错误
 CRITICAL **: 10:45:12.333: Error switching to database xxx whilst restoring table xxxx_data_min
** (myloader:118422): CRITICAL **: 10:46:42.195: Error restoring xxx.xxxx_status_log from file xxx.xxxx_status_log.00006.sql.gz: Lost connection to MySQL server during query

增大租户内存和减小转储比例后 myloader 多线程还原没有出现异常错误。

旧配置

新配置

freeze_trigger_percentage 70%

freeze_trigger_percentage 30%

租户 memory_size 10G

租户 memory_size 15G

4关键配置

注意: datafile_size 不支持缩小(支持增大,需 reload 重启集群),配置后就会预分配(datafile_disk_percentage 默认95%)占用空间

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ll -h /data/oceanbases1/sstable/block_file 
-rw-r--r-- 1 root root 1.5T May  4 16:35 /data/oceanbases1/sstable/block_file
[oceanbase-ce] server1(127.0.0.1): DO NOT decrease datafile_size after startup

memory_limit

OBServer 的最大可使用内存数。由于最低内存配置为 64 GB,预留部分给系统使用,则建议 OBServer 独占 58 GB,即系统租户内存与程序内存共 58 GB

system_memory

系统预留给租户 ID 为 500 的租户的内存容量

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
obclient> ALTER SYSTEM SET system_memory='xxG';

rootservice_memory_limit

Root Service 的最大内存容量限制

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
obclient> ALTER SYSTEM SET rootservice_memory_limit='2G';

ob_query_timeout

SQL 最大执行时间,单位是微秒。

超时会报错

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ERROR 4012 (HY000): Timeout, query has reached the maximum query timeout: 10000000(us), maybe you can adjust the session variable ob_query_timeout or query_timeout hint, and try again.

5常用命令

手动收集信息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CALL dbms_stats.gather_table_stats('test', 'sbtest1', granularity=>'GLOBAL', method_opt=>'FOR ALL COLUMNS SIZE 128');

# 使用 Oracle 模式语法
ALTER SYSTEM SET ENABLE_SQL_EXTENSION = TRUE;
ANALYZE TABLE sbtest1 COMPUTE STATISTICS FOR ALL COLUMNS SIZE 128;

更多手动收集统计信息[4] 的使用建议。

租户资源的创建

创建资源配置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
obclient> CREATE RESOURCE UNIT uc1 MAX_CPU 5, MIN_CPU 4, MEMORY_SIZE '36G', MAX_IOPS 128000, MIN_IOPS 128000, LOG_DISK_SIZE '2T' ;
必选配置项
  • MAX_CPU
  • MEMORY_SIZE
  • MIN_CPU 默认等于 MAX_CPU
  • MIN_IOPS 默认等于 MAX_IOPS
  • LOG_DISK_SIZE 默认等于 3 倍的内存大小,最小为 2G
  • MIN_IOPS 和 MAX_IOPS 的值根据 MIN_CPU 规格自动计算,1 个 Core 对应 1 万 IOPS 值,即 MAX_IOPS = MIN_IOPS = MIN_CPU * 10000

创建资源池

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
obclient> CREATE RESOURCE POOL rp1 UNIT 'uc1', UNIT_NUM 2, ZONE_LIST ('zone1', 'zone2');
  • UNIT 'uc1' 表示为该资源池指定的资源配置为 uc1,该资源池下的每个资源单元使用 uc1 的规格进行配置;
  • ZONE_LIST ('zone1','zone2') 是为资源池指定的使用范围,表示该资源池要在 zone1 和 zone2 上创建资源单元;
  • UNIT_NUM 2 是为资源池指定资源单元的个数,表示在 ZONE_LIST 内的每个 Zone 上都创建 2 个资源单元。

创建租户

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
obclient> CREATE RESOURCE POOL pool1 UNIT 'uc1', UNIT_NUM 2, ZONE_LIST ('z1', 'z2');
obclient>CREATE RESOURCE POOL pool2 UNIT 'uc1', UNIT_NUM 1, ZONE_LIST ('z3');
obclient>CREATE TENANT tt resource_pool_list=('pool1','pool2');

租户 tt 下有 2 个资源池。

删除租户

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Drop tenant mysql force ;

Drop resource pool p1;

Drop RESOURCE UNIT ut1;

查看租户资源配置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT t1.name resource_pool_name,
       t2.`name` unit_config_name,
       t2.max_cpu,
       t2.min_cpu,
       t2.memory_size/1024/1024/1024 memory_size,
                                     t3.unit_id,
                                     t3.zone,
                                     concat(t3.svr_ip,':',t3.`svr_port`) observer,
                                     t4.tenant_id,
                                     t4.tenant_name
FROM __all_resource_pool t1
JOIN __all_unit_config t2 ON (t1.unit_config_id=t2.unit_config_id)
JOIN __all_unit t3 ON (t1.`resource_pool_id` = t3.`resource_pool_id`)
LEFT JOIN __all_tenant t4 ON (t1.tenant_id=t4.tenant_id)
ORDER BY t1.`resource_pool_id`,
         t2.`unit_config_id`,
         t3.unit_id ;
+--------------------+------------------+---------+---------+-----------------+---------+-------+----------------+-----------+-------------+
| resource_pool_name | unit_config_name | max_cpu | min_cpu | memory_size     | unit_id | zone  | observer       | tenant_id | tenant_name |
+--------------------+------------------+---------+---------+-----------------+---------+-------+----------------+-----------+-------------+
| sys_pool           | sys_unit_config  |       1 |       1 |  8.500000000000 |       1 | zone1 | 127.0.0.1:2882 |         1 | sys         |
| p1                 | ut1              |      32 |      32 | 16.000000000000 |    1001 | zone1 | 127.0.0.1:2882 |      1002 | mysql       |
+--------------------+------------------+---------+---------+-----------------+---------+-------+----------------+-----------+-------------+

查看单元配置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select
  name,
  max_cpu,
  round(memory_size / 1024 / 1024 / 1024, 2) 'memory_size_GB'
from
  __all_unit_config;
+-----------------+---------+----------------+
| name            | max_cpu | memory_size_GB |
+-----------------+---------+----------------+
| sys_unit_config |       1 |           8.50 |
| ut1             |      32 |          16.00 |
+-----------------+---------+----------------+

查看各 OBServer 剩余资源单元

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select
  svr_ip,
  svr_port,
  zone,
  round((cpu_capacity_max - cpu_assigned_max), 2) 'cpu_free_num',
  cpu_capacity_max 'cpu_total_num',
  round((mem_capacity - mem_assigned) / 1024 / 1024 / 1024, 2) 'mem_free_GB',
  round(memory_limit / 1024 / 1024 / 1024, 2) 'mem_total_GB',
  round(DATA_DISK_IN_USE / 1024 / 1024 / 1024, 2) as data_used_GB,
  round(DATA_DISK_CAPACITY / 1024 / 1024 / 1024, 2) as data_total_GB,
  round(LOG_DISK_CAPACITY / 1024 / 1024 / 1024, 2) as log_total_GB,
  round(LOG_DISK_IN_USE / 1024 / 1024 / 1024, 2) as log_used_GB
from
  gv$ob_servers;
+-----------+----------+-------+--------------+---------------+-------------+--------------+--------------+---------------+--------------+-------------+
| svr_ip    | svr_port | zone  | cpu_free_num | cpu_total_num | mem_free_GB | mem_total_GB | data_used_GB | data_total_GB | log_total_GB | log_used_GB |
+-----------+----------+-------+--------------+---------------+-------------+--------------+--------------+---------------+--------------+-------------+
| 127.0.0.1 |     2882 | zone1 |         7.00 |            40 |        9.50 |        64.00 |       192.00 |        192.00 |       192.00 |       40.69 |
+-----------+----------+-------+--------------+---------------+-------------+--------------+--------------+---------------+--------------+-------------+

查看所有 OBServer 节点

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select zone,svr_ip,svr_port,inner_port,with_rootserver,status,gmt_create from __all_server order by zone, svr_ip;

查看当前租户

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
show Tenant ;
+---------------------+
| Current_tenant_name |
+---------------------+
| mysql               |
+---------------------+
1 row in set (0.002 sec)

修改资源池

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
obclient> CREATE RESOURCE UNIT uc1 MAX_CPU 5, MIN_CPU 4, MEMORY_SIZE '32G', MMAX_IOPS 128000, MIN_IOPS 128000, LOG_DISK_SIZE '2T';

obclient> CREATE RESOURCE POOL pool1 UNIT 'uc1', UNIT_NUM 2, ZONE_LIST ('z1', 'z2');

obclient> CREATE RESOURCE POOL pool2 UNIT 'uc1', UNIT_NUM 1, ZONE_LIST ('z3');

obclient> CREATE TENANT tt resource_pool_list=('pool1','pool2');

obclient> ALTER RESOURCE UNIT uc1 MAX_CPU 6,  MEMORY_SIZE '36G';

ALTER RESOURCE UNIT config_mysql_zone1_20C10G_vcq MEMORY_SIZE='12G';

# 支持的在线扩容资源单元
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,] 
[LOG_DISK_SIZE [=] 'size_value'];
  
# 调大 OceanBase 集群磁盘最大空间百分比(默认预分配data_size的95%ALTER system SET datafile_disk_percentage = 98;

# 调大 OceanBase 用户租户内存最大内存百分比(默认mem_size的50%) 
alter system set memstore_limit_percentage =70;
 
# 提高转储速度
alter system set freeze_trigger_percentage=30;

更多管理资源池的使用建议[5]

限制

OceanBase 社区版暂不支持字符序 utf8mb4_general_ci。更多关于 OceanBase 与 MySQL 的兼容性[6]

OceanBase 创建 user 只支持明文方式,密文方式(identified as xxx)不支持。支持 CREATE USER 'dmall_xxxx'@'10.%.%.%' identified by 'xxx';

若超过磁盘限额配置写入会报错(除了机器磁盘空间报警外还需对 OBServer data 空间使用率做报警)。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
error, errno = 4184, state = '53100': Server out of disk space

处理方式为扩容资源单元或者 edit-config 修改 datafile_size: 后 reload 集群重启生效。

若超过内存限额配置写入会报错(高 TPS 场景下 OceanBase 很消耗内存)。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SQL error, errno = 4013, state = 'HY001': No memory or reach tenant memory limit

处理方式为扩容资源单元、开启写入限速以及调整转储阈值(调高转储线程数,加快转储,让内存尽快释放)。更多参考租户内存写满[7]

6总结

  • OceanBase 在 QPS、读写延迟、存储压缩方面均不错(生产 MySQL 一监控场景库空间:OceanBase 空间为 6:1 单副本,660G:110G 单副本);
  • 高 TPS 场景可以适当调整租户内存使用参数、转储参数;
  • OceanBase 不同租户资源隔离(IOPS,内存,CPU)更好适配多业务场景;
  • OBD 白屏部署方式更加高效、直观,OCP 管理平台功能全面;
  • 业务应用方使用 OceanBase 比 MySQL 有点区别(大表创建分区表,用户名需带租户名等)。

参考资料

[1]

OMS: https://www.oceanbase.com/docs/common-oceanbase-database-cn-10000000001697223

[2]

分区表使用建议: https://www.oceanbase.com/docs/enterprise-oceanbase-database-cn-10000000000357627

[3]

OAT: https://www.oceanbase.com/docs/enterprise-oat-doc-cn-10000000002026444

[4]

手动收集统计信息: https://www.oceanbase.com/docs/common-oceanbase-database-cn-10000000001699693

[5]

管理资源池: https://www.oceanbase.com/docs/common-oceanbase-database-cn-10000000001702463

[6]

兼容性: https://www.oceanbase.com/docs/common-oceanbase-database-cn-10000000001687857

[7]

租户内存写满: https://www.oceanbase.com/docs/common-oceanbase-database-cn-10000000001702785

本文关键字:#OceanBase# #MySQL# #测评#

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-06-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 爱可生开源社区 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
技术分享 | OceanBase 4.X 最小化单机部署
我们知道,OceanBase 3.X 版本部署单机架构(一个ZONE,一台SERVER)需要耗费较多硬件资源才能正常使用。OceanBase 4.X 版本发布后,在资源占用这块做了很多优化,官方宣称4.X 版本是单机分布式一体化的架构,单台OB SERVER对数据的处理与单机数据库相比性能相当。比如对于 OceanBase 3.X 版本,就算是单机部署,对多个分区的数据更新依然需要两阶段提交来保证其原子性;对于OceanBase 4.X 单机部署,对多分区的数据更新不再需要两阶段提交来保证其原子性。
爱可生开源社区
2023/01/17
1K0
OceanBase初体验之Docker快速部署试用环境
准备好一台安装了 Docker 的 Linux 服务器,确保能够连接到 Docker Hub 仓库。
HOHO
2024/03/14
2500
OceanBase初体验之Docker快速部署试用环境
技术分享 | 使用 ANTMAN 工具替换 OceanBase 云平台节点
上海某公司 DBA,曾经从事银行、证券数仓设计、开发、优化类工作,现主要从事电信级 IT 系统及数据库工作。有三年以上 OceanBase 工作经验,参与某通信行业核心数据库全面国产化工作。获得的专业技能与认证包括 OceanBase OBCP、Oracle OCP 11g、OracleOCM 11g 、MySQL OCP 5.7 、腾讯云TBase、腾讯云 TDSQL、阿里云 ACP 、KingBase KCP。
爱可生开源社区
2023/08/18
2730
技术分享 | 使用 ANTMAN 工具替换 OceanBase 云平台节点
技术分享 | OceanBase 租户延迟删除
对于第二种方式,之前同事们有内部讨论过OceanBase的设计初衷;有可能是以防租户被误删、或者是给费用到期并且不续租的租户一段缓冲的时间,让他能在数据保留时间到期前备份需要的数据出来。
爱可生开源社区
2023/03/13
5130
OB 运维 | OceanBase 单机改三副本:实操手记与深思
作者:李锡超,苏商银行DBA,负责数据库和中间件运维和建设。擅长 MySQL、Python、Oracle,爱好骑行、技术研究和分享。
爱可生开源社区
2025/02/19
1440
OB 运维 | OceanBase 单机改三副本:实操手记与深思
OB 运维 | 一文搞定 OceanBase 各级别数据量统计
作者:胡呈清,爱可生交付团队DBA,OBCE,擅长故障分析、性能优化。个人博客:[简书 | 轻松的鱼],[微信公众号 | 澄清一下],欢迎关注与讨论。
爱可生开源社区
2024/12/19
1390
OB 运维 | 一文搞定 OceanBase 各级别数据量统计
OceanBase 学习记录 -- 安装简易环境
学习OB ,这是OB 的第二期,还是那句话,让人家用枪逼着上路,不如自己自找出路,今天安装。基于OB并不是一个想装就能装的数据库,OB的同学给我们这些想用的人,来了一套一键安装的版本。其中文档中明确了,我们这样使用和安装的问题,但我们就是要试用一下,所以必然就这样了。尤其昨天听了一耳朵 OceanBase新数据库版本的发布会,其中有几句话。
AustinDatabases
2024/11/25
1360
OceanBase  学习记录 -- 安装简易环境
OB 运维 | 一文讲透 OceanBase 单机版【建议收藏】
OceanBase 单机集中式集群(即单机版,后文不再称“单机集中式集群”)是OceanBase 推出的极简数据库架构,区别于分布式集群架构,单机版无多副本和扩缩容能力,适用于开发测试环境及数据安全性要求不高的业务系统。
爱可生开源社区
2024/09/14
3830
OB 运维 | 一文讲透 OceanBase 单机版【建议收藏】
OceanBase 学习记录-- 建立MySQL租户,像用MySQL一样使用OB
在开始学习OceanBase的概念,发现了很多新的知识和新的架构的思维方式,用传统的数据库理念去理解OceanBase可能有一些吃力,这里总结开始学习OceanBase数据库的学习的一些概念和大家进行探讨,加速理解OceanBase的一些基础知识和概念。
AustinDatabases
2024/11/25
1610
OceanBase 学习记录-- 建立MySQL租户,像用MySQL一样使用OB
OceanBase初体验之部署生产标准的三节点分布式集群
如果是使用的物理机部署,建议在BIOS中开启最大性能模式,X86芯片开启超线程。三台节点保证时间一致。
HOHO
2024/03/15
3650
OceanBase初体验之部署生产标准的三节点分布式集群
OB 运维 | 计算 OceanBase 可用 CPU 的核心逻辑
在 OceanBase 中创建租户时,时常会遇到因内存或 CPU 等资源不足导致的租户创建失败的情况。
爱可生开源社区
2025/02/26
390
OB 运维 | 计算 OceanBase 可用 CPU 的核心逻辑
技术分享 | OceanBase 资源及租户管理
https://opensource.actionsky.com/20221207-oceanbase/
爱可生开源社区
2023/02/22
8150
技术分享 | OceanBase 集群扩容缩容
扩容资源:进入OCP -> 找到要扩容的集群 -> 总览 -> 新增OBServer;
爱可生开源社区
2023/03/02
1.1K0
【DB宝87】手动部署 OceanBase 三副本集群(在同一个节点)
OceanBase Docker安装体验:https://www.xmmup.com/oceanbase-dockeranzhuangtiyan.html 手动部署 OceanBase 单副本集群:h
AiDBA宝典
2022/02/23
7230
【DB宝87】手动部署 OceanBase 三副本集群(在同一个节点)
OB 运维 | 日志盘过小也会导致创建租户失败?
某客户基于节约资源的想法,将日志盘设置的比较小,日志盘大小约为集群内存规格的 1.5 倍,当创建租户时,CPU 和内存都充足的情况下,却存在报错 "LOG_DISK resource not enough",我们尝试复现问题并定位原因。
爱可生开源社区
2024/09/14
1250
OB 运维 | 日志盘过小也会导致创建租户失败?
猿创征文|体验新一代分布式数据库—OceanBase
现如今,当我们谈到关键核心技术,自主创新等话题,很多人都会非常关注芯片,但是还有一种IT的核心技术,它的重要性丝毫不在芯片之下,那就是数据库。
宝耶需努力
2022/12/13
6850
猿创征文|体验新一代分布式数据库—OceanBase
【DB宝85】 OceanBase Docker安装体验
参考:https://www.xmmup.com/dbbao2centos7anzhuangdocker.html
AiDBA宝典
2022/02/23
1K0
【DB宝85】 OceanBase Docker安装体验
【OceanBase】基于CentOS系统安装OceanBase数据库
oceanbase镜像-oceanbase下载地址-oceanbase安装教程-阿里巴巴开源镜像站
宝耶需努力
2022/12/13
1K0
OceanBase 社区版OBD部署示例主副本
以root用户安装时,默认安装在/root/observer目录下,本文以 root用户安装在/data/observer目录下。创建过程。
你要的小米吖
2021/09/17
1.9K0
安装社区版本OB
即可 使用 ip  端口: 2881 密码: xxxxx   用户:root 登录。
问天丶天问
2023/10/17
2620
安装社区版本OB
推荐阅读
相关推荐
技术分享 | OceanBase 4.X 最小化单机部署
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文