分布式下的MS

MS模式是分布式系统中非常重要的一种复制模式,为了和配图协调,请允许这里直接使用了master-slave的缩写,没错,MS!

好,从现在开始,我们的标题变为:分布式系统下的master-slave复制。

什么是复制?

复制的意思很明显,就是把一份数据复制到指定的节点上。

复制的种类

复制现在主要有两种,一种主从复制,还有一种就是对等复制。

这里主要关注主从复制。

主从复制主要的动作

在主从分布的情况下,你把一份数据复制到多个节点。其中一个节点作为master。这个master是数据的权威同时通常也负责数据的更新。除了master之外的其它节点为slave或者叫secondaries。主从复制过程就是把数据从master同步到slave的过程。

上面这张图是就是数据从master复制到slave。master处理所有的写操作;而读数据可以从master上读也可以从slave上读。

主从复制能够解决哪些问题?

1、提高读取能力

在需要频繁读取数据集的情况下,主从复制可以通过扩展来提高读取性能。你可以通过增加更多的slave节点的方式,通过这种水平扩展的方式,来处理更多的读取请求。并且可以把所有的读取请求都交给slave节点来处理。

2、故障恢复能力

(1)、读取故障恢复能力

master挂了,slave节点依然可以处理读取。这种优势对于那种大部分情况都是读取的场景是非常有用的。

要想让读取具备故障恢复能力,那么我们就要把写在我们的应用程序里边的“读”的path和“写”的path分开,也就是他们的path必须是不同的,这样你的写操作出现故障时,我们的读取依然坚挺。读写分离怎么搞呢?就是要你通过两个独立的分开的数据库connection来分别提供读和写。这样的能力一些的数据库交互库都是不提供的。当然了,你要开发这样的支持,其实和开发其它的功能是一样的,也是要通过不断的测试来确保这个故障恢复能力的有效性。我们可以把写操作禁用了,然后再试试看是不是能正常的读取。

(2)、写入故障恢复能力

当master挂了以后,自然就不能提供写入能力了。现在整个集群是一个只提供读取能力的集群。直到出问题的master自己恢复了过来或者一个新的master被选举出来。所以在主从架构下,slave作为master的备份就很关键,这样即使master挂了,我们也可以非常迅速的就从茫茫的slave中选出一个新的master来。

这种快速选出新的master的能力,让主从复制变得很有用,即使没有了提高读取性能的能力。当我们的slave节点专心做备份这一件事情的时候,我们就可以把所有的读取和写入都交给master来做。这样的做法是不是会让你很容易联想到那种热备份的单机方案。这种方案让你既拥有了单机配置的简单又拥有强大的故障恢复能力。

现在再来说说选master的这个事情。master可以手动配置指定,也可以是通过自动选举产生。手动指派的意思就是在你配置集群的时候,就配置一个node作为master。自动指派就是指在你创建了集群了以后,他们就热闹地开始选举了,最后在茫茫的节点中选出一个master来。通过简单的配置就可以在master挂掉后自动的选出新的master,这大大缩短了集群的罢工时间。

主从复制不适合的场景

频繁写入的场景

由于master节点既要负责处理写入请求,又要负责把数据同步到slave节点。自然主从复制模式对于那种频繁写入的场景并不是很适合,虽然这种模式它是分流了一部分的读取请求到slave节点,看起来好像为写入请求也有所帮助。

主从复制不足之处

不一致

主从复制是分布式系统中非常重要的复制方式之一。不一致自然也就是成了分布式系统的主要问题了。或者说在分布式系统中就压根不存在一致性,至少是绝对意义上的一致。所以也只能说说“最终一致”。

在主从复制的模式下,有可能不同的客户端访问不同的slave节点,最后得到不同的value。因为有可能master的同步工作正在做,只同步了一部分节点,另外一部分节点还没有同步完。有一种最尴尬的情况,就是一个客户端刚刚写入一条数据,然后他立马就去读自己写入的这条数据,结果没读到。即使你使用主从复制仅仅是为了做个热备份也会遇到这样的问题,因为如果master挂了,那么任何的更新将不会被同步到slave节点上去。

总结

总之,主从架构,让你的集群拥有了读取的水平扩展和备份的水平扩展能力,同时也让你拥有了failover的能力。

但主从复制也存在不足之处,那就是不具备写入的水平扩展能力,同时复制的时延让集群的一致性变得没有那么绝对。

对于那些不是频繁写入但要求频繁读取的场景是足够而实用的了。

原文发布于微信公众号 - ImportSource(importsource)

原文发表时间:2017-02-25

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏源码之家

VCF文件转换——导入导出移动手机电话本不再麻烦

1686
来自专栏進无尽的文章

聊聊工程级别的组件化、插件化 以及 模块化

我们经常会听到组件化、插件化、模块化这三个概念,可是我们真的对这三个概念了解吗?明白它们三者之前的关系和区别吗?本文就我个人的理解做一下简单的总结,如有错误之处...

3053
来自专栏java架构技术

推荐:非常全面的 MySQL 高性能优化实战总结~

MySQL对于很多Linux从业者而言,是一个非常棘手的问题,多数情况都是因为对数据库出现问题的情况和处理思路不清晰。在进行MySQL的优化之前必须要了解的就是...

1472
来自专栏IT笔记

微服务架构实践之邮件通知系统改造

拆分背景 随着平台业务增长,功能耦合度越来越高,部署周期变长,代码样式混乱、新人入手复杂、独立功能影响系统的稳定性等等,等等,等等问题。 以邮件通知为案例对服务...

3756
来自专栏魏琼东

基于DotNet构件技术的企业级敏捷软件开发平台 - AgileEAS.NET - ORM设计器

      AgileEAS.NET平台做为一个快速应用开发平台,其目的为是为了提高应用软件的生产效率,如何软件开发的生产效率,方法是多种多样的;使用工作简化开...

2136
来自专栏编程微刊

微信小游戏跳一跳外挂教程(安卓版)

2982
来自专栏Golang语言社区

Go 语言构建高并发分布式系统实践

你知道互联网最抢手的技术人才有哪些吗?最新互联网职场生态报告显示,最抢手的十大互联网技术人才排名中Go语言开发人员位居第三,从中不难见得,Go语言的渗透率越来越...

5975
来自专栏杨建荣的学习笔记

一个清理和查询都要兼顾的简单方案(r7笔记第68天)

最近和开发应用的同学在讨论一个需求,目前他们碰到了一些性能问题,想让我来看看是否能够从数据库的角度有一些解决方案。 假设表为消费记录,简称service_det...

3424
来自专栏ThoughtWorks

使用spring提高rails开发效率

###声明 目前spring只支持MRI 1.9.3, MRI 2.0.0, Rails 3.2,没有达到要求的人赶紧升级你们的ruby,rails版本吧 ##...

3006
来自专栏架构师之路

究竟为什么要引入数据库中间件

不少朋友经常会问我以下问题: 58到家有没有使用数据库中间件 使用了什么数据库中间件,是自研,还是第三方 怎么实现的,是基于客户端的中间件,还是基于服务端的中间...

3915

扫码关注云+社区