Upload
lu-ming
View
1.967
Download
5
Embed Size (px)
Citation preview
高性能数据架构设计
2011 年 8 月 28 日
这是一些实践过的简单而有效的数据架构技巧的集合。
好的架构不是庞大而看上去完美的,而一定是简单而有效的
抛砖引玉,希望能引发关于数据架构的讨论和思考。
用户登录的场景
一个常见的 Web 应用数据架构场景 用户输入用户名和密码登录到系统中 系统进行用户名密码检验,如果用户验证有效,则允
许用户登录系统 用户登录系统之后,显示用户状态,例如用户名,帐
户积分,余额或者其他通知与消息
用户登录的数据库操作原型 Select UserID from tblUser
where UserName = ‘LoginName’ and UserPassword = ‘PasswordMD5’
SQL 分析 功能实现了,性能呢?
如果数据库为 UTF-8 编码 LoginName 为电子邮件,则长度可能为 20-40 个字节。 Password 长度可能为 6-20 个字节长。 则当文本数据索引较大则基于内存的索引查询命中率降低,大量
读取磁盘造成性能较慢。
解决之道, 将 UTF-8 字段的字符串转换为 Hash 编码的数值,每个整型数据
占用 MySQL 数据库 4 个字节。基于内存的索引查询数据量增加将近 10 倍。
经验总结 在进行文本检索的时候,尽量将文本的 Hash 值进行索引,
并通过索引进行查询,以提升系统查询性能。
注意 采用的 Hash 算法的冲突较少,算法性能较好。 Hash 计算之前要首先统一字符串编码。例如,同样” Hello ,工
程师社区”在通过 UTF-8 和 Unicode 编码, Hash 数值也会不同。 使用自己的 Hash 算法,而不要使用 SDK 库提供的 Hash 算法。
不同语言的 Hash 算法不同。 甚至,同一种语言的 HashCode() 的数值也不同,如 .NET
Framework 。
优化之后的 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’
获得用户积分信息原型Select sum(tblUserReputation.Reputation), tblUser.UserName, tblUser.UserLevelfrom tblUser, tblUserReputationwhere tblUser.ID = tblUserReputation.UserID
应用分析 多表关联查询聚合数据背后的设计
数据库索引 3NF 与 2NF 实时数据与相对实时数据 物化视图(视图索引)
数据库索引 数据库索引
索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。
Hash 索引 vs. B- 树索引 Hash 索引可以一次定位 B- 树索引多次 IO ,从根节点到枝节点
3NF vs. 2NF 3NF
多表关联查询,损失性能
2NF 部分情况下,将常用的用户状态信息,统计信息,定期执
行之后以 2NF 存储,则数据读取性能更好。 甚至,在数据表中建立 Setting 字段,通过 CSV 或者
XML 格式进行半结构化数据存储,既能保证数据库设计的“弹性”,也可以减小多表关联查询。
需要注意的是数据一致性检验和相对实时。
相对实时的场景使用不同的数据管理方式 很多场景,数据并不要求绝对实时,只需要相对实时
异步队列 数据缓存,复制与分发 2NF
用户行为与日志类型数据
不同策略 集中 vs. 分散 数据库 vs. 文件系统 同步 vs. 异步 CSV vs. XML
建议对于日志型数据采用 集中存储 文件系统分级管理 异步存储 CSV 格式
不建议将日志数据存入数据库中。
用户互动与 SNS 信息
基于内存数据库的缓存技术 实时性强、访问频繁、并发访问量大的数据,可以通过
内存数据库实现
内存数据库特点 高性能 高速缓存 快速实现与部署
2011 年 11 月 CatchException.NET沙龙将专题讨论
查找内容或人名
全文检索技术 全文检索
全文检索对于非结构化和半结构化数据进行检索 为何不推荐使用 SQL Server 或者 Oracle全文检索 分词与噪声词 中文分词与逆序词典
结构化数据、非结构化数据与半结构化数据
查找人名、地名、机构名称的方法 姓名二分法分词 基于拼音查找 基于首字母缩略词查找
通过坡度,确保连续字词查找质量
系统演进与架构腐化
数据架构腐化 状态值与状态图的维护 过多的补丁造成复杂的多表联合查询 字段语义的变化 不恰当的非结构化与半结构化数据管理 不恰当的日志类型数据管理 不恰当的索引设计 不恰当的 3NF 或者 2NF 设计
磁盘碎片与索引碎片
风险与策略
常见的风险 缓存数据与数据库内容不一致 系统现代化改造过程中字段定义的改变 死锁 单点故障风险
非结构化索引数据存储 日志类型数据存储
应对之道 存储与服务节点可用性风险
基于 NAS / SAN 的存储方案 缓存系统的集群 反向代理管理集群节点
数据处理风险 通过 Data Engine层封装所有对于数据的操作 对外暴露 SOA接口,提供服务。例如, Thrift, Web
Services, JSON , MQ等。
FAQ 问题答疑
http://CatchException.NET
分享者 陆明
http://www.catchexception.net/PublicProfile/1/3254785944065506726
近期沙龙计划 2011 年 9 月
实时交易系统技术方案
2011 年 10 月 跨平台移动应用开发
2011 年 11 月 海量数据与高并发系统
2011 年 12 月 企业 IT战略管理与策略
报名流程 注册
CatchException.NET ,并完善个人档案和照片
报名沙龙http://salon.catchexception.net/?page_id=55
费用 沙龙免费,如收费另行通知 如果在咖啡厅或酒吧举行沙龙,请点一杯咖啡。