高并发,大容量,高性能数据库设计优化

1.数据存储css

     a.集中式----》分布式html

            复制m/s、切分前端

        a.1切分html5

             垂直切分(按功能模块)java

                 难点:跨域的表关联---》应用程序mysql

                            事务----------》分布式的事务(单独数据源的小事务,而后经过程序控制)nginx

                            某些表访问剧增-----》读写分离web

              读写分离(异构数据源之间的读写分离)redis

                  相同数据源,只须要master/slave算法

                  难点:异构数据源之间的全量复制问题

                            异构数据源之间的增量同步问题(解析日志)

              水平切分(按记录切分----》找规则)

       a.2 数据切分及整合的中间件 

                  了解其它中间件(服务框架中间件、消息中间件)

             mysqlProxy---->只针对mysql   LUA脚本

             amoeba ----->框架

                     ----->amoeba for mysql

                     ----->amoeba for Aladin

             corba ---->文档较少,能够关注 14年会有新版本发布。 

      b.引入NOSQL---》多种存储方案(不一样类型的数据,存储在不一样的数据源)

          nosql分类

                   key/value  内存数据库------->Memcached、redis

                   bson          文档数据库------->Mongodb

                                     db----database

                                     collections----table

                                     document----record

                   Column-Family 列数据库----->Cassandra/hbase

               ---------------------------前三种是聚合模型

                   关系            图数据库-------> neo4j

          nosql --->CAP理论

                  互联网的应用AP+BASE原则

       c.统一数据服务平台(让数据透明)-----》如何设计

          c.1 对外提供的统一的查询API,持久API

          c.2 可以支持异构数据源(关系、非关系)

          c.3数据源改造不须要大面积重构数据平台

          c.4性能优化(延迟加载、按需加载、热点缓存、异步并行加载)

               热点缓存:(热点规则、key规则、过时规则)

               异步并行加载

      d.数据同步

        d.1 相同的多数据源直接使用master/slave机制(数据量不太大)

        d.2 数据量特别大or异构数据源

              TimeTunnel2(tailFile组件、saveFile组件,dfswrite组件)

                     tailFile组件抓取日志增量、爬虫增量数据

                     saveFile 保存到磁盘

                     dfswrite写入hdfs

              DataX

                     异构数据源之间的导入导出工做

                     框架+插件的模式(读插件、写插件)

              Dbsync

       e.分布式缓存Memcached(key/value)

           e.1特色

                  内存存储(对内存要求高,对CPU要求低,选择对内存要求低对cpu要求高的应用部署在一块儿,节约硬件资源)

                  集中式的缓存(每台实例都是独立的,不支持通信,单点问题支持横向扩展,把客户端包含在一块儿是分布式的)

                  分布式扩展(支持动态添加机器)

                  Socket通信(只要支持socket得语言均可以支持其客户端。以java为例,就须要注意序列化的问题、序列化优化的问题)

                  特殊的内存分配机制(每一个对象最大只能1m)

                  缓存机制简单(就两次hash,一次定位实例,一次放入HashMap)

            e.2 安装启动

                  启动参数:-d,-m内存大小,-n、-f未来对调优很重要

            e.3Memcached基本命令

                  set/add/replace/cas/get/gets/incr/decr/delete/stats

            e.4 客户端操做

                  java客户端的操做优化:

                     e.4.1提炼接口

                     e.4.2用配置文件的方式代替硬编码初始化客户端

                     e.4.3单点问题---》备份

                            Memcachedb-->新浪BerkeleyDB

                            淘宝实现的cluster机制---》经过java语言实现的

                     e.4.4本地缓存(OSCache/EhCache)结合Memcached

                     e.4.5Memcached提供的java源码中都是用java5以前的

                            线程处理技术,会影响性能。用锁对象替换synchronized,用java5提供的线程安全的集合类提供性能

                    e.4.6java中客户端读数据时,是单字节读取的

           e.5集群操做

                一致性hash运算   c(libMemcached已经实现了该操做)

                自己服务器端是不直接支持集群的。

                Memcached不少时候都用在了数据库前端缓存

                MSM(Memcached session manager)

                

                网站架构中的缓存

                       页面缓存(OSCache,EhCache)

                       页面静态化(io/xml+xslt)

                       页面局部缓存(OSCache/EhCache/Etag)-->用的都是标签

                       浏览器缓存(header操做/浏览器插件/html5)

                       反响代理服务器缓存(nginx+squid)

                       webServer自己的缓存

          e.6 redis

                 支持更丰富的数据类型 key/value(二进制)

                 支持持久化(单点问题就解决了)

                 master/slave(master宕机以后slave自动升级)

               e.6.1string/ list/hashes(hashmap)/set/sorted-set

               e.6.2rdb方式 aof的方式

               e.6.3master/slave机制

                      当slave断开,从连以后,没有增量操做,会删除

                      slave以前全部的数据而后,从master重新所有获取

                      解决:增量读取                   

                      master宕机以后,slave自动升级(切换达到秒级实现redis自动切换功能达不到这个效率)

                      解决:keepalived

              e.6.4java客户端jedis(集群的问题)

              e.6.5redis优化

2.数据库的查询优化

     硬件规划:tpc(非盈利性组织,测试服务器性能,tpcc,tpmc科学数据)

     mysql查询优化:

              a.优化器模块

                a.1计算出最优的执行计划、

                a.2mysql新技术绕过它---handlersocket(把mysql改形成了nosql) 批量处理、长链接性能极高、全部数据都适合放入内存

              b.优化原则

                    找高并发的query语句

                    反复查看执行计划和性能瓶颈分析

                    用小结果集驱动大结果集---》和join算法有关

                    尽量在索引中完成排序

                    只返回本身须要的列

                    只用最有效的条件

                    尽可能减小join和子查询

              c.索引

                 利:排序的时候减低cpu的使用,查询的时候下降了IO

                 弊 : 若是列中创建索引,每次修改这列数据,都会更新索引

                 何时用:频繁做为查询条件,且修改较少的字段

                 索引失效:

                         在查询语句中索引字段上作任何的计算、函数、类型转换都会使得索引失效,变成全表扫描

                         在索引列上作模糊查询以通配符开头索引失效全表扫表

                         在索引列上使用!=,索引列失效

                          非等值链接 hash索引失效

              d.join优化

                     mysql join效率自己不好 join必定是不多用的(切分、适当的冗余)

                    d.1小结果集驱动大结果集

                    d.2尽可能被驱动表经过索引查询(注意索引失效的问题)

                    d.3 join_buffer_size的配置,尽可能增大

             e. order by优化

                   e.1尽可能在索引列上完成排序(注意索引失效问题)

                   e.2若是不能再索引列上要求增大max_length_for_sort_data

                        参数的设置,比返回的最长的列要大便可。

                        mysql内部有两种排序算法(老、新)

                   e.3只返回本身须要的列

                   e.4增大sort_buffer_size参数的设置

             f.group by 优化

                    先排序再分组

                    f.1同上e

                    f.2能再where中限定的不要去having限定(若是能够的话)

            g:DISTINCT

                   先排序再分组,而后每组取一条(同f)

 

      mysql Server优化:

                a.安装 ---》使用二进制、源码安装(gcc编译器)

                    icc(intel c comiler)编译器是新的技术,提升了源码中计算性能,使得查询性能默承认以提升30%左右(泛化的数字)

                b.淘宝80%的服务器安装的percona数据库

                    percona公司---》产品persona(对mysql源码进行了修改)

                    IO性能处理、内存处理、并发处理等方面都作了优化,并

                    提供了丰富的性能检测工具,percona必须源码安装,提供

                    了不少插件的接口,能够加入新技术。如flashCache(把mysql

                    的一级缓存改形成了二级缓存)

                 c.Mysql  query Cache

                     优势:

                     缺点:计算有消耗、存的结果集会重复存

      mysql 存储引擎

                     MyISAM

                         1.不支持事务、表关系

                         2.操做的是表锁、并发太多服务会宕掉

                         3.缓存的时候,只缓存索引不缓存真实的数据

                            ,真实的数据时经过OS级别的缓存,因此对内存要求低。

                     INNODB

                         1.支持事务和关系

                         2.操做的时候是行锁,支持并发操做

                         3.缓存的时候既要缓存索引也要缓存真实数据,对内存要求

                             高,有一个很是关键的参数设置,直接决定了数据库的性能

                            innodb_buffer_pool_size除掉独占内存和适当冗余所有 给它。

 

                   xtrdb

                      percona出品的xtrdb存储引擎彻底能够替代innodb

                     而且在并发和内存使用上有更多的提升

 

                mysql新技术:

                       handlersocket(淘宝内部客户端操做是封装成了中间件)

                       percona/xtrdb

                       flashCache

                       高性能的编译器intel c compile

                       了解高性能的分布式文件系统 ext3/ext4

 

      Oracle查询优化

             1.oracle共享池原理(必需要如出一辙简单的sql语句大小写、空格 、参数名称等要彻底如出一辙)

             2.不要让oracle作的太多

                2.1避免复杂的join和子查询

                2.2不要使用* (查询数据字典、列出全部列、用别名能够提升效率)

                2.3用EXISTS替换DISTINCT

                       DISTINCT 排序分组取单一

                2.4用UNION-ALL 替换UNION ( if possible)

                       UNION会先作union-all而后排序

            3.给优化器更明确的命令(索引使用--->避免索引失效)

               3.1若是有惟一性索引和非惟一性索引oracle只

                    识别惟一索引

               3.2若是是复合索引,复合索引的第一列必须出现才会使用索引

                    不然会作全表扫描

               3.3任何在索引列上的操做(函数、计算、类型转换等)

                    都会使得索引失效,而进行全表扫描

               3.4模糊查询时避免在索引列上使用前置通配符,不然索引失效

                    ,进行全表扫描

               3.5不要索引列上使用NOT操做,is null ,is not null

             4.细节上的影响

                 4.1多表查询的时候把条件限定后结果集最少的放在条件的最右边

                 4.2尽可能不要在列上作任何计算、函数、转换等,防止索引失效

                 4.3order by放在索引列上,并禁止使用表达式

                 4.4用where子句替换having字句(可能的话)

                 4.5用NOT EXISTS 替代NOT IN

                 4.6尽可能少使用等值链接替换非等值链接

3.数据库的设计优化

             3.1第一范式、二范式... ...五范式(解决数据的冗余)

             3.2范式和非范式集合使用(有的时候须要适当冗余数据减小join)

             3.3大字段垂直拆分、列的访问存在差别(有的列特别频繁,有的列不多访问)也要作垂直拆分

             3.4大表水平拆分

             3.5尽可能使用小的空间、尽可能使用运算快的数据类型(尽可能能用数字的用数字表示)

 

 

 

4.数据集成(统一数据服务平台)

   a.统一API,而且可以适应数据源的改造(面向对象的操做)

     关系数据库---->hibernate

     非关系型数据库---->spring-data  for Mongodb

                                     spring-data  for Mongodb  for Reids

    b.对象的属性和数据中的类型不必定直接匹配

        对象到数据源之间的类型映射转换

        数据源到对象之间的类型映射转换

    c.性能优化

          c.1热点缓存

               热点可配置

               二级缓存(一级缓存索引、二级缓存对象,过滤重复)

               过时(相对过时、绝对过时、事件过时--->消息中间件)

         c.2 异步并行加载(线程的异步设计)

                代理思想(代理模式实现)

                并行的执行容器(线程的操做)

5.业务层----》分布式架构---》soa

6.前端

      js/css合并

      js动态加载(labjs/require js/control js)

      mvc

 http://www.haozileung.com/post/102.html?jdfwkey=kokmm2

相关文章
相关标签/搜索