本文源码:GitHub·点这里 || GitEE·点这里

一、框架简介

1、基础简介

Zookeeper基于观察者模式设计的组件,主要应用于分布式系统架构中的,统一命名服务、统一配置管理、统一集群管理、服务器节点动态上下线、软负载均衡等场景。

2、集群选举

Zookeeper集群基于半数机制,集群中半数以上机器存活,集群处于可用状态。所以建议Zookeeper集群安装为奇数台服务器。在集群的配置文件中并没有指定Master和Slave。在Zookeeper工作时,是有一个节点为Leader,其他则为Follower,Leader是通过内部的选举机制临时产生的。

基本描述

假设有三台服务器组成的Zookeeper集群,每个节点的myid编号依次1-3,依次启动服务器,会发现server2被选择为Leader节点。

server1启动,执行一次选举。服务器1投自己一票。此时服务器1票数一票,未达到半数以上(2票),选举无法完成,服务器1状态保持为LOOKING;

server2启动,再执行一次选举。服务器1和2分别投自己一票,并交换选票信息,因为服务器2的myid比服务器1的myid大,服务器1会更改选票为投服务器2。此时服务器1票数0票,服务器2票数2票,达到半数以上,选举完成,服务器1状态为follower,2状态保持leader,此时集群可用,服务器3启动后直接为follower。

二、集群配置

1、创建配置目录

# mkdir -p /data/zookeeper/data
# mkdir -p /data/zookeeper/logs

2、基础配置

# vim /opt/zookeeper-3.4.14/conf/zoo.cfg

tickTime=2000
initLimit=10
syncLimit=5
dataDir=/data/zookeeper/data
dataLogDir=/data/zookeeper/logs
clientPort=2181

3、单节点配置

# vim /data/zookeeper/data/myid

三个节点服务,分别在myid文件中写入[1,2,3]

4、集群服务

在每个服务的zoo.cfg配置文件中写入如下配置:

server.1=192.168.72.133:2888:3888
server.2=192.168.72.136:2888:3888
server.3=192.168.72.137:2888:3888

5、启动集群

分别启动三台zookeeper服务

[zookeeper-3.4.14]# bin/zkServer.sh start
Starting zookeeper ... STARTED

6、查看集群状态

Mode: leader是Master节点

Mode: follower是Slave节点

[zookeeper-3.4.14]# bin/zkServer.sh status
Mode: leader

7、集群状态测试

随便登录一台服务的客户端,创建一个测试节点,然后在其他服务上查看。

[zookeeper-3.4.14 bin]# ./zkCli.sh
[zk: 0] create /node-test01 node-test01
Created /node-test01
[zk: 1] get /node-test01

或者关闭leader节点

[zookeeper-3.4.14 bin]# ./zkServer.sh stop

则会重新选举该节点。

8、Nginx统一管理

[rnginx-1.15.2 conf]# vim nginx.conf

stream {
upstream zkcluster {
server 192.168.72.133:2181;
server 192.168.72.136:2181;
server 192.168.72.136:2181;
}
server {
listen 2181;
proxy_pass zkcluster;
}
}

三、服务节点监听

1、基本原理

分布式系统中,主节点可以有多台,可以动态上下线,任意一台客户端都能实时感知到主节点服务器的上下线。

流程描述:

  • 启动Zookeeper集群服务;
  • RegisterServer模拟服务端注册;
  • ClientServer模拟客户端监听;
  • 启动服务端注册三次,注册不同节点的zk-node服务;
  • 依次关闭注册的服务端,模拟服务下线流程;
  • 查看客户端日志,可以监控到服务节点变化;

首先创建一个节点:serverList,用来存放服务器列表。

[zk: 0] create /serverList "serverList"

2、服务端注册

package com.zkper.cluster.monitor;
import java.io.IOException;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.ZooDefs.Ids; public class RegisterServer { private ZooKeeper zk ;
private static final String connectString = "127.0.0.133:2181,127.0.0.136:2181,127.0.0.137:2181";
private static final int sessionTimeout = 3000;
private static final String parentNode = "/serverList"; private void getConnect() throws IOException{
zk = new ZooKeeper(connectString, sessionTimeout, new Watcher() {
@Override
public void process(WatchedEvent event) {
}
});
} private void registerServer(String nodeName) throws Exception{
String create = zk.create(parentNode + "/server", nodeName.getBytes(),
Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);
System.out.println(nodeName +" 上线:"+ create);
} private void working() throws Exception{ Thread.sleep(Long.MAX_VALUE);
} public static void main(String[] args) throws Exception {
RegisterServer server = new RegisterServer();
server.getConnect();
// 分别启动三次服务,注册不同节点,再一次关闭不同服务端看客户端效果
// server.registerServer("zk-node-133");
// server.registerServer("zk-node-136");
server.registerServer("zk-node-137");
server.working();
}
}

3、客户端监听

package com.zkper.cluster.monitor;
import org.apache.zookeeper.*;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List; public class ClientServer {
private ZooKeeper zk ;
private static final String connectString = "127.0.0.133:2181,127.0.0.136:2181,127.0.0.137:2181";
private static final int sessionTimeout = 3000;
private static final String parentNode = "/serverList"; private void getConnect() throws IOException {
zk = new ZooKeeper(connectString, sessionTimeout, new Watcher() {
@Override
public void process(WatchedEvent event) {
try {
// 监听在线的服务列表
getServerList();
} catch (Exception e) {
e.printStackTrace();
}
}
});
} private void getServerList() throws Exception {
List<String> children = zk.getChildren(parentNode, true);
List<String> servers = new ArrayList<>();
for (String child : children) {
byte[] data = zk.getData(parentNode + "/" + child, false, null);
servers.add(new String(data));
}
System.out.println("当前服务列表:"+servers);
} private void working() throws Exception{
Thread.sleep(Long.MAX_VALUE);
} public static void main(String[] args) throws Exception {
ClientServer client = new ClientServer();
client.getConnect();
client.getServerList();
client.working();
} }

四、源代码地址

GitHub·地址
https://github.com/cicadasmile/data-manage-parent
GitEE·地址
https://gitee.com/cicadasmile/data-manage-parent

推荐阅读:数据和架构管理

序号 标题
A01 数据源管理:主从库动态路由,AOP模式读写分离
A02 数据源管理:基于JDBC模式,适配和管理动态数据源
A03 数据源管理:动态权限校验,表结构和数据迁移流程
A04 数据源管理:关系型分库分表,列式库分布式计算
A05 数据源管理:PostGreSQL环境整合,JSON类型应用
A06 数据源管理:基于DataX组件,同步数据和源码分析
C01 架构基础:单服务.集群.分布式,基本区别和联系
C02 架构设计:分布式业务系统中,全局ID生成策略

架构设计 | 分布式系统调度,Zookeeper集群化管理的更多相关文章

  1. 分布式架构中一致性解决方案——Zookeeper集群搭建

    当我们的项目在不知不觉中做大了之后,各种问题就出来了,真jb头疼,比如性能,业务系统的并行计算的一致性协调问题,比如分布式架构的事务问题, 我们需要多台机器共同commit事务,经典的案例当然是银行转 ...

  2. 第5章 选举模式和ZooKeeper的集群安装 5-2 单机伪分布式安装zookeeper集群

    先搭建伪分布式集群,再去搭建真分布式集群.有些的人的电脑内存.性能比较低,所以在搭建真实的一个分布式环境的话,可能会相对来说比较卡,所以两种都会做一下,首先会在单机上搭建一个集群.单机上的集群主要就是 ...

  3. 数据源管理 | OLAP查询引擎,ClickHouse集群化管理

    本文源码:GitHub·点这里 || GitEE·点这里 一.列式库简介 ClickHouse是俄罗斯的Yandex公司于2016年开源的列式存储数据库(DBMS),主要用于OLAP在线分析处理查询, ...

  4. zookeeper集群的安装和配置

    Zookeeper的目的是封装好复杂易出错的关键服务,将简单易用的接口和性能高效.功能稳定的系统提供给用户.Zookeeper有两种运行模式,单机模式(Standalone)和集群模式(Distrib ...

  5. 在zookeeper集群的基础上,搭建伪solrCloud集群

    伪集群的搭建:将solrCloud搭建到同一台机器上. 准备工作 1 将在window中部署的单机版solr上传到服务器(虚拟机)中 solr的简单部署:在tomcat中启动slor 的内容 这一次放 ...

  6. 分布式架构高可用架构篇_02_activemq高可用集群(zookeeper+leveldb)安装、配置、高可用测试

    参考: 龙果学院http://www.roncoo.com/share.html?hamc=hLPG8QsaaWVOl2Z76wpJHp3JBbZZF%2Bywm5vEfPp9LbLkAjAnB%2B ...

  7. 分布式架构高可用架构篇_activemq高可用集群(zookeeper+leveldb)安装、配置、高可用测试

    原文:http://www.iteye.com/topic/1145651 从 ActiveMQ 5.9 开始,ActiveMQ 的集群实现方式取消了传统的Master-Slave 方式,增加了基于Z ...

  8. java架构之路-(分布式zookeeper)zookeeper集群配置和选举机制详解

    上次博客我们说了一下zookeeper的配置文件,以及命令的使用https://www.cnblogs.com/cxiaocai/p/11597465.html.我们这次来说一下我们的zookeepe ...

  9. 分布式协调服务Zookeeper集群之ACL篇

    分布式协调服务Zookeeper集群之ACL篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.zookeeper ACL相关知识概览 1>.zookeeper官方文档(h ...

随机推荐

  1. Unity 游戏框架搭建 2019 (二十九) 方法所在类命名问题诞生的原因

    我们在整理阶段解决了一些意外的问题.但是这些问题仅仅只是被解决而已,我们并没有去思考过这些问题是为什么产生的?以及在以后我们如何去避免这些问题的产生? 方法所在类的命名问题,最后我们通过方法分类解决了 ...

  2. Linux学习笔记(三)目录和文件都能操作的命令

    目录和文件都能操作的命令 rm cp mv rm 英文原意:remove files or directories 功能:删除文件或目录 语法:rm 选项[-fir] 文件或目录 rm -f 强制删除 ...

  3. React Hooks: useCallback理解

    useCallback把匿名回调“存”起来 避免在component render时候声明匿名方法,因为这些匿名方法会被反复重新声明而无法被多次利用,然后容易造成component反复不必要的渲染. ...

  4. 用long类型让我出了次生产事故,写代码还是要小心点

    昨天发现线上试跑期的一个程序挂了,平时都跑的好好的,查了下日志是因为昨天运营跑了一家美妆top级淘品牌店,会员量近千万,一下子就把128G的内存给爆了,当时并行跑了二个任务,没辙先速写一段代码限流,后 ...

  5. jquery动态live绑定toggle事件

    $(".btn").live("click",function(){ $(this).toggle( function () { //事件 1 console. ...

  6. 关于go的入门书籍——go自学的序

    说实话,许世伟的<GO语言编程>,承载的心血是轻易可见的.但是我更喜欢那种工具书,就是简单说明他干嘛她干嘛,就能干嘛干嘛··· 比如读张晏关于<取代Apache的高性能Web服务器& ...

  7. 在项目中部署redis的读写分离架构(包含节点间认证口令)

    #### 在项目中部署redis的读写分离架构(包含节点间认证口令) ##### 1.配置过程 ---  1.此前就是已经将redis在系统中已经安装好了,redis utils目录下,有个redis ...

  8. Vue3.0新版API之composition-api入坑指南

    关于VUE3.0 由于vue3.0语法跟vue2.x的语法几乎是完全兼容的,本文主要介绍了如何使用composition-api,主要分以下几个方面来讲 使用vite体验vue3.0 composit ...

  9. 理解分布式一致性:Paxos协议之Cheap Paxos & Fast Paxos

    理解分布式一致性:Paxos协议之Cheap Paxos & Fast Paxos Cheap Paxos Message flow: Cheap Multi-Paxos Fast Paxos ...

  10. 解决从dockerhub上下载debian:jessie失败

    解决从dockerhub上下载debian:jessie失败 笔者使用docker build 构建镜像出现下面的错误 Step 1/12 : FROM debian:jessie Get https ...