1、数据 库 架构 师 做什么 ?58同城数据 库 架构 设计 思路目 录 基本概念 58同城数据 库 架构 设计 思路 总结一、基本概念基本概念 分片 : sharding 复制 : replication 分 组 : group 路由 规则 : router rule 常用路由方法( 1)范 围 : range( 2)哈希: hash( 3)路由服 务 : router-config-server二、数据 库 架构 设计 思路数据 库 架构 师 做什么?数据 库 架构 设计 点 可用性 读 性能 一致性 扩 展性( 1)数据 扩 容( 2)增加字段( 3)水平拆分 SQL玩法( 1)如何保 证
2、 数据的可用性?保 证 可用性的思路:冗余可用性:复制 +冗余 如何保 证 站点 的可用性?复制站点,多机冗余站点 如何保 证 服 务 的可用性?复制服 务 ,多机冗余服 务 如何保 证 数据 的可用性?复制数据,多机冗余数据 数据冗余 带 来的 问题 ?数据冗余 会引収 一致性 问题数据可用性:数据冗余 如何保 证 数据 库 “ 读 ” 高可用? 存在什么 问题 ? 怎么解决?“ 读 ” 高可用数据可用性:数据冗余 如何保 证 数据 库 “ 写 ” 高可用? 存在什么 问题 ? 怎么解决?“ 写 ” 高可用数据可用性: 58的玩法 58同城怎么玩数据可用性: “ 双主 ” 当 “ 主从 ”
3、用 如何解决 读 写一致性 问题 ? 如何解决 读 写可用性 问题 ? 还 存在什么 问题 ?“ 读 写 ” 高可用( 2)如何 扩 展 读 性能?如何提高 读 性能:增加索引 存在什么 问题 ?( 1)写性能降低( 2)索引占用内存大,数据命中率降低 有什么 优 化方案?如何提高 读 性能:增加从 库 存在什么 问题 ?( 1)从 库 越多,同步越慢( 2)数据丌一致 有什么 优 化方案?【 见 后文】 58同城没有采用 这 种玩法 扩 充 读 性能如何提高 读 性能:增加 缓 存 常 见 的 缓 存玩法存在什么 问题 ?( 1)冗余会引収一致性 问题 有什么 优 化方案?【 见 后文】 5
4、8同城怎么玩 缓 存( 3)如何保 证 一致性?一致性:主从丌一致 为 什么会丌一致? 主从丌一致如何 优 化?( 1)引入中 间 件( 2) 强 制 读 主一致性: 缓 存丌一致 为 什么会丌一致? 缓 存丌一致如何 优 化?( 1) 缓 存双淘汰( 2) 设 定 过 期 时间( 4)如何保 证扩 展性?扩 展性:数据 扩 容 原来水平切分成 n个 库 ,要 扩 容成 2n个 库 ,如何 实现 ? 58同城秒 级 数据 扩 容 存在什么缺点,如何解决?【 见 后文】扩 展性: 扩 展字段 原来 3个字段,新增到 5个字段,如何 实现 ?(明 显 丌能 alter table) 3个 库扩 容
5、到 4个 库 ,如何 实现 ? 目 标 :平滑迁移,丌停服 务 扩 展方法:倒 库( 1) 追日志法( 2)双写法【 见 后文】1) 记录 写 日志2)倒 库3)倒 库 完 毕4)追日志5)追日志完 毕 +数据校 验6)切 库扩 展性: 扩 展字段 原来 3个字段,新增到 5个字段,如何 实现 ?(明 显 丌能 alter table) 3个 库扩 容到 4个 库 ,如何 实现 ? 目 标 :平滑迁移,丌停服 务 扩 展方法:倒 库( 1)追日志法( 2) 双写法扩 展性:水平拆分如何拆?四 类 典型 场 景 几乎涵盖互 联 网 90%业务场 景( 单 key)用 户 库 如何拆分: user
6、(uid, XXOO)( 1对 多)帖子 库 如何拆分: tiezi(tid, uid, XXOO)(多 对 多)好友 库 如何拆分: friend(uid, friend_uid, XXOO)(多 key) 订单 库 如何拆分: order(oid, buyer_id, seller_id, XXOO)实 戓 -用 户库 拆分? 用 户库 , 10亿 数据量user(uid, uname, passwd, age, sex, create_time); 业务 需求如下( 1) 1%登 录请 求 = where uname=XXX and passwd=XXX( 2) 99%查询请 求 = where uid=XXX 问题 ?那 uname的 查询 怎么 办 ?【 见 后文】实 戓 -帖子 库 拆分? 帖子 库 , 15亿 数据量tiezi(tid, uid, title, content, time); 业务 需求如下( 1) 查询 帖子 详 情( 90%请 求)SELECT * FROM tiezi WHERE tid=$tid( 2) 查询 用 户 所有収帖( 10%请 求)SELECT * FROM tiezi WHERE uid=$uid