欢迎来到冰点文库! | 帮助中心 分享价值,成长自我!
冰点文库
全部分类
  • 临时分类>
  • IT计算机>
  • 经管营销>
  • 医药卫生>
  • 自然科学>
  • 农林牧渔>
  • 人文社科>
  • 工程科技>
  • PPT模板>
  • 求职职场>
  • 解决方案>
  • 总结汇报>
  • ImageVerifierCode 换一换
    首页 冰点文库 > 资源分类 > DOCX文档下载
    分享到微信 分享到微博 分享到QQ空间

    互联网数据库架构设计最佳实践.docx

    • 资源ID:17083065       资源大小:490.18KB        全文页数:12页
    • 资源格式: DOCX        下载积分:3金币
    快捷下载 游客一键下载
    账号登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录
    二维码
    微信扫一扫登录
    下载资源需要3金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP,免费下载
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    互联网数据库架构设计最佳实践.docx

    1、互联网数据库架构设计最佳实践互联网数据库架构设计最佳实践一 、数据库架构设计思路(1)可用性设计解决思路:复制+冗余副作用:复制+冗余一定会引发一致性问题保证“读”高可用的方法:复制从库,冗余数据,如下图带来的问题:主从不一致解决方案:见下文保证“写”高可用的一般方法:双主模式,即复制主库(很多公司用单master,此时无法保证写的可用性),冗余数据,如下图带来的问题:双主同步key冲突,引不一致解决方案:a)方案一:由数据库或者业务层保证key在两个主上不冲突b)方案二:见下文58同城保证“写”高可用的方法:“双主”当“主从”用,不做读写分离,在“主”挂掉的情况下,“从”(其实是另外一个主)

    2、,顶上,如下图优点:读写都到主,解决了一致性问题;“双主”当“主从”用,解决了可用性问题带来的问题:读性能如何扩充?解决方案见下文(2)读性能设计:如何扩展读性能最常用的方法是,建立索引建立非常多的索引,副作用是:a)降低了写性能b)索引占内存多了,放在内存中的数据就少了,数据命中率就低了,IO次数就多了但是否想到,不同的库可以建立不同的索引呢?如下图TIPS:不同的库可以建立不同索引主库只提供写,不建立索引online从库只提供online读,建立online读索引offline从库只提供offline读,建立offline读索引提高读性能常见方案二,增加从库上文已经提到,这种方法会引发主从

    3、不一致问题,从库越多,主从时延越长,不一致问题越严重这种方案很常见,但58没有采用提高读性能方案三,增加缓存传统缓存的用法是:a)发生写请求时,先淘汰缓存,再写数据库b)发生读请求时,先读缓存,hit则返回,miss则读数据库并将数据入缓存(此时可能旧数据入缓存),如下图带来的问题:a)如上文所述,数据复制会引发一致性问题,由于主从延时的存在,可能引发缓存与数据库数据不一致b)所有app业务层都要关注缓存,无法屏蔽“主+从+缓存”的复杂性58同城缓存使用方案:服务+数据+缓存好处是:1)引入服务层屏蔽“数据库+缓存”2)不做读写分离,读写都到主的模式,不会引发不一致(3)一致性设计主从不一致解

    4、决方案方案一:引入中间件中间件将key上的写路由到主,在一定时间范围内(主从同步完成的经验时间),该key上的读也路由到主方案二:读写都到主上文已经提到,58同城采用了这种方法,不做读写分离,不会不一致数据库与缓存不一致解决方案两次淘汰法异常的读写时序,或导致旧数据入缓存,一次淘汰不够,要进行二次淘汰a)发生写请求时,先淘汰缓存,再写数据库,额外增加一个timer,一定时间(主从同步完成的经验时间)后再次淘汰b)发生读请求时,先读缓存,hit则返回,miss则读数据库并将数据入缓存(此时可能旧数据入缓存,但会被二次淘汰淘汰掉,最终不会引发不一致)(4)扩展性设计(4.1)58同城秒级别数据扩容

    5、需求:原来水平切分为N个库,现在要扩充为2N个库,希望不影响服务,在秒级别完成最开始,分为2库,0库和1库,均采用“双主当主从用”的模式保证可用性接下来,将从库提升,并修改服务端配置,秒级完成扩库由于是2扩4,不会存在数据迁移,原来的0库变为0库+2库,原来的1库变为1库和3库此时损失的是数据的可用性最后,解除旧的双主同步(0库和2库不会数据冲突),为了保证可用性增加新的双主同步,并删除掉多余的数据这种方案可以秒级完成N库到2N库的扩容。存在的问题:只能完成N库扩2N库的扩容(不需要数据迁移),非通用扩容方案(例如3库扩4库就无法完成)(4.2)非指数扩容,数据库增加字段,数据迁移这些方法在(

    6、上)篇中都已经介绍过,此处不再冗余,有兴趣的朋友回复“同城”回看(上)篇方案一:追日志方案方案二:双写方案(4.3)水平切分怎么切四类场景覆盖99%拆库业务a)“单key”场景,用户库如何拆分: user(uid, XXOO)b)“1对多”场景,帖子库如何拆分: tiezi(tid, uid, XXOO)c)“多对多”场景,好友库如何拆分: friend(uid, friend_uid, XXOO)d)“多key”场景,订单库如何拆分:order(oid, buyer_id, seller_id, XXOO)这些拆库方案在(上)篇中都已经介绍过,此处不再冗余,有兴趣的朋友回复“同城”回看(上)

    7、篇(5)海量数据下,SQL怎么玩不会这么玩a)各种联合查询b)子查询c)触发器d)用户自定义函数e)“事务”都用的很少原因:对数据库性能影响极大拆库后,IN查询怎么玩回复“同城”回看(上)篇拆库后,非Partition key的查询怎么玩回复“同城”回看(上)篇拆库后,夸库分页怎么玩?回复“同城”回看(上)篇问题的提出与抽象:ORDER BY xxx OFFSET xxx LIMIT xxx单机方案:ORDER BY time OFFSET 10000 LIMIT 100分库后的难题:如何确认全局偏移量分库后传统解决方案:查询改写+内存排序a)ORDER BY time OFFSET 0 LI

    8、MIT 10000+100b)对20200条记录进行排序c)返回第10000至10100条记录优化方案一:增加辅助id,以减少查询量优化方案二:模糊查询a)业务上:禁止查询XX页之后的数据b)业务上:允许模糊返回 = 第100页数据的精确性真这么重要么?最后的大招!(由于时间问题,只在DTCC2015上分享了哟)优化方案三:终极方案,业务无损,查询改写与两段查询需求:ORDER BY x OFFSET 10000 LIMIT 4; 如何在分库下实现(假设分3库)步骤一、查询改写: ORDER BY x OFFSET3333LIMIT 44,7,9,10 = 1库返回3,5,6,7 = 2库返回

    9、6,8,9,11 = 3库返回步骤二、找到步骤一返回的min和max,即3和11步骤三、通过min和max二次查询:ORDER BY x WHERE xBETWEEN3 AND 113,4,7,9,10 = 1库返回,4在1库offset是3333,于是3在1库的offset是33323,5,6,7,11 = 2库返回,3在2库offset是33333,5,6,8,9,11 = 3库返回,6在3库offset是3333,于是3在3库的offset是3331步骤四、找出全局OFFSET3是全局offset3332+3333+3331=9996当当当当,跳过3,3,3,4,于是全局OFFSET 1

    10、0000 LIMIT 4是5,5,6,6总结:58同城数据库架构设计思路(1)可用性,解决思路是冗余(复制)(1.1)读可用性:多个从库(1.2)写可用性:双主模式 or 双主当主从用(58的玩法)(2)读性能,三种方式扩充读性能(2.1)增加索引:主从上的索引可以不一样(2.2)增加从库(2.3)增加缓存:服务+缓存+数据一套(58的玩法)(3)一致性(3.1)主从不一致:引入中间层 or 读写都走主库(58的玩法)(3.2)缓存不一致:双淘汰来解决缓存不一致问题(4)扩展性(4.1)数据扩容:提升从库,double主库,秒级扩容(4.2)字段扩展:追日志法 or 双写法(4.3)水平切分(

    11、单key)用户库如何拆分:, user(uid XXOO)(1对多)帖子库如何拆分: tiezi(tid, uid, XXOO)(多对多)好友库如何拆分: friend(uid, friend_uid, XXOO)(多key)订单库如何拆分:order(oid, buyer_id, seller_id, XXOO)(5)SQL玩法(5.0)不这么玩:联合查询,子查询,触发器,自定义函数,事务(5.1)IN查询:分发MR or 拼装成不同SQL语句(5.2)非partition key查询:定位一个库 or 分发MR(5.3)夸库分页(5.3.1)修改sql语句,服务内排序(5.3.2)引入特殊

    12、id,减少返回数量(5.3.3)业务优化,允许模糊查询(5.3.4)查询改写,二段查询二、数据库之父Codd的12条法则另外,我们回顾一下数据库之父Codd的12条法则,作为数据库设计的指导性方针:1. 信息法则关系数据库中的所有信息都用唯一的一种方式表示表中的值。2. 保证访问法则依靠表名、主键值和列名的组合,保证能访问每个数据项。3. 空值的系统化处理支持空值(NULL),以系统化的方式处理空值,空值不依赖于数据类型。4. 基于关系模型的动态联机目录数据库的描述应该是自描述的,在逻辑级别上和普通数据采用同样的表示方式,即数据库必须含有描述该数据库结构的系统表或者数据库描述信息应该包含在用户

    13、可以访问的表中。5. 统一的数据子语言法则一个关系数据库系统可以支持几种语言和多种终端使用方式,但必须至少有一种语言,它的语句能够一某种定义良好的语法表示为字符串,并能全面地支持以下所有规则:数据定义、视图定义、数据操作、约束、授权以及事务。(这种语言就是SQL)6. 视图更新法则所有理论上可以更新的视图也可以由系统更新。7. 高级的插入、更新和删除操作把一个基础关系或派生关系作为单个操作对象处理的能力不仅适应于数据的检索,还适用于数据的插入、修改个删除,即在插入、修改和删除操作中数据行被视作集合。8. 数据的物理独立性不管数据库的数据在存储表示或访问方式上怎么变化,应用程序和终端活动都保持着

    14、逻辑上的不变性。9. 数据的逻辑独立性当对表做了理论上不会损害信息的改变时,应用程序和终端活动都会保持逻辑上的不变性。10. 数据完整性的独立性专用于某个关系型数据库的完整性约束必须可以用关系数据库子语言定义,而且可以存储在数据目录中,而非程序中。11. 分布独立性不管数据在物理是否分布式存储,或者任何时候改变分布策略,RDBMS的数据操纵子语言必须能使应用程序和终端活动保持逻辑上的不变性。12. 非破坏性法则如果一个关系数据库系统支持某种低级(一次处理单个记录)语言,那么这个低级语言不能违反或绕过更高级语言(一次处理多个记录)规定的完整性法则或约束,即用户不能以任何方式违反数据库的约束。还有一些经验: 降低对数据库功能的依赖功能应该由程序实现,而非DB实现。原因在于,如果功能由DB实现时,一旦更换的DBMS不如之前的系统强大,不能实现某些功能,这时我们将不得不去修改代码。所以,为了杜绝此类情况的发生,功能应该有程序实现,数据库仅仅负责数据的存储,以达到最低的耦合。 定义实体关系的原则当定义一个实体与其他实体之间的关系时,需要考量如下:o 牵涉到的实体识别出关系所涉及的所有实体。o 所有权考虑一个实体“拥有”另一个实体的情况。o 基数考量一个实体的实例和另一个实体实例关联的数量。


    注意事项

    本文(互联网数据库架构设计最佳实践.docx)为本站会员主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

    copyright@ 2008-2023 冰点文库 网站版权所有

    经营许可证编号:鄂ICP备19020893号-2


    收起
    展开