数据库系统设计漫谈

46
数数数数 数数数数 数数 数数数 , 数数数数数数数数数数

Upload: james-tong

Post on 15-Jan-2015

2.665 views

Category:

Technology


0 download

DESCRIPTION

从关系数据库的起因开始介绍,深入解析关系数据库的ACID、Relation、Normalization等概念,解析数据库Scalability的复杂度,CAP的基本权衡与选择,缓存的概念与设计、权衡。

TRANSCRIPT

Page 1: 数据库系统设计漫谈

数据库系统设计漫谈

讲师:童家旺 , 阿里集团数据库架构师

Page 2: 数据库系统设计漫谈

主题 数据库基本问题调查 关系数据库的基本背景 ACID 基本概念解析 范式问题解析( Normalization ) 数据库的扩展性浅析 常见数据库系统回顾

Page 3: 数据库系统设计漫谈

数据库基本问题调查

大家都使用过哪些数据库?

哪些内容是数据库系统的关键点?

Page 4: 数据库系统设计漫谈

常见的数据存储 传统的数据库系统

Oracle DB2 、 SQL Server MySQL 、 PosgreSQL

分布式数据库 Google Spanner & BigTable & MegaStore OceanBase 、 Hbase

缓存服务器 & KeyValue Store Tair MemcacheD Redis

Page 5: 数据库系统设计漫谈

数据库的主要特性

ACID 原子性( Atomicity ) 完整性( Consistency ) 隔离性 ( Isolation ) 持久性 ( Durability )

Relation & SQL Structured Query Language (即 SQL ) A Relational Model of Data for Large Shared

Data Banks ( By Edgar Codd )

Page 6: 数据库系统设计漫谈

RDBMS 之前的数据库的问题 不支持数据独立性 数据库与应用系统之间的强耦合 应用系统的复杂度 应用系统本身的规模较小(性价比?)

Page 7: 数据库系统设计漫谈

关系数据库的主要业务场景

Billing (记账类业务,电信、银行) Booking (订票类业务,航空) Inventory (库存管理,零售)

这些业务的共同特征是什么啊?

Page 8: 数据库系统设计漫谈

关系数据库的关系来自哪里? 这是关系的一个来源 另一个来源是 Normalization

Page 9: 数据库系统设计漫谈

ACID 的基础概念 Transaction 的概念借自 Contract Law

一手交钱、一手交货( Atomicity ) 不会出现库存为负,也不会出现资金为负的情况( Consistency ) 可同时与多人进行交易( Isolation ) 离柜概不负责( Durability )

Atomicity 要么全部成功,要么全不成功

Consistency 写入数据库的数据必须满足所有定义的约束规则(主键、唯一键、外键等约

束) Isolation

确保并发执行的事务就如同串行执行的事务一样,保证系统状态( state )的一致性。

Durability 一旦提交,哪怕出现掉电、 Crash 也不会丢数据

Page 10: 数据库系统设计漫谈

几个基础概念 Write-Ahead Log Redo

Logical Physical Physiological

Undo 事务槽-事务标识 SCN – 系统变更统一时间戳(逻辑时钟)

Page 11: 数据库系统设计漫谈

如何实现原子性 一个简单购物场景

A 卖一件衣服给 B A 的衣服库存 -1 A 的资金 +N B 的衣服库存 +1 B 的资金 -N

Page 12: 数据库系统设计漫谈

如何实现原子性( 2 ) 事务槽为变更入口,单一入口(原子) 每个变更的记录都包含事务槽信息

Page 13: 数据库系统设计漫谈

数据库中如何保证 C

通过 Read Dirty 与锁来解决 PK/UK 通过 Ref 检查来解决 FK 的问题(需要

Index ) 通过 PreCommit trigger 来做 Null 以及

Check

Page 14: 数据库系统设计漫谈

数据库中如何保证 I

锁控制 不同粒度的锁(表级、块级、记录级) 不同维度的锁(数据相关锁,内存相关锁)

MVCC Snapshot Isolation Block Image + SCN + Undo Image 判断

差别在于读取哪个时间点的 Snapshot

Page 15: 数据库系统设计漫谈

数据库中如何保证 D

Log before Data LGWR before DBWn Flush Log on Commit

Durability On Commit Checkpoint Before Redo Log File

Reuse

Page 16: 数据库系统设计漫谈

ACID 的代价 不同的 Isolation 对应不同的代价

Serialiazability Read Committed (Through Snapshot) Read Dirty ? (没有并发控制)

不同的 Durability 级别 Flush on Commit Flush on Timeout ( Time Range) Flush on Batch ( commits count?)

Page 17: 数据库系统设计漫谈

主题 数据库基本问题调查 关系数据库的基本背景 ACID 基本概念解析 范式问题解析(Normalization) 数据库的扩展性浅析 常见数据库系统回顾

Page 18: 数据库系统设计漫谈

Normalization

先做个小游戏

用笔记录下 学员名单、讲师名称、讲师简介、课程名称、课程

简介 调整下

讲师(童家旺金光丁)以及对应的讲师简介 再次调整下

课程 (数据库概论分布式数据库原理)&简介

Page 19: 数据库系统设计漫谈

Normalization 解决的问题 更新一个源头不会出现异常 每份数据只有一个源头

如何保证多份数据的一致性? 一份数据有多少个源头?

同一份数据被重复了多少次? 对应的存储空间? 为了存储耗费的其它资源?

Page 20: 数据库系统设计漫谈

Normalization带来的问题 表之间的依赖(关系依赖,耦合) 表关联的成本(关联开销,可能的 IO开销) 系统扩展的复杂度(解耦合)

Page 21: 数据库系统设计漫谈

如何权衡 Normalization

尽量不要对静态数据做 Normalization 除非你希望节约存储空间

考虑范式化 Vs 反范式化的投入产出 为什么很多 IT新人喜欢 Normalization

那是因为他们的老师告诉他们需要 Ali 的实际情况

适度的使用 关键在于判断业务之间的耦合性

Page 22: 数据库系统设计漫谈

主题 数据库基本问题调查 关系数据库的基本背景 ACID 基本概念解析 范式问题解析( Normalization ) 数据库的扩展性浅析 常见数据库系统回顾

Page 23: 数据库系统设计漫谈

一个小实验 如何将 2 个人从这里送到杨浦? 如何将 5 个人从这里送到杨浦? 如何将 50 个人从这里送到杨浦? 如何将 500 个人从这里送到杨浦? 如何将 5000 个人从这里送到杨浦? 如何将 50000 个人从这里送到杨浦?

Page 24: 数据库系统设计漫谈

解决扩展性的根本途径

Page 25: 数据库系统设计漫谈

数据库的扩展性问题 做数据库架构、系统架构与上图差别在于:

如何满足如下的要求 检索问题

Relation 并发问题

Isolation Consistency(UK)

一致性问题 Isolation

速度问题 Performance,Durability+Isolation

Page 26: 数据库系统设计漫谈

数据库检索问题 如何从班级的联系方式中找到 XX 的电话号码? 如何从公司的联系方式中找到 XX 的电话号码? 如何从移动公司的系统中找到 XX 的电话号码? 如何从移动、电信、联通的数据库找到 XX 的

电话号码?

Page 27: 数据库系统设计漫谈

数据库的并发问题 同时有多个人要购买手机号? 如何保证大家购买的不是同一个手机号? 如何支持几百、几千、几万人同时购买手机号?

Page 28: 数据库系统设计漫谈

数据库的一致性问题 如何保证大家看到的库存有效? 如何保证读取的信息是准确的? 库存的变更如何实时的提供给

每一个人看到?

Page 29: 数据库系统设计漫谈

数据库的性能问题? 如何快速的让 1 个人买到号码? 有多快?

如何快速的让 10 个人买到号码? 要不要排队? 一个服务员? 一个营业厅?

Page 30: 数据库系统设计漫谈

Performance Vs Scalability

1.当只有一个人访问时,速度如何? 2.当有很多人访问时,速度如何?

大家都同样快? 如果满足 1

表示 Performance很好? 如何能较好的满足 2

表示系统有较好的 Scalability

Page 31: 数据库系统设计漫谈

一致性问题再探讨新浪发的微薄需要强一致吗? ITPUB 的论坛需要强一致吗? 当当的图书描述信息需要强一致吗? 12306 的火车票库存信息需要强一致吗? 支付宝 /财付通的账户余额需要强一致吗? 中行信用卡 /招商银行卡的账户信息需要强一

致吗 ?

Page 32: 数据库系统设计漫谈

数据状态机的分类

何谓状态机 简单的理解是,计算机中会发生变化的数据都是状态机,

这个数据的值不同可能会带来不同的后果。 分类:按照三个维度:时间、信息含金量、变更频率

持续时间 信息含金量 变更频繁度 例子瞬时 高 少 Shopping Card Session

(分)瞬时 低 少 Login Cookie (分)中等时长 高 少 Ecommerce Billing(天 )中等时长 中 少 Product Catalog(年 )中等时长 高 多 Flight/Train Inventory

(月 )无限时长 中 少 User Profile (年 )无限时长 高 多 Bank Account Balance

(年 ) )

Page 33: 数据库系统设计漫谈

Cache 的基本概念 Cache 的定义

Caching is a temp location where I store data in (data that I need it frequently) as the original data is expensive to be fetched, so I can retrieve it faster. 台湾的翻译为“快取”,大陆为“缓存”

Cache 的特征 有 Backend 的内容 处理的效率比走Backend 要快 与 Backend 的内容之间可能会不一致

Cache 的本质 Through Relaxing Consistency to Improve Scalability

Page 34: 数据库系统设计漫谈

Cache 的设计考虑

缓存的一致性维护问题 数据的具体读写比

商品信息?库存信息?用户信息?账户余额? Backend 数据变更频率 业务对一致性的要求 使用何种缓存策略

Write Through Vs Write Back Vs Write Back with Compensate

Page 35: 数据库系统设计漫谈

Memcached 是 Cache吗? It Depends

如果内容有 Backend ?是! 如果内容没有 Backend ?否!

案例 新浪微博的计数器? 淘宝、当当的记录在缓存中的购物车信息?

Page 36: 数据库系统设计漫谈

主题 数据库基本问题调查 关系数据库的基本背景 ACID 基本概念解析 范式问题解析( Normalization ) 数据库的扩展性浅析 常见数据库系统回顾

Page 37: 数据库系统设计漫谈

数据存储的基本需求 存储数据 读写的性能( Hash 查找、 B*Tree 查找) 数据的可靠性( Durability )支持

如何避免单点故障带来的数据丢失(数据保护) 是否支持多维查询(基于关系的查询) 对 Replication 的支持如何? 支撑 Scalability 的复杂度

Page 38: 数据库系统设计漫谈

MySQL (Innodb) & Oracle

传统的关系数据库 支持多维索引

Oracle 的支持较好 MySQL 要到 5.6才比较好的支持 Index 内 Filter

较好的支持数据的一致性 成熟的 MVCC 设计 成熟的 Replication 设计

简单查询的效率略低于 Memcached B*Tree 的成本 MVCC带来的额外成本

Page 39: 数据库系统设计漫谈

MySQL & Oracle

在进行数据库扩展时 只能依赖于应用层的拆分(即: Sharding ) 目前 Sharding 支持由 TDDL 实现 维护成本会相对较高 维护复杂度也比较高

软件的成本 Oracle 为商业软件,有 License费用 MySQL 为开源软件,没有软件本身的费用

Page 40: 数据库系统设计漫谈

Tair 简介

Page 41: 数据库系统设计漫谈

Tair 主要技术点 主要定位为

分布式 Key/Value 缓存 Data Server 的具体实现

Memory Engine 的实现类似于 MemCached Config Server 的实现

基于 Consistent Hash 实现集群的数据分布 基于此做 Replication 做节点的故障检测与剔除 新加入节点时需要基于 CHash 做节点 Rebalance

Page 42: 数据库系统设计漫谈

Hashmap

Slab List

Tair mdb 内存结构

Page 43: 数据库系统设计漫谈

Consistent Hash 简介

Page 44: 数据库系统设计漫谈

OceanBase 系统架构44

主控服务器 RootServer :主 +备,数据定位 / 全局 Schema/机器管理… 动态数据服务器 UpdateServer :主 +备,实时修改 ( 内存 +SSD) 静态数据服务器 ChunkServer :多台,静态数据存储 (磁盘或 SSD) 动态数据不断地被合并到静态 ChunkServer 中实现分布式存储

JavaClient

ChunkServer

ChunkServer

ChunkServer

ChunkServer

RootServer/ UpdateServer

( 主 )

RootServer/ UpdateServer

(备 )

Page 45: 数据库系统设计漫谈

OceanBase 简介 UpdateServer 负责所有的写入

本质上是一个读写分离的技术 对实时更新数据的查询可以在 US 的备库进行

ChunkServer 理论上可以无限扩展 查询操作需要合并 US+CS 的结果 Root Server 的职责类似于 Tair 的 Config Server 相对于 Tair 的优势

可以进行 Full Table扫描 可以进行范围数据查询 更好的 ACID 支持(目前支持 MVCC ) 不支持外键 + 唯一键( FK+UK )

Page 46: 数据库系统设计漫谈

集团现有数据库特性粗略比较Oracle MySQL Tair OceanBase HBase

读性能 高 高 高 中 中

写性能 高 中 高 高 高

一致性 高 高 低 高 - (除 FK/

UK )中

数据保护 高(双份存储)

中 +( 单机故障 )

低 高- (网络提交 ) 高-

多维查询 高 中(索引稍弱)

无 无 无

备库 高(Physical)

高 -(Logical)

低 (Logical) 高 -(Logical) 中 +(Logical)

读扩展能力 中 高 高 高 高

写扩展能力 低 低 高 中 高

扩展复杂度 高 中 低 低 低

软件成本 高 无 研发费用 研发费用 无