文档章节

Zookeeper分布式环境搭建&分布式锁实现

IamOkay
 IamOkay
发布于 2017/02/13 11:15
字数 1880
阅读 59
收藏 1

一.Zookeeper分布式环境搭建

由于机器太慢,懒得搭建虚拟机了,这里我们实现Zookeepe伪分布式集群。

1.试验需要准备的环境:windows系统,jdk环境,zookeeper-3.3.x

2.解压后,进入conf目录,将zoo_sample.cfg复制三份,分别命名为

zoo-d2182.cfg,zoo-d2183.cfg,zoo-d2184.cfg (zoo-d{端口}.cfg)

配置zoo-d2182.cfg

# 心跳时间2000毫秒
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
#就表示fowller与leader的心跳时间是2 tick
syncLimit=5
# the directory where the snapshot is stored.
#配置数据目录
dataDir=D:/Zookeeper/data/d2182
#配置日志目录
dataLogDir=D:/Zookeeper/logs/d2182
# 当前zookeeper使用的端口
clientPort=2182

server.1=127.0.0.1:2888:3888
server.2=127.0.0.1:2889:3889
server.3=127.0.0.1:2890:3890
#在上面的例子中,我把三个zookeeper服务放到同一台机器上。上面的配置中有两个TCP port。后面一个是用于Zookeeper选举用的,而前一个是Leader和Follower或Observer,Watcher交换数据使用的。我们还注意到server.后面的数字。这个就是myid(关于myid是什么下一节会介绍)。

配置zoo-d2183.cfg与zoo-d2184.cfg,只需要复制zoo-d2182.cfg的内容,

然后修改 dataDir,dataLogDir,clientPort三项即可。

3.创建zoo-d2182.cfg,zoo-d2183.cfg,zoo-d2184.cfg中说配置的dataDir与logDir

4.进入 bin目录,复制zkServer.cmd三份,命名为

zkServer-d2182.cmd,zkServer-d2183.cmd,zkServer-d2184.cmd (zkServer-d{端口号}.cmd)

然后在这三个cmd文件中找到如下一行

set ZOOMAIN=org.apache.zookeeper.server.quorum.QuorumPeerMain

然后在该行后面添加对应的配置

#zkServer-d2812.cmd
set ZOOCFG=%ZOOCFGDIR%\zoo-d2182.cfg

#zkServer-d2813.cmd
set ZOOCFG=%ZOOCFGDIR%\zoo-d2183.cfg

#zkServer-d2814.cmd
set ZOOCFG=%ZOOCFGDIR%\zoo-d2184.cfg

如下面的例子

@echo off
REM Licensed to the Apache Software Foundation (ASF) under one or more
REM contributor license agreements.  See the NOTICE file distributed with
REM this work for additional information regarding copyright ownership.
REM The ASF licenses this file to You under the Apache License, Version 2.0
REM (the "License"); you may not use this file except in compliance with
REM the License.  You may obtain a copy of the License at
REM
REM     http://www.apache.org/licenses/LICENSE-2.0
REM
REM Unless required by applicable law or agreed to in writing, software
REM distributed under the License is distributed on an "AS IS" BASIS,
REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
REM See the License for the specific language governing permissions and
REM limitations under the License.

setlocal
call "%~dp0zkEnv.cmd"

set ZOOMAIN=org.apache.zookeeper.server.quorum.QuorumPeerMain
set ZOOCFG=%ZOOCFGDIR%\zoo-d2182.cfg
echo on
java "-Dzookeeper.log.dir=%ZOO_LOG_DIR%" "-Dzookeeper.root.logger=%ZOO_LOG4J_PROP%" -cp "%CLASSPATH%" %ZOOMAIN% "%ZOOCFG%" %*

endlocal

然后我们点击相应的cmd便可以启动

 

二.分布式锁的实现

2.1实现原理

1 设置锁超时时间

redis、数据库等实现的分布式锁,需要设置锁超时时间的原因在于:其他客户端无法得知已经获取锁的客户端的状态 是挂了呢,还是正在执行。所以只能傻傻的设置一个超时,认为超时之后就简单的判定获取锁的客户端挂了。

一旦锁设定了超时时间,可能获取锁的客户端因各种原因执行业务操作的时候耗时较长,超出了锁的超时时间,这时其他客户端就可以再次获取锁了,所以就会带来并发问题。

2 消除锁超时时间

为了消除这个锁超时,就需要由服务器来作为代理来通知,

如ZooKeeper,一旦客户端挂了,就会删除对应的临时节点,然后通知watch该节点的其他客户端。所以客户端不需要设置锁超时,就等待通知即可。

从这点来说ZooKeeper是更可靠的,降低了因锁超时带来的并发问题。

3 方案的高可用问题

redis、数据库等方案要想实现高可用,则必须有对应的高可用方案。如最简单的主从架构,又引入了一致性的问题,又会有很多的坑。

ZooKeeper方案本身可以做到高可用、一致性,所以ZooKeeper方案也更简单一些。

4 连接的单点问题

这个单点不是说redis或zookeeper的单点问题,而是客户端和服务器端的这个连接的单点问题。先来举个例子:

如ZooKeeper还是会出现并发问题的,如客户端获取到锁了之后,和ZooKeeper连接出现了session超时, 就会导致ZooKeeper集群删除对应的临时节点,其他客户端也就能获取到锁了,此时就存在并发问题。

这种问题的根由就是:客户端和ZooKeeper集群之间的连接是单连接,即只连接其中的一台机器。一旦该连接出现网络抖动, 这种分布式锁方案也会出现并发问题。

减少并发的措施:增大session的超时时间,尽量减少网络抖动,但是这也会降低服务器端对客户端的状态检测的灵敏度,这个灵敏度在分布式锁的场景下也不是特别重要,所以无所谓了。

5 消除连接的单点问题

要消除单点,必然是建立多连接来防止网络的抖动,即客户端连接多个服务器端,向每个服务器都执行获取锁的操作。

如redis的Redlock实现的分布式锁。

有N个独立的master服务器,客户端会向所有的服务器发送获取锁的操作。过半的服务器都获取到锁了则认为获取到锁了,这种也有很多细节。这种方式就解决了上述所说的ZooKeeper单连接可能造成的并发问题。

然而redis由于上述1所说的redis自身设计的问题,Redlock实现的分布式锁也会有锁超时问题,即也会存在并发。

所以理想中更好的方案就是:解决了上述2个问题,从而来进一步减少并发的可能性

redis如果能像ZooKeeper一样,实现了和客户端绑定的临时key,一旦redis客户端挂了,临时key删除,通知watch该key的其他客户端(感觉这个是一个不错的需求,不知redis未来是否要实现),就可以消除锁超时,再使用Redlock实现的分布式锁,这时候可靠性就更高了。

本文侧重总结在可靠性方面的问题,性能嘛,单机的redis当然是最快的了,其次zookeeper,最后数据库。而上述第五点,Redlock方案牺牲了一些性能来换取了可靠性。

6 概览分布式锁

其实要解决2个高可用的问题:

  • 数据存储的高可用(解决基本使用)

    如使用redis、数据库、ZooKeeper,他们承载着分布式锁需要的数据,不能是单点的,要集群高可用

  • 连接的高可用(降低并发的概率)

    那就需要建立多连接,如向N个redis master建立连接,向每一个都获取锁。

所以应该理想的布局是:

和N个独立的服务器(如ZooKeeper)都建立连接,向每台服务器都请求获取锁的操作,过半成功才表示获取到锁

这N个独立的服务器既有数据的保障,又有多连接的保障。所以简单来说,应该和3个独立的ZooKeeper机器都建立连接,而不是这3台构成一个ZooKeeper集群。

 

2.2代码实现

参考 zookeeper分布式锁实现

jedisLock—redis分布式锁实现

 

 

 

 

© 著作权归作者所有

共有 人打赏支持
IamOkay
粉丝 187
博文 458
码字总数 370664
作品 0
海淀
程序员
分布式设计与开发(三)------高一致性服务ZooKeeper

分布式环境中大多数服务是允许部分失败,也允许数据不一致,但有些最基础的服务是需要高可靠性,高一致性的,这些服务是其他分布式服务运转的基础,比如naming service、分布式lock等,这些分...

山哥
2012/03/19
0
0
阿里大数据攻城师教你怎样理解ZooKeeper(六)

Zookeeper是什么 是一个针对大型分布式系统的可靠协调系统; 提供的功能包括:配置维护、名字服务、分布式同步、组服务等; 目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效...

JAVA丶学习
04/13
0
0
ZooKeeper学习第一期---Zookeeper简单介绍

一、分布式协调技术 在给大家介绍ZooKeeper之前先来给大家介绍一种技术——分布式协调技术。那么什么是分布式协调技术?那么我来告诉大家,其实分布式协调技术 主要用来解决分布式环境当中多...

卯金刀GG
2017/10/25
0
0
zookeeper学习系列(1)

什么是Zookeeper 1、zookeeper是基于 Apache协议,高可用,高可靠,分布式,开元的分布式环境协同工作系统 -----集群、Java、不需要其它套件、可以更任何其它的系统结合 2、提供实现同步(数...

momoHuang
2014/07/01
0
1
ZooKeeper分布式专题与Dubbo微服务入门

ZooKeeper分布式专题与Dubbo微服务入门 网盘地址:https://pan.baidu.com/s/1TN6BlftB2uvvyVR7IDmODQ 密码: e6zt 备用地址(腾讯微云):https://share.weiyun.com/5539X2S 密码:65b36i Zo...

人气王子333
04/17
0
0

没有更多内容

加载失败,请刷新页面

加载更多

74.expect脚本同步文件以及指定host同步文件 构建分发系统文件和命令

20.31 expect脚本同步文件: 在expect脚本中去实现在一台机器上把文件同步到另外一台机器上去。核心命令用的是rsync ~1.自动同步文件 #!/usr/bin/expect set passwd "123456" spawn rsync -a...

王鑫linux
20分钟前
0
0
TypeScript项目引用(project references)

转发 TypeScript项目引用(project references) TypeScript新特性之项目引用(project references) 项目引用是TypeScript 3.0中的一项新功能,允许您将TypeScript程序构建为更小的部分。 通过这...

durban
25分钟前
0
0
爬虫入门

导读 网络爬虫(Web crawler),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本,它们被广泛用于互联网搜索引擎或其他类似网站,可以自动采集所有其能够访问到的页面内容,以获取...

问题终结者
25分钟前
0
0
ppwjs之bootstrap文字排版:无序列表项不换行

<!DOCTYPT html><html><head><meta http-equiv="content-type" content="text/html; charset=utf-8" /><title>ppwjs欢迎您</title><link rel="icon" href="/favicon.ico" ......

ppwjs
31分钟前
0
0
SpringBoot 学习一

本文将从以下几个方面介绍: 前言 HelloWorld 读取配置文件 例子(CURD) 前言 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架...

tsmyk0715
32分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部