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

一、框架简介

1、基础简介

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

  • Linux下Zookeeper单节点安装
  • SpringBoot整合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.cfgtickTime=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.confstream {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() {@Overridepublic 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() {@Overridepublic 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_架构设计 | 分布式系统调度,Zookeeper集群化管理

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

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

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

  3. 架构设计之「数据库集群方案」

    在之前的文章中,我们知道数据库服务可能已经成为了很多系统的性能关键点,甚至是瓶颈了.也给大家介绍了数据库服务器从主备架构.到主从架构.再到主主架构的基础方案.但如果单台机器已经不能满足完整业务数据存储 ...

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

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

  5. 架构设计 | 分布式体系下,服务分层监控策略

    本文源码:GitHub·点这里 || GitEE·点这里 一.分布式故障 分布式系统的架构,业务开发,这些在良好的思路和设计文档规范之下,是相对来说好处理的,这里的相对是指比较分布式架构下生产环境的突 ...

  6. 架构设计 | 分布式事务①概念简介和基础理论

    本文源码:GitHub·点这里 || GitEE·点这里 一.分布式事务简介 1.转账经典案例 跨地区和机构的转账的业务在实际生活中非常常见,基础流程如下: 账户01通过一系列服务和支付的流程,把钱转 ...

  7. 架构设计基础:单服务.集群.分布式,基本区别和联系

    一.分布式简介 1.架构简介 现在的互联网,几乎常见的复杂系统都会使用分布式架构,如果在不清楚概念之前,刚接触分布式架构这个名词会感觉十分的高大上,其实在对比单服务,集群服务之后,你就会发现本质上都是 ...

  8. MySQL主从架构、读写分离、集群相关面试问题

    文章目录 一.MySQL主从同步原理 二.MySQL主从集群面试相关问题 1.全库同步与部分同步 2.GTID同步集群 3.集群扩容与MySQL数据迁移 4.理解半同步复制 5.主从集群与读写分离 6 ...

  9. Rancher集群化docker管理平台部署、特性及破坏性测试。

    http://8941355.blog.51cto.com/8931355/1712683 rancher是一个docker集群化管理平台,相对于mesos和k8s架构,rancher的部署管理非常简 ...

最新文章

  1. Linux 下 LaTeX 2018 安装与使用
  2. Android系统架构图及简单的系统架构介绍
  3. 数据结构与算法:终于可以用三种语言(C,C#,JavaScript)把图的广度优先遍历讲清楚了(推荐收藏)
  4. LeetCode 2135. 统计追加字母可以获得的单词数(位运算+哈希)
  5. 谷歌不修用户泪流:已遭利用且影响所有安卓版本的严重 0day 漏洞 StrandHogg 详情遭曝光...
  6. 5.剑指Offer --- 优化时间和空间效率
  7. PADS 设置挖空区域,为板子做固定孔,再设置禁止区域,铺铜之前必做的一步...
  8. 论文笔记-深度估计(4) Semi-Supervised Deep Learning for Monocular Depth Map Prediction
  9. 软件开发费用评估 功能点估算法
  10. 谷歌浏览器安装失败,解决办法
  11. CentOS 7 - Securing OpenSSH(一)
  12. 前端-鼠标经过后图标变色
  13. 网络模型(ISO,TCP/IP)
  14. xxl-job源码解读:调度器schedule
  15. 理解MVC、MVP、MVVM在干什么,进化的原因。
  16. SSH的 The authenticity of host xxx.xxx.xxx.xxx can't be established. 问题
  17. 【小程序】之net::ERR_NAME_NOT_RESOLVED的问题
  18. 大专学历销售转行,从三线的4K走到一线20K+,我对自己很满意
  19. NOIP 2012 国王游戏
  20. 操作系统之生产者与消费者

热门文章

  1. java导出数据到excel模板_springboot+jxls 根据Excel模板 填写数据并导出
  2. TNN 量化_加量化港美股打新群!
  3. Linux系统编程10:进程入门之系统编程中最重要的概念之进程进程的相关操作使用fork创建进程
  4. ar - 创建静态库.a文件
  5. linux addr2line
  6. Linux 下的Core Dump
  7. 利用PowerShell Empire实现Word文档DDE攻击控制(简单没啥用)
  8. centos 修改开机画面
  9. golang的panic用法
  10. python twisted教程一,异步编程