zookeeper

1、windows下可以使用该命令进行解压

        tar zxvf .\apache-zookeeper-3.8.3-bin.tar.gz  

2、zookeeper 主要是通过节点特性与watcher机制 来提供多种应用解决方案(后边会有讲解)

        分布式锁

        Master枚举

        与dubbo配合 动态感知服务上下线以及负载均衡

        注意:节点有持久节点  临时节点  有序节点  3.5.3之后新加容器节点、TTL节点

                    同级节点具有唯一性,临时节点与创建客户端的的生命周期一致

3、配置

         数据储存位置以及日志输出位置

        dataDir=../data

        dataLogDir=../log

        环境变量

        新建 ZOOKEEPER_HOME 同时在path中添加%ZOOKEEPER_HOME%\bin

 4、问题 :端口被占用

        找到被占用的端口号
        netstat -ano|findstr 8080

        找到具体的是哪个程序占用
        tasklist|findstr "16460"

        杀死进程(可以从任务管理器的详细信息查看)

        taskkill /f /t /im "16460"


5、启动应用程序(springcloud + zookeeper + dubbo)
            报错一、java.net.ConnectException: Connection refused: no further information

            原因:未启动zookeeper

            报错二、No provider available for the servic  xxx 9090

            原因:provider 服务注解必须使用dubbo的@Service

            报错三、登录访问地址后跳转到登录页面

            原因:有可能你配置了spring的security

6、zookeeper的数据结构

        ZooKeeper的数据模型和分布式文件系统类似,是一种层次化的属性结构,如图4-2所示。和文件系统不同的是,ZooKeeper的数据是结构化存储的,并没有在物理上体现出文件和目录。
ZooKeeper树中的每个节点被称为Znode,Znode维护了一个stat状态信息,其中包含数据变化的时间和版本等。并且每个Znode可以设置一个value值,ZooKeeper并不用于通用的数据库或者大容量的对象存储,它只是管理和协调有关的数据,所以value的数据大小不建议设置得非常大,较大的数据会带来更大的网络开销。
ZooKeeper上的每个节点的数据都是允许读和写的,读表示获得指定Znode上的value数据,写表示修改指定Znode上的value数据,另外,节点的创建规则和文件系统创建规则类似,必须要按照层级创建。

7、zookeeper的特性

        ZooKeeper中的Znode 在被创建的时候,需要指定节点的类型,节点类型分为:
                持久化节点,节点的数据会持久化到磁盘。
                临时节点,节点的生命周期和创建该节点的客户端的生命周期保持一致,一旦该客户端的会话结束,则该客户端所创建的临时节点会被自动删除。
                有序节点,在创建的节点后面会增加一个递增的序列,该序列在同一级父节点之下是唯一的。需要注意的是,持久化节点或者临时节点也是可以设置为有序节点的,也就是持久化有序节点或者临时有序节点。
        在3.5.3版本之后,又增加了两种节点类型,分别是:
                容器节点,当容器节点下的最后一个子节点被删除时,容器节点就会被自动删除。
                TTL节点,针对持久化节点或者持久化有序节点,我们可以设置一个存活时间,如果在存活时间之内该节点没有任何修改并且没有任何子节点,它就会被自动删除。

8、watcher机制

        ZooKeeper提供了一种针对Znode的订阅/通知机制,在Znode节点状态发生变化时或者ZooKeeper 客户端连接状态发生变化时,会触发事件通知。这个机制在服务注册与发现中,针对服务调用者及时感知到服务提供者的变化提供了非常好的解决方案。
        在ZooKeeper提供的Java API中,提供了三种机制来针对Znode进行注册监听,分别是:
                getData(),用于获取指定节点的value信息,并且可以注册监听,当监听的节点进行创建、修改、删除操作时,会触发相应的事件通知。
                getChildren(),用于获取指定节点的所有子节点,并且允许注册监听,当监听节点的子节点进行创建、修改、删除操作时,触发相应的事件通知。
                exists(),用于判断指定节点是否存在,同样可以注册针对指定节点的监听,监听的时间类型和getData()相同。
        Watcher事件的触发都是一次性的,比如客户端通过getData('/node',true)注册监听,如果/node节点发生数据修改,那么该客户端会收到一个修改事件通知,但是/node再次发生变化时,客户端无法收到Watcher事件,为了解决这个问题,客户端必须在收到的事件回调中再次注册事件。

9、前面到一些应用场景,接下来具体聊聊分布式锁和Master选举

        在多线程中,要想操作共享变量,我们需要通过sychronized或者lock进行加锁机制来保证线程安全问题,但在多进程中要想操作共享变量,那就需要分布式锁来保证数据的安全性,而zookeeper的特性适合用作分布式锁(排他性)。下面是加锁和释放锁过程:

        获得锁的过程
                在获得排他锁时,所有客户端可以去ZooKeeper 服务器上/Exclusive_Locks 节点下创建一个临时节点/lock。ZooKeeper基于同级节点的唯一性,会保证所有客户端中只有一个客户端能创建成功,创建成功的客户端获得了排他锁,没有获得锁的客户端就需要通过Watcher机制监听/Exclusive_Locks 节点下子节点的变更事件,用于实时监听/lock节点的变化情况以做出反应。
        释放锁的过程
        在获得锁的过程中,我们定义的锁节点/lock为临时节点,那么在以下两种情况下会触发锁的释放。
         1)获得锁的客户端因为异常断开了和服务端的连接,基于临时节点的特性,/lock 节点会被自动删除。
        2)获得锁的客户端执行完业务逻辑之后,主动删除了创建的/lock节点。
当/lock节点被删除之后,ZooKeeper服务器会通知所有监听了/Exclusive_Locks子节点变化的客户端。这些客户端收到通知后,再次发起创建/lock节点的操作来获得排他锁。

        master选举

                首选呢zookeeper是有状态这与rocketMq中的nameServer正好相反

                同级目录下不能创建重复的节点,那多个节点同时去zookeeper服务器创建节点,那么只有一个会创建成功,那么创建成功的客户端所在的机器就是master。其他没有创建成功的节点注册watcher事件,如果当前master"挂了",也就是临时节点/master-election被删除了,那么其他客户端重新发起Master选举。

                利用临时有序节点的特性,来判断到底是哪个节点会成为下一个master。所有参与选举的客户端在zookeeper服务器的/master节点下创建一个临时有序节点,编号最小的节点表示master,后续的节点可以监听前一个节点的删除事件,用于触发重新选举。

    10、zookeeper与dubbo整合中的运用   

       当 Dubbo 服务启动时,会去 Zookeeper 服务器上的

/dubbo/com.xhy.dubbo.api.IHelloService/providers 目录下创建当前服务的URL,其中com.xhy.dubbo.api.IHelloService是发布服务的接口全路径名称,providers表示服务提供者的类型,dubbo://ip:port表示该服务发布的协议类型及访问地址。其中,URL是临时节点,其他皆为持久化节点。在这里使用临时节点的好处在于,如果注册该节点的服务器下线了,那么这个服务器的URL地址就会从ZooKeeper服务器上被移除。

        当Dubbo服务消费者启动时,会对/dubbo/com.xhy.dubbo.api.IHelloService/providers 节点下的子节点注册 Watcher监听,这样便可以感知到服务提供方节点的上下线变化,从而防止请求发送到已经下线的服务器造成访问失败。同时,服务消费者会在 dubbo/com.xhy.dubbo.api.IHelloService/consumers 下写入自己的URL,这样做的目的是可以在监控平台上看到某个Dubbo 服务正在被哪些服务调用。最重要的是,Dubbo 服务的消费者如果需要调用 IHelloService服务,那么它会先去/dubbo/com.xhy.dubbo.api.IHelloService/providers 路径下获得所有该服务的提供方URL列表,然后通过负载均衡算法计算出一个地址进行远程访问。

        同时,Dubbo还可以针对不同的情况来实现以下功能。
                1)基于临时节点的特性,当服务提供者宕机或者下线时,注册中心会自动删除该服务提供者的信息。
                2)注册中心重启时,Dubbo能够自动恢复注册数据及订阅请求。
                3)为了保证节点操作的安全性,ZooKeeper提供了ACL权限控制,在Dubbo中可以通过dubbo.registry.username/dubbo.registry.password 设置节点的验证信息。
                4)注册中心默认的根节点是/dubbo,如果需要针对不同环境设置不同的根节点,可以使用dubbo.registry.group 修改根节点名称。

以下是node节点属性(包括权限、元数据等)

            注:跟踪源码是解决问题的最有效也是最清晰的手段,可以了解原理和机制,有助于你在开发过程中,找到解决问题的灵感,以期运用到实际工作中

如有不对之处,请大家多多指教

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值