ZAB协议
一、概述
1.Zookeeper Atomic Broadcast - Zookeeper 原子广播协议,是专门为Zookeeper设置的协议
2.这套协议在设计过程中,基于2PC算法来设计,利用PAXOS算法进行了改进
3.作用:原子广播和奔溃恢复
二、原子广播
1.原子广播是为了保证所有节点数据的一致性
2.原子广播基于2Pc算法进行改进
3. 2PC- 2 Phase Commit -二阶段提交 核心思想“一票否决”
a.分发阶段:协调者收到请求之后,将请求发送给每一个参与者,然后让参与者将这个请求进行记录
b.提交阶段:如果每一个参与者都记录成功,并且协调者收到了所有参与者的成功信号,那么协调者就会要求所有的参与者执行这个请求
c.中止阶段:如果有一个或者多个参与者返回nor或者如果协调者没有收到参与者的返回信号,也会认为这个参与者返回的是no,那么协调者救护认为这个请求不可执行,那么协调者就会要求所有的参与者删除这个请求的记录
原子广播的过程(PAXOS改进【过半选举】)
[root@hadoop01 version-2]# pwd
/home/presoftware/zookeeper-3.4.8/tmp/version-2
[root@hadoop01 version-2]# ls
acceptedEpoch currentEpoch log.300000001 snapshot.0 snapshot.200000000
[root@hadoop01 version-2]# vi log.300000001
5.如果某个follower记录失败,而又接收到leader要求执行的命令,这个时候follower就会向leader发送请求重新申请这个任务
三、奔溃恢复
1.当集群中的leader因为某些原因产生丢失,集群中会自动选举出一个新的leader,那么这个过程就称之为崩溃恢复
2.崩溃恢复是为了避免zookeeper集群中出现单点故障
3.每选举出一个leader,就会给feader一个编号,这个编号称之为epochid。每一个leader都会将epochid发送给每一个follower,follower接收到epochid之后存储在哪里?acceptedEpoch
[root@hadoop01 version-2]# pwd
/home/presoftware/zookeeper-3.4.8/tmp/version-2
[root@hadoop01 version-2]# ls
acceptedEpoch currentEpoch log.300000001 snapshot.0 snapshot.200000000
[root@hadoop01 version-2]# vi acceptedEpoch
4.每一个follower接收到请求之后,都会先比较epochid
5.在集群中,Zookeeper的事务id实际上是由64位二进制数字组成,其中高32位表示的是epochid,低32位才是真正的事务id
6.当一个节点重新连入集群之后,这个节点会拿着自己的事务id和当前集群中的事务id进行比较,在比较完成之后,leader就会将确实的操作放入一个队列中发送给这个节点。这个节点在更新过程中不对外服务
log文件为字节日志,查看方法
java -cp .:zookeeper-3.4.8.jar:slf4j-api-1.6.1.jar org.apache.zookeeper.server.LogFormatter log.300000001
[root@hadoop01 zookeeper-3.4.8]# pwd
/home/presoftware/zookeeper-3.4.8
[root@hadoop01 zookeeper-3.4.8]# ls
bin docs README_packaging.txt zookeeper-3.4.8.jar.asc
build.xml ivysettings.xml README.txt zookeeper-3.4.8.jar.md5
CHANGES.txt ivy.xml recipes zookeeper-3.4.8.jar.sha1
conf lib src
contrib LICENSE.txt tmp
dist-maven NOTICE.txt zookeeper-3.4.8.jar
[root@hadoop01 zookeeper-3.4.8]# cp zookeeper-3.4.8.jar tmp/version-2/
[root@hadoop01 zookeeper-3.4.8]# cd lib/
[root@hadoop01 lib]# ls
cobertura log4j-1.2.16.jar slf4j-api-1.6.1.jar
jdiff log4j-1.2.16.LICENSE.txt slf4j-log4j12-1.6.1.jar
jline-0.9.94.jar netty-3.7.0.Final.jar
jline-0.9.94.LICENSE.txt slf4j-1.6.1.LICENSE.txt
[root@hadoop01 lib]# cp slf4j-api-1.6.1.jar ../tmp/version-2/
[root@hadoop01 lib]# cd ../tmp/version-2/
[root@hadoop01 version-2]# ll
总用量 1384
-rw-r--r--. 1 root root 1 7月 12 18:54 acceptedEpoch
-rw-r--r--. 1 root root 1 7月 12 18:54 currentEpoch
-rw-r--r--. 1 root root 67108880 7月 12 20:36 log.300000001
-rw-r--r--. 1 root root 25496 7月 12 20:45 slf4j-api-1.6.1.jar
-rw-r--r--. 1 root root 296 7月 12 18:51 snapshot.0
-rw-r--r--. 1 root root 296 7月 12 18:54 snapshot.200000000
-rw-r--r--. 1 root root 1360961 7月 12 20:44 zookeeper-3.4.8.jar
[root@hadoop01 version-2]# pwd
/home/presoftware/zookeeper-3.4.8/tmp/version-2
[root@hadoop01 version-2]# java -cp .:zookeeper-3.4.8.jar:slf4j-api-1.6.1.jar org.apache.zookeeper.server.LogFormatter log.300000001
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
ZooKeeper Transactional Log File with dbid 0 txnlog format version 2
22-7-12 下午07时49分00秒 session 0x181f20b6ea80000 cxid 0x0 zxid 0x300000001 createSession 30000
22-7-12 下午07时53分56秒 session 0x181f20b6ea80000 cxid 0x2 zxid 0x300000002 create '/log,,v{s{31,s{'world,'anyone}}},F,1
22-7-12 下午07时59分41秒 session 0x381f203e5970000 cxid 0x0 zxid 0x300000003 createSession 30000
22-7-12 下午08时08分08秒 session 0x281f2da307f0000 cxid 0x0 zxid 0x300000004 createSession 30000
22-7-12 下午08时28分18秒 session 0x181f20b6ea80000 cxid 0x0 zxid 0x300000005 closeSession null
EOF reached after 5 txns.
快照文件查看
[root@hadoop01 version-2]# java -cp .:zookeeper-3.4.8.jar:slf4j-api-1.6.1.jar org.apache.zookeeper.server.SnapshotFormatter snapshot.200000000
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
ZNode Details (count=4):
----
/
cZxid = 0x00000000000000
ctime = Thu Jan 01 08:00:00 CST 1970
mZxid = 0x00000000000000
mtime = Thu Jan 01 08:00:00 CST 1970
pZxid = 0x00000000000000
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x00000000000000
dataLength = 0
----
/zookeeper
cZxid = 0x00000000000000
ctime = Thu Jan 01 08:00:00 CST 1970
mZxid = 0x00000000000000
mtime = Thu Jan 01 08:00:00 CST 1970
pZxid = 0x00000000000000
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x00000000000000
dataLength = 0
----
/zookeeper/quota
cZxid = 0x00000000000000
ctime = Thu Jan 01 08:00:00 CST 1970
mZxid = 0x00000000000000
mtime = Thu Jan 01 08:00:00 CST 1970
pZxid = 0x00000000000000
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x00000000000000
dataLength = 0
----
Session Details (sid, timeout, ephemeralCount):
三、观察者(observer)
1.观察者的特点:既不参与投票也不参与选举,但是监听投票和选举结果,然后根据结果来执行任务
2.适用场景:集群节点数量多的时候可以将一部分节点设置为观察者;网络条件不稳定的情况下,可以将部分节点设置为观察者
设置观察者
[root@localhost04 bin]# sh zkServer.sh stop
ZooKeeper JMX enabled by default
Using config: /home/presoftware/zookeeper-3.4.8/bin/../conf/zoo.cfg
Stopping zookeeper ... STOPPED
[root@localhost04 conf]# pwd
/home/presoftware/zookeeper-3.4.8/conf
[root@localhost04 conf]# ls
configuration.xsl log4j.properties zoo.cfg zoo_sample.cfg
[root@localhost04 conf]#
[root@localhost04 conf]# vim zoo.cfg
peerType=observer
server.1=192.168.253.129:2888:3888
server.2=192.168.253.130:2888:3888
server.3=192.168.253.131:2888:3888:observer
验证
[root@localhost04 bin]# sh zkServer.sh start
[root@localhost04 bin]# sh zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /home/presoftware/zookeeper-3.4.8/bin/../conf/zoo.cfg
Error contacting service. It is probably not running.
[root@localhost04 bin]# sh zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /home/presoftware/zookeeper-3.4.8/bin/../conf/zoo.cfg
Mode: observer
3. observer的存活与否并不影响集群是否对外服务。例如一个集群中有21个节点,其中14个节点是observer,那么即使这14个observer全部宕机,该集群也是会正常服务的,但是如果有4个follower宕机,即使所有的observer都存活,该集群也不会对外服务。
zk的集群操作
nc(netcat)的安装使用
先下载
安装
[root@hadoop01 presoftware]# rpm -ivh nc-1.84-22.el6.x86_64.rpm
用nc查看其他节点的状态
[root@hadoop01 bin]# echo stat |nc 192.168.253.130 2181
Zookeeper version: 3.4.8--1, built on 02/06/2016 03:18 GMT
Clients:
/192.168.253.129:51358[0](queued=0,recved=1,sent=0)
Latency min/avg/max: 0/0/0
Received: 2
Sent: 1
Connections: 1
Outstanding: 0
Zxid: 0x500000000
Mode: follower
Node count: 5
查看节点存活
[root@hadoop01 bin]# echo ruok |nc 192.168.253.130 2181
imok[root@hadoop01 bin]#
查看节点的配置信息
[root@hadoop01 bin]# echo conf |nc 192.168.253.130 2181
clientPort=2181
dataDir=/home/presoftware/zookeeper-3.4.8/tmp/version-2
dataLogDir=/home/presoftware/zookeeper-3.4.8/tmp/version-2
tickTime=2000
maxClientCnxns=60
minSessionTimeout=4000
maxSessionTimeout=40000
serverId=2
initLimit=10
syncLimit=5
electionAlg=3
electionPort=3888
quorumPort=2888
peerType=0
扩展:zk动态增删节点;容灾性
AVRO
一、概述
(https://avro.apache.org/)
Apache Avro™ is a data serialization system.
1 AVRo是Apache提供的一套用于序列化和RPC的机制
2.AVRO早期是为Hadoop设计的一套序列化系统,后来将AVRO独立出来
二、序列化
1.序列化的目的:数据的存储和传输
2.序列化的衡量标注:
a.序列化的时间以及占用的CPU
b.序列化之后产生的数据量
c.序列化机制能否跨平台跨语言
3.AVRO考虑到了跨语言传输的问题,才用了json格式
package cn.tedu.AVRO;
import java.io.File;
import org.apache.avro.file.DataFileReader;
import org.apache.avro.file.DataFileWriter;
import org.apache.avro.io.DatumReader;
import org.apache.avro.io.DatumWriter;
import org.apache.avro.specific.SpecificDatumReader;
import org.apache.avro.specific.SpecificDatumWriter;
import org.junit.Test;
import avro.pojo.User;
public class UserDemo {
@Test
public void create(){
User u=new User();
u.setUsername("amy");
u.setAge(15);
System.out.println(u);
}
//序列化
@Test
public void servial() throws Exception{
User u1=new User();
User u2=new User();
u1.setUsername("amy");
u1.setAge(15);
u2.setUsername("amy");
u2.setAge(15);
//创建序列化流
DatumWriter<User> dw=new SpecificDatumWriter<>(User.class);
//需要将数据序列化到磁盘
DataFileWriter<User> dfw=new DataFileWriter<>(dw);
//指定写到那个文件中
dfw.create(User.SCHEMA$, new File("1.txt"));
//进行序列化
dfw.append(u1);
dfw.append(u2);
//关流
dfw.close();
}
//反序列化示例
@Test
public void read() throws Exception{
DatumReader<User> dr = new SpecificDatumReader<> (User.class);
DataFileReader<User> dfr = new DataFileReader<>(new File("1.txt") , dr ) ;
//--通过迭代器,迭代出对象数据
while(dfr.hasNext()){
System.out.println(dfr.next());
}
}
}
{
"namespace":"avro.pojo",//指定包名
"type":"record",//定义的是一个类
"name":"User",//类名
"fields":
[
{"name":"username","type":"string"},
{"name":"age","type":"int"}
]
}
三、RPC
- RPC全程是远程过程调用,允许一个节点远程显试调用另一个节点上的方法而不用做实现
2.存根的作用是限制两个节点上能调用的方法匙一样的
大数据
一、概述
1.数据体量大。数据量从TB计算
2.数据的种类和样式多
3.数据的增长速度快
4.数据的价值密度低
5.数据的质量
6.数据的连通性
7.其他的特征:动态化、可视化、合法性