千峰老师的《大规模分布式系统架构与设计实战》的第三章讲的是分布式协调的实现,在工头-职介所-工人的模型中,分布式协调实际上就是职介所相关的一些内容,包括领导(职介所)怎么产生的,当前领导宕机了怎么办,领导如何管理各个员工(工人)等等一系列问题。
在fourinone中,选取领导并不像paxos算法一样实行基于抢占的少数服从多数的策略,而是一种谦让的策略,相当领导的人在发出当领导的申请之前先问问别人想不想当领导,如果想,他自己就先忍着,如果没有其他人他才出头。这样就避免了冲突。
当领导确定后,有领导统一发号施令,同步各个机器。
而领导又是如何同步各个机器的呢?fourinone框架通过park进行配置信息管理,park提供创建和修改信息的方法,并支持轮训和监听两种方式获取变化的对象,进步保持分布式系统的配置的一致性。
import com.fourinone.BeanContext;
import com.fourinone.ParkLocal;
import com.fourinone.ObjectBean;
public class GetConfigA
{
public static void main(String[] args)
{
ParkLocal pl=BeanContext.getPark();
ObjectBean oldob=null;
while(true)
{
ObjectBean newob=pl.getLastest("zhejiang","hangzhou",oldob);
if(newob!=null)
{
System.out.println(newob);
oldob=newob;
}
}
}
}
import com.fourinone.BeanContext;
import com.fourinone.ParkLocal;
import com.fourinone.LastestListener;
import com.fourinone.LastestEvent;
import com.fourinone.ObjectBean;
public class GetConfigB implements LastestListener
{
public boolean happenLastest(LastestEvent le)
{
ObjectBean ob = (ObjectBean)le.getSource();
System.out.println(ob);
return false;
}
public static void main(String[] args)
{
ParkLocal pl = BeanContext.getPark();
pl.addLastestListener("zhejiang", "hangzhou", null, new GetConfigB());
}
}
import com.fourinone.*;
public class SetConfig
{
public static void main(String[] args)
{
ParkLocal pl = BeanContext.getPark();
ObjectBean xihu = pl.create("zhejiang", "hangzhou", "xihu",AuthPolicy.OP_ALL);
try{Thread.sleep(8000);}catch(Exception e){}
ObjectBean yuhang = pl.update("zhejiang", "hangzhou","xihu");
}
}
可以看到,应用程序只需要在ParkLocal中做改动,其他的机器就会感知这种变化进而使整个分布式系统保持一致。
同时,fourinone又提供了处理宕机的情况:
import com.fourinone.BeanContext;
public class ParkMasterSlave
{
public static void main(String[] args)
{
String[][] master = new String[][]{{"localhost","1888"},{"localhost","1889"}};
String[][] slave = new String[][]{{"localhost","1889"},{"localhost","1888"}};
String[][] server = null;
if(args[0].equals("M"))
server = master;
else if(args[0].equals("S"))
server = slave;
BeanContext.startPark(server[0][0],Integer.parseInt(server[0][1]), server);
}
}
只需要启动一个领导和多个备用领导就可以了,当领导宕机就会有备用的领导顶上去。
分享到:
相关推荐
《大规模分布式系统架构与设计实战笔记8》是关于构建和优化大规模分布式系统的宝贵资源,它涵盖了从基础概念到实际操作的广泛知识。这篇博文通过一个名为`GenerateData.java`的源码示例,深入探讨了分布式系统的核心...
本项目实战教程涵盖了高并发、集群以及分布式系统架构等关键知识点,旨在帮助Java架构师提升技能,实现高性能、高可用和可扩展的电商系统。 1. **Java基础与高级特性** - Java的基础语法、面向对象编程、异常处理...
原来的PDF版有85M,过大。这个是epud版,只有6M,方便阅读和摘抄笔记。
本篇笔记将着重讨论分布式系统的概念、微服务架构的特点、分布式与微服务的关联,以及在Java环境下如何实践这一架构。 首先,分布式系统是由多个通过网络连接协同工作的计算机组成的系统,它们可以跨越多个物理位置...
etcd是一个基于Go语言构建的开源分布式键值存储系统,设计目标是为分布式系统提供强一致性的、高可用的配置共享和服务发现功能。它专注于提供可靠的分布式键值存储,使得在分布式环境中管理和共享关键数据变得简单。...
### Redis 3 分布式集群部署详解 #### 一、Redis 概述 Redis (Remote Dictionary Server) 是一...通过这种方式,不仅可以有效提升 Redis 的性能和可用性,还能满足大规模应用的需求。希望本文能为读者提供参考价值。
Go语言以其简洁的语法、高效的内存管理和强大的并发能力,特别适合构建高并发、高性能的分布式系统,如即时通讯系统。 在即时通讯系统中,主要涉及到以下几个关键技术点: 1. **并发处理**:Go语言的goroutine和...
总之,Kubernetes是现代云原生架构的重要组成部分,它提供了强大的容器编排能力,帮助开发者和运维人员更高效地管理大规模分布式应用。通过深入学习和实践提供的资料,你将能够掌握这一关键技术,并在实际工作中发挥...
在IT行业中,数据库管理系统起着至关重要的作用,而Doris是一款高性能、分布式的数据仓库系统,专为在线分析处理(OLAP)设计。本篇将深入探讨Doris实战中的"BE"部分,以及与之相关的依赖包,特别是C++编程语言在...
标题中的“项目讲义 SaaS平台.rar”表明这是一个关于SaaS(Software as a Service)平台的项目学习资料,其中可能涵盖了构建和管理SaaS...通过深入学习和实践,可以提升在构建大规模分布式系统和SaaS平台方面的技能。
3. **生态系统架构** - **Pig**:一种高级语言,用于简化MapReduce任务的编写过程。 - **Hive**:一种数据仓库工具,提供类似SQL的查询语言来访问Hadoop数据。 - **HBase**:一种分布式的、面向列的数据库系统。 ...
【Dubbo入门到精通架构高级课程】是一门深入解析Dubbo框架...通过这个全面的课程,无论你是初涉分布式系统的开发者还是寻求提升的Java工程师,都将能够熟练掌握Dubbo的使用,并具备构建和维护大规模分布式服务的能力。
Hadoop是一个开源框架,专为分布式存储和处理大规模数据集而设计。这个开发笔记可能深入探讨了Hadoop的核心组件,包括HDFS(Hadoop分布式文件系统)和MapReduce编程模型。 【描述】虽然描述简洁,但我们可以推测这...
3. **CentOS Linux系统管理**:涵盖CentOS的日常管理,包括系统启动与关机、用户环境设置、文件系统管理等。 4. **Linux必备命令**:这是Linux操作的核心,学习如cd、ls、mkdir、rm等基本命令,以及管道、重定向等...
5. **读写分离与分库分表**:对于大规模的秒杀系统,可能需要对数据库进行读写分离和水平扩展,通过分库分表策略减轻单库压力。 6. **数据库优化**:使用索引优化查询效率,设计合理的数据模型,减少join操作,避免...
2. MapReduce:并行计算模型,将大规模数据处理任务分解为“映射”(map)和“化简”(reduce)两个阶段,实现数据的分布式处理。 二、Hadoop架构 Hadoop架构包含NameNode、DataNode、JobTracker和TaskTracker等关键...