设计可扩展的oracle应用
TRANSCRIPT
设计可扩展的 Oracle 应用
我是谁 ?
Jametong@ 童家旺 work @alipay (2010.8-) Blog @http://www.dbthink.com/ mail@ [email protected] Weibo @ Jametong
议程
可扩展性 ? 纵向扩展 Vs 横向扩展 使用连接池 使用绑定变量 使用批量接口 使用各种缓存 范式化 Vs 反范式化
可扩展性 ?
可扩展性 ?
可扩展性 ?
可扩展性 ?
当我们增加一个系统中的资源,并能获取与增加的资源保持适当的比例关系的性能提升,我们就认为这个服务具备了伸缩性。
提供更多单位的服务 处理更大单元的工作量
http://www.dbthink.com/?p=352
Amdahl's law
使用多处理器进行 并行处理能够提升的性能的比例受限于程序中需要串行处理的比例 .
Maximum speedup <= p / ( 1 + f * (p – 1 )) P 为并行的数量 , F 没有提升的部分所占比
例 . Percentage improvement = • ( 1 – 1 / ( speedup factor ) ) *
100% Speedup factor 为上面等式的结果 .
http://en.wikipedia.org/wiki/Amdahl%27s_law
USL Scalability
使用多处理器进行 并行处理能够提升的性能的比例不仅受限于程序中需要串行处理的比例 , 还受限于进程之间的并发系数 .
Maximum speedup <=• p / ( 1 + f * ( p – 1 ) + k * p * ( p – 1 ) ) p 为并行的数量 , f 没有提升的部分所占比例 . k 为多个进程相互之间的交互影响
Oracle 中的 Enqueue 或者 Latch 争用 .
Guerrilla Capacity Planning Chapter 4 By Neil Gunther
可扩展性 ?
实现好的可扩展性,还可能吗?
http://www.dbthink.com/?p=352
可扩展性 ?
实现好的伸缩性,还可能吗?
完全可能
但是只有当我们在进行系统架构设计时充分考虑伸缩性时才可能实现
http://www.dbthink.com/?p=352
提高扩展能力的方式
拆分 —提高可并行处理的比例 异步 --- 降低系统之间的耦合度与争用 优化响应时间
降低单次处理的耗费的时间 / 资源 减少串行执行部分的比例
减少请求次数 批次处理 --- 降低需要进行处理的交互次数 使用缓存 --- 降低对后端的请求次数
横向扩展 Vs 纵向扩展 横向扩展 Vs 纵向扩展 水平拆分 ? 垂直拆分 ? 纵向扩展的限制 ?
单机处理能力 ? 设备 / 软件的维护费用 ? Oracle ExaData?
横向扩展的限制 ? 业务之间的耦合性 ? 系统架构的复杂性 ?
使用连接池
大家使用什么开发语言 ? Java ? PHP ? .NET ?
JBOSS connection Pool ? DBCP ? C3P0?
如果开发语言不支持 Connection Pool Oracle Database Resident
Connection Pooling Dedicated Server Vs Shared Server
使用连接池—性能比较
使用绑定变量
硬解析 – Hard Parse 软解析 – Soft Parse (Bind variable) 软软解析 – Softer Soft Parse
Session Cached Cursors 不解析
Parse Once Execute Many
不同解析方式下的性能
使用批量接口
使用批量提取接口 PStmt. setFetchSize(50) --- Java oci_set_prefetch($stid, 300); ---PHP
使用批量插入接口 Pstmt.AddBatch() ---Java oci_bind_array_by_name($stmt, ":c1", $arr
ay, 5, -1, SQLT_CHR); ---PHP
使用批量接口的性能
你了解哪些缓存 ?
缓存技术 ?
缓存方式 ?
缓存的内容 ?
使用各种缓存
缓存的使用场景 应用的读写比
使用缓存需要考虑的因素 缓存的一致性维护问题 数据的具体读写比 变更频率 业务对一致性的要求 使用何种缓存方式 .
范式化 vs 反范式化
为什么要进行范式化 ? 为什么要进行反范式化 ? 如何控制业务之间的耦合度 ? 改进行何种程度的反范式化 ? 反范式化带来的困难 ?
Any
Questions