Zookeeper里面的版本号和我们理解的版本号不同,它表示的是对数据节点的内容、子节点列表或者ACL信息的修改次数。节点创建时dataversion、aclversion,cversion都为0,每次修改响应内容其对应的版本号加1。
这个版本号的用途就和分布式场景的一个锁概念有关。比如演出售票中的一个座位,显然每个场次中的每个座位都只有一个,不可能卖出2次。如果A下单的时候显示可售,他想买,那么为了保证他可以下单成功,此时别人就不能买。这时候就需要有一种机制来保证同一时刻只能有一个人去修改该座位的库存。这就用到了锁。锁有悲观锁和乐观锁。
-
悲观锁:它会假定所有不同事务的处理一定会出现干扰,数据库中最严格的并发控制策略,如果一个事务A正在对数据处理,那么在整个事务过程中,其他事务都无法对这个数据进行更新操作,直到A事务释放了这个锁。
-
乐观锁:它假定所有不同事务的处理不一定会出现干扰,所以在大部分操作里不许加锁,但是既然是并发就有出现干扰的可能,如何解决冲突就是一个问题。在乐观锁中当你在提交更新请求之前,你要先去检查你读取这个数据之后该数据是否发生了变化,如果有那么你此次的提交就要放弃,如果没有就可以提交。
Zookeeper中的版本号就是乐观锁,你修改节点数据之前会读取这个数据并记录该数据版本号,当你需要更新时会携带这个版本号去提交,如果你此时携带的版本号(就是你上次读取出来的)和当前节点的版本号相同则说明该数据没有被修改过,那么你的提交就会成功,如果提交失败说明该数据在你读取之后和提交之前这段时间内被修改了。
这里通过set命令并携带版本号提交更新,版本号相同更新就会成功。
Zookeeper服务器客户端操作
启动服务器
/opt/zookeeper-3.4.9/bin/zkServer.sh start
查看服务器状态
[root@rich bin]# /opt/zookeeper-3.4.9/bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper-3.4.9/bin/…/conf/zoo.cfg
Mode: standalone
日志文件
zookeeper.out
停止服务器
/opt/zookeeper-3.4.9/bin/zkServer.sh stop
使用客户端登录服务器,登录之前要启动服务器
/opt/zookeeper-3.4.9/bin/zkCli.sh -server 192.168.200.100:2181
如果是本机和默认2181端口号-server后面部分可以省略
Zookeeper常用命令
ZooKeeper服务器与客户端
在/opt/zookeeper-3.4.9/bin目录下
启动服务器:./zkServer.sh start
停止服务器:./zkServer.sh stop
制作开机启动的脚本
把如下脚本复制进去,注意:先i,然后在复制
#!/bin/bash
#chkconfig:2345 20 90
#description:zookeeper
#processname:zookeeper
ZK_PATH=/opt/zookeeper
export JAVA_HOME=/opt/jdk1.8.0_152
case $1 in
start) sh $ZK_PATH/bin/zkServer.sh start;;
stop) sh $ZK_PATH/bin/zkServer.sh stop;;
status) sh $ZK_PATH/bin/zkServer.sh status;;
restart) sh $ZK_PATH/bin/zkServer.sh restart;;
*) echo “require start|stop|status|restart” ;;
esac
ZK_PATH=/opt/zookeeper
export JAVA_HOME=/opt/jdk1.8.0_152
注意:这二处地方要改成自己opt目录下对应的zookeeper
然后把脚本注册为Service
增加权限
初始化zookeeper配置文件
拷贝/opt/zookeeper/conf/zoo_sample.cfg
到同一个目录下改个名字叫zoo.cfg
然后咱们启动zookeeper
以上状态即为安装成功。
在/opt/zookeeper-3.4.9/bin目录下
启动客户端:./zkCli.sh
退出客户端:[zk: localhost:2181(CONNECTED) 6] quit
查看节点的子节点:ls /zookeeper/quota
获取指定节点的值:get /zookeeper
设置指定节点的值:set /zookeeper hello
创建节点:create /fruit water
删除节点:delete /fruit/apple只能删除空节点
删除节点rmr /fruit空节点和非空节点都可以删除
-s:含有序列
创建有序列的节点:create -s /fruit/apple red
apple后面的0000000000就是序列
-e:临时(重启或者超时消失)
创建临时节点:create -e /fruit/orange yellow在重启后再查看就没有这个节点了
通过-e和-s可以把节点分为四个象限,四个情况的节点
Zookeeper集群搭建
集群中服务器间通信时用到3种端口号
-
客户端访问端口号
-
集群中服务器间数据同步端口号
-
集群中follower服务器选举leader服务器端口号
集群中服务器编号
编号形式:1、2、3、……
指定编号:数据目录/myid文件中写入编号
编号和端口号在配置文件中的配置方式
客户端端口号
clientPort
编号和端口号
在配置文件末尾指定如下格式:
server.编号=IP地址:数据同步端口号:选举端口号
server.1=127.0.0.1:6001:6002
server.2=127.0.0.1:7001:7002
server.3=127.0.0.1:8001:8002
zkone步骤
创建目录
mkdir /opt/cluster_zk
重新解压Zookeeper
tar -zxvf /opt/zookeeper-3.4.9.tar.gz -C /opt/cluster_zk/
进入集群目录
cd /opt/cluster_zk
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
最后
最后,强调几点:
- 1. 一定要谨慎对待写在简历上的东西,一定要对简历上的东西非常熟悉。因为一般情况下,面试官都是会根据你的简历来问的; 能有一个上得了台面的项目也非常重要,这很可能是面试官会大量发问的地方,所以在面试之前好好回顾一下自己所做的项目;
- 2. 和面试官聊基础知识比如设计模式的使用、多线程的使用等等,可以结合具体的项目场景或者是自己在平时是如何使用的;
- 3. 注意自己开源的Github项目,面试官可能会挖你的Github项目提问;
我个人觉得面试也像是一场全新的征程,失败和胜利都是平常之事。所以,劝各位不要因为面试失败而灰心、丧失斗志。也不要因为面试通过而沾沾自喜,等待你的将是更美好的未来,继续加油!
以上面试专题的答小编案整理成面试文档了,文档里有答案详解,以及其他一些大厂面试题目。
面试答案
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
的征程,失败和胜利都是平常之事。所以,劝各位不要因为面试失败而灰心、丧失斗志。也不要因为面试通过而沾沾自喜,等待你的将是更美好的未来,继续加油!
以上面试专题的答小编案整理成面试文档了,文档里有答案详解,以及其他一些大厂面试题目。
面试答案
[外链图片转存中…(img-jyhax0xh-1712678739097)]
[外链图片转存中…(img-20Qib4hX-1712678739097)]
[外链图片转存中…(img-pQ11E2rb-1712678739097)]
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-QVPkU4wP-1712678739098)]