发表于 2024-7-14 08:05:54

ZooKeeper的安装与操纵

一、ZooKeeper简介

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


[*]主从协调:确保分布式系统中各个节点的一致性。
[*]服务器节点动态上下线管理:监视集群中节点的状态,并根据节点反馈举行操纵。
[*]同一设置管理:允许分布式系统中的不同组件共享设置信息。
[*]分布式共享锁:提供分布式环境下的锁机制。
[*]同一名称服务:为分布式系统中的节点提供唯一的标识和服务发现。
Zookeeper的数据模子雷同于文件系统,是树状结构,每个树节点(目次)对应一个Znode节点。这些目次节点和我们普通的目次一样可以新建、删除、修改。
https://img-blog.csdnimg.cn/direct/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
https://img-blog.csdnimg.cn/direct/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 如果输出以下内容,则启动乐成
https://img-blog.csdnimg.cn/direct/07638790cb2b4cda96486322742500ed.png
建立myid,在第一台虚拟机输入1,第二台输入2
https://img-blog.csdnimg.cn/direct/41f790be7daa4b239ef06d5816f565a8.png
https://img-blog.csdnimg.cn/direct/4525c6faee444036bf2a39e5c4cd4113.png
https://img-blog.csdnimg.cn/direct/917fbaf36e4f40d28ecea082cb378b59.png
三、使用命令行操纵Zookeeper

设置好Zookeeper之后,就可以操纵Zookeeper集群了,现在我们使用命令行终端举行操纵
1、输入以下命令,毗连Zookeeper集群(第二台虚拟机举行同样的操纵,IP地址记得换!)

zkCli.sh -server 192.168.37.104:2181 因为_现在我是在第一台虚拟机上操纵的,以是IP地址填写第一台虚拟,机的IP地址,端标语即是前面写设置文件时所规定的
毗连乐成后,会出现"Welcome to ZooKeeper"等信息
https://img-blog.csdnimg.cn/direct/d8d865ca49404126a3e2bea7d8946756.png出现以上信息表明毗连乐成,可以举行下面的操纵了!
2、命令行

使用ls命令查看当前ZooKeeper所包含的内容
ls / 使用create可以创建新节点,例如使用命令create /zk "mydata"可以创建一个名为zk的节点以及在上面存放的数据字符串mydata
create /zk "mydata" 会输出以下内容:ˊ
Created /zk 使用get命令可以确认zk是否包含字符串mydata
get /zk 输入乐成会显示以下内容
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"”了
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 版:


[*]32位: http://eclipse.bluemix.net/packages/mars.1/?JAVA-LINUX32
[*]64位: http://eclipse.bluemix.net/packages/mars.1/?JAVA-LINUX64
下载完成后解压使用
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> https://img-blog.csdnimg.cn/direct/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的所有版本内容。



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: ZooKeeper的安装与操纵