高并发day04(ZAB协议,观察者,nc,AVRO,RPC)

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 712 18:54 acceptedEpoch
-rw-r--r--. 1 root root        1 712 18:54 currentEpoch
-rw-r--r--. 1 root root 67108880 712 20:36 log.300000001
-rw-r--r--. 1 root root    25496 712 20:45 slf4j-api-1.6.1.jar
-rw-r--r--. 1 root root      296 712 18:51 snapshot.0
-rw-r--r--. 1 root root      296 712 18:54 snapshot.200000000
-rw-r--r--. 1 root root  1360961 712 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 下午074900秒 session 0x181f20b6ea80000 cxid 0x0 zxid 0x300000001 createSession 30000

22-7-12 下午075356秒 session 0x181f20b6ea80000 cxid 0x2 zxid 0x300000002 create '/log,,v{s{31,s{'world,'anyone}}},F,1

22-7-12 下午075941秒 session 0x381f203e5970000 cxid 0x0 zxid 0x300000003 createSession 30000

22-7-12 下午080808秒 session 0x281f2da307f0000 cxid 0x0 zxid 0x300000004 createSession 30000

22-7-12 下午082818秒 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

  1. RPC全程是远程过程调用,允许一个节点远程显试调用另一个节点上的方法而不用做实现
    2.存根的作用是限制两个节点上能调用的方法匙一样的

在这里插入图片描述

大数据
一、概述

1.数据体量大。数据量从TB计算
2.数据的种类和样式多
3.数据的增长速度快
4.数据的价值密度低
5.数据的质量
6.数据的连通性
7.其他的特征:动态化、可视化、合法性

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值