本文主要学习ZooKeeper的体系结构、节点类型、节点监听、常用命令等基础知识,最后还学习了ZooKeeper的高可用集群的搭建与测试。希望能给想快速掌握ZooKeeper的同学有所帮助。

ZooKeeper简介与安装

ZooKeeper是一个分布式协调服务框架,通常用于解决分布式项目中遇到的一些管理协调的问题,如统一命名服务、分布式配置管理,分布式锁、集群节点状态协调等等。

下载

到http://apache.fayea.com/zookeeper/下载zookeeper-3.4.9,ftp上传至linux

解压

[root@localhost ftpuser]# tar -zxvf zookeeper-3.4.9.tar.gz

创建数据日志目录

在zookeeper的解压目录下创建以下两个文件夹

[root@localhost zookeeper-3.4.9]# mkdir data

[root@localhost zookeeper-3.4.9]# mkdir logs

拷贝配置文件

到zookeeper的解压目录的conf目录下,将zoo_sample.cfg 文件拷贝一份,命名为为 zoo.cfg

[root@localhost conf]# cp zoo_sample.cfg zoo.cfg

修改配置文件

[root@localhost conf]# vi zoo.cfg

# The number of milliseconds of each tick

tickTime=2000

# The number of ticks that the initial

# synchronization phase can take

initLimit=10

# The number of ticks that can pass between

# sending a request and getting an acknowledgement

syncLimit=5

# the directory where the snapshot is stored.

# do not use /tmp for storage, /tmp here is just

# synchronization phase can take

initLimit=10

# The number of ticks that can pass between

# sending a request and getting an acknowledgement

syncLimit=5

# the directory where the snapshot is stored.

# do not use /tmp for storage, /tmp here is just

# example sakes.

dataDir=/home/ftpuser/zookeeper-3.4.9/data

dataLogDir=/home/ftpuser/zookeeper-3.4.9/logs

# the port at which the clients will connect

clientPort=2181

server.1=192.168.2.129:2888:3888

# the maximum number of client connections.

# increase this if you need to handle more clients

#maxClientCnxns=60

#

# Be sure to read the maintenance section of the

# administrator guide before turning on autopurge.

#

# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance

#

# The number of snapshots to retain in dataDir

#autopurge.snapRetainCount=3

# Purge task interval in hours

# Set to "0" to disable auto purge feature

#autopurge.purgeInterval=1

在zoo.cfg 配置dataDir,dataLogDir,server。

server.A=B:C:D:其中 A 是一个数字,表示这个是第几号服务器;B 是这个服务

器的 IP 地址;C 表示的是这个服务器与集群中的 Leader 服务器交换信息的端口;D 表示的是万一集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新的 Leader,而这个端口就是用来执行选举时服务器相互通信的端口。

clientPort 这个端口就是客户端(应用程序)连接 Zookeeper 服务器的端口,Zookeeper 会监听这个端口接受客户端的访问请求

创建 myid 文件

进入/home/ftpuser/zookeeper-3.4.9/data并创建myid文件

[root@localhost conf]# cd /home/ftpuser/zookeeper-3.4.9/data

[root@localhost data]# vi myid

1

编辑 myid 文件,并在对应的 IP 的机器上输入对应的编号。如在 zookeeper 上,myid

文件内容就是 1。如果只在单点上进行安装配置,那么只有一个 server.1

添加环境变量

[root@localhost data]# vi /etc/profile

在文件末尾添加zookeeper 环境变量

# zookeeper env

export ZOOKEEPER_HOME=/home/ftpuser/zookeeper-3.4.9/

export PATH=$ZOOKEEPER_HOME/bin:$PATH

执行source /etc/profile命令是环境变量生效,执行echo $ZOOKEEPER_HOME查看

打开端口

在防火墙中打开要用到的端口 2181、2888、3888。打开/etc/sysconfig/iptables增加以下 3 行

[root@localhost data]# cat /etc/sysconfig/iptables

# Generated by iptables-save v1.4.7 on Thu Jun  2 22:41:13 2016

*filter

:INPUT ACCEPT [5:320]

:FORWARD ACCEPT [0:0]

:OUTPUT ACCEPT [4:464]

-A INPUT -p udp -m udp --dport 23 -j ACCEPT

-A INPUT -p tcp -m tcp --dport 23 -j ACCEPT

-A INPUT -m state --state NEW -m tcp -p tcp --dport 2181 -j ACCEPT

-A INPUT -m state --state NEW -m tcp -p tcp --dport 2888 -j ACCEPT

-A INPUT -m state --state NEW -m tcp -p tcp --dport 3888 -j ACCEPT

COMMIT

# Completed on Thu Jun  2 22:41:13 2016

[root@localhost data]#

查看端口启动状态

[root@localhost data]# service iptables status

启动zookeeper

[root@localhost zookeeper-3.4.9]# cd bin

[root@localhost bin]# ll

total 36

-rwxr-xr-x. 1 1001 1001  232 Aug 23 15:39 README.txt

-rwxr-xr-x. 1 1001 1001 1937 Aug 23 15:39 zkCleanup.sh

-rwxr-xr-x. 1 1001 1001 1032 Aug 23 15:39 zkCli.cmd

-rwxr-xr-x. 1 1001 1001 1534 Aug 23 15:39 zkCli.sh

-rwxr-xr-x. 1 1001 1001 1579 Aug 23 15:39 zkEnv.cmd

-rwxr-xr-x. 1 1001 1001 2696 Aug 23 15:39 zkEnv.sh

-rwxr-xr-x. 1 1001 1001 1065 Aug 23 15:39 zkServer.cmd

-rwxr-xr-x. 1 1001 1001 6773 Aug 23 15:39 zkServer.sh

[root@localhost bin]# zkServer.sh start

ZooKeeper JMX enabled by default

Using config: /home/ftpuser/zookeeper-3.4.9/bin/../conf/zoo.cfg

Starting zookeeper ... STARTED

查看zookeeper后台日志

[root@localhost ~]# tail -f /home/ftpuser/zookeeper-3.4.9/bin/zookeeper.out

查看zookeeper进程

[root@localhost bin]# jps

2011 QuorumPeerMain

1245 Bootstrap

2030 Jps

[root@localhost bin]#

其中,QuorumPeerMain 是 zookeeper 进程,启动正常。查看状态

[root@localhost bin]# zkServer.sh status

ZooKeeper JMX enabled by default

Using config: /home/ftpuser/zookeeper-3.4.9/bin/../conf/zoo.cfg

Mode: standalone

[root@localhost bin]#

停止zookeeper进程

[root@localhost bin]# zkServer.sh stop

ZooKeeper JMX enabled by default

Using config: /home/ftpuser/zookeeper-3.4.9/bin/../conf/zoo.cfg

Stopping zookeeper ... STOPPED

[root@localhost bin]#

客户端连接zookeeper

[root@localhost bin]# ./zkCli.sh -server 192.168.2.129:2181

输入help命令来查看有哪些命令

[zk: 192.168.2.129:2181(CONNECTED) 0] help

ZooKeeper -server host:port cmd args

connect host:port

get path [watch]

ls path [watch]

set path data [version]

rmr path

delquota [-n|-b] path

quit

printwatches on|off

create [-s] [-e] path data acl

stat path [watch]

close

ls2 path [watch]

history

listquota path

setAcl path acl

getAcl path

sync path

redo cmdno

addauth scheme auth

delete path [version]

setquota -n|-b val path

[zk: 192.168.2.129:2181(CONNECTED) 1]

ZooKeeper体系结构

ZooKeeper的体系结构由一个命名空间组成,类似于一个标准的文件系统。命名空间由称为znodes节点的数据寄存器组成,用ZooKeeper说法,这是类似于文件和目录。不同于典型的文件系统的是,这是专为存储数据而设计的,也就是说,ZooKeeper的节点数据是存储在内存中中,可以实现高吞吐量和低延迟的数据。

ZooKeeper允许分布式进程(注意,这里强调的是进程,分布式环境中往往是不同主机之间的协调访问)通过共享ZooKeeper命名空间组织的znodes节点数据来实现相互协调。

ZooKeeper命名空间结构示意图

ZooKeeper节点类型

从上面的ZooKeeper命名空间结构示意图中可以看出,ZooKeeper命名空间的根路径是“/”,每一个znode都有自己的path,每一个znode都存储着一份协调数据,这些数据包括状态信息、配置、位置信息等等。由于znode维护的数据主要是用于分布式进程之间协调的,因此这些数据通常非常小。

命名空间中的每个znode中的数据都是可读可写的,但每个节点都有一个访问控制列表(ACL),限制谁可以做什么。

命名空间中的每个znode都有自己的类型,znode的类型主要有下面几种:

(1)PERSISTEN,永久的(只要客户端不删除,则永远存在)

(2)PERSISTENT_SEQUENTIAL,永久且有序号的

(3)EMPEMERAL ,短暂的(只要客户端断开连接,则会被自动删除)

(4)EMPEMERAL_SEQUENTIAL, 短暂且有序号的

ZooKeeper节点监听

客户端可以对znode进行监听,当znode节点发生变化时,监听事件将会被触发,客户端接收到一个数据包说znode节点已发生改变。

ZooKeeper常用命令

ZooKeeper的常用命令非常简单,也就几条,下面我们来学习ZooKeeper的常用命令,加深对ZooKeeper体系结构的理解。

(1)ls——查看节点(路径)

[zk: 192.168.2.129:2181(CONNECTED) 1] ls /

[dubbo, zookeeper]

[zk: 192.168.2.129:2181(CONNECTED) 2] ls /zookeeper

[quota]

[zk: 192.168.2.129:2181(CONNECTED) 3] ls /dubbo

[com.alibaba.dubbo.monitor.MonitorService, com.mcweb.api.service.IUserService]

[zk: 192.168.2.129:2181(CONNECTED) 4]

(2)create——在命名空间中的某个路径下创建节点

[zk: 192.168.2.129:2181(CONNECTED) 7] create /nodes1 "test node"

Created /nodes1

[zk: 192.168.2.129:2181(CONNECTED) 8] ls /

[dubbo, nodes1, zookeeper]

(3)get——获取命名空间中某个节点的数据

[zk: 192.168.2.129:2181(CONNECTED) 9] get /nodes1

test node

cZxid = 0x227

ctime = Tue Sep 27 04:01:49 CST 2016

mZxid = 0x227

mtime = Tue Sep 27 04:01:49 CST 2016

pZxid = 0x227

cversion = 0

dataVersion = 0

aclVersion = 0

ephemeralOwner = 0x0

dataLength = 9

numChildren = 0

[zk: 192.168.2.129:2181(CONNECTED) 10]

(4)set——设置命名空间中某个节点的数据

[zk: 192.168.2.129:2181(CONNECTED) 10] set /nodes1 "nodes1 data have been setted"

cZxid = 0x227

ctime = Tue Sep 27 04:01:49 CST 2016

mZxid = 0x228

mtime = Tue Sep 27 04:07:04 CST 2016

pZxid = 0x227

cversion = 0

dataVersion = 1

aclVersion = 0

ephemeralOwner = 0x0

dataLength = 28

numChildren = 0

[zk: 192.168.2.129:2181(CONNECTED) 11] get /nodes1

nodes1 data have been setted

cZxid = 0x227

ctime = Tue Sep 27 04:01:49 CST 2016

mZxid = 0x228

mtime = Tue Sep 27 04:07:04 CST 2016

pZxid = 0x227

cversion = 0

dataVersion = 1

aclVersion = 0

ephemeralOwner = 0x0

dataLength = 28

numChildren = 0

[zk: 192.168.2.129:2181(CONNECTED) 12]

(5)delete——删除命名空间中某个节点

[zk: 192.168.2.129:2181(CONNECTED) 13] delete /nodes1

[zk: 192.168.2.129:2181(CONNECTED) 14] get /nodes1

Node does not exist: /nodes1

[zk: 192.168.2.129:2181(CONNECTED) 15]

删除节点信息还可以用rmr命令。好了,常用命令介绍完了,其他命令可以通过help命令来查看。下面我们来学习ZooKeeper Java客户端的使用。

ZooKeeper客户端开发

依赖jar

测试代码

public class ZKTest {

	private ZooKeeper zk = null;

	@Before
public void init() throws Exception {
zk = new ZooKeeper("192.168.2.129:2181", 2000, new Watcher() {
/**
* 监听事件发生时的回调方法
*/
@Override
public void process(WatchedEvent event) {
if (event.getType() == EventType.None) {
System.out.println("Event:null");
return;
}
System.out.println("EventType:" + event.getType());
System.out.println("Path" + event.getPath()); try {
zk.getData("/nodes1", true, null);
zk.getChildren("/nodes1", true); } catch (KeeperException | InterruptedException e) { e.printStackTrace();
}
}
});
} /**
* 向zookeeper服务(集群)中注册数据,添加znode
* @throws Exception
*/ @Test
public void testCreateZnode() throws Exception {
zk.create("/nodes1", "nodes1".getBytes("utf-8"),
Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); // 在一个父节点的范围之内,sequential的顺序是递增的
zk.create("/nodes1/testNode1", "/nodes1/testNode1".getBytes("utf-8"),
Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT_SEQUENTIAL);
zk.create("/nodes1/testNode2", "/nodes1/testNode2".getBytes("utf-8"),
Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT_SEQUENTIAL); // 换一个父节点,序号的递增顺序重新开始
zk.create("/nodes2", "nodes2".getBytes("utf-8"),
Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
zk.create("/nodes2/testNode1", "/nodes2/testNode1".getBytes("utf-8"),
Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT_SEQUENTIAL); zk.create("/nodes3", "/nodes3".getBytes("utf-8"),
Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); zk.close();
} /**
* 从zookeeper中删除znode
* @throws Exception
*/
@Test
public void testDeleteZnode() throws Exception { // 参数1:要删除的节点的路径 参数2:要删除的节点的版本,-1匹配所有版本
// 只能删除不为空的节点
zk.delete("/nodes3", -1);
Stat exists = zk.exists("/nodes3", false);
System.out.println(exists); } @Test
public void testUpdateZnode() throws Exception {
byte[] data = zk.getData("/nodes1", false, null);
System.out.println(new String(data, "utf-8")); zk.setData("/nodes1", "/nodes1 data changed".getBytes("utf-8"), -1); data = zk.getData("/nodes1", false, null);
System.out.println(new String(data, "utf-8")); } /**
* 获取子节点信息
* @throws Exception
*/
@Test
public void testGetChildren() throws Exception {
List<String> children = zk.getChildren("/nodes1", false);
for (String child : children) {
System.out.println(child);
}
} /**
* zk的监听机制:
* 在初始化zk对象的时候定义好回调函数,对znode进行操作时可以注册监听
* 监听的znode上发生相应事件时,客户端zk会接收到zookeeper的事件通知
* 客户端zk根据事件调用我们事先定义好的回调函数
* @throws Exception
*
*/
@Test
public void testWatch() throws Exception {
//获取/nodes1的数据时进行监听
//第二个参数true表示监听
byte[] data = zk.getData("/nodes1", true, null); //获取/nodes1的子节点时进行监听
List<String> children = zk.getChildren("/nodes1", true);
Thread.sleep(Long.MAX_VALUE);
} /**
* 将配置文件上传到zookeeper中进行管理
* @throws Exception
*/
@Test
public void testUploadConfigFileToZookeeper() throws Exception{
String schema_xml = FileUtils.readFileToString(new File("c:/web.xml"));
zk.create("/conf", null, Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
zk.create("/conf/web.xml", schema_xml.getBytes(),
Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
zk.close();
}
}

需要注意的是,创建非叶子节点时,zk会自动加上序号,所以在操作非叶子节点时,不能像添加的时候一样以原路径操作,要加上序号,如:

[zk: localhost:2181(CONNECTED) 50] ls /

[dubbo, nodes2, conf, nodes1, zookeeper]

[zk: localhost:2181(CONNECTED) 51] ls /nodes1

[testNode20000000001, testNode10000000000]

[zk: localhost:2181(CONNECTED) 52] ls /nodes2

[testNode10000000000]

[zk: localhost:2181(CONNECTED) 53] get /nodes1/testNode1

Node does not exist: /nodes1/testNode1

[zk: localhost:2181(CONNECTED) 54] get /nodes1/testNode10000000000

/nodes1/testNode1

cZxid = 0x26a

.......

[zk: localhost:2181(CONNECTED) 55] delete /nodes1/testNode1

Node does not exist: /nodes1/testNode1

[zk: localhost:2181(CONNECTED) 56]

Zookeeper高可用集群搭建与测试

服务器集群信息

Zookeeper 集群的设计目标是高性能、高可用性、严格有序访问的,其中只要有过半的节点是正常的情况下,那么整个集群对外就是可用的。正是基于这个特性,要将 ZK 集群的节点数量要为奇数(2n+1:如 3、5、7 个节点)较为合适。

服务器 1:192.168.2.127  端口:2181、2881、3881

服务器 2:192.168.2.128  端口:2182、2882、3882

服务器 3:192.168.2.130  端口:2183、2883、3883

端口说明:

218x:客户端(应用程序)连接 Zookeeper 服务器的端口,Zookeeper 会监听这个端

288x:该服务器与集群中的 Leader 服务器交换信息的端口

388x:选举通信端口,如果集群中的 Leader 服务器挂了,需要选出一个新的 Leader,而这个端口就是用来执行选举时服务器相互通信的端口

设置多回话操作

在操作之前,先把Xshell或者SecureCRT设置成多会话操作,即同时操纵多个会话窗口,很方便,打开127,128,130会话窗口。

Xshell:查看-》撰写栏,Xshell的下面就会出现一个编辑框,就是撰写栏,点击左下角撰写栏上的蓝色图标,然后选择【全部会话】。

SecureCRT:右击任何一个会话窗口下面的交互窗口,选中“发送交互到所有标签”。

下面某些操纵就可以在撰写栏上同时操纵三台服务器了。

下载或上传文件

将zookeeper-3.4.9.tar.gz下载或者上传到三台服务器中的/usr/ftpuser目录

解压

mkdir /usr/local/zookeeper

tar -zxvf zookeeper-3.4.9.tar.gz -C /usr/local/zookeeper

cd /usr/local/zookeeper

按节点号对 zookeeper 目录重命名

#127

[root@localhost zookeeper]# mv zookeeper-3.4.9/ node-127

#128

[root@localhost zookeeper]# mv zookeeper-3.4.9/ node-128

#130

[root@localhost zookeeper]# mv zookeeper-3.4.9/ node-130

创建数据日志目录

在各 zookeeper 节点目录/usr/local/zookeeper/node-*下创建data和logs目录

cd node-*

mkdir data

mkdir logs

拷贝修改配置文件

将 zookeeper/node-*/conf 目录下的 zoo_sample.cfg 文件拷贝一份,命名为 zoo.cfg

cd conf

cp zoo_sample.cfg zoo.cfg

#127

[root@localhost conf]# vi zoo.cfg

...

#dataDir=/tmp/zookeeper

dataDir=/usr/local/zookeeper/node-127/data

dataLogDir=/usr/local/zookeeper/node-127/logs

# the port at which the clients will connect

clientPort=2181

server.1=192.168.2.127:2881:3881

server.2=192.168.2.128:2882:3882

server.3=192.168.2.130:2883:3883

...

#128

[root@localhost conf]# vi zoo.cfg

...

#dataDir=/tmp/zookeeper

dataDir=/usr/local/zookeeper/node-128/data

dataLogDir=/usr/local/zookeeper/node-128/logs

# the port at which the clients will connect

clientPort=2182

server.1=192.168.2.127:2881:3881

server.2=192.168.2.128:2882:3882

server.3=192.168.2.130:2883:3883

...

#130

[root@localhost conf]# vi zoo.cfg

...

#dataDir=/tmp/zookeeper

dataDir=/usr/local/zookeeper/node-130/data

dataLogDir=/usr/local/zookeeper/node-130/logs

# the port at which the clients will connect

clientPort=2183

server.1=192.168.2.127:2881:3881

server.2=192.168.2.128:2882:3882

server.3=192.168.2.130:2883:3883

...

创建 myid 文件

进入/usr/local/zookeeper/node-*/data,编辑 myid 文件,并在对应的 IP 的机器上输入对应的编号。如在 node-128 上,myid 文件内容就是1,node-128 上就是 2,node-130 上就是 3。

#127

[root@localhost data]# vi /usr/local/zookeeper/node-127/data/myid ## 值为 1

#128

[root@localhost data]# vi /usr/local/zookeeper/node-128/data/myid ## 值为 2

#130

[root@localhost data]# vi /usr/local/zookeeper/node-130/data/myid ## 值为 3

打开端口

在防火墙中打开要用到的端口 218x、288x、388x。打开vi /etc/sysconfig/iptables增加以下 3 行

#127

-A INPUT -m state --state NEW -m tcp -p tcp --dport 2181 -j ACCEPT

-A INPUT -m state --state NEW -m tcp -p tcp --dport 2881 -j ACCEPT

-A INPUT -m state --state NEW -m tcp -p tcp --dport 3881 -j ACCEPT

#128

-A INPUT -m state --state NEW -m tcp -p tcp --dport 2182 -j ACCEPT

-A INPUT -m state --state NEW -m tcp -p tcp --dport 2882 -j ACCEPT

-A INPUT -m state --state NEW -m tcp -p tcp --dport 3882 -j ACCEPT

#130

-A INPUT -m state --state NEW -m tcp -p tcp --dport 2183 -j ACCEPT

-A INPUT -m state --state NEW -m tcp -p tcp --dport 2883 -j ACCEPT

-A INPUT -m state --state NEW -m tcp -p tcp --dport 3883 -j ACCEPT

重启防火墙

service iptables restart

启动zookeeper集群

cd node*/bin

./zkServer.sh start

查看zookeeper集群状态

./zkServer.sh status

可见,三个节点中,有一个为Mode: leader,另外两个为Mode: follower

显示状态报错参考:

http://www.cnblogs.com/xiaohua92/p/5460515.html

dubbo管控台链接集群

需要先安装dubbo管控台,我们就用事先已经安装好的dubbo的管控台(192.168.2.129),下面我们修改下配置文件

[root@localhost ~]#

vi /usr/local/apache-tomcat-7.0.70/webapps/ROOT/WEB-INF/dubbo.properties

dubbo.registry.address=zookeeper://192.168.2.127:2181?backup=192.168.2.128:2182,192.168.2.130:2183

dubbo.admin.root.password=dubbo129

dubbo.admin.guest.password=dubbo129

启动dubbo管控台

[root@localhost ~]# cd /usr/local/apache-tomcat-7.0.70/bin/

[root@localhost bin]# ./startup.sh

应用连zookeeper集群以及高可用测试

在《基于dubbo构建分布式项目与服务模块》一文中,我们创建了服务消费者与服务提供者,现在我们将服务提供者注册到zookeeper集群。

修改mcweb\mcweb-logic\src\main\resources\spring\dubbo-provider.xml

<!-- zookeeper注册中心地址 -->

<dubbo:registry protocol="zookeeper"

address="192.168.2.127:2181,192.168.2.128:2182,192.168.2.130:2183" />

启动mcweb-logic。在dubbo的“首页 > 服务治理 > 服务”中可以看到已经注册到 zookeeper 注册中心的服务的相关情况。看看mcweb-logic的日志:

可见,应用已经连接到了zookeeper集群中的128节点。现在我们把128的zookeeper停止,看看mcweb-logic的日志变化:

可见,zookeeper集群的状态发生了变化,当128节点停止后,应用重新连接到了zookeeper集群中的127节点。现在集群中还有两个节点可用,集群仍可以对外可用,当再把127节点停止后,集群对外就不可用:

只要有过半的节点是正常的情况下,那么整个zookeeper集群对外就是可用的,这是zookeeper集群高可用的基础。

分布式服务协调技术zookeeper笔记的更多相关文章

  1. 【转】浅谈分布式服务协调技术 Zookeeper

    非常好介绍Zookeeper的文章, Google的三篇论文影响了很多很多人,也影响了很多很多系统.这三篇论文一直是分布式领域传阅的经典.根据MapReduce,于是我们有了Hadoop:根据GFS, ...

  2. 个人学习分布式专题(二)分布式服务治理之分布式协调技术Zookeeper

    分布式协调技术Zookeeper 2.1 zookeeper集群安装部署(略) 2.2 zookeeper的基本原理,数据模型 2.3 zookeeper Java api的使用 2.4 zookee ...

  3. Zookeeper分布式服务协调组件

    1.简介 Zookeeper是一个分布式服务协调组件,是Hadoop.Hbase.Kafka的重要组件,它是一个为分布式应用提供一致性服务的组件.   Zookeeper的目标就是封装好复杂易出错的服 ...

  4. 分布式服务:Dubbo+Zookeeper+Proxy+Restful 分布式架构

    分布式 分布式服务:Dubbo+Zookeeper+Proxy+Restful 分布式消息中间件:KafKa+Flume+Zookeeper 分布式缓存:Redis    分布式文件:FastDFS ...

  5. 分布式服务框架:Zookeeper简介

    分布式服务框架:Zookeeper(分布式系统的可靠协调系统) 本文导读: 1 Zookeeper概述 2 Zookeeper总体结构 ——逻辑图.运转流程.特点.优点.数据结构 3 Zookeepe ...

  6. 分布式服务框架:Zookeeper

    Zookeeper是一个高性能,分布式的,开源分布式应用协调服务.它提供了简单原始的功能,分布式应用可以基于它实现更高级的服务,比如同步,配置管理,集群管理,名空间.它被设计为易于编程,使用文件系统目 ...

  7. 《大规模web服务开发技术》笔记

    前段时间趁空把<大规模web服务开发技术>这本书看完了,今天用一下午时间重新翻了一遍,把其中的要点记了下来,权当复习和备忘.由于自己对数据压缩.全文检索等还算比较熟,所以笔记内容主要涉及前 ...

  8. 阿里巴巴分布式服务框架dubbo学习笔记

    Dubbo是什么? Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案.简单的说,dubbo就是个服务框架,如果没有分布式的需求,其实是不需要用的 ...

  9. 基于Nginx和Zookeeper实现Dubbo的分布式服务

    一.前言 公司的项目基于阿里的Dubbo 微服务框架开发.为了符合相关监管部门的安全要求,公司购买了华东1.华东2两套异地服务器,一套是业务服务器,一套是灾备服务器.准备在这两套服务器上实现 Dubb ...

随机推荐

  1. [从产品角度学EXCEL 02]-EXCEL里的树形结构

    这是<从产品角度学EXCEL>系列第三篇. 前言请看: 0 为什么要关注EXCEL的本质 1 excel是怎样运作的 或者你可以去微信公众号@尾巴说数 获得连载目录. 本文仅由尾巴本人发布 ...

  2. Android开发加快sdk更新速度

    1.在:\Windows\System32\drivers\etc目录下找到host文件,不能再这个目录修改host文件,需要先拷贝到桌面 然后把一下地址添加到host文件的最末尾 203.208.4 ...

  3. java从基础知识(十)java多线程(上)

    线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元.另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点 ...

  4. Java页面中文编码要转换两次encodeURI

    1.js文件中使用encodeURI()方法. login_name = encodeURI(encodeURI(login_name)); 2.action中URLDecoder解码 loginNa ...

  5. (转)Redis 的 5 个常见使用场景

    在这篇文章中,我们将阐述 Redis 最常用的使用场景,以及那些影响我们选择的不同特性. 1.会话缓存(Session Cache) 最常用的一种使用Redis的情景是会话缓存(session cac ...

  6. python中的collections

    python中有大量的内置模块,很多是属于特定开发的功能性模块,但collections是属于对基础数据的类型的补充模块,因此,在日常代码中使用频率更高一些,值得做个笔记,本文只做主要关键字介绍,详细 ...

  7. 3dmax导出到blend或者vs中

    使用3dmax将模型导成obj格式的时候,可以导出材质或者不导出. 1.如果不导出,则按下图不勾选导出材质和创建材质库选项.这样生成的obj是可以直接再blend或者vs中打开的. 2.如果导出,不仅 ...

  8. postgres索引创建、 存储过程的创建以及在c#中的调用

    postgres创建索引参考 http://www.cnblogs.com/stephen-liu74/archive/2012/05/09/2298182.html CREATE TABLE tes ...

  9. NYOJ之题目325 zb的生日

    -------------------------------------- 刷一辈子水题... AC代码: import java.util.Scanner; public class Main { ...

  10. (2)WebAPI的增删改查

    using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Ne ...