当前位置:网站首页>高并发day04(ZAB协议,观察者,nc,AVRO,RPC)
高并发day04(ZAB协议,观察者,nc,AVRO,RPC)
2022-07-17 05:21:00 【yygyj】
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.其他的特征:动态化、可视化、合法性
边栏推荐
- Wu Enda machine learning chapter 3-4
- 华为路由 端口映射
- Part of the second Shanxi Network Security Skills Competition (Enterprise Group) WP (I)
- 吴恩达机器学习第12-13章
- 手把手搭建家用 NAS 全能服务器(1)| 配置选择及准备
- 关于STM汇编程序设计相关学习
- 过拟合原因及解决办法
- F5LTM(一)逻辑关系图
- Loadng class `com. mysql. jdbc. Driver‘. This is deprecated. The new driver class is `com. mysql. cj. jdb
- Introduction to daily use of manjaro system
猜你喜欢

《PyTorch深度学习实践》-B站 刘二大人-day3

Experiment 5: Gui

Restapi implementation of automatic completion & case implementation (search box input for automatic completion)

《PyTorch深度学习实践》-B站 刘二大人-day5

阿拉伯数字转中文

wireshark抓包:错误分析

吴恩达机器学习第10-11章

用Altium Designer绘制PCB图

无80和443端口下申请域名SSL证书(适用于 acme.sh 和 certbot)

伺服电机的电子齿轮比如何确定?
随机推荐
F5LTM(一)逻辑关系图
用Altium Designer绘制PCB图
[antdv: Each record in table should have a unique `key` prop,or set `rowKey` to an unique.....
Experiment 3 inheritance and derived classes
从零开始的 Rust 语言 blas 库之预备篇(2)—— blas 矩阵格式详解
Wu Enda machine learning chapter 6-7
Performance comparison between merge into and update in Oracle
Wu Enda machine learning chapter 10-11
《PyTorch深度学习实践》-B站 刘二大人-day7
redis
Mapping index attribute & operation of creating index
top命令
实验三 继承性和派生类
简单irules编写 入门级
Vcenter6.7 installation and troubleshooting
2019cs brand sdnand and EMMC selection comparison important analysis
#MySql MySql 计算今年有多少天周末(周六、日)
Hand in hand building a home NAS universal server (1) | configuration selection and preparation
F5 GTM(一):DNS参数
X11 forwarding