本文主要学习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. JAVA过滤器

    对于get请求和post请求全局过滤: 自己创建一个类,实现HttpServletRequestWrapper接口 package com.dh.deno; import java.io.Buffer ...

  2. iOS 打开本地 其他应用程序(URL Types)

    iOS 打开本地其他应用程序(URL Types) /*前言废话:Xcode是神奇的,是我所见到的编译器中最为神奇的,如:它可以同时运行两个甚至更多Project到我们模拟器上,可以同时使用一个模拟器 ...

  3. 【codevs1282】约瑟夫问题

    题目描述 有编号从1到N的N个小朋友在玩一种出圈的游戏.开始时N个小朋友围成一圈,编号为I+1的小朋友站在编号为I小朋友左边.编号为1的小朋友站在编号为N的小朋友左边.首先编号为1的小朋友开始报数,接 ...

  4. word20161221

    S/MIME, Secure Multipurpose Internet Mail Extensions / 安全多用途网际邮件扩展协议 SACL, system access control lis ...

  5. WPF中弹出菜单

    在WPF里弹出菜单是用Popup,你那个右键的是上下文菜单(也就是快捷菜单). <Grid> <Button x:Name="BtnPop" Width=&quo ...

  6. 域名管理系统DNS

    域名系统DNS,将域名转化为ip地址.域名到ip地址解析过程是以这种方式进行的,当某一程序需要把主机名解析为IP地址时,该应用进程就调用解析程序(本地程序),这时候该进程就变成了DNS的一个客户,将待 ...

  7. ORA-00257: archiver error. Connect internal only, until freed.

    早上BA抄送客户的邮件过来,说系统用不了,应用系统报异常Unable to open connection to oracle,Microsoft Provider v2.0.50727.42,既然是 ...

  8. 【openStack】Libcloud 如何支持 keystone V3?

    Examples This section includes some examples which show how to use the newly available functionality ...

  9. Asp.net 解决下载乱码问题,支持火狐、IE、谷歌等主流浏览器

    public static void DownFileStream(MemoryStream ms, string fileName) { if (ms !=Stream.Null) { ) { fi ...

  10. 安装JBOSS

    下载JBOSS 无需安装 修改环境变量: JBOSS_HOME=/root/jboss-as-7.1.1.Finalexport JBOSS_HOME 进入bin下 ./standalone.sh - ...