安装zookeeper
Zookeeper
zookeeper能做什么zookeeper是一种分布式协调服务,用于管理大型主机,在分布式系统中管理和协调服务是一个复杂的过程,zookeeper允许开发人员专注于应用程序的设计,而不用担心应用的分布式特性
分布式协调组件
当通过nginx进行负载均衡时,此时服务A-1,A-2是冗余存储的,flag都为true,当A-2的值修改为false时,此时A-1与A-2的数据就不一致了,这时ZK就可以修改A-1中的数据,让服务之间的数据保持一致实现无状态
当用户的登陆请求传到A服务器时,别的冗余服务器并没有A的登录信息,此时就可以把登录信息传到zookeeper上,而无需冗余存储每个用户的登录状态(类似于分布式session) 搭建zookeeper服务器
zoo.cfg配置文件说明
zookeeper需要依赖conf/zoo.cfg才能启动
tickTime=2000 发送心跳包的间隔时间(ms),也是别的配置项的基础单位 initLimit=10 容忍follow初始化连接到leader的最大心跳数syncLimit=5 follower与leader同步的最大心跳数dataDir=/temp/data zookeeper数据存储目录及日志保存目录(如果不指定dataLogDir,则日志也保存在这个文件夹下)clientPort=2181 与客户端连接的端口maxClientCnxns=60 单个客户端与zookeeper最大并发连接数
zookeeper服务端命令
./zkServer.sh start ./conf/zoo.cfg [主机地址] 启动zookeeper服务./zkServer.sh stop./conf/zoo.cfg 关闭zookeeper服务 ./zkServer.sh status./conf/zoo.cfg 查看指定zookeeper状态root@agoiyanzsa-PC:/opt/apache-zookeeper-3.6.3-bin/bin# ./zkCli.sh [主机地址] 连接ZK
zookeeper内部数据模型
保存数据的方式
ZK的文件结构类似于树,它的数据是保存在节点上的,ZK的节点称为ZNode,每一个ZNode有一个名称标识,并用路径(/)序列分隔。
在图中,首先有一个由“/”分隔的znode。在根目录下,你有两个逻辑命名空间** config ** 和** workers ** 。
config 命名空间用于集中式配置管理,workers 命名空间用于命名。
在config命名空间下,每个znode最多可存储1MB的数据。这与UNIX文件系统相类似,除了父znode也可以存储数据。这种结构的主要目的是存储同步数据并描述znode的元数据。此结构称为ZooKeeper数据模型。
基础操作 help获取帮助[zk: localhost:2181(CONNECTED) 5] create /test/zookeeperCreated /test/zookeeper[zk: localhost:2181(CONNECTED) 6] set /test 2233[zk: localhost:2181(CONNECTED) 7] ls -lorg.apache.commons.cli.UnrecognizedOptionException: Unrecognized option: -l[zk: localhost:2181(CONNECTED) 8] ls /[test, zookeeper][zk: localhost:2181(CONNECTED) 9] ls /test[zookeeper][zk: localhost:2181(CONNECTED) 10] get /test2233[zk: localhost:2181(CONNECTED) 12] get -s /test2233cZxid = 0x4ctime = Mon Feb 21 21:18:01 CST 2022mZxid = 0x6mtime = Mon Feb 21 21:19:04 CST 2022pZxid = 0x5cversion = 1dataVersion = 1aclVersion = 0ephemeralOwner = 0x0dataLength = 4numChildren = 1
znode
Znode兼具文件和目录两种特点。既像文件一样维护着数据长度、元信息、ACL、时间戳等数据结构,又像目录一样可以作为路径标识的一部分。每个Znode由四个部分组成:
stat :此为状态信息,描述该Znode版本、权限等信息。
acl: 简单的说就是增删改查自身和子节点(cwrda)的操作权限定义
data :与该Znode关联的数据
child :该Znode下的节点
版本号 - 每个znode都有版本号,这意味着每当与znode相关联的数据发生变化时,其对应的版本号也会增加。当多个zookeeper客户端尝试在同一znode上执行操作时,版本号的使用就很重要。操作控制列表(ACL) - ACL基本上是访问znode的认证机制。它管理所有znode读取和写入操作。时间戳 - 时间戳表示创建和修改znode所经过的时间。它通常以毫秒为单位。ZooKeeper从“事务ID"(zxid)标识znode的每个更改。Zxid是唯一的,并且为每个事务保留时间,以便你可以轻松地确定从一个请求到另一个请求所经过的时间。数据长度 - 存储在znode中的数据总量是数据长度。你最多可以存储1MB的数据。
znode的类型
持久节点 - 即使在创建该特定znode的客户端断开连接后,持久节点仍然存在。默认情况下,除非另有说明,否则所有持久节点都是持久的。临时节点 - 客户端活跃时,临时节点就是有效的。当客户端与ZooKeeper集合断开连接时,临时节点会自动删除。因此,只有临时节点不允许有子节点。如果临时节点被删除,则下一个合适的节点将填充其位置。临时节点在leader选举中起着重要作用。这个特性也可以实现服务的注册与发现
创建临时节点 create -e顺序节点 - 顺序节点可以是持久的或临时的。当一个新的znode被创建为一个顺序节点时,ZooKeeper通过将10位的序列号附加到原始名称来设置znode的路径。例如,如果将具有路径/myapp的znode创建为顺序节点,则ZooKeeper会将路径更改为/myapp0000000001,并将下一个序列号设置为0000000002。如果两个顺序节点是同时创建的,那么ZooKeeper不会对每个znode使用相同的数字。顺序节点在锁定和同步中起重要作用。可以利用自增特性实现分布式锁
创建顺序节点 create -s临时顺序节点container(容器节点) - 当容器中没有任何子节点,该节点会被ZK定期删除(60s)TTL节点 - 可以被指定到期时间,到期时ZK会删除它,只能通过zookeeper.extendTypesEnabled=true开启