热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ZooKeeper相关整理

一.简介    ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop家族的重要一员。Hadoop及家族项目
一. 简介

        ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop家族的重要一员。Hadoop及家族项目的命名也特别有意思,Hadoop(大象)下包括:Hive(蜜蜂) ——数据仓库工具、Pig(小猪)——Hadoop客户端,类似于SQL的面向数据流的Pig Latin语言等等、顾名思义zookeeper是整个Hadoop动物园的管理员。

二.安装部署

      ZooKeeper是以Fast Paxos算法为基础的,解决了著名的算法-拜占庭将军问题(有兴趣的同学可以百度一下),zookeeper本身提供分布式协调管理服务,在项目系统中别的组件对其有很大的依赖性,因此本身需要特别稳定,zookeeper集群本身具有过半存活属性,只要挂掉的机器不超过整个集群的一半,剩下的机器组成的集群仍然能对外提供稳定的服务,因此本身zookeeper的部署都是集群模式的,并且部署的集群数量尽量要是奇数,因为偶数挂掉一半机器之后满足不了过半存活会形成集群脑裂。当然自己学习的时候也可以在自己电脑只装一个单机版,通常建议装单机版的伪集群模式,体验上是跟生产上的集群模式是一样的。下面说下实际Linux系统下集群模式的安装,按照最小满足zookeeper过半存活特性的最小奇数3台机器举例。

      1.检查java环境。因为zookeeper是java语言写的,因此首先需要搭建java环境,要注意不同版本的zookeeper对jdk的版本是有要求的。目前最稳定的                            zookeeper版本是3.4.6版本。

      2.将Apache官网下载的zookeeper包解压到服务器,类似目录  /home/zookeeper-3.4.6

      3.跳到zookeeper根目录下的conf文件下,将 zoo_sample.cfg文件重命名为zoo.cfg,  mv /home/zookeeper-3.4.6/conf/zoo_sample.cfg    zoo.cfg

      4.编辑zoo.cfg,此文件是zookeeper的配置文件,vi  zoo.cfg  修改或增加一下内容:

              dataDir=/home/zookeeper-3.4.6/data  (在zookeeper根目录下新建一个data文件夹)

              dataLogDir=/home/zookeeper-3.4.6/log  (在zookeeper根目录下新建一个log文件夹)

            server.1=1.2.3.4:2888:3888      (第一台机器的实际配置信息  ip:端口号 :端口号  两个端口号一个是集群间通信的  一个是自己机器的)

            server.2=1.2.3.5:2888:3888      (第二台)

            server.3=1.2.3.6:2888:3888        (第二台)

        这里要注意下server.1这个后缀,表示的是1.2.3.4这个机器,对应相关机器中的server id是1,不要忘记配置!!

      5.创建数据目录:mkdir /home/zookeeper-3.4.6/data

      6.在data目录下创建myid文件,写入当前机器的serverid ,分别写入1、2、3 。Windows下面就是新建一个txt写上数字后将.txt后缀去掉即可。Linux下 vi myid              填完数字 保存退出即可。

      7.启动zookeeper,开启动物管理员的上岗之路  /home/zookeeper-3.4.6/bin/zkServer.sh start    这里要多说一点,由于配置的是集群模式,因此需要到每台机器          上去启动zookeeper,假设在配置文件里配置了3台机器,在网络没问题的情况下,当最后一台机器启动起来之前,之前启动的每一台机器的控制台都会不停              的刷心跳日志,这是因为集群心跳检测集群中的机器是否都健在,第一次启动的时候可能会觉得奇怪,这个是正常的,只要之前每一步都正确配置,当                      集群中最后一台机器启动之后,所有的机器的控制台会停止刷新报错日志。

      8.检查是否成功运行  /home/zookeeper-3.4.3/bin/zkCli.sh 或 echo stat|nc localhost 2181 (会zookeeper四字命令的也可以用四字命令查看集群状态)

      9.其他 ——设置服务器自动启动服务 

        cd 命令切换到/etc/rc.d/init.d/ ,接着用touch zookeeper创建一个文件

        chmod +x zookeeper        vi zookeeper  (编写以下内容)

            #!/bin/bash

            #chkconfig:2345 20 90

            #description:zookeeper

            #processname:zookeeper

            case $1 in

            start) su root /home/zookeeper-3.4.6/bin/zkServer.sh start;;

            stop) su root /home/zookeeper-3.4.6/bin/zkServer.sh stop;;

            status) su root /home/zookeeper-3.4.6/bin/zkServer.sh status;;

            restart) su root /home/zookeeper-3.4.6/bin/zkServer.sh restart;;

            *)  echo “require start|stop|status|restart”  ;;

            esac

        chkconfig –add zookeeper命令把zookeeper添加到开机启动里面

        chkconfig –list 来看看我们添加的zookeeper是否在里面

      10.单机版的伪集群模式跟实际的集群模式类似,集群模式会了之后单机版的很简单,在自己电脑上这几个安装包里的端口号注意不要重复就行。

三.zookeeper其他、及运维说明

    1.zoo.cfg 配置文件中中 maxClientCnxns=100 ZK单个服务器的最大连接数设成0则不受连接数限制,其它还有很多参数的具体配置方法这里不具体说明了。

    2.清理DATA和log :从3.4.0开始,zookeeper提供了自动清理snapshot和事务日志的功能,通过配置autopurge.snapRetainCount和autopurge.purgeInterval这            两个参数能够实现定时清理了。这两个参数都是在zoo.cfg中配置的:

        autopurge.purgeInterval这个参数指定了清理频率,单位是小时,需要填写一个1或更大的整数,默认是0,表示不开启自动清理功能。

        autopurge.snapRetainCount这个参数和上面的参数搭配使用,这个参数指定了需要保留的文件数目。默认是保留3个。

    3.ZK节点添加权限,zookeeper是一个路径形式的层级目录结构,每一个具体路径下都有一个zk节点,只可以可以存储几兆数据,因此不能用                                        zookeeper来当存储,节点上的数据量多了之后也会影响其性能。zk节点可以针对每个节点设置权限,并且节点权限不是继承的,设置父节点权限,其子节点          不继承父节点的权限。对zk节点上的数据有安全要求的系统可以添加权限。

        zookeeper提供了几种认证方式:(1) world :  有单一ID,anyone表示任何人

                                                            (2) auth  : 不使用任何ID,表示任何通过验证的用户

                                                            (3)digest :  使用户名 密码 字符串生成MD5哈希值作为ACL标识符ID.权限的验证通过直接发送用户名和密码字符串方式                                                                                          完成

                                                              (4)  ip      : 使用客户端主机ip地址作为一个ACL标识符,ACL表达式是以add/bits这种格式表示的。ZK服务器会将addr的                                                                                      前bits位与客户端地址的前bits位来进行匹配验证权限。

        添加权限的代码示例:

                      List acls =newArrayList(2);

                      Id id1 =newId(“digest”, DigestAuthenticationProvider.generateDigest(“admin:admin123”));

                      ACL acl1 =newACL(ZooDefs.Perms.ALL, id1);

                      Id id2 =newId(“digest”, DigestAuthenticationProvider.generateDigest(“guest:guest123”));

                      ACL acl2 =newACL(ZooDefs.Perms.READ, id2);

                      acls.add(acl1);

                      acls.add(acl2);

                      ZooKeeper zk =newZooKeeper(“127.0.0.1:2181”,10000,newDefaultWatcher());

                      zk.create(“/test”,newbyte[0], acls, CreateMode.PERSISTENT);

        登录Zookeeper读取节点数据时:

                    ZooKeeper zk =newZooKeeper(“127.0.0.1:2181”,10000,newDefaultWatcher());

                    zk.addAuthInfo(“digest”,”guest:guest123″.getBytes());

                    byte[] value = zk.getData(“/test”,null,newStat());

            4.zookeeper运维四字命令相关,可以方便快速的查询和排查问题。

《ZooKeeper相关整理》

        5.实际开发中感觉zookeeper原生的api客户端不够完善,实现一些功能需要自己敲大量代码,而且容易出现一些问题。这里给大家推荐——Curator。Curator是            Netflix公司开源的一个Zookeeper客户端,与Zookeeper提供的原生客户端相比,Curator的抽象层次更高,简化了Zookeeper客户端的开发量。

四.Zookeeper典型8大应用场景及对应特性:

      1.数据发布订阅:对统一配置信息数据可以通过zookeeper创建一个数据节点并让客户端进行监听,主要利用了zookeeper的watcher监听特性。

      2.负载均衡:创建一个节点,负载应用把自己的服务器地址写到此节点下,如果此应用挂掉,此节点消失,这里也可以用于实现fail over(故障切换)。

      3.命名服务:利用zookeeper创建顺序无重复节点的特性。这里多说一点,zk节点分为两大类:永久节点和临时节点,然后各自又有有序和无序节点,以此也可                              以说zk节点一共有四种。

      4.分布式协调/通知:不同的客户端都对zookeeper上的同一数据节点进行watcher注册,监听数据节点的变化,当发生变化时,所有订阅的客户端都会收到通知                                          并进行处理,这里利用的watcher监听特性。

      5.集群管理:利用watcher监听与临时节点在会话失效后自动清除的特性。同时,各服务器可以将自己的运行状态信息写入到自己机器对应的临时节点中,进而                              有助于Leader收集机器信息,可以用来管理集群机器的整体配置、负载、切换等。

      6.Master选举:所有的客户端创建同一个path的数据节点,只有一个能成功,即为Master。原理同实现分布式锁。

      7.分布式锁:创建临时节点,由于相同名称的节点只能创建一个,谁成功即获得锁。另外,根据创建时不同的类型—序号,根据一定的规则可以模拟出共享锁,                            读写锁。

      8.分布式队列:每个客户端在指定节点下创建临时节点,然后获取该指定节点下的所有子节点并判断自己是否是序号最小的节点,若果是则可以进行处理,如果                                不是则进行等待并监听比自己序号小的最后一个节点,待接到最后一个最小序号消失的watcher通知后,重复检查。

现在由于zookeeper自身的完善及优秀的特性,很多其他的中间件或者系统都在自身的集群模式下的集群管理都将zookeeper集成到自身中,作为自身集群管理或者自身系统服务管理的重要基础组件,Apache Hbase和 Apache Solr 以及LinkedIn sensei 等项目中都采用到了 Zookeeper。


推荐阅读
  • 2021年Java开发实战:当前时间戳转换方法详解与实用网址推荐
    在当前的就业市场中,金九银十过后,金三银四也即将到来。本文将分享一些实用的面试技巧和题目,特别是针对正在寻找新工作机会的Java开发者。作者在准备字节跳动的面试过程中积累了丰富的经验,并成功获得了Offer。文中详细介绍了如何将当前时间戳进行转换的方法,并推荐了一些实用的在线资源,帮助读者更好地应对技术面试。 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • PHP自学必备:从零开始的准备工作与工具选择 ... [详细]
  • 全面解析JavaScript代码注释技巧与标准规范
    在Web前端开发中,JavaScript代码的可读性和维护性至关重要。本文将详细介绍如何有效地使用注释来提高代码的可读性,并探讨JavaScript代码注释的最佳实践和标准规范。通过合理的注释,开发者可以更好地理解和维护复杂的代码逻辑,提升团队协作效率。 ... [详细]
  • 帝国CMS中的信息归档功能详解及其重要性
    本文详细解析了帝国CMS中的信息归档功能,并探讨了其在内容管理中的重要性。通过归档功能,用户可以有效地管理和组织大量内容,提高网站的运行效率和用户体验。此外,文章还介绍了如何利用该功能进行数据备份和恢复,确保网站数据的安全性和完整性。 ... [详细]
  • 本文介绍了如何利用Struts1框架构建一个简易的四则运算计算器。通过采用DispatchAction来处理不同类型的计算请求,并使用动态Form来优化开发流程,确保代码的简洁性和可维护性。同时,系统提供了用户友好的错误提示,以增强用户体验。 ... [详细]
  • Hadoop平台警告解决:无法加载本机Hadoop库的全面应对方案
    本文探讨了在Hadoop平台上遇到“无法加载本机Hadoop库”警告的多种解决方案。首先,通过修改日志配置文件来忽略该警告,这一方法被证明是有效的。其次,尝试指定本地库的路径,但未能解决问题。接着,尝试不使用Hadoop本地库,同样没有效果。然后,通过替换现有的Hadoop本地库,成功解决了问题。最后,根据Hadoop的源代码自行编译本地库,也达到了预期的效果。以上方法适用于macOS系统。 ... [详细]
  • 为了在Hadoop 2.7.2中实现对Snappy压缩和解压功能的原生支持,本文详细介绍了如何重新编译Hadoop源代码,并优化其Native编译过程。通过这一优化,可以显著提升数据处理的效率和性能。此外,还探讨了编译过程中可能遇到的问题及其解决方案,为用户提供了一套完整的操作指南。 ... [详细]
  • 本文深入探讨了NoSQL数据库的四大主要类型:键值对存储、文档存储、列式存储和图数据库。NoSQL(Not Only SQL)是指一系列非关系型数据库系统,它们不依赖于固定模式的数据存储方式,能够灵活处理大规模、高并发的数据需求。键值对存储适用于简单的数据结构;文档存储支持复杂的数据对象;列式存储优化了大数据量的读写性能;而图数据库则擅长处理复杂的关系网络。每种类型的NoSQL数据库都有其独特的优势和应用场景,本文将详细分析它们的特点及应用实例。 ... [详细]
  • Swoole加密机制的安全性分析与破解可能性探讨
    本文深入分析了Swoole框架的加密机制,探讨了其在实际应用中的安全性,并评估了潜在的破解可能性。研究结果表明,尽管Swoole的加密算法在大多数情况下能够提供有效的安全保护,但在特定场景下仍存在被攻击的风险。文章还提出了一些改进措施,以增强系统的整体安全性。 ... [详细]
  • Amoeba 通过优化 MySQL 的读写分离功能显著提升了数据库性能。作为一款基于 MySQL 协议的代理工具,Amoeba 能够高效地处理应用程序的请求,并根据预设的规则将 SQL 请求智能地分配到不同的数据库实例,从而实现负载均衡和高可用性。该方案不仅提高了系统的并发处理能力,还有效减少了主数据库的负担,确保了数据的一致性和可靠性。 ... [详细]
  • 作为软件工程专业的学生,我深知课堂上教师讲解速度之快,很多时候需要课后自行消化和巩固。因此,撰写这篇Java Web开发入门教程,旨在帮助初学者更好地理解和掌握基础知识。通过详细记录学习过程,希望能为更多像我一样在基础方面还有待提升的学员提供有益的参考。 ... [详细]
  • 在Linux系统中,网络配置是至关重要的任务之一。本文详细解析了Firewalld和Netfilter机制,并探讨了iptables的应用。通过使用`ip addr show`命令来查看网卡IP地址(需要安装`iproute`包),当网卡未分配IP地址或处于关闭状态时,可以通过`ip link set`命令进行配置和激活。此外,文章还介绍了如何利用Firewalld和iptables实现网络流量控制和安全策略管理,为系统管理员提供了实用的操作指南。 ... [详细]
  • 本文深入探讨了如何利用Maven高效管理项目中的外部依赖库。通过介绍Maven的官方依赖搜索地址(),详细讲解了依赖库的添加、版本管理和冲突解决等关键操作。此外,还提供了实用的配置示例和最佳实践,帮助开发者优化项目构建流程,提高开发效率。 ... [详细]
  • Apache Hadoop HDFS QJournalProtocol 中 getJournalCTime 方法的应用与代码实例分析 ... [详细]
author-avatar
Gbom2402851125
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有