一、分布式文件系统概述
1、分布式文件系统:硬件、软件分布在不同计算机上,通过消息传递进行通信。
2、分布式文件系统存在的典型问题:通信异常、网络分区(分布式环境下,由于网络通讯故障,一些节点认为应用不可用,一些节点认为应用可用,整个系统提供服务时,造成不一致性)、三态(成功、失败、超时)、节点故障
3、任何分布式系统都必须遵循CAP特性,满足其中的两个,P:分区容错性,CP:一致性,AP:可用性。
二、zookeeper介绍
1、zookeeper的功能
zookeeper是一个分布式数据一致性的解决方案,可以基于它实现数据的发布及订阅、负载均衡、名称服务、分布式协调及通知、集群管理、master选举、分布式锁和分布式队列。
2、zookeeper的结构
zookeeper是一个集群,其中包括leader、follower、observer(观察者)
leader:选举产生,具备读写权限
follower:参与选举,可被选举,具备读权限
observer:参与选举,不可被选举,具备读权限
3、会话
zookeeper中,客户端与服务端是通过一个TCP长连接进行通信。
(面)4、数据节点
zookeeper数据存储于内存中,数据模型为树状结构,每个znode都会将数据存储在自己的内存中,znode包括持久节点(仅显示删除才消失)、临时节点(会话终止即消失)、持久化顺序节点(客户端与 zookeeper 断开连接后,该节点依旧存在,只是 Zookeeper 给该节点名称进行顺序编号)、临时顺序节点(客户端与 zookeeper 断开连接后,该节点被删除,只是 Zookeeper 给该节点名称进行顺序编号)
5、版本
zookeeper为每个znode维护一个stat的数据结构,记录当前znode的三个版本,分别为version(当前版本)、cversion(当前znode子节点版本)、aversion(当前znode的ACL版本)
6、ACL
zookeeper使用ACL进行权限控制
7、事件监听器
zookeeper上,由用户指定的触发机制,在某些事件产生时,zookeeper能将通知给相关客户端。
8、ZAB协议
ZAB协议为zookeeper的原子广播协议,为了选举新的leader,并保证数据的完整性和一致性。ZAB协议中存在三种状态,looking、following、leading,在leader故障或者集群刚启动时,所有的节点都处于looking状态,等到选出leader后,改为following状态。
9、安装
zookeeper的部署安装可以分为三种类型,单机模式、伪分布式(一个机器,启动多个zookeeper实例)、分布式模式(集群模式)
10、zookeeper命令的使用
(1)delete和rmr
持久节点只能使用delete和rmr删除,文件路径下没有子路径使用delete删除,存在子路径,使用rmr
(2)stat(查询节点信息)
cZxid:事务id,创建该事务的节点,
mZxid:最近更新该节点的事务id
11、watcher
client 端会对某个 znode 建立一个 watcher 事件,当该 znode 发生变化时,这些client 会收到 zk 的通知,然后 client 可以根据 znode 变化来做出业务上的改变等。
12、监控zookeeper的四字命令
ruok、stat、srvr、conf、cons、wchs、envi
[root@centos7 bin]# telnet 192.168.43.101 2181
Trying 192.168.43.101...
Connected to 192.168.43.101.
Escape character is '^]'.
ruok
imokConnection closed by foreign host.
[root@centos7 bin]# telnet 192.168.43.101 2181
Trying 192.168.43.101...
Connected to 192.168.43.101.
Escape character is '^]'.
stat
Zookeeper version: 3.4.6-1569965, built on 02/20/2014 09:09 GMT
Clients:
/192.168.43.101:50102[0](queued=0,recved=1,sent=0)
Latency min/avg/max: 0/1/10
Received: 14
Sent: 13
Connections: 1
Outstanding: 0
Zxid: 0x2
Mode: standalone
Node count: 4
Connection closed by foreign host.
13、zoo.cfg配置文件的参数
#基本配置参数
clientPort=2181
dataDir=/data/zookeeper
dataLogDir #事务日志文件路径
tickTime=2000
#存储配置
preAllocsize #为事务日志预先分配的磁盘空间,默认65536kb
snapCount #每多少次事务执行一次快照,每次事务平均大小在100字节
autopurge.snapRetainCount #要保留在 dataDir 中的快照数
autopurge.purgeInterval #purge操作的时间间隔,0表示不启动
fsync.warningresholdms #zookeeper进行事务日志fsync操作时消耗的时间报警阈值
weight.x=N #判断quornum时的投票权限,默认1
#网络配置
maxClientCnxns #每客户端IP的最大并发连接数
clientPortAddress #zookeeper监听IP地址
minSessionTimeout #默认为ticktime的两倍
maxSessionTimeout
#集群配置
initLimit #follower连入leader并完成数据同步的时长,一般为ticktime的倍数
syncLimit #心跳检测的最大延迟
leaderServer #默认zk的leader接收读写请求
cnxTimeout #leader选举期间,各服务器创建TCP链接的超时时长
ellectionAlg #选举算法,仅支持FastLeaderElection一种
server.id=[hostname]:port:port[:observer]
三、zookeeper的部署安装
1、获取zookeeper的源码文件
https://archive.apache.org/dist/zookeeper/
2、配置jdk
如果系统存在jdk,可以直接使用,如果没有,安装好jdk,可选择较新版的jdk文件,openjdk也可以。
3、解压压缩文件到系统中
cd /usr/local/src
tar -xvf zookeeper-3.4.6.tar.gz
4、修改配置文件
cp /usr/local/src/zookeeper-3.4.6/conf/zoo_sample.cfg /usr/local/src/zookeeper-3.4.6/conf/zoo.cfg
mkdir /data/zookeeper
vim zoo.cfg
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
#dataDir=/tmp/zookeeper
dataDir=/data/zookeeper
# the port at which the clients will connect
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
5、启动服务
cd /usr/local/src/zookeeper-3.4.6/bin
./zkServer.sh start
./zkCli.sh (链接客户端)
6、伪分布式部署
(1)配置文件的修改
在一台机器上部署了3个Server,需要注意的是在集群为分布式模式下我们使用的每个配置文档模拟一台机器,也就是说单台机器及上运行多个ZooKeeper实例。但是,必须保证每个配置文档的各个端口号不能冲突,除了clientPort不同之外,dataDir也不同。另外,还要在dataDir所对应的目录中创建myid文件来指定对应的ZooKeeper服务器实例。
clientPort端口:如果在1台机器上部署多个Server,那么每台机器都要不同的clientPort,比如Server1是2181,Server2是2182,Server3是2183
dataDir和dataLogDir:dataDir和dataLogDir也需要区分下,将数据文件和日志文件分开存放,同时每个Server的这两变量所对应的路径都是不同的
server.X和myid: server.X这个数字就是对应,data/myid中的数字。在3个Server的myid文件中分别写入了0,1,2,那么每个Server中的zoo.cfg都配server.0,server.2,server.3就行了。因为在同一台机器上,后面连着的2个端口,3个Server都不要一样,否则端口冲突。
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
dataDir=/usr/local/zk/data_1
# the port at which the clients will connect
clientPort=2181
#the location of the log file
dataLogDir=/usr/local/zk/logs_1
server.0=localhost:2287:3387
server.1=localhost:2288:3388
server.2=localhost:2289:3389
(2)写入myid文件
echo "0">/usr/local/data_1/myid
echo "1">/usr/local/data_2/myid
echo "2">/usr/local/data_3/myid
(3)服务启动
zkServer.sh start zoo1.cfg
zkServer.sh start zoo2.cfg
zkServer.sh start zoo3.cfg