Kingbase数据库体系结构和日常运维监控
1. 数据库架构
1.1. 内存
1.1.1. Share Memory
共享内存是服务器服务器为数据库缓存和事务日志缓存预留的内存缓存空间,其中最重要的组成部分是Shared Buffer和WAL Buffer:
1. Shared Buffer:
减少磁盘IO
2. WAL Buffer:
用来临时存储数据库变化的缓存区域。存储在WAL Buffer中的内容会根据提前定义好的时间点参数要求写入到磁盘的WAL文件中。
全局信息比如进程、锁、全局统计等信息也保存在共享内存中。
参数名称 | 描述 |
shared_buffers | (1)从磁盘读入的数据(主要包括表和索引)都缓存在这里。 (2)主要目的是最大限度的减少磁盘I0。 (3)推荐内存的1/4大小,不超过内存的1/2,如果不使用huge page建议不要超过32GB。 |
wal_buffers | (1)Write--Ahead Logging buffer是一个临时存储数据更改的缓冲区。存储在WAL buffer中的内容将在预定的时间点写入WAL文件。 (2)默认为-1,即shared_buffer的1/32。最小不少于64k,最大不大于一个wal_segment_size(默认16M大小)。 (3)保持默认即可,因为过了wal_writer_.delay(默认200ms)会刷新清空此缓存。 |
1.1.2. 本地内存
非全局存储的数据都存在本地内存中,主要包括:
1. 临时缓冲区:
用于访问临时表的缓冲区
2. work_mem:
内部排序操作和Hash表在使用临时操作文件之前使用的存储缓冲区。
3. manintance_work_mem:
在维护操作比如:VACUUM、CREATE INDEX、ALTER TABLE ADD FOREIGN
参数名称 | 描述 |
work_mem | (1)旧名sort_mem,声明每个后端进程内部排序和哈希操作可用的工作内存大小。 (2)典型的涉及排序的操作有group by/order by/distinct。 (3)KESV8支持并行查询,每个正在运行的进程都可能使用多个数量的work_mem。 (4)默认值为4M,不能太大,否则连接数较多时会产生内存资源紧张。 (5)若太小、sort/hash计算慢,内存不够时可降级用磁盘(temp_file_limit)。 |
maintenance work mem | (1)指定在维护性操作(例如VACUUM、CREATE INDEX和ALTER TABLE ADD FOREIGN KEY)中使用的最大的内存量。 (2)默认值为64M,可以比work_mem大一点。 |
temp_Buffers | (1)临时表缓冲区存放在每个进程专用的私有内存中(非共享内存中)。它决定存放临时表的数据缓冲区中的数据块的个数,每个数据块的大小是8kB。 (2)默认值为8M,最小值800kB。 |
1.2. 数据库进程
1、kingbase Process(主后台驻留进程)--主进程
主后台驻留进程是kingbase启动时第一个启动的进程。启动时,他会执行恢复、初始化共享内存和运行后台进程操作。正常运行期间,当有客户端发起链接请求时,它还负责创建后端进程。
2、Background Process(后台进程) --辅助进程
进程名称 | 功能描述 |
主进程(KingbaseDaemon) | (1)Kingbase主进程是KES启动的第一个进程。 (2)它负责启动和关闭数据库实例,初始化共享内存,并启动后台子进程。 (3)当客户端进程有连接请求时,负责创建后端进程。 --主进程的第一个作用就是监听,第二大作用就会恢复数据库,前滚和回滚。第三大作用派生出辅助进程 |
后台进程(BackgroundProcess)或称为辅助子进程 | 启动数据库服务后自动启动多个后台进程: (1)logger(系统日志进程,将错误信息写入到日志文件中)。 (2)checkpointer(检查点进程,发送检查点操作)。 (3)BgWriter(后台写进程,将share buffer中的脏数据写入到数据文件中)。 (4)wal writer(预写日志进程,将wal buffer中的脏块写入到WAL文件中)。 (5)Autovacuum launcher(自动清理进程,dead rows垃圾回收)。--清理死亡元组信息,当update超过(row*0.2+50)行数是,就会触发清理。分析统计信息。 (6)archiver(归档进程,拷贝WAL文件到指定的目录)。 (7)stats collector(统计信息收集进程,收集会话执行信息 /sys_stat_activity和表的使用信息/sys_stat_all_tables信息)。 (8)kwr collector(性能分析数据采集进程,定期采集实例运行过程中产生的I0、内存命中等统计数据,存储到kwr快照里面,用于性能问题分析和诊断)。--oracle中的awr报告很相似 |
3、Backend Process(后端进程)
最大后台链接数通过max_connections参数设定,默认值为100。后端进程用于处理前端用户请求并返回结果
4、Client Process(客户端进程)
客户端进程需要和后端进程配合使用,处理每一个客户链接
客户端进程Process) | (Client在服务器上启动客户程序就产生对应的客户端进程,比如: (1)ksql --执行sql的命令行工具。 (2)sys_isready --检查一个KES服务状态。 (3)sys_config --获取已安装的KES的信息。 |
后端进程(BackendProcess)或称为会话服务进程 | (1)客户端进程连接到数据库,主进程fork出对应后端进程。 (2)后端进程的最大数量取决于max_connections参数的设置,默认值是100。 (3)后端进程执行用户的请求,然后传输结果。 |
5、 集群进程:
1、kbha:用于监控repmgrd进程是否存活
2、repmgrd:用于监控集群运行状态
3、node_exporter、postgres_exporter:与监控相关的进程,为deploy部署工具监控页面提供数据
1.3. 数据文件
表中数据实际落盘的位置,在data/base目录下
每个表有三个数据文件:
1、一个文件用于存储数据,文件名是表的OID。
2、一个文件用于管理表的空闲空间,文件名是OID_fsm。
3、一个文件用于管理表的块是否可见,文件名是OID_vm
2. 数据库配置
2.1. 数据库数据目录结构
- kingbase.conf:数据库实例的主配置文件,基本上包含所有配置
- sys_hba.conf:客户端认证配置文件
- sys_ident.conf:“ident”认证方式的用户映射文件
- base目录:默认表空间的目录
- global目录:一些共享系统表的目录
- sys_clog目录:commit log的目录
- sys_log:数据库系统日志目录,在查询一些系统错误时,查看此目录下的日志文件
- sys_stat_tmp:统计信息的存储目录
- sys_tblspc:存储了指向各个用户自建表空间实际目录的链接文件
- sys_twophase:使用两阶段提交功能时分布式事务的存储目录
- sys_xlog:WAL日志的目录
目录 | 描述 |
/data/sys_xact | 是事务提交日志(Commit Log)的存储位置。这个目录在系统初始化后从0000开始递增至FFFF,文件名形如XXXX,默认大小为256KB。此外,事务提交日志主要记录了数据库运行中的事件,例如用户执行的SQL操作等,这些信息可以帮助用户了解和分析数据库当前状态,并有助于分析可能产生的异常。如果某个事务已经被冻结,那么与它相关的文件可以被vacuum清理以回收空间。 |
/data/sys_notify | 存储通知信息的目录。当数据库中的某个事件(如WAL归档、表空间扩展等)发生时,系统会向所有连接到该数据库的客户端发送通知消息。这些通知消息会被写入到sys_notify目录中,以供客户端读取和处理。 |
/data/global | SYS_GLOBAL表空间的目录。 |
/data/sys_csnlog | 包含事务提交序列号和子事务状态数据的目录。 |
/data/sys_bulkload | 包含LISTEN/NOTIFY状态数据的子目录。 |
/data/sys_commit_ts | 事务提交时间戳数据目录。 |
/data/sys_dynshmem | 动态共享内存子系统所使用的文件的子目录。 |
/data/sys_serial | 已提交的可序列化事务信息的子目录。 |
/data/sys_snapshots | 导出的快照的子目录。 |
/data/sys_tblspc | 保存指向自建表空间实际目录的链接文件。 |
/data/sys_twophase | 用于预备事务状态文件的子目录。 |
/data/sys_stat | 用于统计子系统的永久文件的子目录。 |
/data/sys_stat_tmp | 表、索引统计信息临时文件目录。 |
/data/sys_aud | 存储kingbase审计相关信息。 |
/data/sys_wal | WAL日志的目录。 |
/data/sys_multixact | 多事务multi-transaction状态数据的子目录(用于共享的行锁)。 |
/data/sys_logical | 用于逻辑复制的状态数据的子目录。 |
/data/base | SYS_DEFAULT表空间的目录。 |
/data/sys_log | 数据库系统日志目录,用于查询一些系统错误。 |
2.2. 参数配置
配置文件位置:数据库数据目录中kingbase.conf
查看方法:
- 图形:通过数据库对象管理工具查看
- SQL:通过show 参数名称或者查询sys_settings系统表
参数级别:
- 固定级(cluster)
数据库初始化时设置,一旦固定,不能再修改;初始化数据库时设置。
- 系统级(system)
通过直接编辑参数文件 kingbase.conf 或者通过 ALTER SYSTEM SET 语句来设置系统级参数的值。这些参数被设置后不会立即生效,必须重新启动服务器才可生效,而且是对所有数据库及连接均有效。
- 全局级(global)
通过直接编辑参数文件 kingbase.conf 或者通过 ALTER SYSTEM SET 语句来设置全局级参数的值。这些参数被设置后,不用重启服务器,就会对所有数据库及连接立即生效。
- 会话级(session)
使用SET 或者 ALTER DATABASE SET 语句进行设置。
通过 SET 语句设置只对当前连接有效,而通过ALTER DATABASE SET语句设置会对该数据库上启动的每个新会话生效,而不会对该数据库上的本次连接和其它数据库上的连接生效。
2.2.1. 连接配置
listen_addresses (string)
指定服务器在哪些 TCP/IP 地址上监听客户端连接。值的形式是一个逗号分隔的主机名和/或数字 IP 地址列表。特殊项*对应所有可用 IP 接口。
port (integer)
服务器监听的 TCP 端口;默认是 54321。
max_connections (integer)
决定数据库的最大并发连接数。默认值通常是 100 个连接。
Superuser_reserved_connections
决定为KingbaseES超级用户连接而保留的连接“槽”数。 同时活跃的并发连接最多max_connections个。任何时候,活跃的并发连接数最多为max_connections减去 superuser_reserved_connections,新连接就只能由超级用户发起。
Tcp_keepalives_idle
指定不活动多少秒之后通过 TCP 向客户端发送一个 keepalive 消息。 0 值表示使用默认值。
Tcp_keepalives_interval
指定在多少秒之后重发一个还没有被客户端告知已收到的 TCP keepalive 消息。0 值表示使用系统默认值。
Tcp_keepalives_count
指定与客户端的服务器连接被认为死掉之前允许丢失的 TCP keepalive 数量。0 值表示使用系统默认值。
2.2.2. 资源消耗
Shared_buffers
设置数据库服务器将使用的共享内存缓冲区量。默认通常是 128 兆字节(128MB)。
Work_mem
声明内部排序和哈希操作可使用的工作内存大小。
Maintenance_work_mem
指定在维护性操作(例如VACUUM、CREATE INDEX和ALTER TABLE ADD FOREIGN KEY)中使用的 最大的内存量。其默认值是 64 兆字节(64MB)。
effective_cache_size
是kingbase能够使用的最大缓存,这个数字对于独立的kingbase服务器而言应该足够大。
2.2.3. 错误报告及日志
logging_collector
日志收集器开关
Log_destination
KingbaseES支持多种方法来记录服务器消息,包括stderr、csvlog和syslog。默认值是只记录到stderr。
Log_directory
这个参数决定日志文件目录,它可以被指定为一个绝对路径,也可以被指定为一个相对于数据目录的相对路径,默认sys_log
Log_filename
日志文件的文件名,默认是kingbase-%Y-%m-%d_%H%M%S.log
Log_rotation_age
日志超过多长时间,就生成一个新的文件
Log_rotation_size
日志超过多大时,就生成一个新的文件
Log_truncate_on_rotation
是否覆盖已有的同名日志
Log_line_prefix
每个日志行的开头输出
log_duration = off
记录每条SQL语句执行完成消耗的时间,将此配置设置为on,用于统计哪些SQL语句耗时较长。
log_min_duration_statement
-1表示不记录,0将记录所有SQL语句和它们的耗时,>0只记录那些耗时超过(或等于)这个值(ms)的SQL语句。
log_statement = 'none'
none, ddl, mod, all ---- 控制记录哪些SQL语句。none不记录,ddl记录所有数据定义命令,mod记录所有ddl语句,all记录所有执行的语句,将此配置设置为all可跟踪整个数据库执行的SQL语句。
比如,保留一周的日志,到了新的一周,就会把之前一周的日志覆盖掉
Log_filename='kingbase-%Y%m%d-%H.log'
Log_rotation_age=1440
Log_truncate_on_rotation=on
2.2.4. 参数建议设置
max_connections=1000
shared_buffers=RAM(free -g)*0.4GB
work_mem =10MB
maintenance_work_mem=1GB
effective_cache_size=RAM(free -g)*0.5GB
logging_collector=on
log_destination='stderr'
log_directory='sys_log'
log_filename='kingbase-%Y%m%d-%H.log'
log_truncate_on_rotation=on
log_rotation_age=1440
log_rotation_size=100MB
log_connections=on
log_disconnections=on
log_statement='none'
log_checkpoints=on
log_lock_waits=on
log_autovacuum_min_duration=0
lc_messages='C'
log_temp_files=0
log_min_duration_statement=1000
log_line_prefix='%t [%p]: [%l-1] user=%u,db=%d,app=%a,client=%h'
char_default_type='char'
max_locks_per_transaction=1024
#ora_date_style=on
#ora_format_style=on
#ora_func_style=on
#ora_input_emptystr_isnull=on
#ora_numop_style=on
3. 数据库监控运维
3.1. 数据库日志位置
- 数据库日志:
数据目录下的sys_log目录
此目录下存放的是数据库日志文件,数据库运行信息,sql执行情况都存放此目录下的日志文件中。
- 集群日志:
集群目录下
集群的日志文件存放在此目录下
hamgr.log 集群运行状态日志
kbha.log 监控repmgrd进程日志
3.2. 集群状态查看
启停集群:
集群目录/bin下手动启动停止 sh sys_monitor.sh start/stop
3.2.1. 集群状态查看:
repmgr cluster show
要点:status是*ruuning或running状态;upstrean如果不是级联复制,都是指向primary node。
repmgr cluster event
要点:可以看到事件及事件发生时间。该信息对于定位问题很重要。
3.2.2. 查看流复制情况:
select * from sys_stat_replication;
要点:几个lsn之减值差异,代表复制延迟。sync_stat表示复制状态,可以是quorum,sync,async
3.2.3. 查看复制槽情况:
select * from sys_replication_slots;
要点:关键值是active值。如果active='f',表示该replication slot对应的数据库没启动或者流复制有问题。
3.2.4. 流复制监控:
流复制监控是根据视图sys_stat_replication判断日志传输及日志应用延迟情况。该视图右击重要的值:
sent_lsn master传送WAL的位置
write_lsn slave接收WAL的位置(写入到OS写队列)
flush_lsn slave同步到磁盘的WAL位置(刷入到磁盘)
replay_lsn slave同步到数据库的WAL位置(应用到数据库)
具体监控脚本如下:
select client_addr,
sys_wal_lsn_diff(sys_current_wal_insert_lsn(),sys_current_wal_lsn()) as local_noflush_delay,
sys_wal_lsn_diff(sys_current_wal_lsn(),sent_lsn) as local_sent_delay,
sys_wal_lsn_diff(sent_lsn,write_lsn) as stream_write_delay,
sys_wal_lsn_diff(sent_lsn,flush_lsn) as stream_flush_delay,
sys_wal_lsn_diff(sent_lsn,replay_lsn) as stream_replay_dela
from sys_stat_replication;
3.3. 连接监控
sys_stat_activity:实例维护的一个进程相关的视图,是实时变化的。
样例:
1、查看总连接数:
select count(*) from sys_stat_activity where backend_xid <> sys_backend_pid();
2、查看正在执行的查询数:
select datname,count(*) as open,count(*) filter (where state = 'active' ) as active,count(*) filter (where state = 'idle' ) as idle,count(*) filter (where state = 'idle in transaction' ) as idle_in_trans from sys_stat_activity group by rollup(1);
3、查看连接数:
select datname,usename,client_addr,count(*) from sys_stat_activity where backend_xid<>sys_backend_pid() group by 1,2,3 order by 1,2,4 desc;
4、查看大于1s的sql:
select * from sys_stat_activity where state<>'idle' and now()-query_start > interval '1 s' order by query_start ;
5、查看大于5分钟的长事务:
select query,state from sys_stat_activity where state<>'idle' and (backend_xid is not null or backend_xmin is not null) and now()-xact_start > interval '5 min' order by xact_start;
6、查询活动会话:
select pid,usename,datname,query,client_addr from sys_stat_activity where backend_xid<>sys_backend_pid() and state='active' order by query;
3.4. 查看对象大小
查看数据库/表/索引的大小
SELECT datname,sys_size_pretty(sys_database_size(datname)) FROM sys_database;
SELECT relname,sys_size_pretty(sys_relation_size(oid)) FROM sys_class WHERE relname = 'test0';
SELECT relname,sys_size_pretty(sys_total_relation_size(oid)) FROM sys_class WHERE relname = 'test0';
SELECT relname,sys_size_pretty(sys_indexes_size(oid)) FROM sys_class WHERE relname = 'test0';
3.5. 回收空间
- 目的
回收或重用dead tuples占用的磁盘空间
“冻结”数据,防止事务ID回卷导致数据不可见
- 方法
内置autovacuum(基本免维护)
vacuumdb [OPTION]... [DBNAME]
VACUUM [ FULL | FREEZE | ANALYZE | DISABLE_PAGE_SKIPPING ] [table_name[(column_name[, ...])]]
FULL:完全清理(彻底,但是慢)
FREEZE:快速清理并冻结元组(效果较好,较慢)
ANALYZE:快速清理并更新统计信息(效果较好,较快)
3.6. 长事务清理
- 长事务的弊端
阻止垃圾回收,导致表和索引膨胀
频繁唤醒autovacuum进程,浪费I/O
- 查找长事务
SELECT pid,state,query FROM sys_stat_activity WHERE state <> 'idle' AND now()-xact_start > interval '10s';
- 终止长事务、长连接
SELECT sys_terminate_backend(pid);
3.7. 故障处理
出现上图类似的报错,一般是由于系统资源不足导致,修改系统limit限制(open files,max user processes,core file size),systemd的DefaultTasksMax的设置,此参数会限制服务可创建的最大进程数。
- CPU使用率过高
CPU使用率过高,导致应用系统系统运行较慢。
先通过系统视图sys_stat_activity,定位执行时间较长的sql,数据库中单独执行,确定执行时间确实较慢,通过优化将sql执行时间缩短,达到降低 CPU使用率的问题
- sys_locks视图用于查看锁信息
锁冲突数量监控
select * from sys_locks where granted='f';