zk解析(6):Observer

前言

Observer:在不伤害写性能的情况下扩展ZooKeeper。

虽然通过Client直接连接到ZooKeeper集群的性能已经很好了,可是这样的架构假设要承受超大规模的Client,就必须添加ZooKeeper集群的Server数量,随着Server的添加,ZooKeeper集群的写性能必定下降。我们知道ZooKeeper的ZNode变更是要过半数投票通过,随着机器的添加,因为网络消耗等原因必定导致投票成本添加,从而导致写性能的下降。

Observer是一种新型的ZooKeeper节点。能够帮助解决上述问题,提供ZooKeeper的可扩展性。Observer不參与投票,仅仅是简单的接收投票结果。因此我们添加再多的Observer,也不会影响集群的写性能。除了这个区别,其它的和Follower基本上全然一样。比如:Client都能够连接到他们,而且都能够发送读写请求给他们,收到写请求都会上报到Leader。

Observer有另外一个优势,由于它不參与投票,所以他们不属于ZooKeeper集群的关键部位,即使他们Failed,或者从集群中断开,也不会影响集群的可用性。

Observer和Follower在一些方面是一样的。详细点来讲,他们都向Leader提交proposal(投票)。但与Follower不同,Observer不参与投票的过程。它简单的通过接收Leader发过来的INFORM(通知)消息来learn已经Commit的proposal。因为Leader都会给Follower和Observer发送INFORM消息,所以它们都被称为Learner。

阅读全文

zk解析(4):Learner

前言

Learner类是Follower和Observer类的父类,要学习Follower和Observer首先要先学习Learner。

阅读全文

zk解析(3):leader请求处理及处理链(ZookeeperServer/LeaderZooKeeperServer)

前言

在第二篇Leader初始化解析中见到了主节点工作的类ZookeeperServer/LeaderZooKeeperServer,请求的处理工作是交给LeaderZooKeeperServer来处理的。

初始化

leader.lead() -> leader.startZkServer()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
private synchronized void startZkServer() {
// Update lastCommitted and Db's zxid to a value representing the new epoch
lastCommitted = zk.getZxid();
LOG.info("Have quorum of supporters, sids: [ "
+ getSidSetString(newLeaderProposal.ackSet)
+ " ]; starting up and setting last processed zxid: 0x{}",
Long.toHexString(zk.getZxid()));
zk.startup();
/*
* Update the election vote here to ensure that all members of the
* ensemble report the same vote to new servers that start up and
* send leader election notifications to the ensemble.
*
* @see https://issues.apache.org/jira/browse/ZOOKEEPER-1732
*/
self.updateElectionVote(getEpoch());

zk.getZKDatabase().setlastProcessedZxid(zk.getZxid());
}

其他调用

LearnerHandler.run()

阅读全文

zk解析(2):zk集群Leader初始化leader.lead()

根据zk集群启动QuorumPeerMain的解析,可以知道当前节点为主节点时,节点状态变为LEADING。

阅读全文

zk解析(1):zk集群启动QuorumPeerMain解析

入口查看

打开启动脚本zkServer.cmd/zkServer.sh,可以找到以下的内容:

1
ZOOMAIN="org.apache.zookeeper.server.quorum.QuorumPeerMain"

可知入口类是org.apache.zookeeper.server.quorum.QuorumPeerMain

阅读全文

zk集群启动QuorumPeerMain解析

入口查看

打开启动脚本zkServer.cmd/zkServer.sh,可以找到以下的内容:

1
ZOOMAIN="org.apache.zookeeper.server.quorum.QuorumPeerMain"

可知入口类是org.apache.zookeeper.server.quorum.QuorumPeerMain

阅读全文

SpringMVC 源码解析

SpringMVC

在WEB-INF的web.xml中配置Servlet和Listener。

其中核心就是ContextLoaderListener和DispatcherServlet类

阅读全文

分库分表sharding-jdbc源码解析

[TOC]

sharding-jdbc架构

架构图
image

核心概念

LogicTable
数据分片的逻辑表,对于水平拆分的数据库(表),同一类表的总称。例:订单数据根据主键尾数拆分为10张表,分别是t_order_0到t_order_9,他们的逻辑表名为t_order。

ActualTable
在分片的数据库中真实存在的物理表。即上个示例中的t_order_0到t_order_9。

DataNode
数据分片的最小单元。由数据源名称和数据表组成,例:ds_1.t_order_0。配置时默认各个分片数据库的表结构均相同,直接配置逻辑表和真实表对应关系即可。如果各数据库的表结果不同,可使用ds.actual_table配置。

阅读全文

分库分表sharding-jdbc源码解析

[TOC]

sharding-jdbc架构

架构图
image

核心概念

LogicTable
数据分片的逻辑表,对于水平拆分的数据库(表),同一类表的总称。例:订单数据根据主键尾数拆分为10张表,分别是t_order_0到t_order_9,他们的逻辑表名为t_order。

ActualTable
在分片的数据库中真实存在的物理表。即上个示例中的t_order_0到t_order_9。

DataNode
数据分片的最小单元。由数据源名称和数据表组成,例:ds_1.t_order_0。配置时默认各个分片数据库的表结构均相同,直接配置逻辑表和真实表对应关系即可。如果各数据库的表结果不同,可使用ds.actual_table配置。

阅读全文

LinkedHashMap解析

1.LinkedHashMap简介

根据插入顺序简单排序的哈希表实现

阅读全文