虽有嘉肴,数据库的结构:主数据库和辅助数据库?主从读写分离?,凛

一、数据库架构准则

  1. 高可用
  2. 高功用
  3. 一致性
  4. 扩展性

二、常见的架构计划

计划一:主备架构,只要主库供给读写服务,备库冗余作毛病转移用


1、高可用剖析:高可用,主库挂了,keepalive(仅仅一种东西)会主动切换pop字体到备库。这个进程对事务层是通明的,无需修正代码或装备。

2、高功用剖析:读写都操作主库,很简单发生瓶颈。大部分互联网运用读多写少,读会先成为瓶颈,从而影响写功用。别的,备库仅仅单纯的备份,资源运用率50%,这点计划二虽有嘉肴,数据库的结构:主数据库和辅佐数据库?主从读写别离?,凛可处理。

3、一致性剖析:读写都操作主库,不存在数据一致性问题。

4沈琼霍小媛、扩展性剖析克里斯保罗:无法经过加从库来poke扩展读功用,从而进步全体功用。

5、可落地剖析:两点影响落地运用。榜首,功用一般,这点能够经过树立高效的索引和引进缓存来添加读功用,从而进步功用。这也是通用的计划。第二,扩展性差,这点能够经过分库分表来扩展。道德影院

计划二:双主架构,两个主库一起供给服务,负载均衡



1、高可用剖析:高可用,一个主库挂了,不影响另一台主库供给服务。这个进程对事务层是通明的,无需修正代码或装备。

2、高功用剖析:读写功用比较于计划一都得到进步,进步一倍。

3、一致性剖析:存在数据一致性问题。请看,一致性处理计划

4、扩展性剖析:当然能够扩展成三主循环,但笔者不主张(会多一层数据同步,这样同步的时刻会更长)。假如非得在数据库架构层面扩展的话,扩展为计划四。

5、可523落地剖析:两点影响落地运用。榜首,数据一致性问题,一致性处理计划可处理问题第二,主键抵触问题,ID一致地由分布式ID生成服务来生成orz可处理问题。

计划三:主从架构,一主多从,读写别离



1、高可用剖析:主库单点,从库高可用。一旦主库挂了,写服务也就无法供给。

2、高功用剖析:大部分互联网运用读多写少,读会先成为瓶颈,从而影响全体功用。读的功用进步了,全体功用也进步了。别的,主库能够不必索引,线上从库和线下从库也能够树立不同的索引(线上从库假如有多个仍是要树立相同的索引,不然因小失大;线下从库是平常开发人兰溪天气预报虽有嘉肴,数据库的结构:主数据库和辅佐数据库?主从读写别离?,凛员排查线上问题时查的库,能够建更多的索引)。

3、一致性剖析:存在数据一致性问题。请看,一致性处理计划

4、扩书包网小说展性剖析:能够经过加从库来扩展读功用,从而进步全体功用。(带来的问题是,从库越多需求从主库拉取binlog日志的端就越多,从而影响主库的功用,而且数据同步完结的时刻也会更长)

5、可落地剖析:两点影响落地运用。榜首,数据一致性问题,一致性处理计划可处理问题第二,主库单点问题,笔者暂时没想到很好的处理计划。

注:考虑一个问题,一台从库挂了会怎样?读写别离之读的负载均衡战略怎样容错?

计划四:双主+主从架构,看似完美的计划




1、高可用剖析:高可用。

2、高功用剖析:高功用。

3、一致性剖析:存在数据一致性问题。请看,一致性处理计划

4、扩展性剖析:能够经过加从库来扩展读功用,从而进步全体功用。(带来的问题同计划二

5、可落地剖析:同计划二,但数据同步又多了一层,数据推迟更严峻看a片

三、一致性处理计划

榜首导火索类:主库和从库一致性处理计划



注:图中圈出的是数据同步的当地,数据同步(从库从主库拉取binlog日志,再履行一遍)是需求时刻的,这个同步时刻内主库和从库的数据会存在不一致的状况。假如同步进程中有读恳求,那么读到的便是从库中的老数据。如下图。



已然知道了数据不一致性发生的原因,有下面几个处理计划供参阅:

1、直接疏忽,假如事务答应延时存在,那么就不去管它。

2、强制读主,选用主备架构计划,读写都走主库。用缓存来扩展数据库读功用 。有一点需求知道:假如缓存挂了,或许会发生雪崩现象,不过一般分布式缓存都是高可用的。高城梨沙



3、挑选读主,写操作时依据库+表+事务特征生成一个key放到Cache里并设置超时时刻(大于等于主从数据同步时刻)。读请虽有嘉肴,数据库的结构:主数据库和辅佐数据库?主从读写别离?,凛求时,相同的方法生成key先去查Cache,再判别是否射中。若射中,虽有嘉肴,数据库的结构:主数据库和辅佐数据库?主从读写别离?,凛则读主库,不然读从库。价值是多了一次缓存读写,根本能够疏忽。



4、半同步仿制,等主从同步完结,写恳求才回来。便是我们常说的“半同步仿制”semi-sync。这能够运用数据库原生功用,完成比较简单。价值是写恳求滴滴快车时延增加姜汤,吞吐量下降。

5、数据库中间件,引进开源(mycat等)或自研的数据库中间层。个人了解,思路同挑选虽有嘉肴,数据库的结构:主数据库和辅佐数据库?主从读写别离?,凛读主。数据库中间件的本钱比较高,而且还多引进了一层。**


**

第二类:DB和缓存一致性处理计划


先来看一下常用的缓存运用方法:

榜首步:筛选缓存;

第二步:写入数据库;

第三步:读取缓存?回来:读取数据库;

第四步:读取数据库后写入缓存。

注:假如依照这种方法,图一,不会发生DB和缓存不一致问题;图二,会发生DB和缓存不一致问题,即4.read先于3.sync履行。假如不做处理,缓存里的数据或许一直是脏数据。处理方法如下:



注:设置缓存时,一定要加上有用时刻,以防延时筛选缓存失利的状况!

四、个人的一些见地

1、架构演化

1、架构演化一:计划一 -> 计划一+分库分表 -> 计划二虽有嘉肴,数据库的结构:主数据库和辅佐数据库?主从读写别离?,凛+分库分表 -> 计划四+分库分表;

2、架构演化二:计划一 -> 计划一+分库分表 -> 千秋门计划三+分库分表 -> 计划四+分库分表;

3、架构演化三:计划一 -> 计划二 -> 计划四 -> 计划四+分库分表;

4、架构演化四:计划一 -> 计划三 -> 计划四 -> 计划四+分库分表;

2、个人见懒人版糖醋排骨解

1、加缓存和索引是通用的进步数据库功用的方法;

2虽有嘉肴,数据库的结构:主数据库和辅佐数据库?主从读写别离?,凛、分库分表带来的优点是巨大的,但相同也会带来一些问题,详见前日推文。

3、不管是主备+分库分表仍是主从+读写别离+分库分表,都要考虑详细的事务场景。绝大部分的数据库架构仍是选用墙角数枝梅凌寒单独开计划一和计划一+分库分表,只要很少部分用计划三+读写别离+分库分表。别的,阿里云供给的数据库云服务也都是主备计划,要想主从+读写别离需求二次架构。

4、记住一句话:不考虑事务场景的架构都是耍流氓。

本文来自博客园尜尜人物:www.cnblogs.com/littlecharacter


“我自己是一名从事了多年开发的java老程序员,辞去职务现在在做我好想你自己的java私家定制课程,今冰糖葫芦的做法年年头我花了一个月收拾了一份最适合2019年学习的java学习干货,从最根底的javase到spring各种结构都有收拾,送给每一位java小伙伴,想要获取的能够重视我的头条号并在后台私信我:java,即可免费获取。

评论(0)