分布式常见问题
- 容易出现死锁
- 容易活锁,处于活锁的线程都是非阻塞的,而且每个线程都抢不到资源,会造成cpu的耗费
- 集群的管理问题,比如某台的宕机需要能够检测到
- 集群配置文件的统一管理问题
- 集群中信息更新通知问题,某一台机器发布一个信息,能够让整个集群的机器都知道
- 管理集群的选举问题,管理集群的机器本身也是一个集群(例如zookeeper集群),其中有一台为主(选举得到),其他为从。
- 分布式锁
Zookeeper定义
Zookeeper是一个分布式的协调服务框架,Zookeeper可以解决分布式环境常见的问题:统一命名服务,信息配置管理,数据一致性,集群管理,分布式锁等等。
ZooKeeper 是一个开放源码的分布式协调服务,由知名互联网公司雅虎创建,是 Google Chubby 的开源实现。它致力于提供一个高性能、高可用、且具有严格的顺序访问控制能力的分布式协调服务。分布式应用可以基于它实现诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知,集群管理、Master 选举、分布式锁和分布式队列等功能。
Zookeeper的安装配置
- 下载:http://mirror.bit.edu.cn/apache/zookeeper/
- 解压:tar -zxvf zookeeper-3.4.13.tar.gz
- 创建配置文件:zookeeper的配置文件是conf/zoo.cfg,conf目录下有一个配置文件的样本zoo_sample.cfg,复制该文件并修改文件名为zoo.cfg即可
- 更改配置文件内容:单机模式配置如下,其中dataDir为存储快照的目录,建议修改为自定义目录。zoo.cfg:
# 最重要的5个配置
# 通常是tickTime=tickTime*initLimit 就是20000
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/home/raini/app/zookeeper/dataDir
dataLogDir=/home/raini/app/zookeeper/dataLogDir
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
其他设置参数:
- globalOutstandingLimit 配置zoo最大请求危机数,限制同时请求数
- preAllocSize 事务日志文件预分配的磁盘空间大小(默认64M)
- snapCount 相邻两次数据快照之间事务操作的次数
- traceFile
- maxClientCnxns 从socket层面限制“单台"客户机与服务器之间的并发数,置为0 不做任何限制
- clientPortAddress 允许为每个IP地址指定不同监听端口
- minSessionTimeout
- maxSessionTimeout 服务端对客户端会话的超时时间进行限制
- fsync.warningthresholdms 事务日志同步操作时消耗时间的报警阈值,一旦超过将打印出报警日志
- autopurge.snapRetainCount 与下面配套使用,zoo数据自动清理的频率,0不开启(默认)
- autopurge.purgeInterval zoo在进行数据清理时保留的快照文件数量和对应的事务日志文件,注:并不是所有文件d都可被清理的 否则将无法恢复数据 最小值3 至少保留三个数据和快照文件备份
- syncEnabled
- electionAlg 配置zookeeper leader全与算法, 目前无用
- initLimit leaderd等待flower服务器启动,并完成同步的时间,默认10就好,管理的集群多了再适当调大
- leaderServes leaderd是否接受客户端的链接,设置不接收是为了让leaderd只专注于服务器的协调
- server.x=[hostname]:nnnnn[:nnnnn] 配置服务器列表
- syncLimit leaderd与flower心跳检测最大延时时间,默认5,若集群网络延时较大,可调大
- group.x=nnnnn[:nnnnn]
- cnxTimeout TCP创建连接的超时时间,默认5000
- forceSync zoo服务器是否在事务提交时将日志写入操作强制写入磁盘,默认yes 每次都实时写入
- jute.maxbuffer: 单个数据节点可以存储的最大数据量大小,默认1M不需改,zo也不适合存储数据,所有机器都设置才能生效
- skipACL zoo集群是否跳过ACL权限检查 默认no,yes能一定程度提高读写性能,但那些设置过不跳过的节点也将不受控制
- quorumListenOnAllIPs
zookeeper的数据结构
Zookeeper存储数据的结构是一棵树,如图所示:
Zookeeper数据结构的特征:
- 有一个根节点 /,对于Zookeeper的操作都要基于根节点
- 每个节点都叫做Znode节点,都可以创建自己的子节点,都可以存储数据
- 整个Znode树会存储在内存中,提高查询速度。为了防止数据丢失,同时也会把Znode树落到磁盘上,磁盘路径即配置文件zoo.cfg里dataDir指定的目录
- Znode的路径是全局唯一的
- 创建节点时,需指定初始化数据,否则创建报错
- Zookeeper是事务的概念,针对每个事务(创建,更新或删除节点等),Zookeeper都会分配一个递增的Zxid(事务id)。其中有cZxid(创建节点的事务id),mZxid(修改节点的事务id)
Zookeeper单机模式启动,查看,关闭
启动zookeeper:bin/zkServer.sh start > /home/raini/app/zookeeper/tmp/zookeeper.out
验证已启动:QuorumPeerMain为其进程
查看状态:zkServer.sh status
停止服务:zkServer.sh stop
连接zk的ip与端口
localhost:2181,多台机器用逗号分隔