精华内容
下载资源
问答
  • 非常感谢http://blog.csdn.net/lizhitao/article/details/9323137 高并发图片存储服务架构技术学习 https://www.itkc8.com  互联网公司高并发图片处理中间层服务架构设计   目录 背景 1 大吞吐量服...

    非常感谢http://blog.csdn.net/lizhitao/article/details/9323137

    高并发图片存储服务架构技术学习 https://www.itkc8.com 

    互联网公司高并发图片处理中间层服务架构设计                                 

                                  目录

    背景 1

    大吞吐量服务端架构设计要考虑四个技术点 1

    编程语言和编译优化 2

    下面说一下单进程多线程模型 2

    多进程服务器: 3

    图片压缩算法(jpeg,png,gif) 4

    高效分布式文件存储系统选型 4

    Linux系统中sysctl参数优化(TCP高级选项设置) 5

    背景

    本文分析互联网公司高并发高吞吐量(访问)下图片处理(主要是图片压缩或变换)中间层服务架构设计,互联网公司经常会有大量原始图片上传,而且一个原图会在页面以不同尺寸缩略图显示,一般有两种策略生成缩略图,一种在上传图片时,生成需要的多张不同缩略图,另一种是请求指定尺寸的图片时实时生存缩略图片,第一种方式有一定限制,就是需要提前知道所有尺寸的图片,做雍余存储,无形中增加大量文件数量,如果文件系统设计不好,还有可能形成大量文件碎片,而且会消耗大量存储空间,如果前端ui设计改变了图片大小,需要重新生成。而第二种方式更加灵活,但是更消耗cpu资源,属于cpu密集计算型,以上两种方式优缺点一目了然,如果选择就要看公司服务器资源侧重点了。 

    我只是把个人见解做一下分析,不准确地方欢迎大家指出。

    大吞吐量服务端架构设计要考虑四个技术点

    编程语言和编译优化

    技术选型,是单进程多线程模型(reactor事件机制),还是多进程模型.

    图片压缩算法

    高效分布式文件存储系统选型。

    Linux系统中sysctl参数优化(TCP高级选项设置)

     

    编程语言和编译优化

    互联网行业用Java开发语言比较多,而且开发人员成熟,而且经验丰富。

    高性能网络框架:netty,mina等等,而且资料比较,社区比较活跃。而且有大量内置的图像处理API和算法直接使用.对于jdk自带的一套图片处理库,他的特点是稳定简单,但是对图片处理来说,性能确实很差!离实际线上要求差距很大。不过java方面也提供了类似jni方式支持GraphicsMagick+im4java处理图像,但是要原生态支持openmpi,tbb,OpenCV等就比较繁琐了,要用jni方式调用大量动态或静态库。一个性能问题,二是如果出现内存问题也不好控制。

    C语言:

    1.有成熟图像处理库GraphicsMagick和opencv,

    2.有可以很容易实现多进程模式。

    3.容易用其他编译器做优化,比如用intel icc编译,可以大幅度提高性能。

    4.多进程中每个进程方面绑定到每个cpu核上,实现操作系统每个cpu核上队列相同,均衡调度,更容易发挥目前多核cpu性能!

     

    下面说一下单进程多线程模型

    主线程负责侦听listen,注册accept和新进来连接,然后把连接socket转交给work thread pool进行读写事件注册,计算逻辑处理

    reactor事件机制:

    Reactor释义“反应堆”,是一种事件驱动机制。和普通函数调用的不同之处在于:应用程序不是主动的调用某个API完成处理,而是恰恰相反,Reactor逆置了事件处理流程,应用程序需要提供相应的接口并注册到Reactor上,如果相应的时间发生,Reactor将主动调用应用程序注册的接口,这些接口又称为“回调函数”.

     Reactor模式的优点

    Reactor模式是编写高性能网络服务器的必备技术之一,它具有如下的优点:
        1)响应快,不必为单个同步时间所阻塞,虽然Reactor本身依然是同步的;
        2)编程相对简单,可以最大程度的避免复杂的多线程及同步问题,并且避免了多线程/进程的切换开销;
        3)可扩展性,可以方便的通过增加Reactor实例个数来充分利用CPU资源;
        4)可复用性,reactor框架本身与具体事件处理逻辑无关,具有很高的复用性;

    多进程服务器:

    每个进程处理多个connection,使用epoll事件驱动来管理这些连接,多个worker进程之间是对等的,他们同等竞争来自客户端的请求,各进程互相之间是独立的

    master由信号驱动,worker由epoll驱动(当然信号会让epoll_wait返回),有更好的容错性,如果其中一个进程挂了或产生core,master收到相关信号后,会同时重启一个进程,并同时发送出相关监控信息,也不会导致不能提供服务,

    多进程用来利用多CPU硬件,所以按照业务边界来划分进程,或者就按CPU个数配置。

    每个进程是单线程的:所有IO相关操作都是全异步处理方式, 避免多线程切换和锁机制开销

    进程之间抢占epoll资源时,仅用一个轻量级的共享内存锁,循环依次把连接事件放入队列,然后循环处理每个客户端的连接请求和逻辑处理。

    高性能:服务器若支持多CPU或超线程,多线程无法完全利用机器性能,多进程则可以让服务器满载.

     

     

     

    图片压缩算法(jpeg,png,gif)

    目前图像压缩算法已经成型,而且基本上都是搞数学方面的大牛发明的,

    关于图像处理方面可以参考如下:http://blog.csdn.NET/lizhitao/article/details/9317521

    图片压缩或处理是一个非常消耗cpu的操作计算量非常大,因为要进行大量矩阵,傅立叶变换、沃尔什变换、离散余弦变换,图像噪声处理等变换或计算.目前高性能图像处理开源软件有2种GraphicsMagick和opecv。

    GraphicsMagick:

    GraphicsMagick号称图像处理领域的瑞士军刀。 短小精悍的代码却提供了一个鲁棒、高效的工具和库集合,来处理图像的读取、写入和操作,支持超过88种图像格式,包括重要的DPX、GIF、JPEG、JPEG-2000、PNG、PDF、PNM和TIFF等等。

    通过使用OpenMP可是利用多线程进行图片处理,增强了通过扩展CPU提高处理能力。

    注意:但是GraphicsMagick启动多线程时,处理速度虽然加快了,但是cpu确大幅飙升。

    Opencv:

    OpenCV于1999年由Intel建立,如今由Willow Garage提供支持。OpenCV是一个基于[1](开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows和Mac OS操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。[2]最新版本是2.4.5。

    OpenCV 拥有包括 300 多个C函数的跨平台的中、高层 API。它不依赖于其它的外部库——尽管也可以使用某些外部库。

    注意:opencv目前支持jpeg,tiff,png,但是由于版权和法律方面原因不支持gif图像处理,png只是有限支持,图像压缩时会变形或变模糊。

     

    GraphicsMagick与Opencv比较优缺点:

    GraphicsMagick支持图像多,覆盖面全,几乎所有常见图像格式.压缩质量高

    Opencv支持有限的图像处理,覆盖面不全,经过大量压力测试综合比较,但是压缩性能确比GraphicsMagick快一倍多。

    综合两者的优点:需要把两者结合起来混合处理不同图像,以达到图像处理最佳性能。

    高效分布式文件存储系统选型

    互联网图片文件存储,一般考虑带宽,存储空间方面压力,经过压缩大小不会2MB。因此存储方案就有多种选择,既可以选择传统MySQL数据库,也可以用成熟的分布式文件系统.下面就来说说他们的不同和优缺点。

    用mysql做存储:

    1.互联网公司都用mysql的丰富经验,技术成熟,众多人都会用mysql,而且还有专业的DBA团队来维护。

    2.Mysq性能稳定,单台机器加上内存,基本能满足QPS性能要求。

    3.存储图片的表结构属性少,结构简单,一般访问时只需要查询主键就可以了,不需求简历额外的索引。

    4.去中心化设计,两台服务器为一组,双写随机读(任意一台服务器),服务器为raid5模式。

    5.系统扩容,每当当前服务器存储空间不足,需要增加服务器扩容时,都需要成倍增加服务器数量.

     

     

    用分布式文件做存储

    1.一般是直接使用成熟开源产品或自主研发,使用开源产品,开发成本低,学习成本高,需要专门花费一些进行研究或学习。还要自己来维护。自主研发,时间周期长,投入成本更高,但可控性更强。能进行大量性能优化和调整,或许能节省一些服务器资源。

    2.同等条件下分布式文件系统性能一般会比mysql等关系型数据库高3-5倍,因为它不需求进行B+Tree(时间复杂度 )分页查找,文件在上传时,其生成的文件名就包含了大量文件具体位置信息,一般o(1)时间就能准备定位。而且是顺序一次性读取。不想B+Tree按页式存储,可能要多次读取多页数据,而且每条记录需求存储额外信息,进行事物回滚处理,比较浪费存储空间。

    3.中心化设计(一般为meta server和data server两类服务器组集群),两或三台服务器为一组,双写随机读(任意一台服务器),可以不用raid5模式。

    4.系统扩容,每当当前服务器存储空间不足,可以轻易做到线性扩展,只需要增加一组服务器就可以了。明显在成本上具有优势。

     

    Linux系统中sysctl参数优化(TCP高级选项设置)

    服务器在高并发时,会创建大量连接,这就需要设置TCP相关参数来提供服务器性能。

    1.文件描述符最大数调整。

       修改 vi /etc/security/limits.conf 值

          在里面添加一行

          * - nofile 65535
        保存重启,再用命令ulimit -n 可发现文件描述符由默认变成65535了

    2.高负载linux服务器的内核调优
    vi /etc/sysctl.conf,修改内核参数:
    kernel.shmall = 268435456
    net.ipv4.tcp_syncookies = 1
    net.ipv4.tcp_tw_reuse = 1
    net.ipv4.tcp_tw_recycle = 1
    net.ipv4.tcp_fin_timeout = 30
    net.ipv4.tcp_keepalive_time = 1200
    net.ipv4.ip_local_port_range = 1024 65000
    net.ipv4.tcp_max_tw_buckets = 5000
    net.ipv4.tcp_max_tw_buckets = 5000
    net.ipv4.tcp_fin_timeout = 30
    net.ipv4.tcp_keepalive_time = 300
    net.ipv4.tcp_syncookies = 1
    net.ipv4.tcp_tw_reuse = 1
    net.ipv4.tcp_tw_recycle = 1
    net.ipv4.ip_local_port_range = 5000 65000
    net.ipv4.tcp_mem = 786432 1048576 1572864
    net.core.wmem_max = 873200
    net.core.rmem_max = 873200
    net.ipv4.tcp_wmem = 8192 436600 873200
    net.ipv4.tcp_rmem = 32768 436600 873200
    net.core.somaxconn = 256
    net.core.netdev_max_backlog = 1000
    net.ipv4.tcp_max_syn_backlog = 2048
    net.ipv4.tcp_retries2 = 5
    net.ipv4.tcp_keepalive_time = 500
    net.ipv4.tcp_keepalive_intvl = 30
    net.ipv4.tcp_keepalive_probes = 3
    net.ipv4.conf.lo.arp_ignore = 0
    net.ipv4.conf.lo.arp_announce = 0
    net.ipv4.conf.all.arp_ignore = 0
    net.ipv4.conf.all.arp_announce = 0

    3.参数说明:
    net.ipv4.tcp_syncookies = 1
    #表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;
    net.ipv4.tcp_tw_reuse = 1
    #表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
    net.ipv4.tcp_tw_recycle = 1
    #表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。
    net.ipv4.tcp_fin_timeout = 30
    #表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。
    net.ipv4.tcp_keepalive_time = 1200 
    #表示当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时,改为20分钟。
    net.ipv4.ip_local_port_range = 1024    65000 
    #表示用于向外连接的端口范围。缺省情况下很小:32768到61000,改为1024到65000。
    net.ipv4.tcp_max_tw_buckets = 5000
    #表示系统同时保持TIME_WAIT套接字的最大数量,如果超过这个数字,
    #TIME_WAIT套接字将立刻被清除并打印警告信息。默认为180000,改为5000。

    高并发图片存储服务架构技术学习 https://www.itkc8.com 

    后续会分享一下pic server中间层服务器如何设计的,其100-200KB设置缩略图尺寸100*75,实时压缩(计算)如何达到单台机器1000左右/QPS的

    硬件服务器配置:戴尔PowerEdge R710 八核16线程     Xeon E5620 2.4GHz

     

    展开全文
  • picRepository 这只是存储我的互联网图片资源
  • 行业分类-物理装置-一种基于互联网照片分发、存储、交易方法.zip
  • 互联网的标准技术架构如下图所示,这张图基本涵盖了互联网技术公司的大部分技术点,不同的公司只是在具体的技术实现上稍有差异,但不会跳出这个框架的范围。 互联网架构模板的“存储层”技术 SQL层 NOSQL层 小文件...

    互联网的标准技术架构如下图所示,这张图基本涵盖了互联网技术公司的大部分技术点,不同的公司只是在具体的技术实现上稍有差异,但不会跳出这个框架的范围。在这里插入图片描述

    互联网架构模板的“存储层”技术

    SQL层
    NOSQL层
    小文件存储:开源的,HBase,Hadoop,Hypertable,FastDFS等都可以作为小文件存储的底层平台。如果使用了阿里云,有存储系统OSS。
    大文件存储:互联网行业的大文件主要分为两类:一类是业务上的大数据,例如Youtube的视频、电影网站的电影;另一类是海量的日志数据,例如各种访问日志,操作日志,用户轨迹日志等。关于大数据的开源方案现在已经非常成熟了,例如Hadoop,Hbase,Storm,HIve等。
    在这里插入图片描述

    展开全文
  • 我们继续互联网技术架构-分布式存储。 总目录: 分布式存储概述 分布式存储特性 - 哈希分布/一致性哈希分布 分布式存储协议 - 两阶段与Paxos

    我们继续互联网技术架构-分布式存储。

    总目录

    • 分布式存储概述

    • 分布式存储特性 - 哈希分布/一致性哈希分布

    • 分布式存储协议 - 两阶段与Paxos

    1. 概述

    分布式存储作为互联网之核心基石,没有分布式海量存储就好比无源之水。分布式系统不是什么新鲜事物,教科书里已经研究了好多年,但是不温不火,直到近年互联网大数据应用的兴起才使得它大规模的应用到工程实践中,其主要特点概括为:规模大+成本低。现在的大型互联网公司少则几百几千个PC服务器,多的达到数百万级别低成本PC服务器集群;

    总体来说,分布式存储需要具备以下一些要素:

    • 可扩展:灵活水平扩展到成百上千上万,并且整体性能线性增长

    • 低成本:构建与低成本PC,兼备自动容错,自动负载均衡等机制。

    • 高性能:秒,毫秒,亚秒级别。

    • 易用:构建生态环境,与其它系统集成,如监控,运维,数据导入。

    分布式存储的挑战来源自于其设计的两个技术领域:分布式 + 存储:

    • 数据分布式:数据如何分布,数据如何跨服务器读写?

    • 一致性:数据如何replication,多个副本之间又如何同步

    • 容错:检测,并迁移故障服务器上的数据

    • 负载均衡:如何“空中加油”,运行中添加,卸载服务器

    • 事务并发:分布式事务,并发控制

    分布式存储数据分类:

    按照其所处理的数据类型来分的话,大体分为

    • 非结构化数据:如文本,图像,图片,视频,音频等

    • 结构化数据:类似关系型数据库

    • 半结构化数据:介于上面二者之间,如HTML文档,换言之其模式结构于内容混合。

    分布式存储系统分类:

    有了数据,我们看一下容器如何划分:

    • 分布式文件系统:存储非结构化文件对象;如FB Haystack; GFS, HDFS

    • 分布式键值系统:存储半结构化数据,如Amazon Dynamo, Memcache

    • 分布式表格:存储半结构化数据,如BigTable,HBase, DynamoDB

    • 分布式数据库:存储结构化数据,如MySQL Sharding, Amazon RDS,以及阿里OceanBase.

    2. 分布式存储特性

    分布式存储包括了数据的分布,复制,一致性,容错等。

    一致性:分布式存储系统会将数据冗余备份,称之为replication/copy. 副本是目前分布式存储系统容错的唯一方法。如有3个客户端A,B,C

      • 强一致:如A先写入,系统保证后续A,B,C的读去都返回最新值

      • 弱一致:如A先写入,系统保证后续A,B,C的读去都返回最新值

      • 最终一致:“最终”只有个时间的延迟,如replication等,如A先写入,同时假设后续无其他更新相同的值,“最终”A,B,C都会读到A写入的最新值

    数据分布:分布式存储当然会设计数据如何分布了,同时要考虑自动负载均衡

    哈希分布无需多说,类似HashMap的index了,基本思路都是选取某业务相关主键key,然后    hash(key) % N(服务器数量), 当然如果这里hash函数的散列性比较好的话,数据可以比较均匀的分布到集群。

    上面可以么?如果仔细看过HashMap的极客们应该知道,当HashMap的数量超过一定负载后,需要resize, rehash。这有什么问题么?内存处理当然没什么大问题,这可是分布式存储啊,你这么一resize,rehash可不得了,涉及很多数据的迁移,耗时耗力。况且,分布式会动态增加,卸载节点,都不用超过一定数量限制。如何解决?

    一致性哈希(Distributed Hash Table, DHT)算法如下,给系统每个节点分配一个随机token,使得这些token构成一个哈希环,存放时,根据hash(key)的值,存放到顺时针第一个大于/等于该值的token所在节点。这样,每次节点的变更只会影响哈希环中相邻的节点,对其他没有影响。



    如上图所示,假设哈希空间为0-2^32-1大小:
    1>
    首先求出每个服务器node的hash值(一般情况下对机器的hash计算是采用机器的IP或者机器唯一的别名作为输入值),将其分配到圆环上

    2>采用同样算法计算待存储对象的keyhash值,将其分配到这个圆环
    3>
    开始顺时针查找,并分配到第一个找到的服务器节点

    通过上图可以看出对象与机器处于同一哈希空间中,在这样的部署环境中,

    hash环是不会变更的,因此,通过算出对象的hash值就能快速的定位到对应的机器中,这样就能找到对象真正的存储位置了。

    上文提到,普通hash求余最大问题就是当count也就是机器的数量变化,如添加,删除后,需要rehash,并进行位置调整。我们来看一下一致性哈希如何处理:

    如图,灰色的node2被删除,则只需按照瞬时针迁移,object3则会被迁移到

    node3中,所以仅仅会影响object3位置,其他对象无需改动。

    2. 节点添加

    如果我们要在集群中添加一个新的节点node4,通过哈希算法得到key4,并映射到环中。


    按照顺时针迁移规则,我们把object2迁移到node4中,其他object保持原位。

    另外,稍微提及一下,当一致性哈希算法在服务节点太少时,容易因为节点分部不均匀而造成数据倾斜问题。为了解决这种数据倾斜问题,一致性哈希算法引入了虚拟节点机制,即对每一个服务节点计算多个哈希,每个计算结果位置都放置一个此服务节点,称为虚拟节点。

    参考MIT论文:http://dl.acm.org/citation.cfm?id=258660

    顺序分布通常做法是将一个大表顺序划分成连续范围,即子表。如经常用来举例的用户表,按照主键分为1-10000,10001-20000,... 80000-90000等。再添加类似B+树索引。其中叶子相当于子表。

    分布式复制replication,常见做法类似数据库同步操作日志(commit log)

    容错容错是分布式存储系统设计的重要目标,当然是自动容错。

    • 故障检测:心跳,通用做法。官方叫法是,Lease(租约)协议,即带有超时时间的一种授权。

    • 故障恢复:迁移,通用做法。但是当Master节点/总控节点出现故障时,为了HA, 我们就要重新选主了,正所谓国家不可一日无主,当然现代社会,要通过Paxos协议选举,如我们介绍过的ZK.

    3. 分布式协议

    重要的分布式协议:Paxos选举协议两阶段提交协议。其中Paxos协议在我们介绍ZK的时候,就有小伙伴提出详细介绍。

    两阶段提交协议:Two-phase Commit, 2PC. 主要用来确保多个节点或者分布式操作的原子性。如果有使用过JTA或者做过大型银行转账系统的应该使用过。

    如跨数据库操作:


    恰如其名,2PC通常分为两个阶段:

    阶段1: 请求阶段Prepare Phase, 协调者通知参与者准备提交或者取消事务;

    阶段2: 提交阶段Commit Phase, 协调者将阶段1的结果进行投票表决,当且仅当所有参与者同意提交事务时,协调者才通知所有参与者提交,否则通知所有参与者取消。

    如下图所示:


    两阶段提交协议是阻塞协议,执行过程中需要加锁,且无法容错,所以... 大多数分布式存储系统都避而远之。同理可证,JTA。

    Paxos协议主要用于解决多个节点之间一致性问题。如主节点出现故障时,其它节点如何协调选主。同时,当做到了多个节点之间的操作日志一致性,就能够在这些节点上来构建高可用服务包括分布式锁,分布式命名,配置服务等。

    多数情况下,系统只有一个备点提议者Proposer, 所以它的提议总是会很快被大多数节点接受。

    执行步骤:

    1. 批准(accept): Proposer发送accept消息给所有其它节点(acceptor)接受某个提议,acceptor可以选择接受或者拒绝

    2. 确认(acknowledge): 如果超过一半的acceptor接受,则提议生效,proposer发送acknowledge消息通知所有acceptor提议生效

    如果系统有多个proposer,则各自分别发起提议,如修改操作或者提议自己选主,如果proposer第一次发起的accept请求没有被acceptor中多数派批准,则需要进行一轮完整的Paxos协议,如下:


    1. 准备prepare: Proposer首先选择一个提议序号n给其它acceptor节点发送

    prepare消息,Acceptor收到消息后,如果提议序号已经大于它已经回复的所有prepare消息,则acceptor将自己上次接受的提议回复给proposer,并承诺不再回复小于n的提议。

    2. 批准accept:Proposer收到了acceptor中多数派队prepare的回复后,就进入批准阶段。如果在之前的prepare阶段acceptor回复了上次接受的提议,则提议值发给acceptor批准。Acceptor在不违背它之前在prepare阶段的承诺前提下接受这个请求。如果超过一半的acceptor接受,提议值生效,Proposer发送acknowledge消息通知所有acceptor。

    稍微有点绕,Paxos需要确保2点,正确性,即只有一个提议值会生效;可终止性,即最终会有一个提议值生效。数学语言,有且只有一个

    受限与篇幅以及时间,我们会分2篇来介绍分布式存储系统。下一篇将提及著名Google分布式数据库

    The largest single database on earth”。


    公众号:技术极客TechBooster



    展开全文
  • 基于互联网的绝大部分应用系统都会用到图片数据,应用系统中图片存储是关键技术。介绍一种基于SQL Server的Asp.net图片存储的实现方法,即把图片的路径、名称和注解等信息存储到数据库中,而真正的图片文件存储到...
  • 图片怎么存储到数据库里

    千次阅读 多人点赞 2020-12-24 12:07:26
    FTP:FTP服务器(File Transfer Protocol Server)是在互联网上提供文件存储和访问服务的计算机,它们依照FTP协议提供服务。 FTP是File Transfer Protocol(文件传输协议)。顾名思义,就是专门用来传输文件的协议。...

    在这里插入图片描述

    FTP:FTP服务器(File Transfer Protocol Server)是在互联网上提供文件存储和访问服务的计算机,它们依照FTP协议提供服务。 FTP是File Transfer Protocol(文件传输协议)。顾名思义,就是专门用来传输文件的协议。简单地说,支持FTP协议的服务器就是FTP服务器。

    存储图片到数据库里一般有两种方式

    • 将图片保存的路径存储到数据库(文件路径或者ftp路径)
    • 将图片以二进制数据流的形式直接写入数据库字段中(base64)

    图片在数据库的存储用途一般为

    • 商品图片,用户上传的头像
    • 其他方面的图片

    一般存储图片有两种做法:

    1. 把图片直接以二进制形式存储在数据库中,一般数据库提供一个二进制字段来存储二进制数据。比如mysql中有个blob字段。oracle数据库中是blob或bfile类型
    2. 图片存储在磁盘上,数据库字段中保存的是图片的路径。

    将图片转换成二进制存储:

    大体思路:

    1. 将读取到的图片用自己的程序转化成二进制形式。(一般会有内置函数,可以快速转出base64格式)
    2. 再结合insert into语句插入数据表中的blob类型字段中去。
    3. 从数据库取出图片展示的时候。则是直接发送图片内容
    4. 然后前端接收到二进制,展示到需要的位置即可

    总结:处理代码不是很麻烦,使用nodejs很容易就可以处理。但是,我们用得更多的是存储图片的路径,实际图片是在磁盘上保存的(图片二进制放到数据库,把数据库的负担弄重了)。需要代码的话,可以私聊,或者看我nodejs里面对图片的处理。

    互联网环境中,大访问量,数据库速度和性能方面很重要。一般在数据库存储图片的做法比较少,更多的是将图片路径存储在数据库中,展示图片的时候只需要连接磁盘路径把图片载入进来即可。因为图片是属于大字段。一张图片要占用1M甚至几十M,所以使用数据库很浪费资源,但是如果图片量很小的情况下可以尝试,或者直接在后台开辟空间存储文件(这样也给服务器造成了不小的压力),所以最好还是使用第三方文件上传平台,像七牛云,阿里云等等(坐等打钱)。

    牵扯到一些基本的数据库调优,比如这篇文章分为标题、作者、添加时间、更新时间、文章内容、文章关键字等等。

    文章内容一般是比较长的。经常使用text字段去存储。文章的内容就属于大字段。一般文章内容可以拆分到单独一个表中去。不要与文章信息存储在一张表里面。

    个人的理解:mysql中一张表的数据是全部在一个数据文件中的。如果大字段的数据也存储在里面。程序展示列表,比如文章列表。这个时候根本不需要展示文章内容的。但是仍然会影响速度,数据库查找数据其实就是扫描那个数据文件,文件容量越小,速度就会越快(为什么单表的容量在1g-2g的时候基本上要分表了)。拆分出去到一张单独的表,就是单独的文件了。举一反三,相互独立,分离的思想不仅在系统开发中用到,在现实生活中经常存在的。

    总结:三种东西永远不要放到数据库里,图片,文件,二进制数据。

    原因

    • 对数据库的读/写的速度永远都赶不上文件系统处理的速度
    • 数据库备份变的巨大,越来越耗时间
    • 对文件的访问需要穿越你的应用层和数据库层
    • 把图片缩略图存到数据库里?很好,那你就不能使用nginx或其它类型的轻量级服务器来处理它们了。

    关于mysql中的blob类型

    bolb(binary large object)二进制大对像就像int型那样,分为blobMEDIUMBLOBLONGBLOB。其实就是从小到大

    • blob 容量为64KB
    • MEDIUMBLOB 容量为16M
    • LONGBLOB 容量为4G。

    说实话,图片用这样子存储用得还真少。使用java的序列化函数进行序列化的值,有人存入这个字段中去。

    mysql中blob字段存储图片有个通信大小的设置:

    图片要传输给mysql存储起来,那么需要涉及到数据通信。mysql中有个配置是限制通信数据大小的。

    my.conf配置文件中的max_allowed_packet,mysql默认的值是1M。

    好多图片尤其是原始图可能不止1m。传输的数据(也就是图片)超过这个设置大小。结果就会出错

    其实所谓的性能,最关键是数据库性能。因为随着数据库数据量增大,大部分时间耗费是在php,java等语言等待数据库返回数据的过程中耗费时间。

    网站访问量大了后,具体的语言不是瓶颈,瓶颈都在数据库。用c,python,php,java 都能操作mysql数据库获取数据。语言之间可能存在速度执行差异,但是其实这种差别已经很小了。至少我觉得,给予用户感觉不到明显。执行相差0.0001秒用户感觉并没有明显的区别。可能说,大并发(很多用户同时访问)的时候,就会体现到差别了。其实我觉得,大并发访问是数据库瓶颈。等待数据库给予数据。没达到一定级别实在体现不了差别。数据库数据量达到一定级别。语言相差0.001s会给予用户体验上的差别。所以,这也是为什么php很适合做web开发了。解析页面速度快(解释型语言,不需要编译)。可以用java来与数据库打交道获取数据。php不直接操作数据库,而是调用java提供的数据接口,获取数据,马上展示在页面中。这是利用了php的页面执行速度快的一个优势。

    二、数据库中保存图片路径

    一般是这样子的:

    按照年月日生成路径。具体是按照年月日还是按照年月去生成路径,根据自己需要(不一定是按照日期去生成)。

    理解为什么要分散到多个文件夹中去才是关键,涉及到一个原理就明白了:

    1. 操作系统对单个目录的文件数量是有限制的。当文件数量很多的时候。从目录中获取文件的速度就会越来越慢。所以为了保持速度,才要按照固定规则去分散到多个目录中去。
    2. 图片分散到磁盘路径中去。数据库字段中保存的是类似于这样子的”images/2012/09/25/ 1343287394783.jpg”
    3. 原来上传的图片文件名称会重新命名保存,比如按照时间戳来生成,1343287394783. jpg。这样子是为了避免文件名重复,多个人往同一个目录上传图片的时候会出现。
    4. 反正用什么样的规则命名图片,只要做到图片名称的唯一性即可。
    5. 比如网站的并发访问量大,目录的生成分得月细越好。比如精确到小时,一个小时都可以是一个文件夹。同时0.001秒有两个用户同时在上传图片(因为那么就会往同一个小时文件夹里面存图片)。因为时间戳是精确到秒的。为了做到图片名称唯一性而不至于覆盖,生成可以在在时间戳后面继续加毫秒微秒等。总结的规律是,并发访问量越大。就越精确就好了。

    有个方面总结一下:为什么保存的磁盘路径,是”images/2012/09/25/1343287394783.jpg”,而不是” /images/2012/09/25/ 1343287394783.jpg”(最前面带有斜杠)?

    1. 连那个斜杠都不要。这里也是做到方便以后系统扩展。
    2. 在页面中需要取出图片路径展示图片的时候,如果是相对路径,则可以使用”./”+”images/2012/09/25/1343287394783.jpg”进行组装。
    3. 如果需要单独的域名(比如做cdn加速的时候)域名,img1.xxx.com,img2.xxx.com这样的域名
    4. 直接组装 “http://img1.xxx.com/”+”images/2012/09/25/1343287394783.jpg”
    5. 当然数据库是可以在前面加斜杠/保存起来,/images/2012/09/25/ 1343287394783.jpg
    6. 其实不方便统一。比如相对路径载入图片的时候,则是”.”+” /images/2012/09/25/ 1343287394783.jpg”
    7. 可能我还没体会到坏处,以后会遇到问题的。不过,遵循惯例不加斜杠” images/2012/09/25/ 1343287394783.jpg”就对了。

    涉及到一个新问题:为什么大部分系统都不会域名保存进去,像这样子http://www.xxx.com/images/2012/09/25/1343287394783.jpg保存到数据库中

    1. 了解的知识越多,越有利于我们做决定。可能就是一个”感觉区别不是很大”的影响下,去做一个决定,反而对后面是比较大的影响的。至少是增加自己的工作量了。
    2. 其实把域名保存进去,也不是什么滔天大罪的事情。但凡是经验丰富的开发人员都不会这样子做。这是一个经验积累出来的,所以上海那个网友也对此并没有明显的概念很正常,他说他不知道cdn方面的(当然觉得存个域名进去没什么大不了的)。需要了解cdn知识,什么情况下会用到cdn知识。
    3. 虽然是做开发人员,不需要关注运维和服务器之类的知识。不过了解一些就有利于理解了。
    4. 这里涉及到cdn加速。关于cdn原理(就是内容分发网络),我理解其本质就是为了解决距离远产生的速度问题,使用就近的服务。

    CDN

    1. 从中国请求美国一台服务器上的图片。一般比较慢,因为距离这么远,网络传输是存在损耗的,距离越远,传输的时间就越长。一般会看到浏览器左下角显示:“已响应,正在传输数据…”。这不是服务器本身问题了。实际上服务器早就响应请求,把数据发给客户端,但是网络问题,就一直在传输,没传完了。
    2. 在中国,是南北距离远的问题。南北还会涉及到跨网,南方用户使用电信居多,北方用户网通居多。两个线路需要跨越,会有时间延迟。
    3. cdn加速就是适应这个需求产生的:现在不请求美国的服务器。直接在中国安放节点(节点是比较笼统的词语,可以理解成一台服务器,也可以理解成一个机房,就是一个点嘛),请求距离近的节点。这样子就不需要那么远的距离了。

    记得以前在长沙的网站,团购以城市分站的形式。北京和长沙用的是同一套程序。服务器在长沙。北京用户访问北京站的时候,实际上需要远距离访问长沙的服务器。速度怎么都快不起来。跟服务器性能完全没关系。当时不懂这些。不清楚怎么折腾。看那本《前端优化技巧》,想办法去做js代码压缩,浏览器缓存之类的。实际上瞎折腾。不是说这些前端优化不重要,哲学上有主次矛盾之分,瓶颈在哪里就去突破哪里。没解决主要矛盾,问题并不会迎刃而解。当时也不是数据库瓶颈。如果去优化数据库。也不会明显改善。就那点数据量。根本就达不到瓶颈。哪里谈得上主要矛盾。随着后来去其他公司工作,接触一些东西,类似不找瓶颈的优化例子发生在身边好几次了,先没找到瓶颈就瞎去优化。我的同事可能是抱着多多益善的心态去做的,但主要矛盾(技术上说是瓶颈)没找到,也没改善。

    当时如果没想到是距离问题。也就不会想到cdn,当时其实我根本不知道cdn服务。我只知道,google这些网站肯定在中国部署的服务器,要不然,中国用户还去访问美国的服务器,那再好的服务器都会速度慢的。

    由于自己搭建cdn环境和机房的资金比较大(需要大量的服务器),也需要人力维护。反正一般的公司弄不起,其实根本不划算。淘宝以前用商用的cdn服务,后来商用的扛不住了,就搭建了自己的cdn网。我不知道新浪有没有自己搭建,但其实我觉得跟淘宝的特点有关,店铺很多,无论是商品还是交易记录总计起来商品很多的图片,图片都是静态的部分,cdn本来就是用来做静态的(图片,css,js等)请求分发用的。

    我之前在网上看到一句话,cdn网络不是一般的公司玩得起的。

    一般的公司自己搭建cdn网络成本高,所以就有商业的cdn提供付费租用服务,这是一项很成熟的业务,很多这样的公司,大部分全国性的互联网公司都会使用到cdn。

    总结:cdn服务。对于静态内容是非常适合的。所以像商品图片,随着访问量大了后,租用cdn服务,只需要把图片上传到他们的服务器上去。

    例子:北京访问长沙服务器,距离太远。我完全可以把商品图片,放到北京的云服务(我觉得现在提供给网站使用的云存储其实就是cdn,给网站提供分流和就近访问)上去。这样子北京用户访问的时候,实际上图片就是就近获取。不需要很长距离的传输。

    自己用一个域名img.xxx.com来载入图片。这个域名解析到北京的云服务上去。

    做法:数据库中保存的是” images/2012/09/25/1343287394783.jpg”,

    这些图片实际上不存储在web服务器上。上传到北京的cdn服务器上去。

    我从数据库取出来,直接”img.xxx.com/”+” images/2012/09/25/1343287394783.jpg”

    比如如果还有多个,就命名img1.xx.com、img2.xx.com

    反正可以随便。所以如果把域名直接保存进去。就显得很麻烦了。迁移麻烦。

    像淘宝,凡客,亚马逊这些电子商务网站,我们看到请求的时候,下面往往会有

    img1.xxx.cdn.com

    img2.xxx.cdn.com

    其实他们保存在数据库中的是相对路径。有些是不需要在数据库保存的,缩略图可以实时访问的时候用程序生成(节省很多存储空间)

    实际上,把域名保存在数据库中,非常不利于系统迁移。一旦换个域名的话,原来保存在数据库中的是“www.abc.om/images/xxxxxx“,因为路径都在数据库中写死了。下回换个域名就用不了了。那个时候自己去写sql语句批量更新字段吧。

    几个术语:

    • icp,Internet Content Provider,也就是网络内容提供者。联想到我们运营一个网站需要icp备案了吗?你自己运营网站,你就是icp服务商
    • IDC(Internet Data Center),互联网数据中心。IDC的概念,目前还没有一个统一的标准。通俗点,就是提供机房托管(服务器租用和托管),域名注册之类的。

    关于淘宝的图片存储

    了解到:淘宝以前使用了商用的存储。但是没法满足需求。据说,到2010年,淘宝网后端保存着286亿张图片。商用的系统系统没法满足需求的时候。他们就自己开发了一个tfs。大规模的小文件在磁盘上读取,需要磁盘磁头频繁的寻道和换道。大并发情况下和大量的操作确实很麻烦。其实借鉴了当时google公布的gfs设计论文。google有相册服务。为每个用户提供上传图片存储。

    估计,google是率先实现这种小文件网络存储系统的。

    有个观点比较好:对于老板们而言,往往觉得,用钱能解决的都不算问题。但问题在于,你遇到的问题,别人都没遇到过。那这个时候你就没有经验可以参考或者直接拿来使用。只有自己参考一些思路去创造技术了。

    三、关于图片进行云存储(cdn加速)

    曾经看过这个,这个是比较适合创业公司的。价格相对便宜https://www.upyun.com/

    介绍提到,我们在全国各地部署了55个CDN节点,500多台服务器,电信,联通,移动和教育网的4线带宽。

    其实,现在的云存储本质就是一个cdn服务商。你把静态的图片上传到他提供的服务器上去(ftp方式上传或者api形式编写程序上传)。他为你做就近节点访问。

    计费方式:按照流量付费,99元购买100g。怎么算流量。每次访问文件的大小累加,比如一个1m的文件,访问一次流量就加1m。

    我个人理解,对于图片的量不大的情况下,使用这种云服务,好处不是节省存储空间。你自己的服务器100g的空间可能创业型公司都没用完,不是什么存储空间不够用,然后去用云存储。以前我对cdn比较模糊,有这么点理解,或者以为是分散网站web服务器流压力,服务器分流。这些好处是有的。但是,只要理解了cdn产生的背景和解决的关键问题后,就会明白云存储关键好处在于:给用户就近节点访问,加速。

    我觉得,如果不是出于这个考虑,或者达不到这样的目的。用其他方案也完全可以替代。何必使用云存储呢?就是你无非有实力做到全国多个节点去部署服务,才需要租用cdn来帮你,毕竟他们是规模产生的效益,专注于解决这个领域。

    还有:腾讯云、阿里云

    以下为具体存储方法:

      一、保存图片的上传路径到数据库:
      string uppath="";//用于保存图片上传路径
      //获取上传图片的文件名
      string fileFullname = this.FileUpload1.FileName;
      //获取图片上传的时间,以时间作为图片的名字可以防止图片重名
      string dataName = DateTime.Now.ToString("yyyyMMddhhmmss");
      //获取图片的文件名(不含扩展名)
      string fileName = fileFullname.Substring(fileFullname.LastIndexOf("\\") + 1);
      //获取图片扩展名
      string type = fileFullname.Substring(fileFullname.LastIndexOf(".") + 1);
      //判断是否为要求的格式
      if (type == "bmp" || type == "jpg" || type == "jpeg" || type == "gif" || type == "JPG" || type == "JPEG" || type == "BMP" || type == "GIF")
      {
       //将图片上传到指定路径的文件夹
       this.FileUpload1.SaveAs(Server.MapPath("~/upload") + "\\" + dataName + "." + type);
       //将路径保存到变量,将该变量的值保存到数据库相应字段即可
       uppath = "~/upload/" + dataName + "." + type;
      }
      二、将图片以二进制数据流直接保存到数据库:
      引用如下命名空间:
      using System.Drawing;
      using System.IO;
      using System.Data.SqlClient;
      设计数据库时,表中相应的字段类型为iamge
      保存:
      //图片路径
      string strPath = this.FileUpload1.PostedFile.FileName.ToString ();
      //读取图片
      FileStream fs = new System.IO.FileStream(strPath, FileMode.Open, FileAccess.Read);
      BinaryReader br = new BinaryReader(fs);
      byte[] photo = br.ReadBytes((int)fs.Length);
      br.Close();
      fs.Close();
      //存入
      SqlConnection myConn = new SqlConnection("Data Source=.;Initial Catalog=stumanage;User ID=sa;Password=123");
      string strComm = " INSERT INTO stuInfo(stuid,stuimage) VALUES(107,@photoBinary )";//操作数据库语句根据需要修改
      SqlCommand myComm = new SqlCommand(strComm, myConn);
      myComm.Parameters.Add("@photoBinary", SqlDbType.Binary, photo.Length);
      myComm.Parameters["@photoBinary"].Value = photo;
      myConn.Open();
      if (myComm.ExecuteNonQuery() > 0)
      {
       this.Label1.Text = "ok";
      }
      myConn.Close();
      读取:
      ...连接数据库字符串省略
      mycon.Open();
      SqlCommand command = new
      SqlCommand("select stuimage from stuInfo where stuid=107", mycon);//查询语句根据需要修改
      byte[] image = (byte[])command.ExecuteScalar ();
      //指定从数据库读取出来的图片的保存路径及名字
      string strPath = "~/Upload/zhangsan.JPG";
      string strPhotoPath = Server.MapPath(strPath);
      //按上面的路径与名字保存图片文件
      BinaryWriter bw = new BinaryWriter(File.Open(strPhotoPath,FileMode.OpenOrCreate));
      bw.Write(image);
      bw.Close();
      //显示图片
      this.Image1.ImageUrl = strPath;
      采用这两种方式可以根据实际需求灵活选择。
    
    展开全文
  • 存储层技术剖析 1. SQL 即关系数据。前几年NoSQL火了一阵子,很多人都理解为NoSQL是完全抛弃关系数据,全部采用非关系型数据,但事实经过几年的试验后,大家发现关系数据不可能完全抛弃,NoSQL不是No SQL,...
  • hbase解决海量图片存储

    万次阅读 2014-06-23 16:04:19
    随着互联网、云计算及大数据等信息技术的发展,越来越多的应用依赖于对海量数据的存储和处理,如智能监控、电子商务、地理信息等,这些应用都需要对海量图片存储和检索。由于图片大多是小文件(80%大小在数MB以内)...
  • 海量图片存储解决方案

    千次阅读 2019-12-18 14:42:05
    当今世界,互联网、大数据应用迅猛发展,物联网、人工智能...例如,国内目前最大的电商网站淘宝存储的商品图片超过 200 亿张,这些文件的平均大小仅为 15KB 左右,国外著名的社交网站Facebook 存储图片总量更是超...
  • 释了分布式数据存储技术的进步和市场激励的强大结合,正合力形成一个更安全、更高效的网络。...其中一个最大的抽象是集中化的“云存储”,即数据存储在大型的集中的贮仓中,主要由盈利性公司运营。这种架构不仅使网...
  • 本文借鉴传统数据管理技术的理念,研究、设计了一个基于CouchDB的高可扩展、高可靠的海量图片存储管理系统。  1 云计算的定义及特点  云计算是以一种融合的方式,通过网络作载体,以虚拟化技术为基础,以提供...
  • 互联网带来的一片晴天   相对于传统行业来说,互联网行业要显得相对对技术人员尊重些。   在互联网行业中,采用的技术、概念也较传统形行业...没有传统形乙方公司那种“人为的因素存在”。同时互联网行当本身...
  • 随着互联网、云计算及大数据等信息技术的发展,越来越多的应用依赖于对海量数据的存储和处理,如智能监控、电子商务、地理信息等,这些应用都需要对海量图片存储和检索。由于图片大多是小文件(80%大小在数MB以内)...
  • 互联网公司数据安全保护新探索

    千次阅读 2018-05-23 09:52:12
    服务器对于互联网公司来说,是可以接受的损失,但敏感数据泄漏,则会对公司产生重大声誉、经济影响。 在互联网公司的数据安全领域,无论是传统理论提出的数据安全生命周期,还是安全厂商提供的解决方案,...
  • 公司存储文件方案

    2021-01-18 20:53:51
    自己公司自己存储 优点: 安全: 方案1本地硬盘 : 优点: 简单 缺点: 扩容不便, 硬盘损坏会丢数据 方案2 : 磁盘挂载(NFS) 优点: 简单 缺点: 硬盘损坏会丢数据 ...互联网存储.把信息给别人 不安全 收费 ...
  • 存储层技术剖析 1. SQL 即关系数据。前几年NoSQL火了一阵子,很多人都理解为NoSQL是完全抛弃关系数据,全部采用非关系型数据,但事实经过几年的试验后,大家发现关系数据不可能完全抛弃,NoSQL不是No SQL,...
  • 经常有人问我们,如何为成长型公司的大型系统部署存储架构,尤其是当这些大型系统含有视频、音频、或社交类网站时,该如何构建存储架构?以下介绍一些我们常选择的方法及各自的优点。 构建存储架构时,要考虑许多...
  • 很多人对于BAT的技术有一种莫名的崇拜感,觉得只有天才才能做出这样的系统。其实是业务的不断发展推动了技术的发展,这样...互联网的标准技术架构如下图所示,这张图基本上涵盖了互联网技术公司的大部分技术...
  • 本文借鉴传统数据管理技术的理念,研究、设计了一个基于CouchDB的高可扩展、高可靠的海量图片存储管理系统。  1 云计算的定义及特点  云计算是以一种融合的方式,通过网络作载体,以虚拟化技术为基础,以提供...
  • 因项目需要,图片类型的文件无法存储到本地磁盘中,必须以二进制的格式存储到数据库中。以这样的方式进行读写操作时候,就遇到各种问题,下面分别进行问题展示,并列出解决方案: 问题一、图片在数据库中的格式问题...
  • 相信很多想去互联网公司的童鞋,最大的疑问,互联网公司里,到底有哪些职位?程序员有哪些呢?什么叫产品经理?除了产品经理和程序员就没有其他的人了嘛,今天就深入浅出地给大家简单地介绍一下。 本讲稿针对人群,...
  • 对象存储 OSS 图片服务手册 对象存储 OSS/ 图片服务手册 图片服务手册 图片服务介绍 阿里云 OSS图片处理服务 Image Service 简称 IMG 是阿里云 OSS对外提供的海量安全低成本高可 靠的图片处理服务用户将原始图片上传...
  • 互联网公司技术博客

    千次阅读 2017-01-18 14:43:57
     Dropbox是最实用且免费的云存储软件。每天全世界有亿万用户正在使用Dropbox,它提供在电脑、手机、平板,甚服务器上同步、备份或共享文件资料。Dropbox的科技博客,会时常发布一些Dropbox的新产品和新功能详细介绍。...
  • 基于h a d oop的海量图片存储模型的分析和设计

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 92,080
精华内容 36,832
关键字:

互联网公司图片如何存储