分布式协调工具-ZooKeeper实现动态负载均衡

什么是Zookeeper

Zookeeper是一个分布式开源框架,分布式协调工具,是java编写的开源框架,提供了协调分布式应用的基本服务,它向外部应用暴露一组通用服务——分布式同步(Distributed Synchronization)、命名服务(Naming Service)、集群维护(Group Maintenance)等,简化分布式应用协调及其管理的难度,提供高性能的分布式服务。ZooKeeper本身可以以单机模式安装运行,不过它的长处在于通过分布式ZooKeeper集群(一个Leader,多个Follower),基于一定的策略来保证ZooKeeper集群的稳定性和可用性,从而实现分布式应用的可靠性。

1、Zookeeper是为别的分布式程序服务的

2、Zookeeper本身就是一个分布式程序(只要有半数以上节点存活,zk就能正常服务)

3、Zookeeper所提供的服务涵盖:主从协调、服务器节点动态上下线、统一配置管理、分布式共享锁、统> 一名称服务等

4、虽然说可以提供各种服务,但是zookeeper在底层其实只提供了两个功能:管理(存储,读取)用户程序提交的数据(类似namenode中存放的metadata); 并为用户程序提供数据节点监听服务;

简而言之,zookeeper的应用场景,包括一些常见的分布式解决方案:

1:命名服务(注册中心)

2:分布式配置中心,例如springcloud自带的配置中心,springcloud config,可以动态管理配置文件信息,无需重启服务器进行重新读取。

3:消息中间件,事件通知(类似于发布订阅功能)

4:可以解决分布式事务

5:实现分布式锁,

5:实现选举策略

7:实现本地动态负载均衡,在Dubbo中实现

8:消息中间件集群管理。

Zookeeper特性

1、Zookeeper:一个leader,多个follower组成的集群

2、全局数据一致:每个server保存一份相同的数据副本,client无论连接到哪个server,数据都是一致的

3、分布式读写,更新请求转发,由leader实施

4、更新请求顺序进行,来自同一个client的更新请求按其发送顺序依次执行

5、数据更新原子性,一次数据更新要么成功,要么失败

6、实时性,在一定时间范围内,client能读到最新数据

Zookeeper数据结构

1、层次化的目录结构,命名符合常规文件系统规范(类似文件系统) 

2、每个节点在zookeeper中叫做znode,并且其有一个唯一的路径标识 

3、节点Znode可以包含数据和子节点(但是EPHEMERAL类型的节点不能有子节点)

节点类型 
a、Znode有两种类型:

短暂(ephemeral)客户端断开连接zk删除ephemeral类型节点) 
持久(persistent) 客户端断开连接zk不删除persistent类型节点)

b、Znode有四种形式的目录节点(默认是persistent )

PERSISTENT 
PERSISTENT_SEQUENTIAL
EPHEMERAL 
EPHEMERAL_SEQUENTIAL

Zookeeper windows环境安装

1,需要JDK环境

2,安装目录不能有中文路径。安装Zookeeper. 在官网http://zookeeper.apache.org/下载zookeeper.下载的是zookeeper-3.4.6版本。

Java操作Zookeeper

Zookeeper说明

创建节点(znode) 方法:

create:
提供了两套创建节点的方法,同步和异步创建节点方式。
同步方式:
参数1,节点路径《名称) : InodeName (不允许递归创建节点,也就是说在父节点不存在
的情况下,不允许创建子节点)
参数2,节点内容: 要求类型是字节数组(也就是说,不支持序列化方式,如果需要实现序
列化,可使用java相关序列化框架,如Hessian、Kryo框架)
参數3,节点权限: 使用Ids.OPEN_ACL_UNSAFE开放权限即可。(这个参数一般在权展
没有太高要求的场景下,没必要关注)
参数4,节点类型: 创建节点的类型: CreateMode,提供四种首点象型

PERSISTENT                   持久化节点

PERSISTENT_SEQUENTIAL        顺序自动编号持久化节点,这种节点会根据当前已存在的节点数自动加 1

EPHEMERAL                    临时节点, 客户端session超时这类节点就会被自动删除

EPHEMERAL_SEQUENTIAL         临时自动编号节点

Maven依赖信息

<dependency>
			<groupId>org.apache.zookeeper</groupId>
			<artifactId>zookeeper</artifactId>
			<version>3.4.6</version>
		</dependency>

  

public class Test001 {

    // 连接地址
    private static final String ADDRES = "127.0.0.1:2181";
    // 连接地址
    private static final int SESSIN_TIME_OUT = 2000;
    private static final CountDownLatch countDownLatch = new CountDownLatch(1);

    public static void main(String[] args) throws IOException, KeeperException, InterruptedException {
        ZooKeeper zooKeeper = new ZooKeeper(ADDRES, SESSIN_TIME_OUT, new Watcher() {

            public void process(WatchedEvent event) {
                // 获取事件状态
                KeeperState keeperState = event.getState();
                // 获取事件类型
                EventType eventType = event.getType();

                if (KeeperState.SyncConnected == keeperState) {
                    if (EventType.None == eventType) {
                        countDownLatch.countDown();
                        System.out.println("开启连接............");
                    }
                }
            }
        });
        countDownLatch.await();
        // 创建节点
        String result = zooKeeper.create("/itmayiedu_b", "itmayiedu_a".getBytes(), Ids.OPEN_ACL_UNSAFE,
                CreateMode.EPHEMERAL);
        System.out.println("result:" + result);
        Thread.sleep(1000 * 10);
        zooKeeper.close();
    }

}

使用Zookeeper实现负载均衡原理

使用Zookeeper实现负载均衡原理,服务器端将启动的服务注册到,zk注册中心上,采用临时节点。客户端从zk节点上获取最新服务节点信息,本地使用负载均衡算法,随机分配服务器。

猜你喜欢

转载自www.cnblogs.com/andydong/p/10222253.html