zookeeper源码
一、数据存储持久化
Leader 和 Follower 中的数据会在内存和磁盘中各保存一份。所以需要将内存中的数据持久化到磁盘中。在org.apache.zookeeper.server.persistence包下的相关类都是序列化相关的代码。
处理日志接口TxnLog
处理快照接口SnapShot
序列化
zookeeper-jute代码是关于Zookeeper序列化相关源码
12interface InputArchiveinterface OutputArchive
二、服务端初始源码
zkServer.sh从zk的脚本看加载的类是org.apache.zookeeper.server.quorum.QuorumPeerMain
加载的配置的zkEnv.sh中的zoo.cfg
QuorumPeerMain
main方法中初始化一个QuorumPeerMain对象,调用initializeAndRun()方法王超初始化
1234567891011121314151617181920212223protected void initializeAndRun(String[] ...
分布式算法
一、拜占庭将军问题Zookeeper是如何保证数据一致性的?这也是困扰分布式系统框架的一个难题。
拜占庭将军问题是一个协议问题,拜占庭帝国军队的将军们必须全体一致的决定是否攻击某一支敌军。问题是这些将军在地理上是分隔开来的,并且将军中存在叛徒。叛徒可以任意行动以达到以下目标:欺骗某些将军采取进攻行动,促成一个不是所有将军都同意的决定,如当将军们不希望进攻时促成进攻行动;或者迷惑某些将军,使他们无法做出决定。如果叛徒达到了这些目的之一,则任何攻击行动的结果都是注定要失败的,只有完全达成一致的努力才能获得胜利。
二、CAP理论CAP理论告诉我们,一个分布式系统不可能同时满足以下三种
一致性(C:Consistency)
可用性(A:Available)
分区容错性(P:Partition Tolerance )
这三个基本需求,最多只能同时满足其中的两项,因为P是必须的,因此往往选择就在CP或者AP中。
一致性(C:Consistency):在分布式环境中,一致性是指数据在多个副本之间是否能够保持数据一致的特性。在一致性的需求下,当一个系统在数据一致的状态下执行更新操作后,应该保证系 ...
zookeeper简介
一、入门概述Zookeeper从设计模式角度来理解:是一个基于观察者模式设计的分布式服务管理框架,它负责存储和管理大家都关心的数据,然后接受观察者的注册,一旦这些数据的状态发生变化,Zookeeper就将负责通知已经在Zookeeper上注册的那些观察者做出相应的反应。
特点
Zookeeper:一个领导者(Leader),多个跟随者(Follower)组成的集群。
集群中只要有半数以上节点存活,Zookeeper集群就能正常服务。所以Zookeeper适合安装奇数台服务器。
全局数据一致:每个Server保存一份相同的数据副本,Client无论连接到哪个Server,数据都是一致的。
更新请求顺序执行,来自同一个Client的更新请求按其发送顺序依次执行。
数据更新原子性,一次数据更新要么成功,要么失败。
数据结构ZooKeeper数据模型的结构与Unix 文件系统很类似,整体上可以看作是一棵树,每个节点称做一个ZNode。每一个ZNode,默认能够存储1MB的数据,每个ZNode都可以通过其路径唯一标识。
应用场景提供的服务包括:
统一命名服务:在分布式环境下,经常需 ...
Go操作软件
一、Go操作Redisredis第3方库
1go get github.com/garyburd/redigo/redis
连接redis1234567891011121314func main() { //1.建立连接 conn, err := redis.Dial("tcp", "127.0.0.1:6379", redis.DialPassword("123456")) if err != nil { fmt.Println("redis.Dial err=", err) return } defer conn.Close() //GetString(conn) //GetHash(conn) //GetMHash(conn)}
操作string12345678910111213141516func GetString(conn redis.Conn){ //2. 通过go向redis写入数据 _, err := conn.Do(& ...
Go文件测试反射和网络
一、文件打开关闭12file,err:= os.open("test.txt")defer file.Close()
带缓冲的读取默认的相对路径是工程下
1234567891011121314151617181920212223func bufferReader(){ file, err := os.Open("./src/file/d.txt") if err != nil { fmt.Println("open file err=", err) return } defer file.Close() /** 创建一 *Reader, 是带缓冲的 defaultBufSize = 4096 //默认缓冲为4096 */ reader := bufio.NewReader(file) for { str, err := reader.ReadString('\n') //读到换行结束 ...
Go面向对象
一、Go的面向对象
Golang也支持面向对象编程(OOP),但是和传统的面向对象编程有区别,并不是纯粹的面向对象语言。所以我们说Golang支持面向对象编程特性是比较准确的。
Golang没有类(class),Go语言的结构体(struct)和其它编程语言的类(class)有同等的地位,你可以理解Golang是基于struct来实现OOP特性的。
Golang面向对象编程非常简洁,去掉了传统OOP语言的继承、方法重载、构造函数和析构函数、隐藏的this指针等等
Golang仍然有面向对象编程的继承,封装和多态的特性,只是实现的方式和其它OOP语言不一样,比如继承: Golang没有extends 关键字,继承是通过匿名字段来实现。
Golang面向对象(OOP)很优雅,OOP本身就是语言类型系统(type system)的一部分,通过接口(interface)关联,耦合性低,也非常灵活。后面同学们会充分体会到这个特点。也就是说在Golang中面向接口编程是非常重要的特性。
二、struct定义
1234type Cat struct { Name string ...
数组、切片和map
数组var 数组名[数组大小]数据类型 var a [5]int
4种初始化方式
1234var numsArrays01 [3]int = [3]int {1,2,3}var numsArrays02 = [3]int {1,2,3}var numsArrays03 = [...]int {1,2,3}var numsArrays04 = [3]string {1:"1",2:"2",0:"3"}
for-range遍历123456func traverse(){ var numsArrays03 = [...]int {1,2,3} for index, value := range numsArrays03 { fmt.Println(index,value) }}
第一个返回值index是数组的下标第,二个value是该下标位置的值。他们都是仅在 for ...
Go简介
Go的基本介绍特性Go语言保证了既能到达静态编译语言的安全和性能,又达到了动态语言开发维护的高效率,使用一个表达式来形容Go语言:Go =C+ Python,说明Go语言既有c静态语言程序的运行速度,又能达到Python动态语言的快速开发。
从c语言中继承了很多理念,包括表达式语法,控制结构,基础数据类型,调用参数传值,指针等等,也保留了和c语言一样的编保执行方式及弱化的指针。
引入包的概念,用于组织程序结构,Go语言的一个文件都要归属于一个包,而不能单独存在。
垃圾回收机制,内存自动回收,不需开发人员管理
天然并发
从语言层面支持并发,实现简单
goroutine,轻量级线程,可实现大并发处理,高效利用多核。
基于CPS并发模型(Communicating Sequential Processes )实现
吸收了管道通信机制,形成Go语言特有的管道channel,通过管道channel,可以实现不同的goroute之间的相互通信。
函数返回多个值
新的创新:比如切片、延时执行defer等
程序开发123456//hello.gopackage mainimpor ...
设计模式-职责链模式
职责链模式问题123456学校OA系统的采购审批项目:需求是1)采购员采购教学器材2)如果金额小于等于5000,由教学主任审批3)如果金额小于等于10000,由院长审批4)如果金额小于等于30000,由副校长审批5)如果金额超过30000以上,有校长审批请设计程序完成采购审批项目
传统方案解决oA系统审批问题
传统方式是:接收到一个采购请求后,根据采购金额来调用对应的Approver (审批人)完成审批。
传统方式的问题分析:客户端这里会使用到分支判断(比如switch)来对不同的采购请求处理,这样就存在如下问题
如果各个级别的人员审批金额发生变化,在客户端的也需要变化
客户端必须明确的知道有多少个审批级别和访问
这样对一个采购请求进行处理和Approver(审批人)就存在强耦合关系,不利于代码的扩展和维护
基本介绍
职责链模式( Chain ofResponsibility iattern) ,又叫责任链模式,为请求创建了一个接收者对象的链。这种模式对请求的发送者和接收者进行解耦。
职责链模式通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同 ...
设计模式-策略模式
策略模式123鸭子问题有各种鸭子(比如野鸭、北京鸭、水鸭等,鸭子有各种行为,比如叫、飞行等)显示鸭子的信息
传统方式解决问题定义一个抽象类,用多个类去继承。
其它鸭子,都继承了Duck类,所以fly让所有子类都会飞了,这是不正确的
上面说的1的问题,其实是继承带来的问题:对类的局部改动,尤其超类的局部改动,会影响其他部分。会有溢出效应
为了改进1问题,我们可以通过覆盖fly 方法来解决=>覆盖解决
问题又来了,如果我们有一个玩具鸭子ToyDuck,这样就需要ToyDuck去覆盖Duck的所有实现的方法=>解决思路策略模式
基本介绍
策略模式(Strategy Pattern)中,定义算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
这算法体现了几个设计原则,第一、把变化的代码从不变的代码中分离出来;第二、针对接口编程而不是具体类(定义了策略接口);第三、多用组合/聚合,少用继承(客户通过组合方式使用策略)。
Context 是一个使用了某种策略的类。
解决问题
定义飞行接口
1234public interface FlyBe ...