前文
25载春秋,国内数据库领域的先驱——人大金仓正式成立!作为数据库领域国家队,人大金仓始终坚守自主创新之路,不断实现着“从无到有”“从0到1”的跨越式突破。
值此人大金仓成立25周年之际,由人大金仓主办,墨天轮数据社区协办,开源中国社区、dbaplus社群、稀土掘金社区、SegmentFault思否社区联合支持的【2024金仓数据库有奖征文】活动,诚邀爱思考、善总结的你与我们共话人大金仓25载辉煌历程,绽放技术光芒
从开发设计角度、监控运维角度、备份容灾角度对KingbaseES进行实践考究,从本文 会有以下收获。
- KingbaseES概要认识
- KingbaseES的存储管理和内存管理
- KingbaseES的开发设计常用SQL,每种索引有什么用途?如何选择索引?母分区和子分区
- KingbaseES的性能测试工具 sysbench以及pgbench
- KingbaseES的若干个监控视图
- KingbaseES的逻辑备份和物理备份
- KingbaseES的日常维护工作空间膨胀和索引碎片
- KingbaseES的生态适配,flinksql监测mysql的变化 并获取增量数据
金仓数据库概述
作为老四厂之一,金仓是一个闭源数据库厂商,一直独力自主研发,自成一派,产品兼具OLTP和OLAP特性,生态工具丰富,但是群众工程师受众少,其中一个原因是商业闭源导致外人少知。
金仓核心产品是KingbaseES,KingbaseES是一款面向事务处理应用,兼顾简单分析应用的企业级关系型数据库,可满足各行业用户多种场景的数据处理需求。
以KingbaseES为核心,金仓还有如下系列产品
-
KStudio数据开发工具
-
KRDS云数据服务管控平台
-
KMonitor数据库监控工具
-
KADB金仓分析型数据库系统
-
KES金仓数据库管理系统
-
KSOne金仓HTAP分布式数据
-
KDMS金仓数据库迁移评估系统
-
KDTS数据库迁移工具
-
KFS金仓异构数据同步软件
核心产品KingBaseES
下载地址 : https://www.kingbase.com.cn/xzzx/index.htm ,下载介质的同时也要下载授件文件 ,安装ES过程需要识别授权文件。
\typoraimg\20240518-cdbbdc0d-9209-47f6-860c-f3092bc373dd-1718970384486-1.png)
安装参考
[root@server128 kinges]# ./setup.sh
Current user is ROOT.
Please re-run the installer as Non-Root user.
[root@server128 kinges]# useradd kinges
[root@server128 kinges]# passwd kinges
Changing password for user kinges.
New password:
BAD PASSWORD: The password fails the dictionary check - it is too simplistic/systematic
Retype new password:
passwd: all authentication tokens updated successfully.
[root@server128 kinges]# su kinges
[kinges@server128 kinges]$ pwd
/tmp/kinges
[kinges@server128 kinges]$ ./setup.sh
Now launch installer...
Preparing to install
Extracting the JRE from the installer archive...
Unpacking the JRE...
Extracting the installation resources from the installer archive...
Configuring the installer for this system's environment...
Verifying JVM........
Launching installer...
Please choose the Install Set to be installed by this installer.
->1- Full
2- Client
3- Custom
ENTER THE NUMBER FOR THE INSTALL SET, OR PRESS <ENTER> TO ACCEPT THE DEFAULT
: 1 #选择全部安装
/home/kinges/king8 (Is a directory)
File Path: /tmp/license_29296/license_29296_0.dat # 下载
```````````````````````````````````默认掠过
===============================================================================
Choose Install Folder
---------------------
Please choose a destination folder for this installation.
Where would you like to install?
Default Install Folder: /opt/Kingbase/ES/V8
Install Folder:
/home/kinges/Kingbase/ES/V8
Product Features:
SERVER,
INTERFACE,
DEPLOY,
KINGBASEHA,
KSTUDIO,
KDTS
Install Disk Space Information
Require Disk space : 5378 MB Free Disk Space : 41942 MB
PRESS <ENTER> TO CONTINUE:
===============================================================================
Ready To Install
----------------
InstallAnywhere is now ready to install KingbaseES V8 onto your system at the
following location:
/home/kinges/Kingbase/ES/V8
PRESS <ENTER> TO INSTALL:
===============================================================================
Choose a Folder for data directory
----------------------------------
Please choose a folder. The folder must be empty.
Data folder (Default: /home/kinges/Kingbase/ES/V8/data):
===============================================================================
Port
----
Please enter database service listened port, default 54321.
Port (Default: 54321): #默认54321端口
===============================================================================
User
----
Please enter database administrator user name.
User (Default: system): #默认system用户
===============================================================================
Enter Password
--------------
Please Enter the Password: Please Enter the Password:*********
===============================================================================
Enter Password again
--------------------
Please Enter the Password Again: Please Enter the Password Again:*********
===============================================================================
Server Encoding
---------------
Please enter server character set encoding.
->1- UTF8
2- GBK
3- GB18030
ENTER THE NUMBER FOR YOUR CHOICE, OR PRESS <ENTER> TO ACCEPT THE DEFAULT:
===============================================================================
Database Mode
-------------
Please enter database mode.
1- PG
->2- ORACLE
3- MySQL
ENTER THE NUMBER FOR YOUR CHOICE, OR PRESS <ENTER> TO ACCEPT THE DEFAULT: 3
===============================================================================
Case Sensitivity
----------------
Please enter the case sensitivity.
->1- YES
2- NO
ENTER THE NUMBER FOR YOUR CHOICE, OR PRESS <ENTER> TO ACCEPT THE DEFAULT: 2
===============================================================================
Block Size
----------
Please enter block size used in storing data.
->1- 8k
2- 16k
3- 32k
ENTER THE NUMBER FOR YOUR CHOICE, OR PRESS <ENTER> TO ACCEPT THE DEFAULT:
===============================================================================
Encrypt Method
--------------
Please enter the encrypt method.
->1- sm4
2- rc4
ENTER THE NUMBER FOR YOUR CHOICE, OR PRESS <ENTER> TO ACCEPT THE DEFAULT:
===============================================================================
Authentication Method
---------------------
Please enter the authentication method.
->1- scram-sha-256
2- scram-sm3
3- sm4
4- sm3
ENTER THE NUMBER FOR YOUR CHOICE, OR PRESS <ENTER> TO ACCEPT THE DEFAULT:
===============================================================================
Tips
----
The database will be initialized, which may take some time. Please be patient.
PRESS <ENTER> TO CONTINUE:
===============================================================================
Please Wait
-----------
===============================================================================
Installation Complete
---------------------
Congratulations. KingbaseES V8 has been successfully installed to:
/home/kinges/Kingbase/ES/V8
If you want to register KingbaseES V8 as OS service, please run
/home/kinges/Kingbase/ES/V8/install/script/root.sh
PRESS <ENTER> TO EXIT THE INSTALLER:
Complete.
复制
存储管理
KingbaseES数据库管理和组织数据库中的所有对象的逻辑空间,并将其映射到对应的物理文件中。
KingbaseES数据库中管理和组织数据的逻辑结构单元有数据块、段和表空间。在每一个数据库内部存在着若干个表空间,所有的数据库内部对象分别存放在这些表空间中。每个表空间中的关系又被划分为若干个段,每个段中有若干个数据块存储实际的数据。
\typoraimg\20240518-25f9d8fb-979c-4120-86a2-30243683c0ed-1718970384487-3.png)
逻辑存储
KingbaseES的逻辑存储分 表空间、段、数据块,与PG同样。
表空间允许在文件系统里定义那些代表数据库对象的文件存放的位置。 一旦创建了表空间,那么就可以在创建数据库对象的时候引用它。一个数据库可以有一个或多个表空间,创建数据库时自动创建系统表空间,并为缺省的默认表空间。一个表空间只隶属于一个数据库,只有在创建了数据库之后才能创建属于它的表空间。
KingbaseES中表或索引等对象都被记录在表空间中,并被拆分成若干个段存储。
一个段对应了一个物理文件,并只存储一个关系的部分数据。段内部会被划分为若干个数据块进行数据的管理和组织。
KingbaseES中管理数据的最小单元叫做数据块,或者也可以称为页面。一个数据块是最小的IO单元,即每次读入或写出数据只能以数据块做为单位。 数据库中一个数据块的大小通常是8KB,并可以在初始化数据库实例时被指定。该大小需要是操作系统数据块大小的整数倍。
物理存储
总体而言,关于物理文件介绍与pg差不多
项 | 类型 | 描述 |
---|---|---|
SYS_VERSION | 其他 | 一个包含KingbaseES主版本号的文件 |
base | 数据文件 | 包含每个数据库对应的子目录,记录每个数据库内对象的 持久化数据或临时数据。 |
current_logfiles | 控制文件 | 记录当前被日志收集器写入的日志文件的文件 |
global | 数据文件 及控制文件 | 包含集簇范围的表的子目录,比如sys_database。 此外,sys_control文件也存储在此目录下,该文件记录着 数据集簇标识符及版本、检查点信息、块大小等信息 |
sys_commit_ts | 日志文件 | 包含事务提交时间戳数据的子目录 |
sys_csnlog | 日志文件 | 包含事务提交序列号和子事务状态数据的子目录 |
sys_dynshmem | 其他 | 包含被动态共享内存子系统所使用的文件的子目录 |
sys_logical | 控制文件 | 包含用于逻辑复制的状态数据的子目录 |
sys_multixact | 日志文件 | 包含多事务(multi-t ransaction)状态数据的子目录(用于共享的行锁) |
sys_notify | 日志文件 | 包含LISTEN/NOTIFY状态数据的子目录 |
sys_replslot | 其他 | 包含复制槽数据的子目录 |
sys_serial | 日志文件 | 包含已提交的可序列化事务信息的子目录 |
sys_snapshots | 其他 | 包含导出的快照的子目录 |
sys_stat | 其他 | 包含用于统计子系统的永久文件的子目录 |
sys_stat_tmp | 其他 | 包含用于统计信息子系统的临时文件的子目录 |
sys_tblspc | 其他 | 包含指向表空间目录的符号链接的子目录,该符号链接所 指向的表空间目录中存储了所属该表空间的数据文件。 |
sys_twophase | 日志文件 | 包含用于预备事务状态文件的子目录 |
sys_wal | 日志文件 | 包含 WAL(预写日志)文件的子目录 |
sys_xact | 日志文件 | 包含事务提交状态数据的子目录 |
kingbase.auto.conf | 配置文件 | 一个用于存储由ALTER SYSTEM 设置的配置参数的文件 |
kingbase.opts | 控制文件 | 一个 记录服务器最后一次启动时使用的命令行参数的文件 |
kingbase.pid | 控制文件 | 一个锁文件,记录着当前的 kingbase 进程ID(PID)、集簇数据目录路 径、kingbase启动时间戳、端口号、Unix域套接字目 录路径(Windows上为空)、第一个可用的listen_address (IP地址或者*,或者为空表示不在TCP上监听 )以及共享内存段ID(服务器关闭后该文件不存在) |
内存管理及进程管理
KingBaseES由共享内存和私有内存组成。共享内存主要是 shared_buffer 、wal_buffer、effective_cache_size。私有内存主要有work_mem、maintenance_work_mem、temp_buffer
共享内存
ipcs -m
就可以看到共享内存的相关信息。
shared_buffers
原理:数据库服务器使用的共享内存缓冲区的数量,主要用于缓存数据,根据需求一般不能设置超过80% 的内存,但至少是20%。
应用范围:数据库本身,查询的数据量比较大,比较频繁使用到。
wal_buffers
原理:日志缓冲区大小,共享内存里用于 WAL 数据(日志)的磁盘页面缓冲区的数目。
应用范围:如果单位时间事务的数据修改数据量较大,也就是事务的写比较多的情况,如果IO是瓶颈,可以调整这个值到很大,有很多的缓存后,就不会频繁的写磁盘,降低IO。缺省值为 8 ,8个页面是64k。当然也可以很小,这个设置只需要大到能保存下一次事务生成的 WAL 数据即可,因为这些数据在每次事务提交时都会写入磁盘。
#查看共享内存的分配
[root@server128 contrib]# ipcs -m -u
------ Shared Memory Status --------
segments allocated 1
pages allocated 1
pages resident 1
pages swapped 0
Swap performance: 0 attempts 0 successes
#查看共享内存中的进程的信息
[root@server128 contrib]# ipcs -m -p
------ Shared Memory Creator/Last-op PIDs --------
shmid owner cpid lpid
0 kinges 7797 45211
复制
私有内存
work_mem
原理:内部排序和哈希操作可使用的工作内存大小。该内存是在开始使用临时磁盘文件之前使用的内存数目。
应用范围:数据比较多大的情况,主要排序的数据有关系,排序数据越大,设置的就越大,比如16g内存,tpch测试,单用户10g规模数据,设置2g 的work_mem。数值以kB为单位的,缺省是1024(1MB),比如tpcc 1000warehouse,并发50个,设置20mb即可。
maintenance_work_mem
原理:在维护性操作(比如 VACUUM, CREATE INDEX, ALTER TABLE ADD FOREIGN KEY 等)中使用的最大的内存数。
应用范围:在维护性操作(比如 VACUUM, CREATE INDEX, ALTER TABLE ADD FOREIGN KEY 等)调整大小,默认是16MB,比如创建索引的索引数据很大,比如10g,如果内存允许 就可以调整这个参数,一般在需要创建索引的时候调大,创建完之后再调小。
进程管理
-
KingbaseES 主进程
主进程负责统一管理各服务进程和其他后台进程。 该进程负责启动服务进程和其他后台进程,并且在子进程退出的时候做清理工作。 该进程负责分发来自操作系统的信号到各子进程。系统退出时,主进程负责发送信号通知各子进程退出,然后再停止自己。
-
后台写进程background writer
在这个进程中,共享缓冲池上的脏页会逐渐定期地写入持久存储(例如HDD、SSD)。
-
检查点进程 checkpointer
用来执行检查点过程。
-
自动vacuum进程 autovacuum launcher
会定期地在服务器上执行清理和回收工作。
-
WAL日志写进程 walwriter
这个进程周期性地将WAL缓冲区上的WAL数据写入和刷新到持久存储。
-
统计进程 archiver
在此进程中,会收集sys_stat_activity和sys_stat_database等统计信息。
-
归档进程 archiver
归档进程负责将日志文件归档到指定的位置。
-
日志收集进程 logger
日志收集进程负责将数据库运行中的输出信息写入日志文件。
除以上后台进程外,在特定时机或使用一些特性时会有额外的后台进程,例如:
-
恢复进程
实例处于从恢复状态或开启热备份时恢复进程负责重做WAL日志。
-
WAL日志发送、接收进程
使用KingbaseES RWC集群时,主节点通过WAL日志发送进程发送WAL给备节点上的WAL日志接收进程实现数据复制。
-
kwr、ksh进程
开启kwr和ksh功能时,对应的kwr、ksh后台进程负责收集和维护负载、会话历史数据。
-
自动作业进程
开启自动作业功能时,自动作业后台进程实现作业的自动调度。
#通过系统命令查看 共享内存
[root@server128 ~]# ipcs -m
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x033cdf69 262144 kinges 600 56 11
[root@server128 ~]# ipcs -l
------ Messages Limits --------
max queues system wide = 15619
max size of message (bytes) = 8192
default max size of queue (bytes) = 16384
------ Shared Memory Limits --------
max number of segments = 4096
max seg size (kbytes) = 18014398509481983
max total shared memory (kbytes) = 18014398509480960
min seg size (bytes) = 1
------ Semaphore Limits --------
max number of arrays = 25600
max semaphores per array = 250
max semaphores system wide = 6400000
max ops per semop call = 1000
semaphore max value = 32767
复制
SQL开发
CRUD
# DDL创建库
test=# create database systest;
CREATE DATABASE
# DDL 创建用户名
test=# create user henley with password 'gmcc1234';
CREATE ROLE
# DDL 授权密码
test=# GRANT ALL PRIVILEGES ON DATABASE systest TO henley;
GRANT
/home/kinges/Kingbase/ES/V8/KESRealPro/V008R006C008B0014/Server/bin/ksql -U henley systest -p 54321 -h 127.0.0.1
#输入密码 gmcc1234
Password for user henley:
Type "help" for help.
systest=> create table myking(id int);
CREATE TABLE
systest=> insert into myking values(100),(200);
INSERT 0 2
systest=> select * from myking;
id
-----
100
200
(2 rows)
systest=> update myking set id=1000 where id =100;
UPDATE 1
systest=> select * from myking;
id
------
200
1000
(2 rows)
systest=> delete from myking where id=200;
DELETE 1
systest=> select * from myking;
id
------
1000
(1 row)
systest=> \dt myking;
List of relations
Schema | Name | Type | Owner
--------+--------+-------+--------
public | myking | table | henley
(1 row)
# 详情查看
systest=> \dt+ myking;
List of relations
Schema | Name | Type | Owner | Size | Description
--------+--------+-------+--------+------------+-------------
public | myking | table | henley | 8192 bytes |
(1 row)
systest=> select version();
version
----------------------------------------------------------------------------------------------------------------------
KingbaseES V008R006C008B0014 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-28), 64-bit
(1 row)
复制
sysbench
#基于kingbaseES的sysbench基准测试
[root@server128 ~]# sysbench /usr/share/sysbench/oltp_read_write.lua --db-driver=pgsql --pgsql-host=192.168.153.128 --pgsql-port=54321 --pgsql-user=henley --pgsql-password='gmcc1234' --pgsql-db=systest --tables=5 --table-size=100000 --threads=5 --time=300 --report-interval=10 prepare
sysbench 1.0.20 (using bundled LuaJIT 2.1.0-beta2)
Initializing worker threads...
Creating table 'sbtest4'...
Creating table 'sbtest5'...
Creating table 'sbtest1'...
Creating table 'sbtest3'...
Creating table 'sbtest2'...
Inserting 100000 records into 'sbtest5'
Inserting 100000 records into 'sbtest1'
Inserting 100000 records into 'sbtest4'
Inserting 100000 records into 'sbtest2'
Inserting 100000 records into 'sbtest3'
Creating a secondary index on 'sbtest3'...
Creating a secondary index on 'sbtest5'...
Creating a secondary index on 'sbtest2'...
Creating a secondary index on 'sbtest4'...
Creating a secondary index on 'sbtest1'...
复制
pgbench
#基于kingbaseES的pgbench基准测试
[root@server128 ~]# /usr/pgsql-14/bin/pgbench -i -s 5 -h 192.168.153.128 -p 54321 -U henley systest
Password:
dropping old tables...
NOTICE: table "pgbench_accounts" does not exist, skipping
NOTICE: table "pgbench_branches" does not exist, skipping
NOTICE: table "pgbench_history" does not exist, skipping
NOTICE: table "pgbench_tellers" does not exist, skipping
creating tables...
generating data (client-side)...
500000 of 500000 tuples (100%) done (elapsed 0.35 s, remaining 0.00 s)
vacuuming...
creating primary keys...
done in 1.30 s (drop tables 0.01 s, create tables 0.02 s, client-side generate 0.75 s, vacuum 0.18 s, primary keys 0.33 s).
复制
索引分区
索引分区是数据库的基本能力,KingBaseES相对Mysql,除了支持传统手段互联网经常使用的B树索引和哈希索引之外,还支持brin索引和gin索引,brin索引可用于时序业务场景,gin索引可以用于全文搜索场景 ,gist可以用于时空等不确定性范围查找的业务场景。下面是索引设计 和索引容量查看方式。
索引
#btree index
drop table btree_t;
create table btree_t( c0 int,c1 timestamp, c2 float,c3 varchar(50), primary key(c0) );
create index btree_idx ON btree_t (c1) ;
insert into btree_t(c0,c1,c2,c3) select s.a,('2024-5-17 16:26:38.000000'::timestamp) +concat(s.a/10000,'s')::INTERVAL, random(),md5(random()::text) FROM generate_series(1, 10000000) AS s(a);
systest=# create index btree_idx ON btree_t (c1) ;
CREATE INDEX
<ERVAL, random(),md5(random()::text) FROM generate_series(1, 10000000) AS s(a);
INSERT 0 10000000
systest=# \dti+ btree_t;
List of relations
Schema | Name | Type | Owner | Table | Size | Description
--------+---------+-------+--------+-------+--------+-------------
public | btree_t | table | system | | 814 MB |
(1 row)
# hash index
drop table hash_t;
create table hash_t( c0 int,c1 timestamp, c2 float,c3 varchar(50), primary key(c0) );
create index hash_idx ON hash_t USING HASH (c1) ;
insert into hash_t(c0,c1,c2,c3) select s.a,('2024-5-17 16:26:38.000000'::timestamp) +concat(s.a/10000,'s')::INTERVAL, random(),md5(random()::text) FROM generate_series(1, 10000000) AS s(a);
systest=# \dti+ hash_t;
# brin index
drop table brin_t;
create table brin_t( c0 int,c1 timestamp, c2 float,c3 varchar(50), primary key(c0) );
create index brin_idx ON brin_t USING brin(c1) WITH (pages_per_range=1024, autosummarize=on);
insert into brin_t(c0,c1,c2,c3) select s.a,('2024-5-17 16:26:38.000000'::timestamp) +concat(s.a/10000,'s')::INTERVAL, random(),md5(random()::text) FROM generate_series(1, 10000000) AS s(a);
systest=# \dti+ brin_idx;
List of relations
Schema | Name | Type | Owner | Table | Size | Description
--------+----------+-------+--------+--------+-------+-------------
public | brin_idx | index | system | brin_t | 48 kB |
(1 row)
# gin index
drop table gin_t;
create table gin_t( c0 int,c1 timestamp, c2 float,c3 TSVECTOR, primary key(c0) );
create index gin_idx ON gin_t USING gin(c3) ;
insert into gin_t(c0,c1,c2,c3) select s.a,('2024-5-17 16:26:38.000000'::timestamp) +concat(s.a/10000,'s')::INTERVAL, random(),'hello world kinges' FROM generate_series(1, 10000000) AS s(a);
systest=# \di+ hash_idx
List of relations
Schema | Name | Type | Owner | Table | Size | Description
--------+----------+-------+--------+--------+--------+-------------
public | hash_idx | index | system | hash_t | 444 MB |
(1 row)
systest=# \di+ btree_idx
List of relations
Schema | Name | Type | Owner | Table | Size | Description
--------+-----------+-------+--------+---------+--------+-------------
public | btree_idx | index | system | btree_t | 204 MB |
(1 row)
systest=# \di+ brin_idx
List of relations
Schema | Name | Type | Owner | Table | Size | Description
--------+----------+-------+--------+--------+-------+-------------
public | brin_idx | index | system | brin_t | 48 kB |
(1 row)
systest=# \dt+ gin_t;
List of relations
Schema | Name | Type | Owner | Size | Description
--------+-------+-------+--------+--------+-------------
public | gin_t | table | system | 814 MB |
(1 row)
复制
分区
常区的范围分区、列表分区、哈希分区使用多了,这里就不过多赘述, 下面是 kingbaseES的母分区和子分区
#建立母分区,正常创建
test=# CREATE TABLE vehicles(
test(# name text PRIMARY KEY, -- 车辆名字
test(# color text, -- 车身颜色
test(# weight float, -- 车身重量
test(# area text, -- 产地
test(# manufacturerid int -- 制造商标识
test(# );
CREATE TABLE
# 继承vehicles
test=# CREATE TABLE bikes(
test(# size float NOT NULL -- 车架尺寸,常见的是15、17、19、21寸
test(# ) INHERITS(vehicles);
test=#
test=# CREATE TABLE cars(
test(# displacement float NOT NULL -- 排量
test(# ) INHERITS(vehicles);
CREATE TABLE
test=#
test=# CREATE TABLE trucks(
test(# load float NOT NULL -- 最大载重
test(# ) INHERITS(vehicles);
CREATE TABLE
test=# INSERT INTO bikes VALUES
test-# ('bike001','RED',30,'上海',1001,17),
test-# ('bike002','RED',35,'重庆',1002,19),
test-# ('bike003','YELLOW',30,'重庆',1002,17),
test-# ('bike004','WHITE',30,'上海',1001,21);
INSERT 0 4
test=# INSERT INTO cars VALUES
test-# ('car001','RED',630,'上海',2001,1.5),
test-# ('car002','Golden',635,'重庆',2002,1.6),
test-# ('car003','YELLOW',730,'重庆',2002,2.5),
test-# ('car003','Grey',730,'重庆',2002,2.5),
test-# ('car003','YELLOW',630,'北京',2005,1.6),
test-# ('car004','WHITE',700,'上海',2001,2.0);
INSERT 0 6
test=# INSERT INTO bikes VALUES
test-# ('truck001','RED',1040,'北京',1001,10),
test-# ('truck002','RED',1055,'重庆',1002,12),
test-# ('truck003','Grey',1500,'上海',1001,30);
INSERT 0 3
复制
监控运维
pg_top监控性能
pg_top 是一个用于 PostgreSQL 数据库的实时监控和性能分析工具,类似于 Unix 系统中的 top 命令。它显示了 PostgreSQL 的活动会话、SQL 查询、锁定信息、缓存命中率、I/O 操作等信息,可以帮助数据库管理员快速识别和诊断性能问题。现在pg_top可以安装kingBaseES上面,侧面反映与kingBaseES兼容。
pg_top 的主要功能
- 实时查看活动会话:显示每个数据库连接的活动会话信息,包括查询、状态、用户、数据库、客户端地址等。
- 监控资源使用:显示 PostgreSQL 实例的 CPU、内存和 I/O 资源使用情况。
- 显示锁和等待信息:帮助识别数据库中的锁争用和等待事件。
- 实时排序和筛选:可以按多种条件实时排序和筛选会话信息,如按 CPU 使用、内存使用、运行时间等。
- 查询缓存命中率:显示查询缓存命中率,帮助了解数据库缓存的有效性。
- 显示表和索引统计信息:提供表和索引的使用和性能统计信息。
#基于kingbaseES进行pg_top安装,并对关键进程进行监控
wget https://codeload.github.com/markwkm/pg_top/zip/refs/heads/master
http://download-ib01.fedoraproject.org/pub/epel/7/x86_64/Packages/l/
yum install postgresql-devel
yum install cmake -y
mkdir /home/postgres/pgsql
git clone https://gitlab.com/pg_top/pg_top.git
cd pg_top/
cmake -DCMAKE_INSTALL_PREFIX=/home/postgres/pgsql/
make
make install
# pg_top 指向KingbaseES的服务IP及端口进行监控
/home/postgres/pgsql/bin/pg_top -h 192.168.153.128 -p 54321 -U henley -d systest
复制
pg_top可以见到kingbase的进程动态变化
kbstattuple监控元组
kbstattuple可以监控 元组统计信息
test20240524=# create extension kbstattuple;
CREATE EXTENSION
create extension kbstattuple;
SELECT * FROM kbstatindex('sbtest1_pkey');
systest=# SELECT * FROM kbstatindex('sbtest1_pkey');
-[ RECORD 1 ]------+----------
version | 4
tree_level | 2
index_size | 307052544
root_block_no | 410
internal_pages | 132
leaf_pages | 36939
empty_pages | 0
deleted_pages | 410
avg_leaf_density | 71.6
leaf_fragmentation | 20.37 #查看该表的索引碎片率
复制
备份冗灾
#对systest库进行逻辑备份
/home/kinges/Kingbase/ES/V8/KESRealPro/V008R006C008B0014/Server/bin/sys_dump -U system -h 192.168.153.128 -p 54321 -W -f /tmp/systest.sql systest
#将btree_t表导出为csv文件格式
systest=# COPY btree_t TO '/tmp/btree_t.csv' DELIMITER ',' CSV HEADER;
COPY 10000000
#进行全量数据的物理备份
[kinges@server128 global]$ mkdir /tmp/kinges
[kinges@server128 global]$ sys_basebackup -D /tmp/kinges -h 127.0.0.1 -p 54321 -U system -X stream -P
Password:
5052419/5052419 kB (100%), 1/1 tablespace
[root@server128 etc]# ll /tmp/kinges
total 140
-rw------- 1 kinges kinges 227 May 17 08:44 backup_label
drwx------ 9 kinges kinges 4096 May 17 08:45 base
-rw------- 1 kinges kinges 46 May 17 08:44 current_logfiles
drwx------ 2 kinges kinges 4096 May 17 08:45 global
-rw------- 1 kinges kinges 357 May 17 08:45 initdb.conf
-rw------- 1 kinges kinges 88 May 17 08:45 kingbase.auto.conf
-rw------- 1 kinges kinges 27619 May 17 08:44 kingbase.conf
drwx------ 3 kinges kinges 4096 May 17 08:44 sys_aud
drwx------ 2 kinges kinges 4096 May 17 08:44 sys_bulkload
drwx------ 2 kinges kinges 4096 May 17 08:45 sys_commit_ts
drwx------ 2 kinges kinges 4096 May 17 08:44 sys_csnlog
drwx------ 2 kinges kinges 4096 May 17 08:45 sys_dynshmem
-rw------- 1 kinges kinges 4316 May 17 08:45 sys_hba.conf
-rw------- 1 kinges kinges 1371 May 17 08:44 sys_ident.conf
drwxrwxr-x 2 kinges kinges 4096 May 17 08:45 sys_log
drwx------ 4 kinges kinges 4096 May 17 08:45 sys_logical
drwx------ 4 kinges kinges 4096 May 17 08:44 sys_multixact
drwx------ 2 kinges kinges 4096 May 17 08:44 sys_notify
drwx------ 2 kinges kinges 4096 May 17 08:44 sys_replslot
drwx------ 2 kinges kinges 4096 May 17 08:44 sys_serial
drwx------ 2 kinges kinges 4096 May 17 08:44 sys_snapshots
drwx------ 2 kinges kinges 4096 May 17 08:44 sys_stat
drwx------ 2 kinges kinges 4096 May 17 08:44 sys_stat_tmp
drwx------ 2 kinges kinges 4096 May 17 08:44 sys_tblspc
drwx------ 2 kinges kinges 4096 May 17 08:44 sys_twophase
-rw------- 1 kinges kinges 3 May 17 08:44 SYS_VERSION
drwx------ 3 kinges kinges 4096 May 17 08:44 sys_wal
drwx------ 2 kinges kinges 4096 May 17 08:44 sys_xact
#KingBaseES具备sys_rman和sys_probackup 等物理备份管理工具, 支持增量备、差异备份,同时具有灵活的备份策略,使用体验上与pg差不多
复制
定期维护
空间膨胀
KingBaseES在TP的处理机制也是以MVCC的方式去处理,对修改、删除的数据标识为无效的数据,并没有在表空间里面把它真正的进行删除,所以要定期维护
systest=# select pg_size_pretty(pg_relation_size('btree_t'));
pg_size_pretty
----------------
814 MB
(1 row)
systest=# update btree_t set c2=c2+0.0001;
systest=# select pg_size_pretty(pg_relation_size('btree_t'));
pg_size_pretty
----------------
1628 MB
(1 row)
systest-# \x
Expanded display is on.
#确认n_dead_tup 全部清0.
systest=# select * from pg_stat_user_tables where relname='btree_t';
-[ RECORD 1 ]-------+---------------------------
relid | 16584
schemaname | public
relname | btree_t
seq_scan | 6
seq_tup_read | 11027116
idx_scan | 0
idx_tup_fetch | 0
n_tup_ins | 10000000
n_tup_upd | 10000001
n_tup_del | 0
n_tup_hot_upd | 0
n_live_tup | 10000032
n_dead_tup | 10000001
n_mod_since_analyze | 10000000
last_vacuum |
last_autovacuum |
last_analyze |
last_autoanalyze | 2024-05-17 00:49:27.385556
vacuum_count | 0
autovacuum_count | 0
analyze_count | 0
autoanalyze_count | 1
# n_dead_tup | 10000001就是膨胀的空间
systest=# vacuum btree_t;
VACUUM
systest=# select * from pg_stat_user_tables where relname='btree_t';
-[ RECORD 1 ]-------+---------------------------
relid | 16584
schemaname | public
relname | btree_t
seq_scan | 6
seq_tup_read | 11027116
idx_scan | 0
idx_tup_fetch | 0
n_tup_ins | 10000000
n_tup_upd | 10000001
n_tup_del | 0
n_tup_hot_upd | 0
n_live_tup | 9975350
n_dead_tup | 0
n_mod_since_analyze | 0
last_vacuum | 2024-05-17 15:20:13.667568
last_autovacuum | 2024-05-17 15:19:32.926424
last_analyze |
last_autoanalyze | 2024-05-17 15:19:39.194643
vacuum_count | 1
autovacuum_count | 1
analyze_count | 0
autoanalyze_count | 2
复制
索引碎片
#针对索引碎片多的表进行处理
reindex table table_name;
systest=# drop index btree_idx;
DROP INDEX
systest=# create index btree_idx on btree_t(c1);
CREATE INDEX
SELECT relpages, reltuples FROM pg_class C, pg_index I, pg_namespace N
WHERE nspname NOT IN ('pg_catalog', 'information_schema')
AND C.relkind = 'i'
AND C.relnamespace = N.oid
AND I.indexrelid = C.oid
AND I.indrelid = 'btree_t'::regclass;
复制
生态适配
KingBaseES的技术路径发展目标,让专精Oracle、MySQL、pg的工程师也能快速上手KingBaseES。KingBaseES的提供了适配 Oracle、适配MySQL、适配PostgreSQL三种模式,减低工程师的学习成本。例如下面的匹配MySQL的时间函数以及Oracle的操作方式
# mysql mode
systest=# SELECT FROM_UNIXTIME(0) "FROM_UNIXTIME";
FROM_UNIXTIME
---------------------
1970-01-01 08:00:00
(1 row)
# oracle mode
SELECT to_binary_double('9.98989');
复制
除此之外,KingBaseES也支持与开源生态的适配,例如适配主流的flinksql,通过flinksql把监控业务源系统数据的变化,如果有变化就导到KingBaseES上面。
下面展示把MySQL的数据传到KingBaseES的例子
准备下面三个介质软件
- flink-1.17.1-bin-scala_2.12.tgz
- flink-connector-jdbc-3.0.0-1.16.jar
- flink-sql-connector-mysql-cdc-2.3.0.jar
解压flink-1.17.1-bin-scala_2.12.tgz
,把flink-connector-jdbc-3.0.0-1.16.jar和flink-sql-connector-mysql-cdc-2.3.0.jar 放在lib目录下。
mysql打开激活binlog
[mysqld]
log-bin = mysql-bin
server-id =1
binlog_format = ROW
复制
打开flink集群
[root@server128 flinktest]# ./flink-1.17.1/bin/start-cluster.sh
Starting cluster.
Starting standalonesession daemon on host server128.
Starting taskexecutor daemon on host server128.
[root@server128 flinktest]# ./flink-1.17.1/bin/sql-client.sh
Flink SQL>
### 输入MySQL源端相关信息
CREATE TABLE sbtest1 (
id INT,
k INT,
c STRING,
pad STRING,
primary key (id) NOT ENFORCED
) WITH (
'connector' = 'mysql-cdc',
'hostname' = '192.168.153.128',
'port' = '3306',
'username' = 'xxxxxx',
'password' = 'xxxxxx',
'database-name' = 'mydb',
'table-name' = 'sbtest1',
'debezium.snapshot.mode' = 'initial'
);
### 输入KingBaseES相关信息
CREATE TABLE sbtest1 (
id INT,
k INT,
c STRING,
pad STRING,
primary key (id) NOT ENFORCED
) WITH (
'connector' = 'jdbc',
'url' = 'jdbc:postgresql://192.168.xxx.xxx:54321/mydb',
'username' = 'xxxxx',
'password' = 'xxxxx',
'table-name' = 'sbtest1'
);
### 将MySQL的数据传到KingBaseES相关信息
Flink SQL> INSERT INTO sbtest1 SELECT * FROM sbtestt;
[INFO] Submitting SQL update statement to the cluster...
[INFO] SQL update statement has been successfully submitted to the cluster:
Job ID: 4c15bcd1cea0fc8010e321157f975ec1
复制
总结
金仓数据库KingbaseES是少数不多入选国家自主创新产品目录的数据库产品,一直耕耘了20多年,未来金仓的发展方向以OLTP为主,OLTP为辅,致力于数据的全栈解决方案,因为 覆盖的产品线广,而且能全领域的解决客户的问题,因此能获得客户的认同。