zookeeper系列(七):主从同步

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了zookeeper系列(七):主从同步相关的知识,希望对你有一定的参考价值。

参考技术A 整个集群完成Leader选举后,Leader会向Leader服务器进行注册。当Leader向Leader服务器完成注册后,就进入主从数据同步环节。也就是Leader会将自己的数据同步给从服务器。

根据ZXID来判断同步策略

这里有三个ZXID

四种数据同步策略:

场景:
peerLastZxid 介于 minCommittedLog 和 maxCommittedLog 之间。

leader向从服务器发送一个DIFF指令,告诉从服务器进入DIFF同步阶段,leader将要把一些proposal同步给从。针对每个proposal,leader都会发送两个数据包,分别是proposal内容数据包和commit指令数据包。

假如某个时刻leader服务器的建议缓存队列对应的ZXID依次是:
0x500000001、0x500000002、0x500000003、0x500000004、0x500000005

而从服务器最后处理的ZXID为0x500000003。

那么leader就会依次将0x500000004、0x500000005两个proposal同步给从服务器。

场景:
假设有A、B、C三台机器,加入某一时刻B是leader,此时的epoch为5,ZXID包括0x500000001、0x500000002。此时leader正要处理ZXID:0x500000003,并且已经将该事务写入到了自己机器的事务日志中了,就在将该proposal发给从服务器的时候,B挂了,也就是leader挂了,proposal没有同步出去。
此时zk集群会进行新一轮的leader选举,A成为leader,epoch为6。并又提交了两个事务0x600000001、0x600000002。此时B重启,并开始同步数据。

leaderA发现B中的ZXID:0x500000003自己没有,那么就会让B先回滚到和自己ZXID一样的最近的ZXID。再DIFF同步。

此时B,先回滚到0x500000002,再DIFF同步0x600000001、0x600000002
(这里是6开头了啊,不是5开头)

场景:
peerLastZxid 大于 maxCommittedLog
TRUNC + DIFF同步的第一步。
也就是A成为leader后,还没有新的事务0x600000001、0x600000002进来,B就起来了。这个时候,B直接回滚就好了。

场景1:
peerLastZxid 小于 minCommittedLog

场景2:
leader服务器上没有proposal缓存队列。

在这两种场景下,leader服务器都无法直接使用建议缓存队列进行数据同步,没办法了,只能全量同步了。

所谓全量同步就是leader服务器将本机上的全量内存数据都同步给从服务器。

hadoop+zookeeper+yarn+spark高可用主从备份启动步骤

环境搭建参考于 https://www.cnblogs.com/zimo-jing/p/8892697.html

1、所有节点依次启动zookeeper

 # zkServer.sh start
>>
7915 QuorumPeerMain 
7915 QuorumPeerMain 

 

2、所有节点依次启动journalnode 保证数据同步(此步可省略,3将启动这一步) 

 # hadoop-daemon.sh start journalnode
>>
 7915 QuorumPeerMain  
8109 JournalNode
7915 QuorumPeerMain  

 

3、主节点启动hdfs 

 # start-dfs.sh
>>
8279 NameNode
7915 QuorumPeerMain
8604 DFSZKFailoverController
8109 JournalNode 

 

UI界面 :

            master http://master:50070
            slave1 http://slave1:50070

4、主节点启动yarn slave1也要执行

 

# zkServer.sh start
-----------master------------- 
>>
8279 NameNode
7915 QuorumPeerMain
8604 DFSZKFailoverController
8732 ResourceManager
8109 JournalNode
-----------slave1------------- 
>>  
8192 DataNode
8113 NameNode
8481 NodeManager
8006 JournalNode
8348 DFSZKFailoverController
7935 QuorumPeerMain 

 UI界面:

       master:8088

            slave1:8088

           (注意: slave1UI界面会跳转到master)

5、启动spark

 

-----------master------------- 
# start-master.sh
# start-slaves.sh

>>
8279 NameNode
7915 QuorumPeerMain
8604 DFSZKFailoverController
8732 ResourceManager
8109 JournalNode
9150 Master
9374 Worker
-----------slave1------------- 
# start-master.sh

>>
8192 DataNode
8113 NameNode
8481 NodeManager
8786 Master
8006 JournalNode
8348 DFSZKFailoverController
9164 Worker
7935 QuorumPeerMain

 

界面:主 http://master:8081/
           从 http://slave1:8082/

6、提交任务

yarn:client模式 

 spark-submit --master yarn --conf spark.pyspark.python=/usr/python3/python --deploy-mode client hello.py

 spark: client模式 

spark-submit --master spark://master:7077 --conf spark.pyspark.python=python3 --deploy-mode client hello.py

 完!

 

以上是关于zookeeper系列(七):主从同步的主要内容,如果未能解决你的问题,请参考以下文章

Redis系列--主从同步

主从同步的详细流程

高并发架构系列:数据库主从同步的3种一致性方案实现,及优劣比较

Mysql -- 主从复制(主从同步)

闲聊MySQL:浅析主从同步

ActiveMQ 基于zookeeper的主从(levelDB Master/Slave)搭建以及Spring-boot下使用