27
高高高高高高高高高 2011 高 8 高 28 高

Cenet salon.220904-高性能数据架构设计

  • Upload
    lu-ming

  • View
    1.967

  • Download
    5

Embed Size (px)

Citation preview

Page 1: Cenet salon.220904-高性能数据架构设计

高性能数据架构设计

2011 年 8 月 28 日

Page 2: Cenet salon.220904-高性能数据架构设计

这是一些实践过的简单而有效的数据架构技巧的集合。

好的架构不是庞大而看上去完美的,而一定是简单而有效的

抛砖引玉,希望能引发关于数据架构的讨论和思考。

Page 3: Cenet salon.220904-高性能数据架构设计

用户登录的场景

Page 4: Cenet salon.220904-高性能数据架构设计

一个常见的 Web 应用数据架构场景 用户输入用户名和密码登录到系统中 系统进行用户名密码检验,如果用户验证有效,则允

许用户登录系统 用户登录系统之后,显示用户状态,例如用户名,帐

户积分,余额或者其他通知与消息

Page 5: Cenet salon.220904-高性能数据架构设计

用户登录的数据库操作原型 Select UserID from tblUser

where UserName = ‘LoginName’ and UserPassword = ‘PasswordMD5’

Page 6: Cenet salon.220904-高性能数据架构设计

SQL 分析 功能实现了,性能呢?

如果数据库为 UTF-8 编码 LoginName 为电子邮件,则长度可能为 20-40 个字节。 Password 长度可能为 6-20 个字节长。 则当文本数据索引较大则基于内存的索引查询命中率降低,大量

读取磁盘造成性能较慢。

解决之道, 将 UTF-8 字段的字符串转换为 Hash 编码的数值,每个整型数据

占用 MySQL 数据库 4 个字节。基于内存的索引查询数据量增加将近 10 倍。

Page 7: Cenet salon.220904-高性能数据架构设计

经验总结 在进行文本检索的时候,尽量将文本的 Hash 值进行索引,

并通过索引进行查询,以提升系统查询性能。

注意 采用的 Hash 算法的冲突较少,算法性能较好。 Hash 计算之前要首先统一字符串编码。例如,同样” Hello ,工

程师社区”在通过 UTF-8 和 Unicode 编码, Hash 数值也会不同。 使用自己的 Hash 算法,而不要使用 SDK 库提供的 Hash 算法。

不同语言的 Hash 算法不同。 甚至,同一种语言的 HashCode() 的数值也不同,如 .NET

Framework 。

Page 8: Cenet salon.220904-高性能数据架构设计

优化之后的 SQL 原型Select UserID from tblUser where UserNameHash = -1234589 and UserPasswordHash = 123456

Select UserID from tblUser where UserNameHash = -1234589 and UserPasswordHash = 123456 andUserName = ‘LoginName’ and UserPassword = ‘PasswordMD5’

Page 9: Cenet salon.220904-高性能数据架构设计

获得用户积分信息原型Select sum(tblUserReputation.Reputation), tblUser.UserName, tblUser.UserLevelfrom tblUser, tblUserReputationwhere tblUser.ID = tblUserReputation.UserID

Page 10: Cenet salon.220904-高性能数据架构设计

应用分析 多表关联查询聚合数据背后的设计

数据库索引 3NF 与 2NF 实时数据与相对实时数据 物化视图(视图索引)

Page 11: Cenet salon.220904-高性能数据架构设计

数据库索引 数据库索引

索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。

Hash 索引 vs. B- 树索引 Hash 索引可以一次定位 B- 树索引多次 IO ,从根节点到枝节点

Page 12: Cenet salon.220904-高性能数据架构设计

3NF vs. 2NF 3NF

多表关联查询,损失性能

2NF 部分情况下,将常用的用户状态信息,统计信息,定期执

行之后以 2NF 存储,则数据读取性能更好。 甚至,在数据表中建立 Setting 字段,通过 CSV 或者

XML 格式进行半结构化数据存储,既能保证数据库设计的“弹性”,也可以减小多表关联查询。

需要注意的是数据一致性检验和相对实时。

Page 13: Cenet salon.220904-高性能数据架构设计

相对实时的场景使用不同的数据管理方式 很多场景,数据并不要求绝对实时,只需要相对实时

异步队列 数据缓存,复制与分发 2NF

Page 14: Cenet salon.220904-高性能数据架构设计

用户行为与日志类型数据

Page 15: Cenet salon.220904-高性能数据架构设计

不同策略 集中 vs. 分散 数据库 vs. 文件系统 同步 vs. 异步 CSV vs. XML

建议对于日志型数据采用 集中存储 文件系统分级管理 异步存储 CSV 格式

不建议将日志数据存入数据库中。

Page 16: Cenet salon.220904-高性能数据架构设计

用户互动与 SNS 信息

Page 17: Cenet salon.220904-高性能数据架构设计

基于内存数据库的缓存技术 实时性强、访问频繁、并发访问量大的数据,可以通过

内存数据库实现

内存数据库特点 高性能 高速缓存 快速实现与部署

2011 年 11 月 CatchException.NET沙龙将专题讨论

Page 18: Cenet salon.220904-高性能数据架构设计

查找内容或人名

Page 19: Cenet salon.220904-高性能数据架构设计

全文检索技术 全文检索

全文检索对于非结构化和半结构化数据进行检索 为何不推荐使用 SQL Server 或者 Oracle全文检索 分词与噪声词 中文分词与逆序词典

结构化数据、非结构化数据与半结构化数据

Page 20: Cenet salon.220904-高性能数据架构设计

查找人名、地名、机构名称的方法 姓名二分法分词 基于拼音查找 基于首字母缩略词查找

通过坡度,确保连续字词查找质量

Page 21: Cenet salon.220904-高性能数据架构设计

系统演进与架构腐化

Page 22: Cenet salon.220904-高性能数据架构设计

数据架构腐化 状态值与状态图的维护 过多的补丁造成复杂的多表联合查询 字段语义的变化 不恰当的非结构化与半结构化数据管理 不恰当的日志类型数据管理 不恰当的索引设计 不恰当的 3NF 或者 2NF 设计

磁盘碎片与索引碎片

Page 23: Cenet salon.220904-高性能数据架构设计

风险与策略

Page 24: Cenet salon.220904-高性能数据架构设计

常见的风险 缓存数据与数据库内容不一致 系统现代化改造过程中字段定义的改变 死锁 单点故障风险

非结构化索引数据存储 日志类型数据存储

Page 25: Cenet salon.220904-高性能数据架构设计

应对之道 存储与服务节点可用性风险

基于 NAS / SAN 的存储方案 缓存系统的集群 反向代理管理集群节点

数据处理风险 通过 Data Engine层封装所有对于数据的操作 对外暴露 SOA接口,提供服务。例如, Thrift, Web

Services, JSON , MQ等。

Page 27: Cenet salon.220904-高性能数据架构设计

近期沙龙计划 2011 年 9 月

实时交易系统技术方案

2011 年 10 月 跨平台移动应用开发

2011 年 11 月 海量数据与高并发系统

2011 年 12 月 企业 IT战略管理与策略

报名流程 注册

CatchException.NET ,并完善个人档案和照片

报名沙龙http://salon.catchexception.net/?page_id=55

费用 沙龙免费,如收费另行通知 如果在咖啡厅或酒吧举行沙龙,请点一杯咖啡。