当前位置: 代码网 > 服务器>软件设计>开源 > ZooKeeper的安装与操作

ZooKeeper的安装与操作

2024年07月31日 开源 我要评论
是一个分布式的、开放源码的分布式应用程序协调服务,它是的Chubby服务的开源实现,也是和等大数据生态系统中的重要组件。ZooKeeper的目标是为分布式应用提供一致性服务,包括配置维护、域名服务、分布式同步和组服务等。它封装了复杂且易出错的关键服务,通过简单的接口和高效、稳定的系统提供给用户。ZooKeeper的工作原理基于,该算法通过选举产生一个领导者(leader),只有领导者能提交proposer,以此来解决Paxos算法中可能存在的活锁问题。

一、zookeeper简介

zookeeper是一个分布式的、开放源码的分布式应用程序协调服务,它是google的chubby服务的开源实现,也是hadoophbase等大数据生态系统中的重要组件。zookeeper的目标是为分布式应用提供一致性服务,包括配置维护、域名服务、分布式同步和组服务等。它封装了复杂且易出错的关键服务,通过简单的接口和高效、稳定的系统提供给用户。

zookeeper的工作原理基于fast paxos算法,该算法通过选举产生一个领导者(leader),只有领导者能提交proposer,以此来解决paxos算法中可能存在的活锁问题。

zookeeper提供的服务包括但不限于:

  • 主从协调:确保分布式系统中各个节点的一致性。
  • 服务器节点动态上下线管理:监视集群中节点的状态,并根据节点反馈进行操作。
  • 统一配置管理:允许分布式系统中的不同组件共享配置信息。
  • 分布式共享锁:提供分布式环境下的锁机制。
  • 统一名称服务:为分布式系统中的节点提供唯一的标识和服务发现。

zookeeper的数据模型类似于文件系统,是树状结构,每个树节点(目录)对应一个znode节点。这些目录节点和我们普通的目录一样可以新建、删除、修改。

25015ceb56844394872ac2dfd90bc563.png

zookeeper的底层功能主要包括管理和监听用户程序提交的数据,以及为用户程序提供数据节点监听服务。它的文件系统采用目录树结构,不依赖于hdfs,而是有自己的文件系统目录树。zookeeper使用java编写,但支持java和c两种编程语言的接口。

zookeeper的代码版本中提供了分布式独享锁、选举、队列的接口,其中分布锁和队列有java和c两个版本,选举只有java版本。它不仅是一个集群的管理者,还监视着集群中各个节点的状态,并根据节点提交的反馈进行下一步合理操作。

二、zookeeper安装与配置

实验环境:

                centos7操作系统

                虚拟机1,虚拟机2        

                zookeeper集群

!!!注意,以下操作两台虚拟机都要进行!!!

1、下载解压zookeeper到/usr/local文件夹下

wget http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gz
sudo mv /home/qyf/desktop/zookeeper-3.4.10.tar.gz /usr/local
tar -zxvf /usr/local/zookeeper-3.4.10.tar.gz

8555c58b9c20422294c7d309cecfd9ca.png

2、编辑/etc/profile文件

sudo vi /etc/profile

写入以下内容:

export zookeeper_home=/usr/local/zookeeper-3.4.10
export path=$path:$zookeeper_home/bin:$zookeeper_home/conf

使配置生效:

source /etc/profile

3、进入zookeeper/conf目录,建立新文件zoo.cfg

sudo cd /home/zookeeper-3.4.10/conf
sudo vi zoo.cfg

写入以下内容:

datadir=/usr/local/zookeeper-3.4.10/data # data文件夹要创建的位置
ticktime=2000
initlimit=5
synclimit=2
clientport=2181 # 端口号,可以自己设置

server.1=192.168.37.104:2888:3888  // 此处ip地址为你的两台虚拟机的ip地址
server.2=192.168.37.105:2888:3888      

4.如果是普通模式下要给zookeeper文件夹相关的操作权限,如果是root用户则忽略这一步

sudo chmod -r 777 ./zookeeper-3.4.10

5、启动zookeeper服务

zkserver.sh start

如果输出以下内容,则启动成功

07638790cb2b4cda96486322742500ed.png

建立myid,在第一台虚拟机输入1,第二台输入2

41f790be7daa4b239ef06d5816f565a8.png

4525c6faee444036bf2a39e5c4cd4113.png

917fbaf36e4f40d28ecea082cb378b59.png

三、使用命令行操作zookeeper

配置好zookeeper之后,就可以操作zookeeper集群了,现在我们使用命令行终端进行操作

1、输入以下命令,连接zookeeper集群(第二台虚拟机进行同样的操作,ip地址记得换!)

zkcli.sh -server 192.168.37.104:2181

因为_现在我是在第一台虚拟机上操作的,所以ip地址填写第一台虚拟,机的ip地址,端口号即是前面写配置文件时所规定的

连接成功后,会出现"welcome to zookeeper"等信息

d8d865ca49404126a3e2bea7d8946756.png出现以上信息表明连接成功,可以进行下面的操作了!

2、命令行

使用ls命令查看当前zookeeper所包含的内容

ls /

使用create可以创建新节点,例如使用命令create /zk "mydata"可以创建一个名为zk的节点以及在上面存放的数据字符串mydata

create /zk "mydata"

会输出以下内容:ˊ

created /zk

使用get命令可以确认zk是否包含字符串mydata

get /zk

输入成功会显示以下内容

[zk: 192.168.37.104:2181(connected) 15] get /zk         
mydata
czxid = 0x200000001
ctime = tue apr 02 03:50:46 pdt 2024
mzxid = 0x30000001f
mtime = tue apr 02 06:28:53 pdt 2024
pzxid = 0x200000002
cversion = 1
dataversion = 2
aclversion = 0
ephemeralowner = 0x0
datalength = 6
numchildren = 1

使用set命令,可以修改mydata字符串为其他内容

set /zk "hahahaha"

在使用get命令查看,神奇的发现刚才的字符串“mydata”被覆盖成“hahahaha"”了

[zk: 192.168.37.104:2181(connected) 18] get /zk           
hahahaha
czxid = 0x200000001
ctime = tue apr 02 03:50:46 pdt 2024
mzxid = 0x300000021
mtime = tue apr 02 06:30:32 pdt 2024
pzxid = 0x200000002
cversion = 1
dataversion = 4
aclversion = 0
ephemeralowner = 0x0
datalength = 8
numchildren = 1

如果要删除节点则要使用delete命令:

delete /zk

删除刚刚创建的节点zk

四、使用api操作zookeeper

进行下面的操作前请确保你的虚拟机已经安装了eclipse,并且相关配置已配置好,如果还没有进行配置,请按照我下面的步骤进行操作

下载eclipse

在 centos 中安装 eclipse,需要下载安装程序,我们选择 eclipse ide for java developers 版:

下载完成后解压使用

sudo tar -zxf ~/下载/eclipse-java-mars-1-linux-gtk*.tar.gz -c /usr/lib

建立maven文件,并且编辑pom.xml文件,输入以下内容

<dependencies>
        <dependency>
            <groupid>org.apache.zookeeper</groupid>
            <artifactid>zookeeper</artifactid>
            <version>3.4.10</version>
        </dependency>
        <dependency>
            <groupid>com.github.sgroschupf</groupid>
            <artifactid>zkclient</artifactid>
            <version>0.1</version>
        </dependency>
        <dependency>
            <groupid>junit</groupid>
            <artifactid>junit</artifactid>
            <version>4.12</version>
        </dependency>
  </dependencies>

3b52e06eddfe4a908ba0246105f43886.png

在/src/main/resources下建立log4文件,写入以下内容:

log4j.rootlogger=info, stdout
 
log4j.appender.stdout=org.apache.log4j.consoleappender
 
log4j.appender.stdout.layout=org.apache.log4j.patternlayout
 
log4j.appender.stdout.layout.conversionpattern=%d %p [%c] - %m%n
 
log4j.appender.logfile=org.apache.log4j.fileappender
 
log4j.appender.logfile.file=target/spring.log
 
log4j.appender.logfile.layout=org.apache.log4j.patternlayout
 
log4j.appender.lo  

gfile.layout.conversionpattern=%d %p [%c] - %m%n

至此准备工作已完成

1、创建节点

建立新的java文件,写入以下内容

public static void main(string[] args) throws exception{
		string connectstr="192.168.37.104:2181,192.168.37.105:2181";
		zookeeper zk = new zookeeper(connectstr,3000,null);
		string path = zk.create("/zk001","zk001_data".getbytes(),ids.open_acl_unsafe, createmode.persistent);
		system.out.println(path);
	}

上述代码中,create()方法需要传入四个参数:第一个参数为节点名称,本例中为zk001;第二个参数为节点数据,需要转成字节数组;第三个参数为权限控制,本例中使用 zookeeper 自带的完全开放权限 ids.open_acl_unsafe;第四个参数为所创建节点的类型,本例中为persistent,即持久类型的节点。
 

2、添加数据

public static void main(string[] args) throws exception{
		string connectstr="192.168.37.104:2181,192.168.37.105:2181";
		zookeeper zk = new zookeeper(connectstr,3000,null);
			stat stat = zk.setdata("/zk001","zk002_data2".getbytes() , -1);
			system.out.println(stat.getversion());
	}

其中,第一个参数为节点路径,本例中为/zk001;第二个参数为需要添加的数据,并转成字节数组,本例中为“zk002 data2”;第三个参数为版本号,-1代表所有版本。也就
是说,上述代码向节点/zk001的所有版本添加了数据“zk002 data2”。
 

3、获取数据

public static void main(string[] args) throws exception{
		string connectstr="192.168.37.104:2181,192.168.37.105:2181";
		zookeeper zk = new zookeeper(connectstr,3000,null);
		stat stat = new stat();
		// 返回指定路径上的几点数据和节点状态,节点的状态会放入stat对象中
			byte[]bytes = zk.getdata("/zk001", new watcher() {
				@override
				public void process(watchedevent event) {
					system.out.println(event.gettype());
				}
			},stat);
			system.out.println(new string(bytes));
			// 改变节点数据,出发watcher
			zk.setdata("/zk001", "zk001_data_testwatch".getbytes(), -1);
			// 验证是否触发了watcher
			while(true) {
				thread.sleep(3000);
			}
	}

这里在getdata()方法中指定了一个wacther,对节点的变化进行监听,在数据改变的时候出发watcher指定的回调方法

4、删除节点

public static void main(string[] args) throws exception{
		string connectstr="192.168.37.104:2181,192.168.37.105:2181";
		zookeeper zk = new zookeeper(connectstr,3000,null);
		// delete node
		zk.delete("/zk001", -1);
	}

上述代码中,delete()方法传入了两个参数:第一个参数为需要删除的节点路径,本例中为/zk001;第二个参数为节点的版本,如果是-1,则代表删除所有版本。也就是说,上述代码删除了节点/zk001的所有版本内容。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com