Hbase 的持久化等级

引用自《Hbase原理和实践》第六章 6.1 Hbase 的写入流程
HBase 可以通过设置HLog的持久化等级决定是否开启 HLog 机制以及 HLog 的落盘方式。HLog的持久化等级分为如下五个等级。
SKIP_WAL:只写缓存,不写HLog日志。因为只写内存,因此这种方式可以极大地提升写入性能,但是数据有丢失的风险。在实际应用过程中并不建议设置此等级,除非确认不要求数据的可靠性。
ASYNC_WAL:异步将数据写入HLog日志中。
SYNC_WAL:同步将数据写入日志文件中,需要注意的是,数据只是被写入文件系统中,并没有真正落盘。HDFS Flush策略详见HADOOP-6313。
FSYNC_WAL:同步将数据写入日志文件并强制落盘。这是最严格的日志写入等级,可以保证数据不会丢失,但是性能相对比较差。
USER_DEFAULT:如果用户没有指定持久化等级,默认HBase使用SYNC_WAL等级持久化数据。

Mysql 的持久化等级

redo log 的持久化

1、持久化策略通过参数 innodb_flush_log_at_trx_commit 控制。

设置为 0 的时候,表示每次事务提交时都只是把 redo log 留在 redo log buffer 中 ; MySQL 崩溃就会丢失。
设置为 1 的时候,表示每次事务提交时都将 redo log 直接持久化到磁盘(将 redo log buffer 中的操作全部进行持久化,可能会包含其他事务还未提交的记录);断电也不会丢失。
设置为 2 的时候,表示每次事务提交时都只是把 redo log 写到 page cache。MySQL 崩溃不会丢失,断电会丢失。

2、InnoDB 后台还有一个线程会每隔一秒钟将 redo log buffer 中记录的操作执行 write 写到 page cache,然后再 fsync 到磁盘上。

未提交的事务操作也可能会持久化,未提交事务操作的持久化触发场景如下:

1、redo log buffer 被占用的空间达到 innodb_log_buffer_size(redo log buffer 大小参数)的一半时,后台会主动写盘,无论是否是已完成的事务操作都会执行。

2、innodb_flush_log_at_trx_commit 设为 1 时,在每次事务提交时,都会将 redo log buffer 中的所有操作(包括未提交事务的操作)都进行持久化。

3、后台有线程每秒清空 redo log buffer 进行落盘。

参考文章:
MySQL 中的WAL机制


universe_king
3.4k 声望680 粉丝