又拍网数据库架构案例分析

这篇文章是对又拍网公布的数据库案例的分析总结 又拍网是一个大型照片分享社区,数据库架构也是从简单到复杂发展起来的 数据库进化过程 (1)一主一从 最初是由一台主库和一台从库组成,当时从库只用作备份和容灾,当主库出现故障时,从库就手动变成主库 随着压力的增加,加上了memcached (2)一主多从 通过添加多个从库来分流查询压力 (3)数据库拆分 随着数据量的增加,读写压力都迅速增加,决定进行数据库拆分,将数据存放到不同的数据库服务器中 数据库拆分 一般可以按两个纬度来拆分数据: (1)垂直拆分 按功能模块拆分,多个数据库之间的表结构不同 (2)水平拆分 将同一个表的数据进行分块保存到不同的数据库中,数据库中的表结构相同 又拍网的核心业务对象是用户上传的照片,而照片数据的增加速度随着用户量的增加越来越快 压力基本上都在照片表上,垂直拆分不太适合,所以,采用了水平拆分的方式 拆分规则 常见的拆分方式是对表中某列值的范围或者hash值拆分,比如ID在0-10000之间的用户对应到数据库A,ID在10000-20000这个范围的对应到数据库B 这种方法实现起来比较方便高效,但是不能满足后续的伸缩性要求,如果需要增加数据库节点,必需调整算法或移动很大的数据集,比较难做到在不停止服务的前提下进行扩充数据库节点 又拍网采用的拆分方法是:映射表 这种方法是指建立一个索引表,保存每个用户ID和数据库ID的对应关系,每次读写用户数据时先从这个表获取对应数据库,新用户注册后,在所有可用的数据库中随机挑选一个为其建立索引 把索引表进行缓存,提高检索性能 数据迁移 如果需要平衡各个节点的压力,需要进行数据的迁移 例如要迁移用户A的数据 (1)将A状态置为迁移数据中,这个状态的用户不能进行写操作,并在页面上进行提示 (2)然后将用户A的数据全部复制到新增加的节点上 (3)更新映射表 (4)将用户A的状态置为正常 (5)将原数据库上的数据删除 迁移操作放在凌晨,减少对用户访问的影响 数据访问过程

拆分带来的问题 (1)跨库关联查询 如果需要查询的数据分布于不同的数据库,不便于通过JOIN的方式查询获得 比如要获得好友的最新照片,不能保证所有好友的数据都在同一个数据库里,需要通过多次查询,再进行聚合 有些需求可以通过保存多份数据来解决,例如用户A、用户B的数据库分别是DB1、DB2,当A评论了B作品时 先在B所在DB2中photo_comments表插入记录,记录B的哪个作品被谁评论了什么内容 然后在A所在DB1中user_comments表插入记录,记录A给哪个作者的哪个作品发表过评论 这样可以通过photo_comments得到B的某张照片的所有评论,也可以通过user_comments获得A发布过的所有评论 (2)不能保证数据的一致/完整性 跨库的数据没有外键约束,也没有事务保证,比如上面评论照片的例子,很可能出现成功插入photo_comments表,但是插入user_comments表时却出错了 可以在两个库上都开启事务,然后先插入photo_comments,再插入user_comments,然后提交两个事务,但不能完全保证这个操作的原子性 (3)自增ID 增加了一个专门用来生成ID的数据库,表结构很简单,只有一个自增字段id 例如要插入评论时,先在ID库的photo_comments表里插入一条空的记录,以获得一个唯一的评论ID 定期清理ID库的数据,以保证获取新ID的效率 数据库布局 整个数据库由多个子库构成

每个子库由两台物理服务器组成,两台都为master,互相复制

虽然都为master,但只有一个为工作状态,那么另一台就闲置了,为了节约成本,在两台服务器上放两个子库

原文发布于微信公众号 - 性能与架构(yogoup)

原文发表时间:2015-12-08

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏架构师之路

缓存架构设计细节二三事

本文主要讨论这么几个问题: (1)“缓存与数据库”需求缘起 (2)“淘汰缓存”还是“更新缓存” (3)缓存和数据库的操作时序 (4)缓存和数据库架构简析 一、...

44590
来自专栏数据和云

终于来了,Percona发布XtraBackup for MySQL 8.0

Percona在9月12日,终于宣布第一个测试用的XtraBackup for MySQL 8.0版本给大家试用:

26430
来自专栏MYSQL轻松学

MYSQL高性能优化总结

在进行MySQL的优化之前必须要了解的就是MySQL的查询过程,很多的查询优化工作实际上就是遵循一些原则让MySQL的优化器能够按照预想的合理方式运行而已。

26630
来自专栏后端技术探索

MySQL 数据库优化(运维角度)

一个成熟的数据库架构并不是一开始设计就具备高可用、高伸缩等特性的,它是随着用户量的增加,基础架构才逐渐完善。这篇博文主要谈MySQL数据库发展周期中所面临的问题...

32720
来自专栏企鹅号快讯

一文读懂NoSQL数据库

摘要:SQL数据库对数据类型和一致性有要求,NoSQL为了速度、灵活性和规模而放弃了这些要求。 在开发应用程序时,最基本的选择之一就是是否使用SQL或NoSQL...

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

MyCAT中的DDL

今天开发同学提了一个需求,是希望对某一个时间范围的表做DDL操作,看起来好像复杂度也不高。

19930
来自专栏数据库新发现

Percona最新发布XtraBackup for MySQL 8.0

Percona在9月12日,终于宣布第一个测试用的XtraBackup for MySQL 8.0版本给大家试用:

16410
来自专栏数据和云

insert into太慢?Roger 带你找真凶

李真旭(Roger) ACOUG 核心专家,Oracle ACE,云和恩墨技术专家 编辑手记:昨天谈到索引并不是万能的,事实上很多无用的索引给数据库带来很大的维...

52140
来自专栏Golang语言社区

数据库中间件

作者:[美]威廉·肯尼迪(William Kennedy)布赖恩·克特森(Brian

91470
来自专栏cloudskyme

一步一步学lucene——(第一步:概念篇)

信息检索的概念 信息检索(Information Retrieval)是指信息按一定的方式组织起来,并根据信息用户的需要找出有关的信息的过程和技术。狭义的信息检...

44980

扫码关注云+社区

领取腾讯云代金券