zoukankan      html  css  js  c++  java
  • 如何设计一个坚如磐石的数据层?

      在现代软件工程的开发应用和系统设计中,我们一般把软件系统的逻辑层次分为三层:展示层,处理层和数据层。数据层又可细分为缓存层,数据库层和文件存储层,如图:

     

      鉴于创建高性能程序的关键是多花时间在系统设计上,本文主要对软件系统的数据层优化设计做一些阐述和归纳总结。

     缓存

      在互联网系统中,缓存技术对高并发,高性能的帮助起着功不可没的作用。以目前使用最为广泛的是redis3.0版本为例,其有三种工作模式:

     

      以上3种模式都支持级联部署。针对不同数据量大小,一般可采用两种方案:

      如果数据量在10G以内,单master+3个哨兵集群即可。

      数据量在1T以上,采用集群模式,3主3从1备份,至少部署7个或者更多redis实例。可有效解决redis在分布式方面的需求,动态扩容,自动故障转移等。

    使用建议

      1,合理使用缓存的淘汰策略,redis提供了6种不同的策略。默认是noeviction ,当实际内存超出 maxmemory 时只能删和读,不会写。

      2,主动设置缓存的失效时间,为每个缓存对象设置一个随机范围内的失效时间,避免某些缓存大量失效,造成缓存雪崩,以至于引发级联故障。

      3,为避免遭受恶意查询请求,如查询不存在的订单,可考虑采用Google guava 提供的boolmFliter。其默认错误率是3%(可配置),5个哈希函数(mumurt,md5,crc300等) ,

        bit数组长度是七百多万,0.6M大小。 创建过滤器时,最好将大小设置为单号总量的2倍,以降低hashmap碰撞的概率,实现快速构建。

      4, 缓存需要刷新时,直接删除该缓存,让下一次请求去重新设置缓存,或者采用消息中间件异步刷新和定时刷新的方式。

      5,如果必须使用分布式事务(尽量避免),可考虑通过setNx(),而不使用数据库去实现。

    数据库

    一、安全性设计

      一般采取的安全策略为用户管理,存取控制、数据加密、审计跟踪和攻击检测。

    二、完整性设计

      1,在需求分析阶段制定完整的命名规范,尽量使用有意义的英文单词或缩写、下划线等组合,注释完备且正确。

      2,慎用目前主流DBMS都支持的触发器功能。一方面性能开销较大,另一方面触发器的多级触发不好控制,容易发生错误,如果需要用最好使用Before型语句级触发器。

      3,根据数据的约束的类型确定其实现的系统层次和方式,并提前考虑对性能的影响。一般情况下,字段约束尽量在数据库中,逻辑约束由应用程序去实现,并根据业务规则对数据库做细致的测试。

    三、应用设计

      应采用数据库连接池技术连接数据库,例如HikariCP ,并设置最大连接数,最小连接数,一个机械硬盘比较可靠稳定的最大连接数200左右,固态硬盘最大连接数是700左右。

      MySQL单表数据如果大于700万,Oracle单表数据大于5000万,会造成性能大幅下降,应考虑及时修改数据库虚拟内存、分库分表,或者建立数据库集群。

    文件

      目前应用较广的分布式文件系统有:FastDFS 和 HDFS ,FastDFS适合中小文件,HDFS适合非并发写的大文件。安装和使用都比较简单,都提供了对应接口API。

  • 相关阅读:
    Unity 执行命令行
    c#中的特性,以及一些思考
    miniui禁用combobox
    给textarea赋值并可编辑
    js不允许input输入空格
    使用OPENROWSET函数连接并访问远程数据库数据
    miniui 换页符点击无效
    AJAX基本结构及使用
    SQL Server查询数据库中包含某个值的表和字段
    js实现input输入框只能输入数字的功能
  • 原文地址:https://www.cnblogs.com/chuyuan/p/12016322.html
Copyright © 2011-2022 走看看