ZooKeeper 为分布式系统提供了一种配置管理的服务:集中管理配置,即将全局配置信息保存在 ZooKeeper 服务中,方便进行修改和管理,省去了手动拷贝配置的过程,同时还保证了可靠和一致性。
在分布式系统中,经常需要对应用或者服务进行统一命名,便于识别和区分开来,而 ZooKeeper 就提供了这种服务。
锁应该都不陌生,没有用过也听说过,在多个进程访问互斥资源的时候,需要加上一道锁。在分布式系统中,分布式程序分布在各个主机上的进程对互斥资源进行访问时也需要加锁。
分布式锁应当具备以下条件:
在分布式系统中,由于各种各样的原因,例如机器故障、网络故障等,导致集群中的节点增加或者减少,集群中有些机器需要感知到这种变化,然后根据这种变化做出对应的决策。
我们需要知道以下几点:
znode( ZooKeeper 的数据节点) 有四种类型 :
1)PERSISTENT(持久节点)
默认的节点类型。持久化保存的节点,创建节点的客户端与 ZooKeeper 断开连接后,该节点依旧存在 。
2)PERSISTENT_SEQUENTIAL(持久顺序节点)
所谓顺序节点,就是在创建节点时,ZooKeeper 根据创建的时间顺序给该节点名称进行编号,适合用于分布式锁、分布式选举等场景。创建时添加 -s 参数即可。
3)EPHEMERAL(临时节点)
和持久节点相反,当创建节点的客户端与 ZooKeeper 断开连接后,临时节点会自动删除,适用于心跳、服务发现等场景。创建时添加参数-e 即可。
4)EPHEMERAL_SEQUENTIAL(临时顺序节点)
顾名思义,该类节点结合了临时节点和顺序节点的特征,在创建节点时,ZooKeeper 根据创建的时间顺序给该节点名称进行编号,当创建节点的客户端和 ZooKeeper 断开连接后,节点自动删除。创建时添加 -e -s 参数即可。
ZooKeeper 实现分布式锁就是利用了临时顺序节点。
首先在 ZooKeeper 中创建一个持久节点 ParentLock,每当有客户端想要获得锁时,就在 ParentLock 下创建一个临时顺序节点,如果该节点是第一个,则获得锁,如果不是,则找到排序比它靠前的一个节点并注册 Watcher,用于监听节点是否存在。若第一个节点运行完毕,其客户端会调用指令删除该节点,或者其客户端崩溃,第一个节点也会自动删除,而第二个节点监听到该节点被删除,再经过查询确认就能获得锁了。不难发现 ZooKeeper 实现的分布式锁相当于是一个等待锁的队列,能够提升抢锁的效率,但是因为需要创建和删除节点,导致性能较低。
- #下载到目录usr/local下解压并且重命名
-
- wget https://www.apache.org/dyn/closer.lua/zookeeper/zookeeper-3.8.1/apache-zookeeper-3.8.1-bin.tar.gz
-
- tar zxvf apache-zookeeper-3.8.1-bin.tar.gz
-
-
-
- #创建data目录
- #修改.cfg文件
- cd zookeeper
- mkdir data
-
- cd conf
- mv mv zoo_sample.cfg zoo.cfg
- vim zoo.cfg
- 修改
- /data路径为
- /usr/local/zookeeper/data
- 根据需求添加端口号配置
- admin.serverPort=1234
-
-
-
-
- # bin目录下
- ./zkServer.sh start # 启动,这样启动是单机启动。
- ./zkServer.sh close # 关闭
- ./zkServer.sh status # 查看状态
-
-
-
- 设置开机自启
- cd /etc/rc.d/init.d
- vim zookeeper
- #!/bin/bash
- #chkconfig:2345 20 90
- #description:zookeeper
- #processname:zookeeper
- export JAVA_HOME=/usr/local/jdk/jdk8
- case $1 in
- start) su root /usr/local/zookeeper/bin/zkServer.sh start /usr/local/zookeeper/conf/zoo.cfg;;
- stop) su root /usr/local/zookeeper/bin/zkServer.sh stop;;
- status) su root /usr/local/zookeeper/bin/zkServer.sh status;;
- restart) su /usr/local/zookeeper/bin/zkServer.sh restart;;
- *) echo "require start|stop|status|restart" ;;
- esac
-
-
-
- # 启动服务
- chkconfig --add zookeeper
- service zookeeper start
-
-
-
- # 进入zookeeper的目录
- //启动zookeeper服务端 -指定配置文件cong/zoo.cfg
- sudo ./bin/zkServer.sh --config conf start
- //启动zookeeper客户端
- sudo ./bin/zkCli.sh -server 127.0.0.1:2181
- //查看zookeeper启动状态
- ./bin/zkServer.sh status
-
-
-
- # 使用zookeeper命令,测试是否启动成功
- //创建节点key
- create /queue
- //创建临时顺序节点
- create -e -s /queue/host1
- //查看创建的节点信息
- ls -R /queue
- cd /usr/local/kafka/kafka_2.12-3.1.0/bin
-
- //启动zookeeper应用程序
-
- ./zookeeper-server-start.sh ../config/zookeeper.properties
-
- 如果启动报错:INFO ZooKeeper audit is disabled.
-
- 修改../config/zookeeper.properties
- 添加audit.enable=true
-
- 然后重新启动
-
Apache Download Mirrors https://www.apache.org/dyn/closer.cgi?path=/kafka/3.1.0/kafka_2.12-3.1.0.tgz
- 将压缩文件移动到自己的software
-
- mv kafka_2.12-3.1.0.tgz /Users/xiansongliu/Downloads/kafka
-
- 解压压缩文件
-
- tar -zxvf kafka_2.12-3.1.0.tgz
-
- 将安装包移动到/usr/local
-
- sudo mv kafka_2.12-3.1.0 /usr/local/kafka
-
-
-
- 启动kafka
- ./bin/kafka-server-start.sh -daemon config/server.properties
1、创建一个topic
./bin/kafka-console-producer.sh --bootstrap-server localhost:9092 --topic test
2、查看创建的topic
./bin/kafka-topics.sh --bootstrap-server localhost:9092 --list
./bin/kafka-console-producer.sh --bootstrap-server localhost:9092 --topic test
1、在kafka服务端发送消息
./bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test
2、此时客户端接收到消息