前言

在KingbaseESV8R6数据库中,必须先将更改写入WAL日志(老版本称为 xlog),然后才能将这些更改从内存shared_buffer 写入到磁盘。

前两天有个同事遇到一个问题,wal日志每天生成120GB,于是我们检查了参数checkpoint_timeout参数是默认的5min。然而这个参数应该根据实际的业务类型进行调整,建议调整为30-60分钟。

增加检查点之间的距离会导致WAL日志减少,相当于增加checkpoint_timeout参数,就相对减少wal日志量生成。因为当开启了full_page_writes参数(默认开启),每次检查点后的第一次写入wal日志必然发生一次全页写。所以这就大大增加了wal日志量。

检查点相关参数:

checkpoint_timeout

自动 WAL 检查点之间的最长时间,以秒计。合理的范围在 30 秒到 1 天之间。默认是 5 分钟( 5min )。增加这个参数的值会增加崩溃恢复所需的时间。这个参数只能在 kingbase.conf 文件中或在服务器命令行上设置。

checkpoint_completion_target

指定检查点完成的目标,作为检查点之间总时间的一部分。默认是 0.5。 这个参数只能在 kingbase.conf 文件中或在服务器命令行上设置。

max_wal_size

在检查点之间允许重做日志增长到的最大尺寸。这是一个软限制, 在特殊的情况下重做文件尺寸可能会超过max_wal_size。如果指定值时没有单位,则以兆字节为单位。默认为 1 GB。增加这个参数 可能导致崩溃恢复所需的时间。这个参数只能在kingbase.conf或者服务器命令行中设置。

测试wal日志生成量对比

这里使用kbbench工具进行测试

[](javascript:void(0)

kbbench参数说明:
[kingbase2@localhost ~]$ kbbench --help
kbbench is a benchmarking tool for Kingbase. Usage:
kbbench [OPTION]... [DBNAME] Initialization options:
-i, --initialize invokes initialization mode
-I, --init-steps=[dtgvpf]+ (default "dtgvp")
run selected initialization steps
-F, --fillfactor=NUM set fill factor
-n, --no-vacuum do not run VACUUM during initialization
-q, --quiet quiet logging (one message each 5 seconds)
-s, --scale=NUM scaling factor
--foreign-keys create foreign key constraints between tables
--index-tablespace=TABLESPACE
create indexes in the specified tablespace
--tablespace=TABLESPACE create tables in the specified tablespace
--unlogged-tables create tables as unlogged tables Options to select what to run:
-b, --builtin=NAME[@W] add builtin script NAME weighted at W (default: 1)
(use "-b list" to list available scripts)
-f, --file=FILENAME[@W] add script FILENAME weighted at W (default: 1)
-N, --skip-some-updates skip updates of kbbench_tellers and kbbench_branches
(same as "-b simple-update")
-S, --select-only perform SELECT-only transactions
(same as "-b select-only") Benchmarking options:
-c, --client=NUM number of concurrent database clients (default: 1)
-C, --connect establish new connection for each transaction
-D, --define=VARNAME=VALUE
define variable for use by custom script
-j, --jobs=NUM number of threads (default: 1)
-l, --log write transaction times to log file
-L, --latency-limit=NUM count transactions lasting more than NUM ms as late
-M, --protocol=simple|extended|prepared
protocol for submitting queries (default: simple)
-n, --no-vacuum do not run VACUUM before tests
-P, --progress=NUM show thread progress report every NUM seconds
-r, --report-latencies report average latency per command
-R, --rate=NUM target rate in transactions per second
-s, --scale=NUM report this scale factor in output
-t, --transactions=NUM number of transactions each client runs (default: 10)
-T, --time=NUM duration of benchmark test in seconds
-v, --vacuum-all vacuum all four standard tables before tests
--aggregate-interval=NUM aggregate data over NUM seconds
--log-prefix=PREFIX prefix for transaction time log file
(default: "kbbench_log")
--progress-timestamp use Unix epoch timestamps for progress
--random-seed=SEED set random seed ("time", "rand", integer)
--sampling-rate=NUM fraction of transactions to log (e.g., 0.01 for 1%) Common options:
-d, --debug print debugging output
-h, --host=HOSTNAME database server host or socket directory
-p, --port=PORT database server port number
-U, --username=USERNAME connect as specified database user
-V, --version output version information, then exit
-?, --help show this help, then exit Report bugs to <kingbase-bugs@kingbase.com.cn>. 1)创建测试数据库kbbench :
createdb -p 2920 -U SYSTEM kbbench ; 2)初始化测试数据:
kbbench -i -s 10 -p 2920 -U SYSTEM kbbench
重点:主要用到两个参数,‐i:初始化模式,‐s 插入的倍数,默认是1,即插入100000条,这里设置10,即插入100万条记录 [kingbase2@localhost sys_wal]$ kbbench -i -s 10 -p 2920 -U SYSTEM kbbench
dropping old tables...
creating tables...
generating data...
100000 of 1000000 tuples (10%) done (elapsed 0.07 s, remaining 0.63 s) 200000 of 1000000 tuples (20%) done (elapsed 0.18 s, remaining 0.70 s)
300000 of 1000000 tuples (30%) done (elapsed 0.29 s, remaining 0.67 s)
400000 of 1000000 tuples (40%) done (elapsed 0.39 s, remaining 0.59 s)
500000 of 1000000 tuples (50%) done (elapsed 0.49 s, remaining 0.49 s)
600000 of 1000000 tuples (60%) done (elapsed 0.60 s, remaining 0.40 s)
700000 of 1000000 tuples (70%) done (elapsed 0.71 s, remaining 0.30 s)
800000 of 1000000 tuples (80%) done (elapsed 0.82 s, remaining 0.21 s)
900000 of 1000000 tuples (90%) done (elapsed 1.01 s, remaining 0.11 s)
1000000 of 1000000 tuples (100%) done (elapsed 1.12 s, remaining 0.00 s)
vacuuming...
creating primary keys...
done. 开始测试:
kbbench -c 4 -j 4 -T 100 -r -p 2920 -U SYSTEM kbbench;
-c 总连接数,创建多少个连接到数据库,一般数据库接受连接数默认为100,其中需要预留
3个左右的连接。
-j 进程数量,每个进程创建n个连接,那么就存在如下关系:-c = -j *n,建议为服务
器的CPU核数。
-T 测试持续时间,指定了-T就不能指定-t,每个连接执行的事物数量。即,要么指定测试多
长时间,要么指定测试多少个事物。
-r 显示每一步操作的平均时间。
-f 指定测试脚本,不指定则使用默认脚本。这里使用的默认脚本。 [kingbase2@localhost ~]$ kbbench -c 4 -j 4 -t100 -r -p 2920 -U SYSTEM kbbench;
starting vacuum...end.
transaction type: <builtin: TPC-B (sort of)>
scaling factor: 1
query mode: simple
number of clients: 4
number of threads: 4
duration: 100 s
number of transactions actually processed: 104125
latency average = 3.842 ms
tps = 1041.164501 (including connections establishing)
tps = 1041.374809 (excluding connections establishing)
statement latencies in milliseconds:
0.001 \set aid random(1, 100000 * :scale)
0.000 \set bid random(1, 1 * :scale)
0.000 \set tid random(1, 10 * :scale)
0.000 \set delta random(-5000, 5000)
0.241 BEGIN;
0.173 UPDATE kbbench_accounts SET abalance = abalance + :delta WHERE aid = :aid;
0.406 SELECT abalance FROM kbbench_accounts WHERE aid = :aid;
0.867 UPDATE kbbench_tellers SET tbalance = tbalance + :delta WHERE tid = :tid;
1.453 UPDATE kbbench_branches SET bbalance = bbalance + :delta WHERE bid = :bid;
0.160 INSERT INTO kbbench_history (tid, bid, aid, delta, mtime) VALUES (:tid, :bid, :aid, :delta, CURRENT_TIMESTAMP);
0.538 END; kbbench=# select pg_size_pretty(sum(size)) from pg_ls_waldir();
pg_size_pretty
----------------
160 MB
(1 row) 调整检查点时间为30s,再次进行测试
alter system set checkpoint_timeout='1min' TEST=# select sys_reload_conf();
sys_reload_conf
-----------------
t
(1 row) TEST=# show checkpoint_timeout ;
checkpoint_timeout
--------------------
1min
(1 row) TEST=# drop database kbbench;
DROP DATABASE
再次执行一次以上的测试步骤
createdb -p 2920 -U SYSTEM kbbench ; kbbench -i -s 10 -p 2920 -U SYSTEM kbbench kbbench -c 4 -j 4 -T 100 -r -p 2920 -U SYSTEM kbbench; wal日志量增长3倍左右,因为检查点发生的更频繁,导致检查点发生后第一次写入的wal日志是full page,也就是写入了8K,无形中增加了wal日志量。 TEST=# select pg_size_pretty(sum(size)) from pg_ls_waldir();
pg_size_pretty
----------------
462 MB
(1 row)

[](javascript:void(0)

总结:

增加检查点间隔可以避免生成大量wal日志。而且检查点频繁发生会使脏块写入更频繁,这时候如果业务很繁忙,wal日志实际上也会发生大量磁盘写,综合分析,很容易造成磁盘IO繁忙,严重会影响业务正常运行,甚至造成一些数据库等待事件。所以我们需要根据业务系统类型,例如OLAP或OLTP,合理设置检查点时间。

另一方面,需要注意增加检查点时间间隔虽然对数据库性能有帮助,但是由于需要保留更多wal日志,所以当发生实例崩溃时,事务前滚回滚的时间也会加长,那么也将增加数据库恢复时间。

KingbaseES checkpoint_timeout参数对wal日志量的影响的更多相关文章

  1. KingbaseES通过sys_waldump解析wal日志

    前言 oracle中的redo日志我们无法直接读取,然而对于KingbaseES数据库,我们可以利用sys_waldump工具解析wal日志,查看wal日志记录的信息. 我们可以利用 sys_wald ...

  2. MySQL 5.6 新参数对binlog日志量的优化

    数据库版本:5.6.* 1.row日志image类型 参数binlog_row_image 控制着这种image类型,默认为FULL(log all columns),即记录before&af ...

  3. KingbaseES在线wal日志

    KingbaseES数据库日志文件记录数据库的历史操作信息, 包含恢复数据库中的所有事务所需的信息. KingbaseES在线WAL日志: WAL日志: 预写式日志(Write-Ahead Loggi ...

  4. KingbaseES V8R3集群管理和维护案例之---failover切换wal日志变化分析

    ​ 案例说明: 本案例通过对KingbaseES V8R3集群failover切换过程进行观察,分析了主备库切换后wal日志的变化,对应用者了解KingbaseES V8R3(R6) failover ...

  5. KingbaseES V8R6 集群环境wal日志清理

    案例说明: 1.对于集群中的wal日志,除了需要在备库执行recovery外,在集群主备切换(switchover或failover)时,sys_rewind都要读取wal日志,将数据库恢复到一致性状 ...

  6. PgSQL · 追根究底 · WAL日志空间的意外增长

    问题出现 我们在线上巡检中发现,一个实例的pg_xlog目录,增长到4G,很是疑惑.刚开始怀疑是日志归档过慢,日志堆积在pg_xlog目录下面,未被清除导致.于是检查归档目录下的文件,内容如下.但发现 ...

  7. PostgreSQL WAL日志详解

    wal日志即write ahead log预写式日志,简称wal日志.wal日志可以说是PostgreSQL中十分重要的部分,相当于oracle中的redo日志. 当数据库中数据发生变更时:chang ...

  8. Postgresql WAL日志浅析

    一.预写日志(WAL) 预写式日志(Write Ahead Log,WAL)是保证数据完整性的一种标准方法.简单来说,WAL的中心概念是数据文件(存储着表和索引)的修改必须在这些动作被日志记录之后才被 ...

  9. Postgresql清理WAL日志

    WAL是Write Ahead Log的简写,和oracle的redo日志类似,存放在$PGDATA/pg_xlog中,10版本以后在$PGDATA/pg_wal目录. 1.如果开启了归档,在目录ar ...

  10. postgresql如何维护WAL日志/归档日志

    WAL日志介绍 wal全称是write ahead log,是postgresql中的online redo log,是为了保证数据库中数据的一致性和事务的完整性.而在PostgreSQL 7中引入的 ...

随机推荐

  1. 正则表达式(Regular Expression)详解

    1 前言 正则表达式主要用于复杂文本处理,如模式匹配.格式检验.文本替换等.常用的通配符有: ^, $, *, ., , -, +, ?, &, |, (), [], {} 2 String中 ...

  2. JS实现提示文本框可输入剩余字数

    最近在设计写博客功能时,涉及到留言框输入字数限制,需要给用户剩余数字提示. 参考文章:https://www.cnblogs.com/crazytrip/p/4968230.html 实现效果: 源码 ...

  3. spring boot整合dubbo

    本项目通过模拟卖票和买票模块来讲解spring boot如何整合dubbo. 1.搭建zookeeper 使用docker方式: docker pull registry.docker-cn.com/ ...

  4. 使用RegSetValueEx创建键值

    #include <iostream> #include <string> #include <sstream> #include <fstream> ...

  5. RHEL8重置root用户密码步骤

    要先确定是否为RHEL 8系统. [root@zhangsan ~]# cat /etc/redhat-release Red Hat Enterprise Linux release 8.0 (Oo ...

  6. [2023本地存储方案](https://www.cnblogs.com/fangchaoduan/p/17608006.html)

    2023本地存储方案 本地存储方案 cookie 本地存储:有期限的限制,可以自己设置过期期限.在期限内,不论页面刷新还是关闭,存储的信息都还会存在. localStorage 本地持久化存储:页面刷 ...

  7. logstash部署及项目日志输出到ES

    目录 logstash简介 安装logstash logstash的基本语法 测试标准输入输出 测试输出到文件 测试输出到ES 指定配置文件启动 配置文件内容 后台运行脚本 参考 logstash简介 ...

  8. Emqx高可用架构

    目录 优化前架构 主要问题 haproxy问题 优化后架构 优化功能点 emq版本升级 linux系统调优 haproxy调优 测试工具 依赖安装 配置erl环境变量 安装压测软件 测试指令与结果展示 ...

  9. 【Application Insights】使用CURL命令向Application Insgihts发送测试数据

    问题描述 在使用App Service或者Kubernetes等服务时,需要收集一些日志数据并且发送到Application Insights中,当使用SDK或者是服务自带的Application I ...

  10. Nebula Graph 源码解读系列 | Vol.05 Scheduler 和 Executor 两兄弟

    本文首发于 Nebula Graph Community 公众号 上篇我们讲述了 Query Engine Optimizer 部分的内容,在本文我们讲解下 Query Engine 剩下的 Sche ...