大型网站架构改进历程:存储的瓶颈

2023-10-27

【编者按】本文转自博客园的 夏天的森林,在看这篇之前,大家可以移步看 大型网站架构改进历程:存储的瓶颈(一)(二)(三)(四)

上文里我遗留了两个问题,一个问题是数据库做了水平拆分以后,如果我们对主键的设计采取一种均匀分布的策略,那么它对于被水平拆分出的表后续的查询操作将有何种影响,第二个问题就是水平拆分的扩容问题。这两个问题在深入下去,本系列就越来越技术化了,可能最终很多朋友读完后还是没有找到解决实际问题的启迪,而且我觉得这些问题都是像BAT这样巨型互联网公司才会认真思考的,因此本篇我打算换个角度来阐述本文的后续内容。

这里我们首先要明确一个问题,到底是什么因素促使我们去做数据库的垂直拆分和水平拆分的呢?答案很简单就是业务发展的需求,前文里的水平拆分技术方案基本都是抛弃千变万化的业务规则的限制,尽量将水平拆分的问题归为一个简单的技术实现方案,而纯技术手段时常是看起来很美,但是到了面对现实问题时候,常常会变得那么苍白和无力。

水平拆分

水平拆分的难题里我还有个难题没有讲述,就是水平拆分后对查询操作的影响,特别是对单表查询的影响,这点估计也是大伙最为关心的问题,今天我不在延着水平拆分的技术手段演进是阐述上文的遗留问题,而是我要把前面提到的技术手段和一些典型场景结合起来探讨如何解决网站存储的瓶颈问题。

前文中我总结过一个解决存储瓶颈的脉络,具体如下:

单库数据库-->数据库读写分离-->缓存技术-->搜索技术-->数据的垂直拆分-->数据的水平拆分

这个脉络给一些朋友产生了误解,就是认为这个过程应该是个串行的过程,其实在实际的场景下这个过程往往是并行的,但是里面有一个元素应该是串行的或者说思考时候有个先后问题,那就是对数据库层的操作,具体如下:

单库数据库-->数据库读写分离-->数据的垂直拆分-->数据的水平拆分

而缓存技术和搜索技术在数据库的任意阶段里都可以根据实际的业务需求随时切入其中帮助数据库减轻不必要的压力。例如,当网站的后台数据库还是单库的时候,数据库渐渐出现了瓶颈问题,而这个瓶颈又没有达到需要采取大张旗鼓做读写分离方案的程度,那么我这个时候可以考虑引入缓存机制。不过要合理的使用缓存我们首先要明确缓存本身的特点,这些特点如下所示:

特点一:缓存主要是适用于读操作,并且缓存的读操作的效率要远远高于从数据库以及硬盘读取数据的效率。

特点二:缓存的数据是存储在内存当中,因此当系统重启,宕机等等异常场景下,缓存数据就会不可逆的丢失,且无法恢复,因此缓存不能作为可靠存储设备,这就导致一个问题,缓存里的数据必须首先从数据库里同步到内存中,而使用缓存的目的就是为了解决数据库的读操作效率低下的问题,数据库的数据同步到缓存的操作会因为数据库的效率低下而在性能上大打折扣,所以缓存适合的场景是那些固定不变的数据以及业务对实时性变化要求不高的数据。

根据缓存的上述两个特点,我们可以把数据库里和上述描述类似操作的相关数据迁移到缓存里,那样我们就从数据库上剥离了那些对数据库价值不高的操作,让数据库专心做有价值的操作,这样也是减轻数据库压力的一种手段。

不过这个手段局限性很强,局限性主要是一台计算机了用于存储缓存的内存的大小都是远远要低于硬盘,并且内存的价格要远贵于硬盘,如果我们将大规模的数据从硬盘往内存迁移,从资源成本和利用率角度考虑性价比还是很低的,因此缓存往往都是用于转存那些不会经常变化的数据字典,以及经常会被读,而修改较少的数据,但是这些数据的规模也是有一定限度的,因此当单库数据库出现了瓶颈时候马上就着手进行读写分离方案的设计性价比还是很高的。

前文我讲到我们之所以选择数据库读写分离是主要原因是因为数据库的读写比例严重失衡所致,但是做了读写分离必然有个问题不可避免,写库向读库同步数据一定会存在一定的时间差,如果我们想减小读库和写库数据的时间差,那么任然会导致读库因为写的粒度过细而发生部分性能的损失,但是时间差过大,或许又会无法满足实际的业务需求,因此这个时间差的设计一定要基于实际的业务需求合理的设计。

同步的时间差的问题还是个小问题,也比较好解决,但是如何根据实际的业务需求做读写分离这其实还是非常有挑战性的,这里我举个很常见的例子来说明读写分离的难度问题,我们这里以淘宝为例,淘宝是个C2C的电商网站,它是互联网公司提供一个平台,商家自助接入这个平台,在这个平台上卖东西,这个和线下很多大卖场的模式类似。

淘宝是个大平台,它的交易表里一定是要记下所有商户的交易数据,但是针对单个商家他们只会关心自己的网店的销售数据,这就有一个问题了,如果某一个商家要查询自己的交易信息,淘宝就要从成千上万的交易信息里检索出该商家的交易信息,那么如果我们把所有交易信息放在一个交易表里,肯定有商家会有这样的疑问,我的网店每天交易额不大,为什么我查询交易数据的速度和那些大商家一样慢了?那么我们到底该如何是解决这样的场景了?

碰到这样的情况,当网站的交易规模变大后就算我们把交易表做了读写分离估计也是没法解决实际的问题,就算我们做的彻底点把交易表垂直拆分出来估计还是解决不了问题,因为一个业务数据库拥有很多张表,但是真正压力大的表毕竟是少数,这个符合28原则,而数据库大部分的关键问题又都是在那些数据压力大的表里,就算我们把这些表单独做读写分离甚至做垂直拆分,其实只是把数据库最大的问题迁移出原来数据库,而不是在解决该表的实际问题。

如果我们要解决交易表的问题我们首先要对交易表做业务级的拆分,那么我们要为交易表增加一个业务维度:实时交易和历史交易,一般而言实时交易以当天及当天24小时为界,历史交易则是除去当天交易外的所有历史交易数据。实时交易数据和历史交易数据有着很大不同,实时交易数据读与写是比较均衡的,很多时候估计写的频率会远高于读的频率,但是历史交易表这点上和实时交易就完全不同了,历史交易表的读操作频率会远大于写操作频率,如果我们将交易表做了实时交易和历史交易的拆分后,那么读写分离方案适合的场景是历史交易查询而非实时交易查询,不过历史交易表的数据是从实时交易表里同步过来的,根据这两张表的业务特性,我们可以按如下方案设计,具体如下:

我们可以把实时交易表设计成两张表,把它们分别叫做a表和b表,a表和b表按天交替进行使用,例如今天我们用a表记录实时交易,明天我们就用b表记录实时交易,当然我们事先可以用个配置表记录今天到底使用那张表进行实时交易记录,为什么要如此麻烦的设计实时交易表了?这么做的目的是为了实时交易数据同步到历史数据时候提供便利,一般我们会在凌晨0点切换实时交易表,过期的实时交易表数据会同步到历史交易表里,这个时候需要数据迁移的实时交易表是全表数据迁移,效率是非常低下,假如实时交易表的数据量很大的时候,这种导入同步操作会变得十分耗时,所以我们设计两张实时交易表进行切换来把数据同步的风险降到最低。

由此可见,历史交易表每天基本都只做一次写操作,除非同步出了问题,才会重复进行写操作,但是写的次数肯定是很低的,所以历史交易表的读写比例失衡是非常严重的。不过实时交易表的切换也是有技术和业务风险的,为了保证实时交易表的高效性,我们一般在数据同步操作成功后会清空实时交易表的数据,但是我们很难保证这个同步会不会有问题,因此同步时候我们最好做下备份,此外,两个表切换的时候肯定会碰到这样的场景,就是有人在凌晨0点前做了交易,但是这个交易是在零点后做完,假如实时交易表会记录交易状态的演变过程,那么在切换时候就有可能两个实时表的数据没有做好接力,因此我们同步到历史交易表的数据一定要保持一个原则就是已经完成交易的数据,没有完成的交易数据两张实时交易还要完成一个业务上的接力,这就是业界常说的数据库日切的问题。

历史交易表本身就是为读使用的,所以我们从业务角度将交易表拆分成实时交易表和历史交易表本身就是在为交易表做读写分离,居然了设计了历史交易表我们就做的干脆点,把历史交易表做垂直拆分,将它从原数据库里拆分出来独立建表,随着历史交易的增大,上文里所说的某个商户想快速检索出自己的数据的难题并没有得到根本的改善,为了解决这个难题我们就要分析下难题的根源在那里。

这个根源很简单就是我们把所有商户的数据不加区别的放进了一张表里,不管是交易量大的商户还是交易量小的商户,想要查询出自己的数据都要进行全表检索,而关系数据库单表记录达到一定数据量后全表检索就会变的异常低效,例如DB2当数据量超过了1亿多,mysql单表超过了100万条后那么全表查询这些表的记录都会存在很大的效率问题,那么我们就得对历史交易表进一步拆分,因为问题根源是单表数据量太大了,那我们就可以对单表的数据进行拆分,把单表分成多表,这个场景就和前面说的水平拆分里把原表变成逻辑表,原表的数据分散到各个独立的逻辑表里的方式一致,不过这里我们没有一开始做水平拆分,那是会把问题变麻烦,我们只要在一个数据库下对单表进行拆分即可,这样也能满足我们的要求,并且避免了水平拆分下的跨库写作的难题。

接下来我们又有一个问题了那就是我们按什么维度拆分这张单表呢?

我们按照前文讲到的水平拆分里主键设计方案执行吗?当然不行哦,因为那些方案明显提升不了商户检索数据的效率问题,所以我们要首先分析下商户检索数据的方式,商户一般会按这几个维度检索数据,这些维度分别是:商户号、交易时间、交易类型,当然还有其他的维度,我这里就以这三个维度为例阐述下面的内容,商户查询数据效率低下的根本原因是全表检索,其实商户查询至少有一个维度那就是商户号来进行查询,如果我们把该商户的数据存入到一张单独的表里,自然查询的效率会有很大的提升,但是在实际系统开发里我们很少通过商户号进行拆分表,这是为什么呢?

因为一个电商平台的商户是个动态的指标,会经常发生变化,其次,商户号的粒度很细,如果使用商户号拆分表的必然会有这样的后果那就是我们可能要频繁的建表,随着商户的增加表的数量也会增加,造成数据的碎片化,同时不同的商户交易量是不一样的,按商户建表会造成数据存储的严重不平衡。如果使用交易类型来拆分表,虽然维度的粒度比商户号小,但是会造成数据的分散化,也就是说我们查询一个商户的全部交易数据会存在很大问题。

由此可见拆表时候如何有效的控制维度的粒度以及数据的聚集度是拆分的关键所在,因为使用交易时间这个维度就会让拆分更加合理,不过时间的维度的设计也是很有学问的,下面我们看看腾讯分析的维度,如下所示:

 

腾讯分析的维度是今天这个其实相当于实时交易查询,除此之外都是对历史数据查询,它们分为昨天、最近7天和最近30天,我们如果要对历史交易表进行拆分也是可以参照腾讯分析的维度进行,不过不管我们选择什么维度拆分数据,那么都是牺牲该维度成全了其他维度,例如我们按腾讯分析的维度拆分数据,那么我们想灵活使用时间查询数据将会受到限制。

我们把历史交易数据通过交易时间维度进行了拆分,虽然得到了效率提升,但是历史交易数据表是个累积表,随着时间推移,首先是月表,接下来是周表都会因为数据累积产生查询效率低下的问题,这个时候我们又该如何解决了?

这个时候我们需要再引进一个维度,那么这个时候我们可以选择商户号这个维度,但是商户号作为拆分维度是有一定问题的,因为会造成数据分布不均衡,那么我们就得将维度的粒度由小变粗,其实一个电商平台上往往少数商户是完成了大部分电商平台的交易,因此我们可以根据一定指标把重要商户拆分出来,单独建表,这样就可以平衡了数据的分布问题。

我们总结下上面的案例,我们会得到很多的启迪,我将这些启迪总结如下:

启迪一:数据库的读写分离不是简单的把主库数据导入到读库里就能解决问题,读数据库和写数据的分离的目的是为了让读和写操作不能相互影响效率。

启迪二:解决读的瓶颈问题的本质是减少数据的检索范围,数据检索的范围越小,读的效率也就越高;

启迪三:数据库的垂直拆分和水平拆分首先不应该从技术角度进行,而是通过业务角度进行,如果数据库进行业务角度的水平拆分,那么拆分的维度往往是要根据该表的某个字段进行的,这个字段选择要有一定原则,这个原则主要是该字段的维度的粒度不能过细,该字段的维度范围不能经常的动态发生变化,最后就是该维度不能让数据分布严重失衡。

回到现实的开发里,对于一个数据库做拆表,分表的工作其实是一件很让人恼火的工作,这主要是有以下原因所造成的,具体如下所述:

原因一:一个数据库其实容纳多少张表是有一定限制的,就算没有超过这个限制,如果原库本来有30张表,我们拆分后变成了60张,接着是120张,那么数据库本身管理这么多表也会消耗很多性能,因此公司的DBA往往会控制那些过多分表的行为。

原因二:每次拆表后,都会牵涉到历史数据的迁移问题,这个迁移风险很大,迁移方案如果设计的不完善可能会导致数据丢失或者损坏,如果关键数据发生了丢失和损坏,结果可能非常致命。因此在设计数据库分表分库方案时候我们要尽量让受影响的数据范围变得最小。

原因三:每次拆表和分表都会让系统的相关方绷紧神经,方案执行后,会有很长时间的监控和观察期,所以拆数据库时常是一件令人讨厌的事情。

原因四:为了保证新方案执行后确保系统没有问题,我们常常会让新旧系统并行运行一段时间,这样可以保证如果新方案出现问题,问题的影响面最低,但是这种做法也有一个恶果就是会导致数据迁移方案要进行动态调整,从而增加迁移数据的风险

因此当公司不得不做这件事情时候,公司都会很自然去考虑第三种解决方案,第三种解决方案是指尽量不改变原数据库的功能,而是另起炉灶,使用新技术来解决我们的问题,例如前文所说的搜索技术解决数据库like的低效问题就是其中方案之一,该方案只要我们将数据库的表按一定时间导入到文件系统,然后对文件建立倒排索引,让like查询效率更好,这样就不用改变原数据库的功能,又能减轻数据库的压力。

现在常用的第三种解决方案就是使用NoSql数据库,NoSql数据库大多都是针对文件进行的,因此我们可以和使用搜索引擎那样把数据导入到文件里就行了,NoSql基本都采用Key/Value这种简单的数据结构,这种数据结构和关系数据库比起来更加的灵活,对原始数据的约束最少,所以在NoSql数据库里建表我们可以很灵活的把列和行的特性交叉起来用。这句话可能很多人不太理解,下面我举个例子解释下。例如hadoop技术体系里的hbase,hbase是一个基于列族的数据库,使用hbase时候我们就可以通过列来灵活的拆分数据,比如我们可以把中国的省份作为一个列,将该省份的数据都放入到这个列下面,在省这个维度下我们可以接着在定义一个列的维度,例如软件行业,属于软件行业的数据放在这个列下面,最终提供用户查询时候我们就可以减少数据检索的范围,最终达到提升查询效率的目的。

由此可见当我们用惯了关系数据库后,学习像hbase这样的Nosql数据库我们会非常的不适应,因为关系数据库的表有固定模式,也就是我们常说的结构化数据,当表的定义好了后,就算里面没有数据,那么这个结构也就固定了,我们使用表的时候都是按这个模型下面,我们几乎感觉不到它,但是到了hbase的使用就不同了,hbase使用时候我们都在不停的为数据增加结构化模型,而且这个维度是以列为维度的,而关系数据库里列确定后我们使用时候是无法改变的,这就是学习hbase的最大困难之一。Hbase之所以这么麻烦的设计这样的计算模型,终极目的就是为了让海量数据按不同维度存储起来,使用时候尽全力检索数据检索的数量,从而达到海量数据快速读取的目的。

文章转自:博客园——夏天的森林


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

大型网站架构改进历程:存储的瓶颈 的相关文章

  • 使用STM32的DSP库时,遇到的一个bug

    Bug提示如下 Drivers CMSIS Include core cm4 h 81 error 35 error directive Compiler generates FPU instructions for a device wi
  • vcpkg下载不了报错

    使用powershell 添加环境变量 env HTTPS PROXY http 127 0 0 1 7890
  • CSDN的常用技巧(字体、颜色、大小、类型、背景标记、删除、居中)

    CSDN的常用文本设置 字体 颜色 大小 类型等 一 字体设置 二 绘制表格 三 下划线 四 首行缩进 五 设置插入图片的大小 六 空格 七 黑点 八 背景标记 删除文本 九 文字居中 一 字体设置 CSDN Markdown编辑器对字体设
  • 微信远程代码执行漏洞(最新版本利用)-亲测已上线

    目录 POC index html exp js 测试总结 最新版微信利用方式 最新版存在 web安全学习了解 web渗透测试 官网 宣紫科技 POC index html exp js ENABLE LOG true IN WORKER
  • 使用python将视频切分为图片

    coding UTF 8 import cv2 import numpy as np import random import os 定义保存图片函数 image 要保存的图片名字 addr 图片地址与相片名字的前部分 num 相片 名字的
  • 修改网站图标以apache tomcat为例

    路径在 opt apache tomcat 9 0 6 webapps ROOT 把该路径下的favicon ico文件换成自己的 名字必须也是要favicon ico
  • 记一次通过binlog日志恢复MySQL数据库的经历

    通过binlog日志恢复MySQL数据库的数据 一 起因 起因是我在自己服务器上搭建的博客被黑客攻击 黑客删除了我的数据库并且要求支付比特币才给我恢复 博客所有的表和数据都被清空 只留下了勒索金额和地址 如图 穷鬼如我当然是 二 恢复数据
  • 小爱控制HA上的开关(红外线)

    小爱同学控制homeassistant in 树莓派 by 红外线 前言 租了房子以后一直想搞智能家居自动化各种事情 最近终于腾出空可以搞辣 研究了一圈感觉拆开关太麻烦了 零火线还要撬开关 租的房子不敢瞎搞 想了一下可以用arduino 树
  • [C++11]std::promise

    一 std promise介绍 std promise 是C 11并发编程中常用的一个类 常配合std future使用 其作用是在一个线程t1中保存一个类型typename T的值 可供相绑定的std future对象在另一线程t2中获取
  • SQL驱动下载并导入idea,idea连接数据库

    虽然是件小事 但花费了我一个小时呜呜呜呜呜 所以写个博客 希望能帮到需要的人 首先 做好准备工作 1 下载database插件 1 点击上边栏中的设置 gt 选中plogins 2 在搜索框搜索database gt 选择Database
  • 「已解决」 iTunes 由于卸载 Apple Software Upadate 失败的问题。

    已解决 iTunes 由于卸载 Apple Software Upadate 失败的问题 官方给出的解决方案是 相信大家都会卡在第 2 个步骤上面 卸载 Apple Software Update 时发生出错 这里给出几个方案 方案 1 将
  • 项目研发心得总结

    前言 近期因学校实验室项目需求 组建6人小团队研发一个网站 框架采用 NET MVC EF 数据库为SQL Server 简单总结一二 一 数据库设计方面 网站的根基 数据库 最开始源自于和甲方进行需求沟通 由于甲方节奏较缓慢 在未完全确定
  • chm文件打开后,只能看到目录,不显示内容解决方法

    右键单击对应chm文件 选择 属性 打开 常规 选项卡 点击 属性区域 的 解除锁定 文件即可打开 并查看内容
  • 等响度曲线_什么是“响度”

    转自 https blog csdn net weixin 36225384 article details 112220422 原文 https www tonmeister ca wordpress 2014 06 07 bo tech
  • mac本工具使用配置

    1 CotEditor 文本编辑器 文本换行或者不换行设置 格式 换行 文本分栏展示 方便对比 显示 分栏显示 隐藏元素可见模式 格式 隐藏不可见元素
  • 解决keil文件用vscode打开乱码

    打开用户设置 输入encoding 勾选Auto Guess Encoding 如图 就可以自动识别文件的编码了 这样打开GBK和UTF8编码的带中文的文件 就不用手动切换编码了 在vscode文件中可以设置自动保存 你就不用手动ctrl
  • javaFX用IDEA打包导出exe后图片不显示问题

    今天在用idea打包完成了JavaFX项目时 查到了两种方法 一种是用eclipse中的ant直接打包形成可安装的exe文件 见https code makery ch zh cn library javafx tutorial part7
  • fatal: unable to access ‘https://github.com/xxx‘: Failed to connect to github.com

    执行这两行命令 端口号改成自己代理服务器的端口 我的是7890 git config global https proxy 127 0 0 1 7890 git config global http proxy 127 0 0 1 7890
  • visio2016上下标

    之前的visio版本是有上下标的快捷按钮的 但是在visio2016中没有了 需要选中文字之后在 字体 选项卡 点击右下角的小箭头 在 位置 中选择上下标 或者使用快捷键 选中要成为上标的文字 ctrl shift 选中要成为下标的文字 c
  • 解决matplotlib画图中文乱码

    一 下载字体 以SimHei字体为例 下载SimHei ttf文件 在python环境下输入 import matplotlib print matplotlib path 输出matplotlib的安装环境 放在该路径下的mpl data

随机推荐

  • 将Servlet中的ResultSet显示到Jsp页面

    Servlet从数据库中拿到结果以后 对用户来说 他们并不关心你怎么拿的 恰恰最重要的是 他们要看到信息展示在网页上 那这个该怎么实现 言归正传 拿到数据以后 想要把数据展示到Jsp页面上 这样办 跳转 转发和重定看大佬文章 清晰又明白 转
  • vscode连接服务器不用每次都输入密码

    1 首先在自己的本地生成公钥和密钥 git bash 输入以下命令 ssh keygen 然后一路回车 就会在自己用户 ssh文件夹下生成一对密钥 生成的公钥和密钥默认放在 ssh文件夹 我的是 2 修改本地的配置文件 添加下面这行属性到配
  • python学习笔记---IO编程【廖雪峰】

    IO编程 IO在计算机中指Input Output 也就是输入和输出 由于程序和运行时数据是在内存中驻留 由CPU这个超快的计算核心来执行 涉及到数据交换的地方 通常是磁盘 网络等 就需要IO接口 IO编程中 Stream 流 是一个很重要
  • linux中的阻塞机制及等待队列

    阻塞与非阻塞是设备访问的两种方式 驱动程序需要提供阻塞 等待队列 中断 和非阻塞方式 轮询 异步通知 访问设备 在写阻塞与非阻塞的驱动程序时 经常用到等待队列 一 阻塞与非阻塞 阻塞调用是没有获得资源则挂起进程 被挂起的进程进入休眠状态 调
  • 输出数组中最大和最小的元素值及其下标

    设计完整的程序实现以下功能 一个数组有10个元素 例如 1 8 10 2 5 0 7 15 4 5 利用指针作为函数参数 输出数组中最大和最小的元素值及其下标 include
  • TOPP问题(Time-Optimal Path Parameterization)详细解析(附代码)

    题目来源 深蓝学院课程 机器人中的数值优化 主讲 汪哲培博士 最后大作业 参考资料 课程ppt与视频 助教和大佬的提示和讨论 Verscheure D et al Time optimal path tracking for robots
  • java List的contains和remove方法,底层依赖的的对象的equals

    实例 新建一个Person类 像List中添加Person 进行contains和remove方法的测试 Person类 name和age两个属性 但是没有重写equals方法 public class Person private Str
  • Vue2中后台使用dhtmlx-gantt插件实现复杂甘特图

    在工作中由于业务的复杂性 需要使用dhtmlx gantt来实现复杂表格 以下是甘特图的实现以及一些配置描述 由于官方文档是英文的 所以对英文不好的不太友好 官方文档 Gantt API Gantt Docs 相关配置 1 一行需要展示多条
  • Spring框架 AOP

    AOP 面向切面编程 是一种新的方法论 是对传统OOP 面向对象编程 的补充 AOP编程时 扔然需要定义公共功能 但可以明确的定义这个功能在哪里 以什么方式应用 并且不必修改受影响的类 这样一来横切关注点就被模块化到特殊的对象 切面 里 a
  • vscode 所有的默认配置项

    文档 官网 setting json 快速打开 使用快捷键 Ctrl Shift P 然后搜索setting 首选项 打开默认设置 json 这个打开的是defaultSettings json文件 可以在你的默认配置中看到这些 然后自己配
  • 对sql注入的一些理解

    前言 第一个接触的漏洞就是sql注入 一个危害很大到现在都还在流行的漏洞 利用sql注入可以对网站进行脱库 也可以写入shell控制服务器 假期正好有时间 再一次梳理关于sql注入的一些知识 自身理解 我对这个漏洞的理解就是前端的数据可以直
  • kubeadm安装

    一 硬件环境准备 三台机器 计划为 一台master 两台node 序号 ip 系统版本 hostname 配置 节点类型 1 192 168 137 61 CentOS 7 4 1611 Core master61 2核2G Master
  • 主流的6个Go语言Web框架

    GO 语言爱好者的最佳Web框架 如果你是自己写一个小应用程序 那你可能不需要Web框架 但是如果你要做产品 那么你肯定需要一个好的框架 如果你认为你有相应的知识和经验 你会自己编写所有的这些代码么 你有时间找到一个产品级的外部包来完成工作
  • google各国网址

    google各国网址 巴西 www google com br 瑞士 www google ch 荷兰 www google nl 澳大利亚 www google com au 印度 www google co in 罗马尼亚 www go
  • es每次结果不一样_Elasticsearch 分页坑之---评分一致导致数错乱

    1 背景介绍 最近搞es搜索 match查询默认按照评分排序 发现有一部分数据评分一致 一开始也没注意 客户端调用分页的时候 突然发现数据重复错乱很严重 挖槽顿时觉得 挖槽怎么那么坑 from size 做分页 每次都是重新加载 所以评分一
  • react不能用@引用文件

    方法一 步骤 1 删除node models 步骤 2 重新cnpm install 如果cnpm install时右上角出现eslint 省略号是因为记不清了 点击选择忽略 可能会解决
  • iOS OpenGL渲染YUV数据

    链接 http www jianshu com p 39cde80d60e2 本文主要介绍使用OpenGL ES来渲染I420 YUV420P NV12 YUV420SP 的方法 关于YUV的知识 可以看这里 YUV颜色编码解析 同样会用到
  • [519]matplotlib(一)

    import numpy as np 高斯分布 mean 0 0 cov 0 1 1 0 x y np random multivariate normal mean cov 10000 T 使用NumPy 的 histogram2d 函数
  • 使用RESTful风格api命名接口时,GET方法怎么传递多个参数

    点击上方 码农突围 马上关注 这里是码农充电第一站 回复 666 获取一份专属大礼包 真爱 请设置 星标 或点个 在看 在使用RESTful风格不同于普通借口命名的一点是 它规范使用 来表示资源之间的层级关系 对于普通形式命名的接口 假设需
  • 大型网站架构改进历程:存储的瓶颈

    编者按 本文转自博客园的 夏天的森林 在看这篇之前 大家可以移步看 大型网站架构改进历程 存储的瓶颈 一 二 三 四 上文里我遗留了两个问题 一个问题是数据库做了水平拆分以后 如果我们对主键的设计采取一种均匀分布的策略 那么它对于被水平拆分