3G技术应用
ZooKeeper是源代码开放的分布式协调服务,由雅虎创建,是Google Chubby的开源实现。ZooKeeper是一个高性能的分布式数据一致性解决方案,它将那些复杂的、容易出错的分布式一致性服务封装起来,构成一个高效可靠的原语集,并提供一系列简单易用的接口给用户使用;
知识要点:
1、源代码开放
2、是分布式协调服务,它解决分布式数据一致性问题
A:顺序一致性 B:原子性 C:单一视图
D:可靠性 E:实时性
3、高性能
4、我们可以通过调用ZooKeeper提供的接口来解决一些分布式应用中的实际问题
1.2.1.数据发布/订阅
数据发布/订阅 顾名思义就是一方把数据发布出来,另一方通过某种手段可以得到这些数据
通常数据订阅有两种方式:推模式和拉模式,推模式一般是服务器主动向客户端推送信息, 拉模式是客户端主动去服务器获取数据(通常是采用定时轮询的方式),
ZK采用两种方式相结合
发布者将数据发布到ZK集群节点上,订阅者通过一定的方法告诉服务器,我对哪个节点的数据感兴趣,那服务器在这些节点的数据发生变化时,就通知客户端,客户端得到通知后可以去服务器获取数据信息
1.2.2.负载均衡
步骤:
1、首先DB在启动的时候先把自己在ZK上注册成一个临时节点,ZK的节点后面我们会讲到有两种,一种是永久节点,一类是临时节点临时节点在服务器出现问题的时候,节点会自动的从ZK上删除,那么这样ZK上的服务器列表就是最新的可用的列表
2、客户端在需要读写数据库的时候首先它去ZooKeeper得到所有可用的DB的连接信息(一张列表)
3、客户端随机选择一个与之建立连接
4、当客户端发现连接不可用的时候可再次从ZK上获取可用的DB连接信息,当然也可以在刚获取的那个列表里移除掉不可用的连接后再随机选择一个DB与之连接
1.2.3.命名服务
顾名思义,就是提供名称的服务,例如数据库表格ID,一般用得比较多的有两种ID,一种是自动增长的ID,一种是UUID(9291d71a-0354-4d8e-acd8-64f7393c64ae),两种ID各自都有缺陷,自动增长的ID局限在单库单表中使用,不能在分布式中使用,UUID可以在分布式中使用但是由于ID没有规律难于理解,我们可以借用ZK来生成一个顺序增长的,可以在集群环境下使用的,命名易于理解的ID
1.2.4.分布式协调/通知
心跳检测
在分布式系统中,我们常常需要知道某个机器是否可用,传统的开发中,可以通过Ping某个主机来实现,Ping得通说明对方是可用的,相反是不可用的,ZK 中我们让所有的机其都注册一个临时节点,我们判断一个机器是否可用,我们只需要判断这个节点在ZK中是否存在就可以了,不需要直接去连接需要检查的机器 ,降低系统的复杂度
1、源代码开放
2、已经被证实是高性能,易用稳定的工业级产品
3、有着广泛的应用:Hadoop,HBase,Storm,Solr
Leader,Follower,Observer
Leader服务器是整个Zookeeper集群工作机制中的核心
Follower服务器是Zookeeper集群状态的跟随者
Observer服务器充当一个观察者的角色
Leader,Follower 设计模式
Observer 观察者设计模式
会话是指客户端和ZooKeeper服务器的连接,ZooKeeper中的会话叫Session,客户端靠与服务器建立一个TCP的长连接
来维持一个Session,客户端在启动的时候首先会与服务器建立一个TCP连接,通过这个连接,客户端能够通过心跳检测与服务器保持有效的会话,也能向ZK服务器发送请求并获得响应
Zookeeper中的节点有两类
1.集群中的一台机器称为一个节点
2.数据模型中的数据单元Znode,分为持久节点和临时节点
Zookeeper的数据模型是一棵树,树的节点就是Znode,Znode中可以保存信息
版本类型说明
version当前数据节点数据内容的版本号
cversion当前数据节点子节点的版本号
aversion当前数据节点ACL变更版本号
悲观锁和乐观锁
悲观锁又叫悲观并发锁,是数据库中一种非常严格的锁策略,具有强烈的排他性,能够避免不同事务对同一数据并发更新造成的数据不一致性,在上一个事务没有完成之前,下一个事务不能访问相同的资源,适合数据更新竞争非常激烈的场景
相比悲观锁,乐观锁使用的场景会更多,悲观锁认为事务访问相同数据的时候一定会出现相互的干扰,所以简单粗暴的使用排他访问的方式,而乐观锁认为不同事务访问相同资源是很少出现相互干扰的情况,因此在事务处理期间不需要进行并发控制,当然乐观锁也是锁,它还是会有并发的控制!对于数据库我们通常的做法是在每个表中增加一个version版本字段,事务修改数据之前先读出数据,当然版号也顺势读取出来,然后把这个读取出来的版本号加入到更新语句的条件中,比如,读取出来的版本号是1,我们修改数据的语句可以这样写,update 某某表 set 字段一=某某值 where id=1 and version=1,那如果更新失败了说明以后其他事务已经修改过数据了,那系统需要抛出异常给客户端,让客户端自行处理,客户端可以选择重试
事件监听器
ZooKeeper允许用户在指定节点上注册一些Watcher,当数据节点发生变化的时候,ZooKeeper服务器会把这个变化的通知发送给感兴趣的客户端
ACL是Access Control Lists 的简写, ZooKeeper采用ACL策略来进行权限控制,有以下权限:
CREATE:创建子节点的权限
READ:获取节点数据和子节点列表的权限
WRITE:更新节点数据的权限
DELETE:删除子节点的权限
ADMIN:设置节点ACL的权限
1. 准备Java运行环境,JDK
2.下载ZooKeeper安装包
①进入apache官网:
②按如下图操作
③按如下图操作
④按如下图操作
⑤按如下图操作
⑥按如下图操作、
⑦通过命令:cd /opt/ 进入到opt目录下,再通过
wget
下载到该目录下,如下图
⑧通过命令 tar -zxvf zookeeper-3.4.10.tar.gz 命令解压zookeeper-3.4.10.tar.gz 压缩文件
再通过cp zookeeper-3.4.10 -C zookeeper 将解压后的zookeeper-3.4.10名称改zookeeper
如下图
3.配置文件zoo.cfg
⑨通过命令:cd zookeeper/conf 进入到zookeeper的配置文件所在的目录,会看到如下图的一个文件
通过命令 :cp zoo_sample.cfg zoo.cfg 将zoo_sample.cfg文件复制一份,如下图
再通过命令:vim zoo.cfg 打开刚复制的文件,编辑里面的内容如下图,之后保存退出
⑩通过命令 scp zoo.cfg root@192.168.111.130:/opt/zookeeper/conf/
scp zoo.cfg root@192.168.111.130:/opt/zookeeper/conf/
将修改好的配置文件复制到其余两台服务器相同的目录下(复制过程中需要输入root用户的密码)
4.创建myid
再通过命令 mkdir /var/zookeeper -p 创建在上面配置的存放数据的目录
切换到这个目录(cd /var/zookeeper),再通过命令 vim myid 创建并打开myid文件,在第一行输入1,保存退出,如下图
5.配置其他机器
再打开其余两台服务器,重复刚才创建目录(mkdir /var/zookeeper -p,vim myid)的操作,
里面分别输入2和3,保存退出。到这里整个zookeeper集群的配置就完成了
6.启动服务器
①通过命令 cd /opt/zookeeper/bin 切换到zookeeper服务的bin目录,如下图
②通过命令 ./zkServer.sh start 启动 第一台服务器,再通过同样的命令启动其余一台或两台服务器
②通过命令 yum install telnet 安装telnet 软件,其余两台服务器执行同样的操作
③通过命令 telnet 192.168.111.129 2181 连接第一台服务器
再通过命令 stat 查看状态如下图,是follower服务器
④ 通过命令 telnet 192.168.111.130 2181连接第一台服务器
再通过命令 stat 查看状态如下图,是leader服务器
⑤如果这期间有无法连接主机的异常
需要通过命令chkconfig iptables off 关闭linux 操作系统的防火墙,其余两台服务器执行同样的操作,重启三台读取器,重启zookeeper服务,就会正常
跟集群模式的配置基本一致,zoo.cfg稍有区别
跟集群模式的配置基本一致,zoo.cfg稍有区别
全部0条评论
快来发表一下你的评论吧 !