- zookeeper的安装
- 下载
进入要下载的版本的目录,选择.tar.gz文件下载
下载链接:http://archive.apache.org/dist/zookeeper/
下载后copy的linux服务器中,文件传输安装yum install -y lrzsz - 解压 tar -zxf zookeeper-3.4.10.tar.gz -C /usr/myapp
- 配置
cd /root/soft/zookeeper-3.4.10 mkdir data mkdir logs // 在conf目录下新建zoo.cfg文件,写入以下内容保存: tickTime=2000 dataDir=/root/soft/zookeeper-3.4.10/data dataLogDir=/root/soft/zookeeper-3.4.10/logs clientPort=2181
- 启动和停止
// 进入bin目录 ./zkServer.sh start ./zkServer.sh stop ./zkServer.sh restart ./zkServer.sh status
- 伪集群,在一台机器上安装多个zk,配置不同的端口
tickTime=2000 dataDir=/usr/myapp/zookeeper1/data dataLogDir=/usr/myapp/zookeeper1/logs clientPort=2181 initLimit=5 syncLimit=2 server.1=192.168.220.128:2888:3888 server.2=192.168.220.128:4888:5888 server.3=192.168.220.128:6888:7888 写入zk id 到zk的data目录 echo '1' > data/myid // 其他两个安装目录依次类推
- 集群,在不同的机器上安装zooKeeper做集群
tickTime=2000 dataDir=/usr/myapp/zookeeper-3.4.5/data dataLogDir=/usr/myapp/zookeeper-3.4.5/logs clientPort=2181 initLimit=5 syncLimit=2 server.1=192.168.220.128:2888:3888 server.2=192.168.220.129:2888:3888 server.3=192.168.220.130:2888:3888 // 写入zk id 到zk的data目录 echo '1' > data/myid
- tips: 安装之前一定要确保机器上有jdk
- 下载
- zookeeper配置文件
- clientPort:客户端连接server的端口,即对外服务端口,一般设置为2181
- dataDir:存储快照文件snapshot的目录。默认情况下,事务日志也会存储在这里。建议同时配置参数dataLogDir,事务日志的写性能直接影响zk性能
- tickTime:zk中的一个时间单元。ZK中所有时间都是以这个时间单元为基础,进行整数倍配置的。例如session的最小超时时间是2*tickTime.
- dataLogDir:事务日志输出目录。尽量给事务日志的输出配置单独的磁盘或是挂载点,这将极大的提升ZK性能(No java System peroperty)
- globalOutstandingLimit:最大请求堆积数。默认是1000.ZK运行的时候,尽管SERVER已经没有空闲来处理更多的客户端请求了,但是还是允许客户端请求提交到服务器上来,以提高吞吐性能。淡然为了妨害Server内存溢出,这个请求堆积数还是需要限制下的。(Java System property:zookeeper.globalOutstandingLimit)
- preAllocSize:预先开辟磁盘空间,用于后续写入事务日志。默认是64M,每个事务日志大小就是64M。如果ZK的快照频率较大的话,建议适当减小这个参数。(Java System Property:zookeeper.preAllocSize)
- snapCount:每进行snapCount次事务日志输出后,触发一次快照(snapshot),此时,ZK会生成一个snapshot文件,同时创建一个新的事务日志文件log.。默认是100000.(真正的代码实现中,会进行一定的随机数处理,以避免所有服务器在同一时间进行快照而影响性能)(Java System property:zookeeper.snapCount)
- traceFile:用于记录所有请求的log,一般调试过程中可以使用,但是生产环境不建议使用,会严重影响性能(Java Sytem property:?requestTraceFile)
- maxClentCnxns:单个客户端与单台服务器之间的连接数的限制,是ip级别的,默认是60,如果设置为0,那么表明不做任何限制。请注意这个限制的使用范围,仅仅是单台客户端机器与与单台ZK服务器之间的连接数限制,不是针对指定客户端IP,也不是ZK集群的连接数限制,也不是单台ZK对所有客户端的连接数限制
- clientPortAddress:对于多网卡机器,可以为每个IP指定不同的监听端口。默认情况是所有IP都监听clientPort指定的端口。NEW IN 3.3.0
- minSessionTimeoutmaxSessionTimeout:Session超时时间限制,如果客户端设置的超时时间不在这个范围,那么会被强制设置为最大或最小时间。默认的session超时时间在2tickTime~20tickTime之歌范围 New in 3.3.0
- syncLimit:在运行过程中,Leader负责与ZK集群中所有机器进行通信,例如通过一些心跳检测机制,来检测机器的存活状态。如果L发出心跳包在syncLimit之后,还没有从F那里收到响应,那么久认为这个F已经不在线。注意:不要把这个参数设置得过大,否则可能会掩盖一些问题
- leaderServers:默认情况下,Leader是会接受客户端连接,并提供正常的读写服务。但是如果你想让Leader专注于集群中机器的协调,那么可以将这个参数设置为no,这样一来,会大大提高写操作的西能。(Java System Property: zookeeper.leaderServers)
- server.x=[hostname]:[nnnnn]:这里的X是一个数字,与myid文件中的id是一致的。右边可以配置两个端口,第一个端口用于F和L之间的数据同步和其他通信,第二个端口用于Leader选举过程中的投票通信
- cnxTimeout:Leader选举过程中,打开一次连接的超时时间,默认是5S。(Java System Property:zookeeper.cnxTimeout)
- ZK的特性
-
会话(Session):客户端与服务端的一次回话连接,本质是TCP长连接,通过会话可以进行心跳检测和数据传输
-
数据节点
1> 数据节点数据模型:zookeeper的视图结构和标准的Unix文件系统类似,其中每个节点称为“数据节点”或ZNode,每个znode可以存储数据,还可以挂载子节点,因此可以称之为“树”
2> 特性:a, 在Zookeeper中,znode是一个跟Unix文件系统路径相似的节点,可以往这个节点存储或获取数据 b, 通过客户端可对znode进行增删改查的操作,还可以注册watcher监控znode的变化
3> 节点类型:
a, 持久节点:跟客户端断开后,数据(ZNODE)还在 b, 临时节点:跟客户端断开后,数据(ZNODE)不存在 c, 持久顺序节点: d, 临时顺序节点: e,实现分布式锁的基础:对于持久节点和临时节点,同一个znode下,节点的名称是唯一的!
4> 节点状态属性
a, czxid(long):节点被创建的Zxid值 b, mzxid(long):字节被修改的Zxid值 c, pzxid(long):字节点最后一次呗修改时的事务id 注:a,b,c事务ID可以识别出请求的全局顺序 d, ctime(long):节点被创建的时间 e, mtime(long):节点最后一次被修改的时间 f, version(long):节点被修改的版本号 g, cversion(long):节点的所拥有子节点被修改的版本号 h, aversion(long):节点的ACL被修改的版本号 注:f,g,h基于CAS理论保证分布式数据原子性操作 i, emphememralOwner(long):如果此节点为临时节点,那么它的值为这个节点拥有者的回话ID;否则它的值为0 j, dataLength(int):节点数据域的长度 k, numChildren(int):节点拥有的子节点个数
-
版本
-
Watcher:事件监听器,客户端可以再节点上注册监听器,当特定的时间发生后,ZK会通知到感兴趣的客户端;
1> eventType: NodeCreated, NodeDeleted, NodeDataChanged, NodeChildrenChange -
ACL:ZK采用ACL(access control lists)策略控制权限,5种权限:create,read,write,delete,admin
1> ACL机制:表示为scheme:id:permissions,第一个字段表示采用哪一种机制,第二个id表示用户,permissions表示相关权限(curda)
2> zookeeper提供了如下几种机制scheme:a, world:它下面只有一个id,叫anyone,world:anyone代表任何人,zookeeper中对所有人有权限的节点就是属于world:anyone的 b, auth:它不需要id,只要是通过authentication的user都有权限(zookeeper支持通过kerberos来进行authentication,也支持username/password形式的 authentcation) c, digest:它对应的id为username:BASE64(SHA1(password)),它需要先通过username:password形式的authentication d, ip:它对应的id为客户机的IP地址,设置的时候可以设置一个IP段,比如:192.168.1.0/16,表示匹配前16个bit的IP段
-
集群角色
ZooKeeper集群角色.png
-
网友评论