MySQL,HDFS,HBase相似之处

这几天一直在看MySQL底层的一些东西,看到最后,越来越觉得MySQL,HBase,HDFS之间有很多相似的地方,所以在这里来记录这些相似之处,和大家一起学习。

1. 预写日志

  1. 在MySQL Innodb中,有Redo日志和二进制日志。当我们进行数据库更改的时候,更改的操作会记录在Redo日志中,同时也会记录在二进制日志中。Redo日志主要保证了事务的持久性,以后可以通过回放Redo中的修改操作,来进行数据的修复。Redo日志主要记录了对页的物理修改。
  2. 在HDFS中,如果我们有修改操作的话,首先,我们会通过RPC来访问NameNode,那么这次操作会先记录在Edits Log中,然后在对NameNode 内存中的文件系统或者文件元数据进行修改。这里每次修改操作都会先记录在Edits Log中,然后才会去内存中进行修改操作。
  3. 在HBase中,有预写日志(WAL),每个RegionServer共享一个WAL,每次进行修改操作的时候,会首先把该操作记录到WAL中去,然后再去memstore中进行数据的修改操作,只有这样,才算一次修改完成。

2. Hadoop HDFS HA(高可用性)和MySQL双主复制

  1. 我们知道,Hadoop 2.0中HDFS引入了HA(高可用性),即一个集群中有两个NameNode,Active NameNode和StandBy NameNode,只有Active NameNode 向外进行服务。Active NameNode和StandBy NameNode中的内存中文件系统和文件元数据是一样的。当Active NameNode中的Edits Log内容增加时,其会把增加的内容写到一些叫做Journal Node节点上,Standby NameNode监测到Edits Log变化的时候,就会得到增加的内容记录到自己的日志中。
  2. 而上面很类似MySQL中的双主复制,即有两个节点,双方互相对方的主库。只要有一个变化,另外一个节点就会监测对方的二进制文件改变了,就会将对方的修改的二进制文件内容复制到自己的relay log中,然后进行回放操作。

3. HBase MemStore,BlockCatch和MySQL 缓冲池

  1. 在HBase集群的每个节点上,每个列族都会有一个MemStore和BlockCatch,他们在一个堆中。当我们进行数据的Put操作时,会先将该操作记录中WAL中,然后将该数据写入到MemStore中,当MemStore满了时,会刷写到磁盘上,形成一个HFile文件。而当我们进行数据的读取的时候,BlockCatch用于缓存我们读取到的数据,是以Block问单位读取的,HFile在物理上以Block进行存放的。读取的访问的顺序是MemStore中的修改队列,然后是BlockCatch,如果没有的话,就从物理上面访问对应的HFile.
  2. 在MySQL中,为了缓和CPU到磁盘的速度不匹配问题,引入了缓冲池。缓冲池是内存的一块区域,其中包括了Free List , LRU List,Flush List。我们知道,MySQL Innodb是以页进行数据存放的,所以在Free List,LRU List,Flush List都是以页为单位工作的。当我们从磁盘读取页的时候,首先会从Free List进行页的申请,如果没有空间的话,就会从LRU List中替换相应的页。Flush List中都是要进行刷写到磁盘上面的脏页。

4. MySQL Innodb LSN,HDFS 事务ID,HBse序列号

  1. 在MySQL中,LSN表示日志序列号,刷写到Redo 日志中的日志量,以字节为单位,比如现在的LSN是1000,事务1刷写了100字节的重做日志,事务2刷写了300字节的重做日志,那现在的LSN就是1400.每次CheckPoint都有相应的LSN,每次回复CheckPoint的LSN到最新的LSN之间的操作。
  2. HDFS中的事务ID号。我们每次在HDFS文件中的修改操作,都是通过一次RPC请求进行操作。NameNode在接受到该操作之后,会把该操作记录到EditsLog中去。我们往EditsLog中进行写入的时候,其实这个操作就是一个事务。所以,每次这样的事务操作都有一个全局唯一的事务ID号,并且该事务ID号是单调递增的。你可以在本地磁盘上面看到edits_000000000000001-000000000000007.这样的文件,其实其中的00000000001-00000000007就是事务的ID号,表示写到editslog文件中的操作。同时,你也可以看到fsimage_000000000000007这样的文件,这表示已经进行刷写数据的FSiamge文件,表示00000000007之前的操作后的数据已经进行刷写到磁盘进行持久化了。这就类似于Mysql中的CheckPoint.每次只需要进行持久到磁盘的事务ID——最新的EditLogs中的事务ID之间的操作就行了,进行恢复。
  3. 在HBase中,也有序列号,其类似上面的操作。

现在还有好多地方没有深入的了解,上面写的这些只是我现在的一些想法,可能有些地方写到不是完全正确,如果有什么错误,希望大家可以提出。我们一起进步。

©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页