分布式常见问题

  • 容易出现死锁
  • 容易活锁,处于活锁的线程都是非阻塞的,而且每个线程都抢不到资源,会造成cpu的耗费
  • 集群的管理问题,比如某台的宕机需要能够检测到
  • 集群配置文件的统一管理问题
  • 集群中信息更新通知问题,某一台机器发布一个信息,能够让整个集群的机器都知道
  • 管理集群的选举问题,管理集群的机器本身也是一个集群(例如zookeeper集群),其中有一台为主(选举得到),其他为从。
  • 分布式锁

Zookeeper定义

Zookeeper是一个分布式的协调服务框架,Zookeeper可以解决分布式环境常见的问题:统一命名服务,信息配置管理,数据一致性,集群管理,分布式锁等等。

ZooKeeper 是一个开放源码的分布式协调服务,由知名互联网公司雅虎创建,是 Google Chubby 的开源实现。它致力于提供一个高性能、高可用、且具有严格的顺序访问控制能力的分布式协调服务。分布式应用可以基于它实现诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知,集群管理、Master 选举、分布式锁和分布式队列等功能。

Zookeeper的安装配置

  1. 下载:http://mirror.bit.edu.cn/apache/zookeeper/
  2. 解压:tar -zxvf zookeeper-3.4.13.tar.gz
  3. 创建配置文件:zookeeper的配置文件是conf/zoo.cfg,conf目录下有一个配置文件的样本zoo_sample.cfg,复制该文件并修改文件名为zoo.cfg即可
  4. 更改配置文件内容:单机模式配置如下,其中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如何配置_数据

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为其进程

zookeeper怎么配置超级管理员密码怎么生成 zookeeper如何配置_数据_02

查看状态:zkServer.sh status

zookeeper怎么配置超级管理员密码怎么生成 zookeeper如何配置_数据_03

停止服务:zkServer.sh stop

 

连接zk的ip与端口

localhost:2181,多台机器用逗号分隔