如何设计一个坚如磐石的数据层?

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

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

 缓存

  在互联网系统中,缓存技术对高并发,高性能的帮助起着功不可没的作用。以目前使用最为广泛的是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万,Orange单表数据大于5000万,会造成性能大幅下降,应考虑及时修改数据库虚拟内存、分库分表,或者建立数据库集群。

文件

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

原文地址:https://www.cnblogs.com/chuyuan/p/12016322.html

时间: 2024-10-13 17:07:03

如何设计一个坚如磐石的数据层?的相关文章

Java基础-继承-编写一个Java应用程序,设计一个汽车类Vehicle,包含的属性有车轮个数 wheels和车重weight。小车类Car是Vehicle的子类,其中包含的属性有载人数 loader。卡车类Truck是Car类的子类,其中包含的属性有载重量payload。每个 类都有构造方法和输出相关数据的方法。最后,写一个测试类来测试这些类的功 能。

#29.编写一个Java应用程序,设计一个汽车类Vehicle,包含的属性有车轮个数 wheels和车重weight.小车类Car是Vehicle的子类,其中包含的属性有载人数 loader.卡车类Truck是Car类的子类,其中包含的属性有载重量payload.每个 类都有构造方法和输出相关数据的方法.最后,写一个测试类来测试这些类的功 能. package hanqi; public class Vehicle { private int wheels; private int weight

一个通用的数据访问层实现类

在java商城开发中以及人事系统开发中我们知道会涉及到很多的数据表,如果每一个数据库都按照我们开发人员所定义的那样一个表,一个实现类,然后是一个数据访问层接口,数据访问层实现类,业务逻辑层接口,业务逻辑层实现类...这样写下去,代码量无疑是很大的. 下面我们就介绍一个基本的数据访问层实现类,至于接口的定义,我想只要明白实现类,接口的定义应该很简单. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27

全球异地多活架构设计(二): 数据层的支持

要做到全球异地多活, 一定要在数据层支持多机房写入, 并且对大多数业务场景提供最终一致性的解决方案.原因如下: 跨洲的网络延迟在100ms的数量级,如果只有单点写, 对于用户体验是种灾难 对于高频操作来说,  如果做强一致性,那么任然受限于网络延迟, 对于用户体验是种灾难 既然决定要选择最终一致性, 那么随之而来就有两个问题需要解决: 跨机房的数据同步 多点写入时的数据冲突处理 一 .数据同步 数据的同步有几个核心问题需要考虑: 1.获取数据变更以及重放 2.不丢不重不乱序 3.避免数据回环同步

深度学习:从头设计一个TensorFlow3一样的新一代深度学习系统,到底需要把握哪些要点?

深度学习工具潮流滚滚,各种工具层出不穷.也有各种文章从易用性,可移植性,灵活性和效率方面对于各个系统进行比较.这篇文章希望从系统设计上面来讲来回答这个讨论这个问题:如果想到从头设计一个TensorFlow3一样的新一代深度学习系统,到底需要把握哪些要点. 计算单元:从layer abstraction到operator 大家熟悉的第一代深度学习系统,以cuda-convnet21和caffe为代表.这些系统主要的一大特点是提出了一个以深度学习计算层次layer为基本单元的计算单位.不同的laye

软件设计文档及数据流向图

1 数据流向图:张涛 033  2 软件设计结构图:马冀伟 034 3 软件概要设计详细设计文档:王树才  030 一:数据流向图 二:软件设计结构图 三: 软件概要设计详细设计文档 项目名称:  基于服务器的购物系统 1 数据层: 产生的数据有:物品的基本信息,包括名称, 数量,价格,类别,说明,图片:订单信息,包括订单提交时间,订单详情,订单失效时间:用户信息,包括用户名,登录密码,登录时间: 用户上传自己数据:物品名称,数量,价格,类别,说明,图片,用户手机号. 2 整体结构 1 用户登录

从研发人的角度评判怎样设计一个好的DCS系统

相信从事自动化或控制系统的同仁,应该了解Distributed Control System(简称DCS)的基本功能及其在工控行业的作用.从工程应用的角度,一个完整的DCS系统主要包括三个部分:HMI人机交互层.控制站层.仪表与执行机构层. HMI主要包括工程师站.监控站.历史站等,主要在具有较高稳定的PC上安装相应的软件构成.控制站层,主要实现相应的控制算法与逻辑,并通过相应的IO卡件采集数据和发送指令.仪表与执行机构,主要由各个厂家的智能变送器.电动机等组成. 由于仪表与执行机构,厂家众多,

设计一个移动应用的本地缓存机制

在手机应用程序开发中,为了降低与服务端的交互次数,加快用户的响应速度,一般都会在iOS设备中加一个缓存的机制,前面一篇文章介绍了iOS设备的内存缓存.这篇文章将设计一个本地缓存的机制. 功能需求 这个缓存机制满足以下这些功能. 1.能够将数据缓存到本地磁盘. 2.能够推断一个资源是否已经被缓存.假设已经被缓存.在请求同样的资源.先到本地磁盘搜索. 3.能够推断文件缓存什么时候过期.这里为了简单起见这里,我们在请求url资源的时候.给每次请求的文件设定一个过期的时间. 4.能够实现:假设文件已经被

如何设计一个RPC系统

版权声明:本文由韩伟原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/162 来源:腾云阁 https://www.qcloud.com/community RPC是一种方便的网络通信编程模型,由于和编程语言的高度结合,大大减少了处理网络数据的复杂度,让代码可读性也有可观的提高.但是RPC本身的构成却比较复杂,由于受到编程语言.网络模型.使用习惯的约束,有大量的妥协和取舍之处.本文就是通过分析几种流行的RPC实现案例,提供

数据层全栈式编程架构

CRUD全栈式编程架构之数据层的设计 CodeFirst 一直以来我们写应用的时候首先都是创建数据库 终于在orm支持codefirst之后,我们可以先建模. 通过模型去创建数据库,并且基于codefirst可以实现方便的 实现数据库迁移的工作.使用codefirst有以下几个技巧, 以EntityFramework为例,结合我这个设计做了以下改进 1.模型的识别 建立一个基类命名Entity,里面只有一个long类型的id字段. 所有需要映射到数据库的模型都继承自Entity, + 2.模型的