D 表示的是万一集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新的 Leader,而这个端口就是用来执行选举时服务器相互通信的端口。如果是伪集群的配置方式,由于 B 都是一样,所以不同的 Zookeeper 实例通信端口号不能一样,所以要给它们分配不同的端口号。
在集群模式下,集群中每台机器都需要感知到整个集群是由哪几台机器组成的,在配置文件中,按照格式server.id=host:port:port,每一行代表一个机器配置。id: 指的是server ID,用来标识该机器在集群中的机器序号
新建datadir目录,设置myid
在每台zookeeper机器上,我们都需要在数据目录(dataDir)下创建一个myid文件,该文件只有一行内容,对应每台机器的Server ID数字;比如server.1的myid文件内容就是1。【必须确保每个服务器的myid文件中的数字不同,并且和自己所在机器的zoo.cfg中server.id的id值一致,id的范围是1~255】
启动zookeeper
Zookeeper的数据模型如果我们把zookeeper当成是一个内存数据库的话,那么crud就是对zookeeper内存数据库进行一个数据的增删改查操作,那zookeeper的数据结构是什么样的呢?如图9-4所示,zookeeper的视图结构和标准的文件系统非常类似,每一个节点称之为ZNode, 是zookeeper的最小单元。每个znode上都可以保存数据以及挂载子节点,构成一个层次化的树形结构
图9-4 节点类型Zookeeper中包含4种类型的节点,分别说明如下。
持久化节点持久化节点可以细分为两种节点,分别是:
PERSISTENT:持久化,不会随客户端的断开而自动删除,默认类型,如图9-5所示
图9-5
PERSISTENT_SEQUENTIAL:带序号的持久化,znode的名字将被附加一个单调递增的数字,如图9-6所示
图9-5 临时节点
EPHEMERAL:临时节点,当客户端断开时自动删除,如图9-6所示,如果该Client创建了/Server1和/Server2这两个节点,当Client的session断开后,这两个节点会被Zookeeper自动删除。
图9-6
EPHEMERAL_SEQUENTIAL:带序号的临时节点,znode的名字将被附加一个单调递增的数字,如图9-7所示
注意,临时节点不能存在子节点
图9-7 Container节点CONTAINER:container节点是一个特殊用途的节点,它是为Leader、Lock等操作而设计的节点类型,它的作用是: 当容器节点的最后一个子节点被删除后,容器节点将会被标注并且在一段时间后删除。
由于容器节点存在这个特性,所以当我们在容器节点下创建一个子节点时,需要捕获KeeperException.NoNodeException异常,如果捕获到这个异常,就需要重新创建容器节点。
TTL节点如果某个节点设置为TTL节点类型,那么这个节点在指定TTL时间(单位为毫秒)段内没有修改并且没有子节点时,该节点会在一段时间后被删除。
PERSISTENT_WITH_TTL:zookeeper的扩展类型,如果znode在给定的TTL内没有被修改,它将在没有子节点时被删除。要想使用该类型,必须在zookeeper的bin/zkService.sh中的启动zookeeper的java环境中设置环境变量zookeeper.extendedTypesEnabled=true(具体做法在下边),否则KeeperErrorCode = Unimplemented for /**。
设置zookeeper.extendedTypesEnabled=true