Editlog与FileChannel Log的Group Commit

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介:

前阶段看Hadoop源码看到editlog部分,和flume file-channellogfile部分注意到一个相同之处:Groupcommit.其实最早接触这个概念是在MySQLredo log(注:binlog group commitmariadb/procona是支持的,或者mysqlsync_binlog=0;细节移步:http://kristiannielsen.livejournal.com/12254.html);

先来看看Hadoop是怎么处理的:

Editlog是可以被多个线程并发写入的,每个线程维护了自己最新的一个事务ID

privatestaticfinalThreadLocal<TransactionId> myTransactionId = newThreadLocal<TransactionId>() {

protectedsynchronizedTransactionId initialValue() {

returnnewTransactionId(Long.MAX_VALUE);

}

};

在提交的时候,首先获得提交时最新的事务ID

synchronized(this){

TransactionId id = myTransactionId.get();

id.txidtxid;

}

然后开始同步(代码被删减)

//拿到自己的事务ID

longmytxid = myTransactionId.get().txid;

booleansync = false;

try{

EditLogOutputStream logStream = null;

synchronized(this){

try {

//如果自己的事务未被同步,但是同步正在被其他线程处理,那么就阻塞

while (mytxid > synctxid && isSyncRunning) {

try {

wait(1000);

catch (InterruptedException ie) {}

}

//当被唤醒或者超时发现自己的事务已经被group commit了,那么就返回

if (mytxid <= synctxid) {

return;

}

//否则开始进行sync

isSyncRunning = true;

sync = true;

//Hadoopeditlog使用了double buffer来达到刷新和写不阻塞;这里置换buffer

editLogStream.setReadyToFlush();

logStream = editLogStream;

try{

if (logStream != null) {

logStream.flush();

}

catch(IOException ex) {}

finally{

synchronized(this){

if (sync) {

isSyncRunning = false;

}

//刷新完成,唤醒阻塞线程

this.notifyAll();

}

}

而在Flume File-channel里的group commit也是类似的方式,不过更为简洁:

一样是分两个阶段,每个阶段都是同步方法,并且Flumetransactionidposition是分开的,每次只需同步文件末尾位置:

Commit();

Sync();

//在提交的时候更新最后提交位置

synchronizedvoidcommit(ByteBuffer buffer) throws IOException {

write(buffer);

lastCommitPosition= position();

}

//若已经被同步了则什么也不做,返回

synchronizedvoidsync() throwsIOException {

if(lastSyncPositionlastCommitPosition){

getFileChannel().force(false);

lastSyncPosition = position();

syncCount++;

}

}


本文转自MIKE老毕 51CTO博客,原文链接:http://blog.51cto.com/boylook/1300543,如需转载请自行联系原作者

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
4月前
|
Oracle 关系型数据库
Log Archive Destinations to a Group
oracle 归档日志路径配置
27 1
|
测试技术 开发工具 git
git commit message——git提交日志规范备忘
使用git提交时,最好能注意保持规范,可能某些公司对这方面没有要求,但是提交日志不规范的话,不方便查阅和管理。 在此记录下commit的类别,备忘,更详细的介绍,可以查看文末链接。
164 0
|
消息中间件 存储 编解码
重新理解RocketMQ Commit Log存储协议
Consumer Queue Offset是连续的吗, Commit Log Offset是连续的吗?今天我们一起重新理解RocketMQ Commit Log存储协议。
394 0
重新理解RocketMQ Commit Log存储协议
|
算法 数据库 索引
慢查询日志中出现commit
在慢查询日志中出现commit,就是因为事务提交(commit)的时间过长。
327 0
慢查询日志中出现commit
|
开发工具 git
【Git&GitHub - 5】:Git添加文件并提交到本地(git status、git add、git commit、git log命令的使用)
【Git&GitHub - 5】:Git添加文件并提交到本地(git status、git add、git commit、git log命令的使用)
208 0
【Git&GitHub - 5】:Git添加文件并提交到本地(git status、git add、git commit、git log命令的使用)
|
存储 SQL 关系型数据库
【redo log、bin log、undolog、purge操作、group commit】
【redo log、bin log、undolog、purge操作、group commit】
200 0
|
SQL 数据库
FAQ系列 | slow log中出现commit、binlog dump等奇怪的记录
FAQ系列 | slow log中出现commit、binlog dump等奇怪的记录
108 0
|
SQL 监控 NoSQL
网站流量日志分析--统计分析--sql补充扩展--group by 语法限制解析|学习笔记
快速学习网站流量日志分析--统计分析--sql补充扩展--group by 语法限制解析
173 0
|
SQL 数据库
FAQ系列 | slow log中出现commit、binlog dump等奇怪的记录
FAQ系列 | slow log中出现commit、binlog dump等奇怪的记录
|
SQL 数据库
FAQ系列 | slow log中出现commit、binlog dump等奇怪的记录
FAQ系列 | slow log中出现commit、binlog dump等奇怪的记录