分布式算法

Redis分布式集群几点说道

北慕城南 提交于 2019-11-28 23:07:30
Redis数据量日益增大,使用的公司越来越多,不仅用于做缓存,同时趋向于存储这一块,这样必促使集群的发展,各个公司也在收集适合自己的集群方案,目前行业用的比较多的是下面几种集群架构,大部分都是采用分片技术,保证单实例内存增大带来的一系列问题,下面所列出的codis方案目前正在不断测试过程中,测试过程没有展示出来,主要从以下几点出发。 测试架构 和性能 :   1、keepalived+haproxy故障测试   2、Zookeeper集群节点测试   3、Codis-proxy集群节点测试   4、Codis-server集群节点测试   5、脚本写入大量测试数据并模拟数据迁移   6、性能测试 下面具体介绍codis和其他几大集群方案 集群方案:   1、 主从高可用(该方案就是单实例形式,只是为了保证数据的安全,对于用户数据少,业务的前期可以采用,目前我司缓存架构就是采用该方案)   2、 客户端分片(典型代表:Jedis。自主写分片算法,代码掌握在自己手中,可控性强,但是需要专业的开发运维人员维护,技术要求和维护成本高)   3、代理分片(典型代表:Twemproxy,redis集群没有正式推出之前官网推荐的方案,也是目前使用最多的)   4、 Redis cluster(3版本推出的集群方案,历时四年之多的开发)   5、 Codis集群(豌豆荚15年开源的解决方案

【转载】【分布式】一致性哈希算法

荒凉一梦 提交于 2019-11-28 20:39:26
本文转载自: https://www.cnblogs.com/lpfuture/p/5796398.html 如有侵权,请告知下线,多谢!! 0. 目的 分布式系统中节点根据哈希取值进行保存数据,当有节点新增或者节点下线,普通哈希算法会需要所有数据的哈希分布重新计算。而一致性哈希算法只需要重新计算下线的节点的数据即可。关键在于数据在环上,顺时针向最靠近的节点分布。 1. 一致性Hash性质 考虑到分布式系统每个节点都有可能失效,并且新的节点很可能动态的增加进来,如何保证当系统的节点数目发生变化时仍然能够对外提供良好的服务,这是值得考虑的,尤其实在设计分布式缓存系统时,如果某台服务器失效,对于整个系统来说如果不采用合适的算法来保证一致性,那么缓存于系统中的所有数据都可能会失效(即由于系统节点数目变少,客户端在请求某一对象时需要重新计算其hash值(通常与系统中的节点数目有关),由于hash值已经改变,所以很可能找不到保存该对象的服务器节点),因此一致性hash就显得至关重要,良好的分布式cahce系统中的一致性hash算法应该满足以下几个方面: 平衡性(Balance) 平衡性是指哈希的结果能够尽可能分布到所有的缓冲中去,这样可以使得所有的缓冲空间都得到利用。很多哈希算法都能够满足这一条件。 单调性(Monotonicity) 单调性是指如果已经有一些内容通过哈希分派到了相应的缓冲中

分布式架构的一致性维持

痞子三分冷 提交于 2019-11-28 14:49:28
在实际开发中,我们的大型项目都需要设计分布式架构,同时对高并发的场景进行管理,而在高并发环境中,我们通过使用redis集群来管理和控制该场景,同时,我们需要保证数据库与缓存的双写一致性,同时因为在常见的高并发场景中,我们对于微服务的控制并不能很好的应对该场景,如spring cloud和docker的结合并不能很好的解决该问题,因此我们需要相应的算法和协议来维持分布式架构的一致性。 如图所示,我们在分布式架构中,通常对于服务器的管理,我们通过观察是否存在特洛伊问题来决定使用哪种方法来解决分布式架构一致性。 在非特洛伊问题中,我们使用paxos和raft协议来维持分布式架构一致性,例如,在使用spring+spring MVC+Mybatis的开发中,我们经常使用@RequestBody 注解来返回一个json格式的网络状态,在常用的消息队列中,例如RabbitMQ,我们使用消息中间件的特性来进行程序的解耦削峰异步,通过消息中间件的作用,我们使传统RPC的方式变为了分布式,从而解决了系统的耦合性,但是对于大型业务场景,消息中间件会产生消息丢失,消息转发失败等系统问题,所以我们在设计架构的时候,通过会使用消息队列锁定算法来维持消息的稳定性,但对于高并发场景一味的使用synchronized或者乐观锁是不现实的,所以我们会使用分布式锁,自旋锁等高级锁来保持高并发场景的读写一致性。

分布式系统中一致性哈希算法

送分小仙女□ 提交于 2019-11-28 14:03:44
分布式系统中一致性哈希算法 此博文转载自 分布式系统中一致性哈希算法 ,博主对分布式系统中最常见的一致性哈希算法进行了非常细致的讲解,非常值得阅读!另外博主在博客园上定制的皮肤样式也是非常好看,推荐一波~ 业务场景 近年来,由于互联网的兴起,B2C、O2O等商业概念的提出和移动端的发展,使得分布式系统流行起来。分布式系统相对于单一系统而言,带来了流量大、系统高可用和高容错的便利。功能强大的同时,也意味着实现起来需要更多的技术支持。例如系统访问层的 负债均衡 、缓存层的 多实例主从复制备份 以及数据层的 分库分表 等。 我们以负载均衡为例,常见的负载均衡方法有很多,但是它们的优缺点都很明显: 随机访问策略: 系统随机访问,缺点:可能造成服务器负载压力不均衡,俗话讲就是撑的撑死,饿的饿死。 轮询策略: 请求均匀分配,如果服务器有性能差异,则无法实现性能好的服务器能够多承担一部分。 权重轮询策略: 权值需要静态配置,无法自动调节,不适合对长连接和命中率有要求的场景。 Hash取模策略: 不稳定,如果列表中某台服务器宕机,则会导致路由算法产生变化,由此导致命中率的急剧下降。 一致性哈希策略(本文重点分析) 以上几个策略,排除本篇介绍的一致性哈希策略,可能使用最多的就是 Hash取模策略 了。Hash取模策略的缺点也是很明显的,这种缺点也许在负载均衡的时候不是很明显

分布式系统中的互斥算法

♀尐吖头ヾ 提交于 2019-11-28 04:23:01
1分布式系统简介及优势 分布式系统是一种多处理器。各处理器通过互联网构成统一的系统。系统采用分布式计算结构,即把原来系统内中央处理器处理的任务分散给相应的处理器,实现不同功能的各个处理器相互协调,共享系统的外设与软件。通过与集中式系统的比较,分布式系统的优点主要体现在以下几个方面:(1) 能够实现资源共享。例如: CPU、存储设备等硬件资源、软件工具和软件环境等软件资源能被系统内所有主机使用。(2) 系统具有很快的反应能力。分布式系统将所接受的任何任务都会分配给其所支配的所有主机并行执行,因此它的响应时间就大大缩短了。(3) 伸缩性较强。是否能伸缩自如,与性能的好坏息息相关,对分布式系统进行缩减和扩充,灵活性和可扩展性高。(4) 适应范围较广。分布式系统可以适用于不同的环境,例如一些需要相互合作的工作,如事务处理、过程控制等。 2 互斥问题的产生 当有多个进程竞争系统中相同的资源时,互斥问题就产生了。一个正确的互斥算法必须避免冲突( 死锁和饿死) 和保证公平性。通常分布式操作系统使用的互斥算法有:集中式算法、分布式算法和令牌环算法。评价互斥算法性能的准则有(1)每次临界区请求所需要的消息的个数(2)响应时间(RT)(3)同步延迟(SD)。一个好的互斥算法应该是无饥饿,无死锁的。 3 三种传统算法 3.1 集中式算法 集中式算法借鉴了集中式互斥算法的思想,在分布式系统中

zookeeper基础

谁说我不能喝 提交于 2019-11-28 01:36:31
1. zookeeper的由来   Zookeeper 最早起源于雅虎研究院的一个研究小组。在当时,研究人员发现,在雅虎内部很多大型系统基本都需要依赖一个类似的系统来进行分布式协调,但是这些系统往往都存在分布式单点问题。   所以,雅虎的开发人员就试图开发一个通用的无单点问题的分布式协调框架,以便让开发人员将精力集中在处理业务逻辑上。   关于“ZooKeeper”这个项目的名字,其实也有一段趣闻。在立项初期,考虑到之前内部很多项目都是使用动物的名字来命名的(例如著名的Pig项目),雅虎的工程师希望给这个项目也取一个动物的名字。时任研究院的首席科学家 Raghu Ramakrishnan 开玩笑地说:“在这样下去,我们这儿就变成动物园了!”此话一出,大家纷纷表示就叫动物园管理员吧,因为各个以动物命名的分布式组件放在一起,雅虎的整个分布式系统看上去就像一个大型的动物园了。   而 Zookeeper 正好要用来进行分布式环境的协调,于是,Zookeeper 的名字也就由此诞生了。 2. zookeeper概览   ZooKeeper 是一个开源的分布式协调服务。ZooKeeper 框架最初是在“Yahoo!"上构建的,用于以简单而稳健的方式访问他们的应用程序。   后来,Apache ZooKeeper 成为 Hadoop,HBase 和其他分布式框架使用的有组织服务的标准。  

Hadoop大数据平台基础

本秂侑毒 提交于 2019-11-28 00:49:44
官网:http://hadoop.apache.org/ 文章目录 Hadoop简介 核心架构 HDFS NameNode DataNode 文件操作 Linux 集群 Hadoop和高效能计算、网格计算的区别 发展现状 MapReduce与Hadoop之比较 Hadoop生态圈 概况 HDFS(Hadoop分布式文件系统) Mapreduce(分布式计算框架) HBASE(分布式列存数据库) Zookeeper(分布式协作服务) HIVE(数据仓库) Pig(ad-hoc脚本) Sqoop(数据ETL/同步工具) Flume(日志收集工具) Mahout(数据挖掘算法库) Oozie(工作流调度器) Yarn(分布式资源管理器) Mesos(分布式资源管理器) Tachyon(分布式内存文件系统) Tez(DAG计算模型) Spark(内存DAG计算模型) Giraph(图计算模型) GraphX(图计算模型) MLib(机器学习库) Streaming(流计算模型) Kafka(分布式消息队列) Phoenix(hbase sql接口) ranger(安全管理工具) knox(hadoop安全网关) falcon(数据生命周期管理工具) Ambari(安装部署配置管理工具) Hadoop简介 Hadoop实现了一个 分布式文件系统(Hadoop Distributed File

一篇读懂分布式架构下的负载均衡

房东的猫 提交于 2019-11-27 22:54:42
微信公众号: IT一刻钟 大型现实非严肃主义现场 一刻钟与你分享优质技术架构与见闻,做一个有剧情的程序员 关注可了解更多精彩内容,定期有福利相送哟 文章目录 什么是负载均衡? 负载均衡分类 二层负载均衡 三层负载均衡 四层负载均衡 七层负载均衡 负载均衡算法 静态均衡算法: 动态负债均衡算法: 说在后面话 什么是负载均衡? 百度词条里的解释是:负载均衡,英文叫Load Balance,意思就是将请求或者数据分摊到多个操作单元上进行执行,共同完成工作任务。 它的目的就通过调度集群,达到最佳化资源使用,最大化吞吐率,最小化响应时间,避免单点过载的问题。 负载均衡分类 负载均衡可以根据网络协议的层数进行分类,我们这里以ISO模型为准,从下到上分为: 物理层,数据链路层,网络层,传输层,会话层,表示层,应用层。 当客户端发起请求,会经过层层的封装,发给服务器,服务器收到请求后经过层层的解析,获取到对应的内容。 二层负载均衡 二层负债均衡是基于数据链路层的负债均衡,即让负债均衡服务器和业务服务器绑定同一个虚拟IP(即VIP),客户端直接通过这个VIP进行请求,那么如何区分相同IP下的不同机器呢?没错,通过MAC物理地址,每台机器的MAC物理地址都不一样,当负载均衡服务器接收到请求之后,通过改写HTTP报文中以太网首部的MAC地址,按照某种算法将请求转发到目标机器上,实现负载均衡。

理解分布式系统常用的负载均衡算法

拈花ヽ惹草 提交于 2019-11-27 22:48:15
分布式系统常用的负载均衡算法 最近在做的系统上使用ES比较多,出于对ES的学习,在了解了ES的负载均衡算法之后,也相应的了解了其它的负载均衡算法,在这里做一个分享。 1:轮询法: 轮询很容易实现,将请求按顺序轮流分配到后台服务器上,均衡的对待每一台服务器,而不关心服务器实际的连接数和当前的系统负载。使用轮询策略的目的是,希望做到请求转移的绝对均衡,但付出的性能代价也是相当大的。为了保证pos变量的并发互斥,引入了重量级悲观锁synchronized,将会导致该轮询代码的并发吞吐量明显下降。 2:随机法: 通过系统随机函数,根据后台服务器列表的大小值来随机选取其中一台进行访问。由概率统计理论得知,随着调用量的增大,其实际效果越来越仅仅与平均分配流量到后台的每一台服务器,也就是轮询法的效果。 3:随机轮询法: 随机轮询,就是将随机法和轮询法结合起来,在轮询节点时,随机选择一个节点作为开始位置的index,此后每次选择下一个节点来处理请求,即(index+1)%size。 这种方式只是在选择第一个节点使用了随机方法,其他与轮询法无异,缺点和轮询一样。 4:源地址哈希法: 源地址哈希的思想是根据服务消费者请求客户端的IP地址,通过哈希函数计算得到一个哈希值,将此哈希值和服务器列表的大小进行取模运算,得到的结果便是要访问的服务器地址的序号。采用源地址哈希法进行负载均衡,相同的ip客户端

深入理解阿里分布式消息中间件之消息队列

主宰稳场 提交于 2019-11-27 14:01:21
1、为什么要使用消息队列? 分析:一个用消息队列的人,不知道为啥用,有点尴尬。没有复习这点,很容易被问蒙,然后就开始胡扯了。 回答:这个问题,咱只答三个最主要的应用场景(不可否认还有其他的,但是只答三个主要的),即以下六个字:解耦、异步、削峰 (1)解耦 传统模式: 传统模式的缺点: 系统间耦合性太强,如上图所示,系统A在代码中直接调用系统B和系统C的代码,如果将来D系统接入,系统A还需要修改代码,过于麻烦! 中间件模式: 中间件模式的的优点: 将消息写入消息队列,需要消息的系统自己从消息队列中订阅,从而系统A不需要做任何修改。 (2)异步 传统模式: 传统模式的缺点: 一些非必要的业务逻辑以同步的方式运行,太耗费时间。 中间件模式: 中间件模式的的优点: 将消息写入消息队列,非必要的业务逻辑以异步的方式运行,加快响应速度 (3)削峰 传统模式 传统模式的缺点: 并发量大的时候,所有的请求直接怼到数据库,造成数据库连接异常 中间件模式: 中间件模式的的优点: 系统A慢慢的按照数据库能处理的并发量,从消息队列中慢慢拉取消息。在生产中,这个短暂的高峰期积压是允许的。 2、使用了消息队列会有什么缺点? 分析:一个使用了MQ的项目,如果连这个问题都没有考虑过,就把MQ引进去了,那就给自己的项目带来了风险。 我们引入一个技术,要对这个技术的弊端有充分的认识,才能做好预防。要记住