60.大数据之旅——电信日志项目03

zookeeper概述

在这里插入图片描述
官方网址:http://zookeeper.apache.org/
What is ZooKeeper?
ZooKeeper is a centralized service for maintaining configuration information, naming, providing distributed synchronization, and providing group services. All of these kinds of services are used in some form or another by distributed applications. Each time they are implemented there is a lot of work that goes into fixing the bugs and race conditions that are inevitable. Because of the difficulty of implementing these kinds of services, applications initially usually skimp on them ,which make them brittle in the presence of change and difficult to manage. Even when done correctly, different implementations of these services lead to management complexity when the applications are deployed.

Zookeeper是分布式服务框架。主要是用来解决分布式应用中常见的问题,如:集群中数据的一致性、统一命名服务、集群中机器节点的状态同步服务、集群管理、分布式应用配置项的管理等。

所以如果从功能角度上来看,Zookeeper不仅仅可以应用到Hadoop生态系统中,它可以应用到任何的集群环境里,起到分布式(集群)管理和协调服务。

Zookeeper是根据Google发表的一篇论文:《The Chubby lock service for loosely-coupled distributed systems》一种锁服务:Chubby lock,旨在服务于松耦合分布式系统。

分布式思想
利用多台机器并行执行同一个任务,每台机器上都有独立的程序模块及要处理的数据,即人多干活快的思想。但是,由于由原来的单一节点运算模式转变为分布式运算,所以,代码的编写、数据资源的分配策略都发生了改变,并且也引发了很多新的问题。

分布式编程、集群管理存在的难题
死锁。在分布式系统中,产生死锁的因素一般是由于系统提供的资源数比线程进程所需要的资源数少,并且系统的资源分配策略和线程并发执行速度不当引起的(互斥使用资源+占有资源且等待资源)。
活锁,活锁最大的隐患就是,进程或线程并不是blocked的,所以会导致cpu一直在调度线程工作,最后cpu资源耗尽。
线程间由于某些条件发生碰撞,导致重新执行,如果再次尝试后依然发生碰撞,再重新执行。碰撞—再执行—碰撞……如此循环往复,就产生了活锁。

单一实体的活锁
例如线程从队列中拿出一个任务来执行,如果任务执行失败,那么将任务重新加入队列,继续执行。假设任务总是执行失败,或者某种依赖的条件总是不满足,那么线程一直在繁忙却没有任何结果。

协同导致的活锁
生活中的典型例子: 两个人在窄路相遇,同时向一个方向避让,然后又向另一个方向避让,如此反复。
通信中也有类似的例子,多个用户共享信道(最简单的例子是大家都用对讲机),同一时刻只能有一方发送信息。发送信号的用户会进行冲突检测, 如果发生冲突,就选择避让,然后再发送。 假设避让算法不合理,就导致每次发送,都冲突,避让后再发送,还是冲突。
计算机中的例子:两个线程发生了某些条件的碰撞后重新执行,那么如果再次尝试后依然发生了碰撞,长此下去就有可能发生活锁。

集群管理,如何来监控集群里某个节点的状态,比如是正常运行还是宕机了。
集群环境下的协调通知,比如集群某一个机器有数据更新或其他状态变更,需要集群里其他的机器能够及时(实时),这个需要集群管理者做到协调通知
集群环境下的任务分配。如果是手动实现,思路是:先要知道集群里有哪些节点,即集群的总数量,然后还要判断哪些节点是可用节点(是空闲还是繁忙),如果是空闲节点,就发送数据,但是集群里节点的状态是不断变化的,所以还要想办法去实时监听。
集群环境下的负载均衡,在集群任务分配过程中,可能会导致任务分配不均的情况,比如把80%的任务都分给一台机器来处理,导致这台机器的cpu工作负荷很大。所以在做分布式编程时,也需要考虑到。
配置信息的管理。要达到的效果,更改一次信息,就能够让所有的机器都更新这个信息
分布式锁的实现。比如某台抢到了一个集群里的共享资源,那其他机器就不能在用这个资源,这就相当于在分布式环境下,跨机器的环境下,实现的锁效果。针对这种锁,我们叫分布式锁。但是针对分布式锁,用sychronized,重入锁实现不了。

Zookeeper要解决的问题
在分布式应用中,由于工程师不能很好地使用锁机制,以及基于消息的协调机制不适合在某些应用中使用,因此需要有一种可靠的、可扩展的、分布式的、可配置的协调机制来统一系统的状态。Zookeeper的目的就在于此。

Zookeeper的名字
动物园管理员
数据一致性:比如多台一级引擎,配置信息都必须一样

zookeeper单机模式安装配置


安装步骤:
0.关闭虚拟机的防火墙 ,执行:service iptables stop
1.准备虚拟机,安装并配置jdk,1.6以上
配置示例:
JAVA_HOME=/home/software/jdk1.8
CLASSPATH=.: J A V A H O M E / l i b / d t . j a r : JAVA_HOME/lib/dt.jar: JAVAHOME/lib/dt.jar:JAVA_HOME/lib/tools.jar
PATH= J A V A H O M E / b i n : JAVA_HOME/bin: JAVAHOME/bin:PATH
export JAVA_HOME PATH CLASSPATH

2.上传zookeeper的安装包 3.4.7版本
3.解压安装 tar -xvf …………
4.进入zookeeper安装目录下的conf目录,有一个zoosample.cfg的文件
复制一份,并重命名为zoo.cfg文件,这个名字固定写死,因为zookeeper启动会检查这个文件,根据这个配置文件里的信息来启动服务
5.进入bin目录
执行:./zkServer.sh start 启动zookeeper
6.进入zookeeper客户端,操作zookeeper
执行:./zkCli.sh
在这里插入图片描述

Linux操作+数据模型+节点介绍


在这里插入图片描述
1.每个节点称为znode节点
2.多个znode节点共同形成了一个znode树
3.每个znode节点都可以存储数据
4.每个znode节点都具有唯一性。基于这个特性,可以通过zookeeper做统一命名服务
5.znode树是维系在内存中,供用户快速查询
6.znode节点,4种。①create /park01 ② create -e /park01 ③ create -s /park01
④ create -e -s /park01
7.临时节点的特点:当创建此临时节点的客户端断开连接后,节点别删除
8.Zxid(事务id),是一个递增的id,事务Id越大,事务越新。选举时会用到。
9.选举id,如果Zxid比较不出来,谁大谁当Leader
10.客户端连接zokeeper服务的超时的阈值:下限:2ticktime 上限20ticktime
4000~40000

zookeeperAPI操作


同步方式
一、
连接zookeeper和创建节点数据代码:

public class ZkDemo {
   
 
public static void main(String[] args) throws Exception {
   
final CountDownLatch cdl =new CountDownLatch(1);
//第一个参数,连接的zookeeper节点ip,
//第二个参数,会话超时时间,以毫秒为单位。比如设置1000*30 是30秒。如果30秒内zookeeper没有收到客户端节点的心跳,则断开连接
//第三个参数,Watcher,观察者,当zookeeper里有事件发生时,会通知到这个process方法里
//需要注意,连接是异步的,当连接成功是,会回调process方法,我们需要做相应的处理
//此外,连接一个zookeeper连接地址也可以,因为zookeep会将数据同步至其他的zookeerper节点
ZooKeeper zk=new ZooKeeper("192.168.234.137:2181",30000,new Watcher(){
   
 
@Override
public void process(WatchedEvent event) {
   
if(event.getState()==KeeperState.SyncConnected){
   
//说明连接成功了
cdl.countDown();
}
 
}
 
});
//之所以用递减锁,因为:连接是非阻塞的,到底连接成功没,不知道。所以,用递减锁,把这个连接变成了阻塞式连接,当成功连接后,才走
//await()之后的代码
cdl.await();
//创建节点
//1.path 节点路径;2.data[] 节点数据;3.acl 权限策略,一般设为所用用户都可以操作这个节点,并且具有所有权限,所以选:Ids.OPEN_ACL_UNSAFE;
//4.createMode 创建模式:
//PERSISTENT 持久
//PERSISTENT_SEQUENTITAL 持久顺序
//EPHEMERAL 临时
//EPHEMERAL_SEQUENTITAL 临时顺序
zk.create("/node", "hello1604Zookeeper".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值