搭建zookeeper单机部署和集群部署
- 格式:pdf
- 大小:85.13 KB
- 文档页数:3
zookeeper、ZK安装、ZK配置、ZK使⽤-----------------------------⽬录-----------------------------------第⼀部分:zookeeper简介第⼆部分:zookeeper环境搭建 1、单机环境 2、集群环境第三部分:zookeeper基本使⽤ 1、java原⽣zk客户端api操作 2、zkClient客户端操作(推荐) 3、curator客户端操作(推荐)第四部分:zookeeper应⽤场景第五部分:zookeeper深⼊进阶第六部分:zookeeper源码分析-----------------------------⽬录-----------------------------------第⼀部分:zookeeper简介1、 zookeeper基本概念zookeeper是⼀个开源的分布式协调服务,其设计⽬标是将那些复杂并且容易出差错的分布式⼀致性服务封装起来,构成⼀个⾼效可靠的原语集,并提供给⽤户⼀些简单的接⼝,zookeeper是⼀个典型的分布式⼀致性的解决⽅案(CP模式),分布式应⽤程序可以基于它实现数据订阅/发布、负载均衡,命名服务、集群管理、分布式锁和分布式队列等功能。
2、基本概念@1、集群⾓⾊通常在分布式系统中,构成⼀个集群中的每⼀台机器都有⾃⼰的⾓⾊,典型的是master/slave模式(主备模式),这种情况下能够处理写操作的机器成为master机器,把所有通过⼀步复制⽅式获取最新数据并且提供服务的机器为slave机器。
在zookeeper中没有是⽤主备模式,引⼊了Leader、Follower、Observer三种⾓⾊,在zk集群中所有的机器通过Leader选举来选Leader,Leader服务器为客户端提供读写服务,Follower和Observer都能提供读服务,唯⼀的区别是Observer不参与Leader选举,不参与写操作的过半写成功。
在Docker中部署ZooKeeper集群的详细教程一、介绍Docker是一种流行的容器化技术,允许开发人员将应用程序和其依赖项打包到一个可移植的容器中,实现软件环境的一致性和可移植性。
而ZooKeeper是一个开源的协调服务,用于分布式系统中的配置管理,命名服务和分布式锁等功能。
本文将详细介绍如何在Docker中部署ZooKeeper集群。
二、准备工作首先,需要在系统上安装Docker和Docker Compose。
具体的安装过程可以参考Docker和Docker Compose的官方文档。
安装完成后,确保Docker和Docker Compose正确运行。
三、创建Docker Compose文件在部署ZooKeeper集群之前,需要创建一个Docker Compose文件来定义集群中的容器。
创建一个新文件,命名为docker-compose.yml,并在其中输入以下内容:version: "3"services:zoo1:image: zookeeper:3.4.14restart: alwaysports:- "2181:2181"environment:ZOO_MY_ID: 1ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888volumes:- ./data/zoo1:/datazoo2:image: zookeeper:3.4.14restart: alwaysenvironment:ZOO_MY_ID: 2ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888volumes:- ./data/zoo2:/datazoo3:image: zookeeper:3.4.14restart: alwaysenvironment:ZOO_MY_ID: 3ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888volumes:- ./data/zoo3:/data在这个文件中,我们定义了三个ZooKeeper节点:zoo1、zoo2和zoo3。
使用Docker容器部署Zookeeper集群在当今互联网时代,随着云计算和微服务架构的兴起,容器化技术正逐渐成为企业构建可弹性、高可用性的系统的首选。
Docker作为当前最流行的容器化平台之一,具有易用性和高度可移植性的优势,被广泛应用于各种场景。
本文将重点讨论如何使用Docker容器部署Zookeeper集群。
1. Docker与Zookeeper简介Docker是一种轻量级的虚拟化技术,可以将应用程序及其依赖项打包到一个独立的可执行容器中,实现快速部署和迁移。
而Zookeeper则是一个开源的分布式协调服务,常用于实现分布式系统的一致性与可用性。
2. 准备工作首先,我们需要安装Docker和Docker Compose,以便于管理和部署容器。
其次,需要获取Zookeeper的镜像文件,可以在Docker Hub中找到官方提供的镜像。
另外,还需要准备一个用于存储Zookeeper数据的目录,以保证数据持久化。
3. 编写Docker Compose文件Docker Compose是一个工具,可以通过一个简单的配置文件来定义和管理多个容器的运行方式。
针对Zookeeper集群,我们可以编写一个docker-compose.yml文件,指定Zookeeper容器的配置参数。
在该文件中,我们可以定义三个Zookeeper容器,分别命名为zookeeper1、zookeeper2和zookeeper3。
并通过指定镜像、端口映射、数据目录等参数来配置每个容器的运行环境。
4. 构建和启动容器在完成Docker Compose文件编写之后,我们可以使用docker-compose命令来构建和启动Zookeeper容器集群。
首先,使用docker-compose命令构建镜像,然后使用docker-compose up命令启动容器。
此时,我们可以通过docker ps命令查看容器的运行状态,确保容器正常启动,并且端口映射正确。
Docker下安装zookeeper(单机集群)启动Docker后,先看⼀下我们有哪些选择。
有官⽅的当然选择官⽅啦~下载:[root@localhost admin]# docker pull zookeeperUsing default tag: latestTrying to pull repository docker.io/library/zookeeper ...latest: Pulling from docker.io/library/zookeeper1ab2bdfe9778: Already exists7aaf9a088d61: Pull complete80a55c9c9fe8: Pull completea0086b0e6eec: Pull complete4165e7457cad: Pull completebcba13bcf3a1: Pull complete41c03a109e47: Pull complete4d5281c6b0d4: Pull completeDigest: sha256:175d6bb1471e1e37a48bfa41a9da047c80fade60fd585eae3a0e08a4ce1d39edStatus: Downloaded newer image for docker.io/zookeeper:latest查看镜像详情[root@localhost admin]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZE192.168.192.128:443/hello-2 latest 0c24558dd388 42 hours ago 660 MB192.168.192.128:443/hello latest a3ba3d430bed 42 hours ago 660 MBdocker.io/nginx latest 5a3221f0137b 13 days ago 126 MBdocker.io/zookeeper latest 3487af26dee9 13 days ago 225 MBdocker.io/registry latest f32a97de94e1 5 months ago 25.8 MBdocker.io/mongo latest 8bf72137439e 12 months ago 380 MBdocker.io/influxdb latest 34de2bdc2d7f 12 months ago 213 MBdocker.io/centos latest 5182e96772bf 12 months ago 200 MBdocker.io/grafana/grafana latest 3e16e05be9a3 13 months ago 245 MBdocker.io/hello-world latest 2cb0d9787c4d 13 months ago 1.85 kBdocker.io/java latest d23bdf5b1b1b 2 years ago 643 MB[root@localhost admin]# docker inspect 3487af26dee9[{"Id": "sha256:3487af26dee9ef9eacee9a97521bc4f0243bef0b285247258c32f4a03cab92c5","RepoTags": ["docker.io/zookeeper:latest"],"RepoDigests": ["docker.io/zookeeper@sha256:175d6bb1471e1e37a48bfa41a9da047c80fade60fd585eae3a0e08a4ce1d39ed"],"Parent": "","Comment": "","Created": "2019-08-15T06:10:50.178554969Z","Container": "9a38467115f1952161d6075135d5c5287967282b834cfe68183339c810f9652b","ContainerConfig": {"Hostname": "9a38467115f1","Domainname": "","User": "","AttachStdin": false,"AttachStdout": false,"AttachStderr": false,"ExposedPorts": {"2181/tcp": {},"2888/tcp": {},"3888/tcp": {},"8080/tcp": {}},"Tty": false,"OpenStdin": false,"StdinOnce": false,"Env": ["PATH=/usr/local/openjdk-8/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/apache-zookeeper-3.5.5-bin/bin","LANG=C.UTF-8","JAVA_HOME=/usr/local/openjdk-8","JAVA_VERSION=8u222","JAVA_BASE_URL=https:///AdoptOpenJDK/openjdk8-upstream-binaries/releases/download/jdk8u222-b10/OpenJDK8U-jre_","JAVA_URL_VERSION=8u222b10","ZOO_CONF_DIR=/conf","ZOO_DATA_DIR=/data","ZOO_DATA_LOG_DIR=/datalog","ZOO_LOG_DIR=/logs","ZOO_TICK_TIME=2000","ZOO_INIT_LIMIT=5","ZOO_SYNC_LIMIT=2","ZOO_AUTOPURGE_PURGEINTERVAL=0","ZOO_AUTOPURGE_SNAPRETAINCOUNT=3","ZOO_MAX_CLIENT_CNXNS=60","ZOO_STANDALONE_ENABLED=true","ZOO_ADMINSERVER_ENABLED=true","ZOOCFGDIR=/conf"],"Cmd": ["/bin/sh","-c","#(nop) ","CMD [\"zkServer.sh\" \"start-foreground\"]"],"ArgsEscaped": true,"Image": "sha256:20bf3cc1bd5b5766b79da5265e94007d0802ce241df1636d0f63e211a79a0e3e","Volumes": {"/data": {},"/datalog": {},"/logs": {}},"WorkingDir": "/apache-zookeeper-3.5.5-bin","Entrypoint": ["/docker-entrypoint.sh"],"OnBuild": null,"Labels": {}},"DockerVersion": "18.06.1-ce","Author": "","Config": {"Hostname": "","Domainname": "","User": "","AttachStdin": false,"AttachStdout": false,"AttachStderr": false,"ExposedPorts": {"2181/tcp": {},"2888/tcp": {},"3888/tcp": {},"8080/tcp": {}},"Tty": false,"OpenStdin": false,"StdinOnce": false,"Env": ["PATH=/usr/local/openjdk-8/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/apache-zookeeper-3.5.5-bin/bin","LANG=C.UTF-8","JAVA_HOME=/usr/local/openjdk-8","JAVA_VERSION=8u222","JAVA_BASE_URL=https:///AdoptOpenJDK/openjdk8-upstream-binaries/releases/download/jdk8u222-b10/OpenJDK8U-jre_","JAVA_URL_VERSION=8u222b10","ZOO_CONF_DIR=/conf","ZOO_DATA_DIR=/data","ZOO_DATA_LOG_DIR=/datalog","ZOO_LOG_DIR=/logs","ZOO_TICK_TIME=2000","ZOO_INIT_LIMIT=5","ZOO_SYNC_LIMIT=2","ZOO_AUTOPURGE_PURGEINTERVAL=0","ZOO_AUTOPURGE_SNAPRETAINCOUNT=3","ZOO_MAX_CLIENT_CNXNS=60","ZOO_STANDALONE_ENABLED=true","ZOO_ADMINSERVER_ENABLED=true","ZOOCFGDIR=/conf"],"Cmd": ["zkServer.sh","start-foreground"],"ArgsEscaped": true,"Image": "sha256:20bf3cc1bd5b5766b79da5265e94007d0802ce241df1636d0f63e211a79a0e3e","Volumes": {"/data": {},"/datalog": {},"/logs": {}},"WorkingDir": "/apache-zookeeper-3.5.5-bin","Entrypoint": ["/docker-entrypoint.sh"],"OnBuild": null,"Labels": null},"Architecture": "amd64","Os": "linux","Size": 225126346,"VirtualSize": 225126346,"GraphDriver": {"Name": "overlay2","Data": {"LowerDir": "/var/lib/docker/overlay2/92185ebf7638a7b34180cfb87795dd758405cbad4fd0139b92a227d1a4b61847/diff:/var/lib/docker/overlay2/8787e91f5c03a7c03cee072019eca49a0402a0a0902be39ed0b5d651a79cce35/diff:/var/lib/doc "MergedDir": "/var/lib/docker/overlay2/a7fcc1b78c472cde943f20d1d4495f145308507b5fe3da8800c33dc4ce426156/merged","UpperDir": "/var/lib/docker/overlay2/a7fcc1b78c472cde943f20d1d4495f145308507b5fe3da8800c33dc4ce426156/diff","WorkDir": "/var/lib/docker/overlay2/a7fcc1b78c472cde943f20d1d4495f145308507b5fe3da8800c33dc4ce426156/work"}},"RootFS": {"Type": "layers","Layers": ["sha256:1c95c77433e8d7bf0f519c9d8c9ca967e2603f0defbf379130d9a841cca2e28e","sha256:2bf534399acac9c6b09a0b1d931223808000b04400a749f08187ed9ee435738d","sha256:eb25e0278d41b9ac637d8cb2e391457cf44ce8d2bfe0646d0c9faefc96413f91","sha256:e54bd3566d9ef3e1309a5af6caf8682f32c6ac4d6adfcbd3e601cfee4e2e0e85","sha256:c79435051d529a7b86f5f9fc32e7e2ec401929434e5596f02a2af731f55c9f28","sha256:76e0d7b2d700e6d17924b985703c7b5b84fb39ddcc0a1181b41217c2a11dffc4","sha256:eecdc37df6afd77091641588f9639f63b65e8eb141e56529e00da44419c5bd04","sha256:36e788f2d91a89375df5901f31cca33776f887c00ddfd3cf9f2466fa4cb794d6"]}}]默认拉取最新的是3.5.X版本,如果你需要3.4.X版本的,要指定标签单机# 最后那个是镜像的ID[root@localhost admin]# docker run -d -p 2181:2181 --name some-zookeeper --restart always 3487af26dee9d5c6f857cd88c342acf63dd58e838a4cdf912daa6c8c0115091147136e819307[root@localhost admin]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESd5c6f857cd88 3487af26dee9 "/docker-entrypoin..." 4 seconds ago Up 3 seconds 2888/tcp, 3888/tcp, 0.0.0.0:2181->2181/tcp, 8080/tcp some-zookeeper[root@localhost admin]# docker exec -it d5c6f857cd88 bashroot@d5c6f857cd88:/apache-zookeeper-3.5.5-bin# ./bin/zkCli.shConnecting to localhost:21812019-08-29 07:15:21,623 [myid:] - INFO [main:Environment@109] - Client environment:zookeeper.version=3.5.5-390fe37ea45dee01bf87dc1c042b5e3dcce88653, built on 05/03/2019 12:07 GMT2019-08-29 07:15:21,679 [myid:] - INFO [main:Environment@109] - Client environment:=d5c6f857cd882019-08-29 07:15:21,680 [myid:] - INFO [main:Environment@109] - Client environment:java.version=1.8.0_2222019-08-29 07:15:21,717 [myid:] - INFO [main:Environment@109] - Client environment:java.vendor=Oracle Corporation2019-08-29 07:15:21,718 [myid:] - INFO [main:Environment@109] - Client environment:java.home=/usr/local/openjdk-82019-08-29 07:15:21,725 [myid:] - INFO [main:Environment@109] - Client environment:java.class.path=/apache-zookeeper-3.5.5-bin/bin/../zookeeper-server/target/classes:/apache-zookeeper-3.5.5-bin/bin/../build/classes:/apache-zookeeper-3.5.5 2019-08-29 07:15:22,108 [myid:] - INFO [main:Environment@109] - Client environment:java.library.path=/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib2019-08-29 07:15:22,109 [myid:] - INFO [main:Environment@109] - Client environment:java.io.tmpdir=/tmp2019-08-29 07:15:22,109 [myid:] - INFO [main:Environment@109] - Client environment:piler=<NA>2019-08-29 07:15:22,109 [myid:] - INFO [main:Environment@109] - Client environment:=Linux2019-08-29 07:15:22,109 [myid:] - INFO [main:Environment@109] - Client environment:os.arch=amd642019-08-29 07:15:22,110 [myid:] - INFO [main:Environment@109] - Client environment:os.version=3.10.0-862.9.1.el7.x86_642019-08-29 07:15:22,110 [myid:] - INFO [main:Environment@109] - Client environment:=root2019-08-29 07:15:22,110 [myid:] - INFO [main:Environment@109] - Client environment:user.home=/root2019-08-29 07:15:22,110 [myid:] - INFO [main:Environment@109] - Client environment:user.dir=/apache-zookeeper-3.5.5-bin2019-08-29 07:15:22,118 [myid:] - INFO [main:Environment@109] - Client environment:os.memory.free=11MB2019-08-29 07:15:22,148 [myid:] - INFO [main:Environment@109] - Client environment:os.memory.max=247MB2019-08-29 07:15:22,148 [myid:] - INFO [main:Environment@109] - Client environment:os.memory.total=15MB2019-08-29 07:15:22,206 [myid:] - INFO [main:ZooKeeper@868] - Initiating client connection, connectString=localhost:2181 sessionTimeout=30000 watcher=org.apache.zookeeper.ZooKeeperMain$MyWatcher@3b95a09c2019-08-29 07:15:22,239 [myid:] - INFO [main:X509Util@79] - Setting -D jdk.tls.rejectClientInitiatedRenegotiation=true to disable client-initiated TLS renegotiation2019-08-29 07:15:22,285 [myid:] - INFO [main:ClientCnxnSocket@237] - jute.maxbuffer value is 4194304 Bytes2019-08-29 07:15:22,366 [myid:] - INFO [main:ClientCnxn@1653] - zookeeper.request.timeout value is 0. feature enabled=Welcome to ZooKeeper!JLine support is enabled2019-08-29 07:15:22,563 [myid:localhost:2181] - INFO [main-SendThread(localhost:2181):ClientCnxn$SendThread@1112] - Opening socket connection to server localhost/0:0:0:0:0:0:0:1:2181. Will not attempt to authenticate using SASL (unkno 2019-08-29 07:15:23,443 [myid:localhost:2181] - INFO [main-SendThread(localhost:2181):ClientCnxn$SendThread@959] - Socket connection established, initiating session, client: /0:0:0:0:0:0:0:1:37198, server: localhost/0:0:0:0:0:0:0:1:2181 2019-08-29 07:15:23,520 [myid:localhost:2181] - INFO [main-SendThread(localhost:2181):ClientCnxn$SendThread@1394] - Session establishment complete on server localhost/0:0:0:0:0:0:0:1:2181, sessionid = 0x10001216d990000, negotiated WATCHER::WatchedEvent state:SyncConnected type:None path:null[zk: localhost:2181(CONNECTED) 0] ls /[zookeeper][zk: localhost:2181(CONNECTED) 1] quitWATCHER::WatchedEvent state:Closed type:None path:null2019-08-29 07:15:37,042 [myid:] - INFO [main:ZooKeeper@1422] - Session: 0x10001216d990000 closed2019-08-29 07:15:37,043 [myid:] - INFO [main-EventThread:ClientCnxn$EventThread@524] - EventThread shut down for session: 0x10001216d990000root@d5c6f857cd88:/apache-zookeeper-3.5.5-bin# exitexit[root@localhost admin]#在外部访问(192.168.192.128:2181)集群环境:单台宿主机(192.168.192.128),启动三个zookeeper容器。
zookeeper有⼏种部署模式?zookeeper怎么保证主从节点的状态同步?⼀、zookeeper的三种部署模式Zookeeper 有三种部署模式分别是单机模式、伪集群模式、集群模式。
这三种模式在不同的场景下使⽤:单机部署:⼀般⽤来检验 Zookeeper 基础功能,熟悉 Zookeeper 各种基础操作及特性。
伪集群部署:在单台机器上部署集群,⽅便在本地验证集群模式下的各种功能。
集群部署:⼀般在⽣产环境使⽤,具备⼀致性、分区容错性。
⼆、zookeeper怎么保证主从节点的状态同步Zookeeper的核⼼是原⼦⼴播,这个机制保证了各个Server之间的同步。
实现这个机制的协议叫做Zab协议。
Zab协议有两种模式,它们分别是恢复模式(选主)和⼴播模式(同步)。
恢复模式:当服务启动或者在领导者崩溃后,Zab就进⼊了恢复模式,当领导者被选举出来,且⼤多数Server完成了和leader的状态同步以后,恢复模式就结束了。
因此,选主得到的leader保证了同步状态的进⾏,状态同步⼜保证了leader和Server具有相同的系统状态,当leader失去主权后可以在其他follower中选主新的leader。
三、集群中为什么有主节点在分布式环境中,有些业务逻辑只需要集群中的某⼀台机器进⾏执⾏,其他的机器可以共享这个结果,这样可以⼤⼤减少重复计算,提⾼性能,于是就需要进⾏ leader 选举。
四、集群中有 3 台服务器,其中⼀个节点宕机,这个时候 zookeeper 还可以使⽤吗?zookeeper具有过半存活即可⽤的特性。
可以继续使⽤,单数服务器只要没超过⼀半的服务器宕机就可以继续使⽤。
1.成功选举Leader必须要备节点过半,2n和2n-1(n>1)的容错数是⼀样的都是 n-1 。
2.集群服务偶数节点也是可以的,偶数容错数和奇数⼀样,所以没必要浪费⼀个节点资源,⼀般为奇数个。
参考链接:。
windows环境下安装zookeeper教程详解(单机版)第⼀步(下载安装包)先准备安装包,这⾥我推荐在Apache官⽹下载(地址:https:///releases.html)。
因为这篇⽂章是为后续dubbo+zk+mybatis+springBoot的教程做铺垫,故选⽤windows版本做讲解⽅便各位读者快速上⼿,后⾯我会写linux环境下的安装配置及使⽤。
关联dubbo请看https:///qq_33316784/article/details/88601513这篇⽂章。
进⼊下载⼊⼝:选择任意下载地址:点击进⾏下载:第⼆步(开始安装)解压到常⽤的安装⽬录将conf⽬录下的zoo_sample.cfg⽂件,复制⼀份,重命名为zoo.cfg修改zoo.cfg配置⽂件,将dataDir=/tmp/zookeeper修改成zookeeper安装⽬录所在的data⽂件夹(需要在安装⽬录下⾯新建⼀个空的data⽂件夹和log⽂件夹),再添加⼀条添加数据⽇志的配置,如下图参数说明:tickTime:这个时间是作为 Zookeeper 服务器之间或客户端与服务器之间维持⼼跳的时间间隔,也就是每个 tickTime 时间就会发送⼀个⼼跳。
initLimit:这个配置项是⽤来配置 Zookeeper 接受客户端(这⾥所说的客户端不是⽤户连接 Zookeeper 服务器的客户端,⽽是 Zookeeper 服务器集群中连接到 Leader 的Follower 服务器)初始化连接时最长能忍受多少个⼼跳时间间隔数。
当已经超过 10 个⼼跳的时间(也就是 tickTime)长度后 Zookeeper 服务器还没有收到客户端的返回信息,那么表明这个客户端连接失败。
总的时间长度就是 5*2000=10 秒syncLimit:这个配置项标识 Leader 与 Follower 之间发送消息,请求和应答时间长度,最长不能超过多少个 tickTime 的时间长度,总的时间长度就是 2*2000=4 秒dataDir:顾名思义就是 Zookeeper 保存数据的⽬录,默认情况下,Zookeeper 将写数据的⽇志⽂件也保存在这个⽬录⾥。
zookeeper集群搭建搭建Zookeeper集群第⼀步:准备⼯作1. 安装JDK2. 将Zookeeper上传到服务器3. 解压Zookeeper,并创建data⽬录,将conf下的zoo_sample.cfg⽂件改名为zoo.cfg4. 建⽴/user/local/zookeeper-cluster ,将解压后的Zookeeper复制到以下三个⽬录/usr/local/zookeeper-cluster/zookeeper-1/usr/local/zookeeper-cluster/zookeeper-2/usr/local/zookeeper-cluster/zookeeper-35. 配置每⼀个 Zookeeper 的 dataDir(zoo.cfg) clientPort 分别为 2181 2182 2183修改/usr/local/zookeeper-cluster/zookeeper-1/conf/zoo.cfgclientPort=2181dataDir=/usr/local/zookeeper-cluster/zookeeper-1/data修改/usr/local/zookeeper-cluster/zookeeper-2/conf/zoo.cfgclientPort=2182dataDir=/usr/local/zookeeper-cluster/zookeeper-2/data修改/usr/local/zookeeper-cluster/zookeeper-3/conf/zoo.cfgclientPort=2183dataDir=/usr/local/zookeeper-cluster/zookeeper-3/data第⼆步:配置集群1. 在每个 zookeeper 的 data ⽬录下创建⼀个 myid ⽂件,内容分别是 1、2、3 。
这个⽂件就是记录每个服务器的 ID2. 在每⼀个 zookeeper 的 zoo.cfg 配置客户端访问端⼝(clientPort)和集群服务器 IP 列表。
2. 3. 4. 5. zookeeper有单机、伪集群、集群三种部署方式,可根据自己对可靠性的需求选择合适的部署方式。
下边对这三种部署方式逐一进行讲解。
1. 系统环境准备
操作系统 :centos7
java 环境:jdk8
我搭建的是自centos7的linux下,先配置好java的配置环境,然后下载zookeeper的相关的jar进行部署
2.zookeeper部署
下 载 zookeeper 安装包:
下载完成,通过 tar -zxvf 解压
tar -zxf zookeeper-3.4.5.tar.gz
常用命令
1.启动 ZK 服务:
sh bin/zkServer.sh start
查看 ZK 服务状态:
sh bin/zkServer.sh status
停止 ZK 服务:
sh bin/zkServer.sh stop
重启 ZK 服务:
sh bin/zkServer.sh restart
连接服务器
sh zkCli.sh -timeout 0 -r -server ip:port
3.集群模式
初 次 使 用 zookeeper , 需 要 将 %zk_home%/conf 目 录 下 的zoo_sample.cfg 文件 copy 一份重命名为 zoo.cfg,修改 dataDir 目录,dataDir 表示日志文件存放的路径集群环境安装在 zookeeper 集群中,各个节点总共有三种角色,分别是:leaderfollowerobserver
集群模式我们采用模拟 3 台机器来搭建 zookeeper 集群。
分别复制安装包到三台机器上并解压,同时 copy 一份zoo.cfg。
3.1 修改配置文件zoo.cfg
在zoo.cfg配置文件配置以下的语句
tickTime=2000
dataDir=/tmp/zookeeper
dataLogDir=/usr/myapp/zookeeper-3.4.5/logs
clientPort=2181
initLimit=10
syncLimit=5
server.1=192.168.44.128:2888:3888
server.2=192.168.44.129:2888:3888
server.3=192.168.44.130:2888:3888
server.id=host:port1:port2
idservice ID ,同时,在每台zookeeper机器上,需要在数据目录(dataDir参数指定
的那个目录下)创建一个myid的文件,文件只要一行内容,并且是一个数字,即对应
每台服务器的serverID的数字
port1 Leader
port2 Leader Leader。
如果是伪集群的配置方式,由于 host 都是一样, 所以不同
的 Zookeeper 实例通信端口号不能一样,所以要给它们分配不同的端口号
3.2 新建 datadir 目录,设置 myid
在每台zookeeper机器上,我们都需要在下创建一个,该文件只有一行内容,对应每
dataDir myid
台机器的 Server ID 数字;比如 server.1 的 myid 文件内容就是1。
【必须确保每个服务器的 myid 文件中的数字不同,并且和自己所在机器的 zoo.cfg 中 server.id 的 id 值一致,id 的范围是 1~255】
3.3 启动 zookeeper
sh zkServer.sh start
4.单机模式
zookeeper 支持单机模式,只要启动一台zookeeper机器,就可以正常提供正常的服务
单机的部署模式基本与集群模式的部署基本一致,由于是单机模式,所以整个zookeeper的集群只有一台机器,所以zoo.cfg 的配置做如下的修改:
tickTime=2000
dataDir=/tmp/zookeeper
dataLogDir=/usr/myapp/zookeeper-3.4.5/logs
clientPort=2181
initLimit=10
syncLimit=5
server.1=192.168.44.128:2888:3888
启动zookeeper
sh bin/zkServer.sh start
然后查看的服务端的状态
sh bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /root/zookeeper-3.4.12/bin/../conf/zoo.cfg
Mode: standalone
这里的mode信息为standalone,但是集群模式的mode显示为leader或者为follower
5.伪集群模式
如果手上有一台比较好的机器,作为单机部署,资源有点浪费,可以借助硬件上的虚拟化的技术,把一条物理机器转换为几台虚拟机,不过这样的成本太高,zookeeper允许你在一台机器上完成一个伪集群模式的搭建
伪集群模就是集群中的所有机器都在一个机器上,但是以集群的特性来对外提供服务,这种模式和集群模式非常类似,只是把zoo.cfg做了如下的修改
tickTime=2000
dataDir=/tmp/zookeeper
dataLogDir=/usr/myapp/zookeeper-3.4.5/logs
clientPort=2181
initLimit=10
syncLimit=5
server.1=192.168.44.128:2888:3888
server.2=192.168.44.128:2889:3889
server.3=192.168.44.128:2890:3890
在这个zoo.cfg的配置中,机器列表的配置都是一个ip地址,端口号是不一样。
6.带 Observer 角色的集群
Observers:在不伤害写性能的情况下扩展Zookeeper
尽管通过Client直接连接到Zookeeper集群的性能已经非常好了,但是这种架构如果要承受超大规模的Client,就必须增加Zookeeper集群的Server数量,随着Server的增加,Zookeeper集群的写性能必定下降,我们知道Zookeeper的Znode变更是要过半数投票通过,随着机器的增加,由于网络消耗等原因必然导致投票成本增加,从而导致写性能的下降。
Observer是一种新型的Zookeeper节点,可以帮助解决上述问题,提供Zookeeper的可扩展性。
Observer不参与投票,只是简单的接收投票结果,因此我们增加再多的Observer,也不会影响集群的写性能。
除了这个差别,其他的和Follower基本上完全一样。
例如:Client都可以连接到他们,并且都可以发送读写请求给他们,收到写请求都会上报到Leader。
Observer有另外一个优势,因为它,所以他们不属于Zookeeper集群的关键部位,即使他们Failed,或者从集群中断开,也不会影响集群的可用性。
根据Observer的特点,我们可以使用Observer做跨数据中心部署。
如果把Leader和Follower分散到多个数据中心的话,因为数据中心之间的网络的延迟,势必会导致集群性能的大幅度下降。
使用Observer的话,将Observer跨机房部署,而Leader和Follower部署在单独的数据中心,这样更新操作会在同一个数据中心来处理,并将数据发送的其他数据中心(包含Observer的),然后Client就可以在其他数据中心查询数据了。
但是使用了Observer并非就能完全消除数据中心之间的延迟,因为Observer还得接收Leader 的同步结果合Observer有更新请求也必须转发到Leader,所以在网络延迟很大的情况下还是会有影响的,它的优势就为了。
使用Observer
如果要使用Observer模式,可以在对应节点的配置文件添加如下配置:
peerType=observer
上面仅仅是告诉Zookeeper该节点是Observer,其次,必须在配置文件指定哪些节点被指定为Observer,例如:
server.1=localhost:2181:3181:observer。