架构设计 | 分布式系统调度,Zookeeper集群化管理
一、框架简介
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.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
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Jindo SQL 性能优化之 RuntimeFilter Plus
作者:陆路,花名世仪,阿里巴巴计算平台事业部EMR团队高级开发工程师,大数据领域技术爱好者,对Spark、Hive等有浓厚兴趣和一定的了解,目前主要专注于EMR产品中开源计算引擎的优化工作。 背景介绍 TPC-DS 测试集采用星型和雪花型等多维数据模型,包含 7 张事实表和 17 张维度表,以 store channel 为例,事实表和维度表的关联关系如下所示: 分析 TPC-DS 全部 99 个查询语句不难发现,绝大部分语句的过滤条件都不是直接作用于事实表,而是通过过滤维度表并将结果集与事实表 join 来间接完成。因此,优化器很难直接利用事实表索引来减少数据扫描量。如何利用好查询执行时的维度表过滤信息,并将这些信息下推至存储层来完成事实表的过滤,对于性能提升至关重要。 在 2019 年的打榜测试中,我们基于 Spark SQL Cat
- 下一篇
开源 CI/CD 构建框架 TekTon 的深入剖析
简介 Tekton 是一个功能强大且灵活的Kubernetes 原生开源框架,用于创建持续集成和交付(CI/CD)系统。 关于Tekton, 网上可以搜到很多很多介绍文档,本文主要阐述我对Tekton的实现原理和背后的技术逻辑的一点理解。tekton.dev Tekton定义了Task, TaskRun, Pipeline, PipelineRun, PipelineResource 五类核心对象。Tekton通过对Task和Pipeline的抽象,我们可以定义出任意组合的pipeline模板来完成各种各样的CICD任务。通过TaskRun,PipelineRun,PipelineResource可以将这些模板套用到各个实际的项目中。 实现原理 高度抽象的结构化设计使得Tekton具有非常灵活的特性。那么Tekton是如何实现workflow的流转的呢。 Tekton利用Kubernetes的List-Watch机制,在启动时初始化了2个Controller, PipelineRunController和TaskRunController。 PipelineRunController监...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS7,8上快速安装Gitea,搭建Git服务器
- 设置Eclipse缩进为4个空格,增强代码规范
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- Mario游戏-低调大师作品
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- MySQL8.0.19开启GTID主从同步CentOS8