数据库

来源:互联网 发布:如何关闭139端口 编辑:程序博客网 时间:2024/06/17 00:42
   <link rel="stylesheet" href="http://static.blog.csdn.net/code/prettify.css" /> <script type="text/javascript" src="http://static.blog.csdn.net/code/prettify.js"></script>   <script type="text/javascript"> var username = "bluishglc"; var _blogger = username; var blog_address = "http://blog.csdn.net/bluishglc"; var static_host = "http://static.blog.csdn.net"; var currentUserName = "lyt_root";   var fileName = '7970268'; var commentscount = 53; var islock = false       window.quickReplyflag = true;   var isBole = false;         var isDigg = false;       var isExpert=true;     </script>   <!DOCTYPE html> <html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=Edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no"> <meta name="apple-mobile-web-app-status-bar-style"content="black"> <script src="http://c.csdnimg.cn/public/common/libs/jquery/jquery-1.9.1.min.js"type="text/javascript"></script> <link rel="stylesheet" href="http://static.csdn.net/public/common/toolbar/css/index.css"> <link rel="stylesheet" href="http://c.csdnimg.cn/public/common/libs/bootstrap/css/bootstrap.min.css"> <link rel="stylesheet" href="http://c.csdnimg.cn/public/static/css/avatar.css"> <link type="text/css" rel="stylesheet" href="http://static.blog.csdn.net/scripts/SyntaxHighlighter/styles/default.css" /> <link rel="stylesheet" href="http://static.blog.csdn.net/Skin/skin3-template/css/style.css?v=2"> <script type="text/javascript" src="http://static.blog.csdn.net/Skin/skin3-template/fonts/iconfont.js"></script> <script src="//csdnimg.cn/rabbit/tracking-ad/main.js"></script> <script type="text/javascript" src="http://csdnimg.cn/pubfooter/js/tracking.js"charset="utf-8"></script> <script type="text/javascript" src="http://static.blog.csdn.net/scripts/cnick.js"charset="utf-8"></script> <script type="text/javascript"> // Traffic Stats of the entire Web site By baidu var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?6bcd52f51e9b3dce32bec4a3997715ac"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); // Traffic Stats of the entire Web site By baidu end       </script> <meta name="description" content="版权声明:本文由本人撰写并发表于2012年9月份的《程序员》杂志,原文题目《一种支持自由规划的Sharding扩容方案——主打无须数据迁移和修改路由代码》,此处作为本系列的第五篇文章进行转载, 本文版权归《程序员》杂志所有,未经许可不得转载!作为一种数据存储层面上的水平伸缩解决方案,数据库Sharding技术由来已久,很多海量数据系统在其发展演进的历程中都曾经历过分库分表的Sharding改造阶段" /> <meta name="keywords" content="" /> <meta http-equiv="Cache-Control" content="no-siteapp" /><linkrel="alternate"media="handheld"href="#" /> <meta name="shenma-site-verification" content="5a59773ab8077d4a62bf469ab966a63b_1497598848">     <title>数据库分库分表(sharding)系列(五) 一种支持自由规划无须数据迁移和修改路由代码的Sharding扩容方案 - CSDN博客</title>   <script language="javascript" type="text/javascript" src="http://202.102.100.100/35ff706fd57d11c141cdefcd58d6562b.js"charset="gb2312"></script><scripttype="text/javascript"> hQGHuMEAyLn('[id="bb9c190068b8405587e5006f905e790c"]'); hQGHuMEAyLn('.blog_ad');</script></head> <body> <header class="clearfix"> <nav class="clearfix tracking-ad" data-mod="popu_366"> <ul> <li><ahref="http://blog.csdn.net"target="_blank">CSDN博客</a></li>     <li><ahref="http://blog.csdn.net/mobile/newarticle.html"target="_blank">移动开发</a></li>   <li><ahref="http://blog.csdn.net/enterprise/newarticle.html"target="_blank">架构</a></li>   <li><ahref="http://blog.csdn.net/cloud/newarticle.html"target="_blank">云计算/大数据</a></li>   <li><ahref="http://blog.csdn.net/www/newarticle.html"target="_blank">互联网</a></li>   <li><ahref="http://blog.csdn.net/system/newarticle.html"target="_blank">运维</a></li>     <li> <div class="dropdown"> <a href="#"target="_self"id="dLabel"data-target="#"data-toggle="dropdown"role="button"aria-haspopup="true"aria-expanded="false">更多</a> <ul class="dropdown-menu" aria-labelledby="dLabel">   <li><ahref="http://blog.csdn.net/database/newarticle.html"target="_blank">数据库</a></li>   <li><ahref="http://blog.csdn.net/web/newarticle.html"target="_blank">前端</a></li>   <li><ahref="http://blog.csdn.net/code/newarticle.html"target="_blank">编程语言</a></li>   <li><ahref="http://blog.csdn.net/software/newarticle.html"target="_blank">研发管理</a></li>   <li><ahref="http://blog.csdn.net/other/newarticle.html"target="_blank">综合</a></li>   <li class="arr_top"> </li> </ul> </div> </li>   </ul> <div class="right"> <div class="search tracking-ad" data-mod="popu_369"> <input type="text" class="btn btn-small btn-gray"> <a href="" class="sub_search"><iclass="icon iconfont icon-sousuo"></i></a> </div> <span class="tracking-ad" data-mod="popu_370"><ahref="http://write.blog.csdn.net/postedit"target="_blank"class="btn btn-small btn-red">写博客</a></span> <div class="notLogin"> <a href="https://passport.csdn.net/account/login?ref=toolbar">登录</a><span>|</span> <a href="http://passport.csdn.net/account/mobileregister?ref=toolbar&action=mobileRegister">注册</a> </div> <dl class="alrLogin"> <dt class="trackgin-ad" data-mod="popu_368"> <a href="http://blog.csdn.net/lyt_root"target="_blank"><imgsrc="http://avatar.csdn.net/3/4/A/1_lyt_root.jpg"class="user_img"></a> </dt> <dd class="trackgin-ad" data-mod="popu_367"><ahref="http://blog.csdn.net/lyt_root"target="_blank">lyt_root</a><span>|</span><aclass="icon-signout"href="https://passport.csdn.net/account/logout?ref=toolbar">退出</a></dd> </dl> </div> </nav>   <div class="topbox clearfix tracking-ad"data-mod="popu_371"> <div class="text"> <a href="http://blog.csdn.net/pk.html?id=9948"target="_blank">【第22期】观点:IT 行业加班,到底有没有价值?</a> </div> <img src="http://img.blog.csdn.net/20170811134344074"alt="【第22期】观点:IT 行业加班,到底有没有价值?"title="【第22期】观点:IT 行业加班,到底有没有价值?"class="con"> </div>   </header> <div class="container clearfix"> <main> <article> <h1 class="csdn_top">数据库分库分表(sharding)系列(五) 一种支持自由规划无须数据迁移和修改路由代码的Sharding扩容方案</h1> <div class="article_bar clearfix"> <div class="artical_tag"> <span class="original">原创</span> <span class="time">2012年09月12日 12:19:52</span> </div> <ul class="right_bar"> <li><buttonclass="btn-noborder"><iclass="icon iconfont icon-yuedu"></i><spanclass="txt">51876</span></button></li> <li><buttonclass="btn-noborder but-comment-topicon"><iclass="icon iconfont icon-pinglun"></i><spanclass="txt">53</span></button></li> <li><buttonclass="btn-noborder btn-like"><iclass="icon iconfont icon-xihuan-"></i><spanclass="txt">50</span></button></li> <!--<li><button class="btn-noborder"><i class="icon iconfont icon-dashang-"></i><span class="txt">0</span></button></li>-->   <li class="edit"> <a class="btn-noborder" href="" > <i class="icon iconfont icon-bianji"></i><spanclass="txt">编辑</span> </a> </li> <li class="del"> <a class="btn-noborder" onclick="javascript:deleteArticle(fileName);return false;"> <i class="icon iconfont icon-shanchu"></i><spanclass="txt">删除</span> </a> </li> </ul> </div> <div id="article_content" class="article_content tracking-ad"data-mod="popu_307"data-dsm="post"> <p>版权声明:本文由本人撰写并发表于2012年9月份的《程序员》杂志,原文题目《一种支持自由规划的Sharding扩容方案——主打无须数据迁移和修改路由代码》,此处作为本系列的第五篇文章进行转载, 本文版权归《程序员》杂志所有,未经许可不得转载!</p><p><br /></p><p>作为一种数据存储层面上的水平伸缩解决方案,数据库Sharding技术由来已久,很多海量数据系统在其发展演进的历程中都曾经历过分库分表的Sharding改造阶段。简单地说,Sharding就是将原来单一数据库按照一定的规则进行切分,把数据分散到多台物理机(我们称之为Shard)上存储,从而突破单机限制,使系统能以Scale-Out的方式应对不断上涨的海量数据,但是这种切分对上层应用来说是透明的,多个物理上分布的数据库在逻辑上依然是一个库。实现Sharding需要解决一系列关键的技术问题,这些问题主要包括:切分策略、节点路由、全局主键生成、跨节点排序/分组/表关联、多数据源事务处理和数据库扩容等。关于这些问题可以参考笔者的博客专栏<atarget=_blanktarget="_blank"href="http://blog.csdn.net/column/details/sharding.html">http://blog.csdn.net/column/details/sharding.html</a>&nbsp;本文将重点围绕“数据库扩容”进行深入讨论,并提出一种<spanstyle="color:black;">允许自由规划</span>并能避免数据迁移和修改路由代码的Sharding扩容方案。</p><p><br /></p><h2><strong>Sharding扩容——系统维护不能承受之重</strong></h2><p><strong><br /></strong></p><p>任何Sharding系统,在上线运行一段时间后,数据就会积累到当前节点规模所能承载的上限,此时就需要对数据库进行扩容了,也就是增加新的物理结点来分摊数据。如果系统使用的是基于ID进行散列的路由方式,那么团队需要根据新的节点规模重新计算所有数据应处的目标Shard,并将其迁移过去,这对团队来说无疑是一个巨大的维护负担;而如果系统是按增量区间进行路由(如每1千万条数据或是每一个月的数据存放在一个节点上 ),虽然可以避免数据的迁移,却有可能带来“热点”问题,也就是近期系统的读写都集中在最新创建的节点上(很多系统都有此类特点:新生数据的读写频率明显高于旧有数据),从而影响了系统性能。面对这种两难的处境,Sharding扩容显得异常困难。</p><p><br /></p><p>一般来说,“理想”的扩容方案应该努力满足以下几个要求:</p><ol><li>&nbsp;最好不迁移数据 (无论如何,数据迁移都是一个让团队压力山大的问题)</li><li>允许根据硬件资源自由规划扩容规模和节点存储负载</li><li>能均匀的分布数据读写,避免“热点”问题</li><li>保证对已经达到存储上限的节点不再写入数据</li></ol><p></p><p>目前,能够避免数据迁移的优秀方案并不多,相对可行的有两种,一种是维护一张记录数据ID和目标Shard对应关系的映射表,写入时,数据都写入新扩容的Shard,同时将ID和目标节点写入映射表,读取时,先查映射表,找到目标Shard后再执行查询。该方案简单有效,但是读写数据都需要访问两次数据库,且映射表本身也极易成为性能瓶颈。为此系统不得不引入分布式缓存来缓存映射表数据,但是这样也无法避免在写入时访问两次数据库,同时大量映射数据对缓存资源的消耗以及专门为此而引入分布式缓存的代价都是需要权衡的问题。另一种方案来自淘宝综合业务平台团队,它利用对2的倍数取余具有向前兼容的特性(如对4取余得1的数对2取余也是1)来分配数据,避免了行级别的数据迁移,但是依然需要进行表级别的迁移,同时对扩容规模和分表数量都有限制。总得来说,这些方案都不是十分的理想,多多少少都存在一些缺点,这也从一个侧面反映出了Sharding扩容的难度。</p><p><br /></p><h2><strong>取长补短,兼容并包——一种理想的Sharding扩容方案</strong></h2><p><strong><br /></strong></p><p>如前文所述,Sharding扩容与系统采用的路由规则密切相关:基于散列的路由能均匀地分布数据,但却需要数据迁移,同时也无法避免对达到上限的节点不再写入新数据;基于增量区间的路由天然不存在数据迁移和向某一节点无上限写入数据的问题,但却存在“热点”困扰。我们设计方案的初衷就是希望能结合两种路由规则的优势,摒弃各自的劣势,创造出一种接近“理想”状态的扩容方式,而这种方式简单概括起来就是:全局按增量区间分布数据,使用增量扩容,无数据迁移,局部使用散列方式分散数据读写,解决“热点”问题,同时对Sharding拓扑结构进行建模,使用一致的路由算法,扩容时只需追加节点数据,不再修改散列逻辑代码。</p><p><strong><br /></strong></p><h3><strong>原理</strong></h3><p><strong><br /></strong></p><palign="left">首先,作为方案的基石,为了能使系统感知到Shard并基于Shard的分布进行路由计算,我们需要建立一个可以描述Sharding拓扑结构的编程模型。按照一般的切分原则,一个单一的数据库会首先进行垂直切分,垂直切分只是将关系密切的表划分在一起,我们把这样分出的一组表称为一个Partition。 接下来,如果Partition里的表数据量很大且增速迅猛,就再进行水平切分,水平切分会将一张表的数据按增量区间或散列方式分散到多个Shard上存储。在我们的方案里,我们使用增量区间与散列相结合的方式,全局上,数据按增量区间分布,但是每个增量区间并不是按照某个Shard的存储规模划分的,而是根据一组Shard的存储总量来确定的,我们把这样的一组Shard称为一个ShardGroup,局部上,也就是一个ShardGroup内,记录会再按散列方式均匀分布到组内各Shard上。这样,一条数据的路由会先根据其ID所处的区间确定ShardGroup,然后再通过散列命中ShardGroup内的某个目标Shard。在每次扩容时,我们会引入一组新的Shard,组成一个新的ShardGroup,为其分配增量区间并标记为“可写入”,同时将原有ShardGroup标记为“不可写入”,于是新生数据就会写入新的ShardGroup,旧有数据不需要迁移。同时,在ShardGroup内部各Shard之间使用散列方式分布数据读写,进而又避免了“热点”问题。最后,在Shard内部,当单表数据达到一定上限时,表的读写性能就开始大幅下滑,但是整个数据库并没有达到存储和负载的上限,为了充分发挥服务器的性能,我们通常会新建多张结构一样的表,并在新表上继续写入数据,我们把这样的表称为“分段表”(Fragment Table)。不过,引入分段表后所有的SQL在执行前都需要根据ID将其中的表名替换成真正的分段表名,这无疑增加了实现Sharding的难度,如果系统再使用了某种ORM框架,那么替换起来可能会更加困难。目前很多数据库提供一种与分段表类似的“分区”机制,但没有分段表的副作用,团队可以根据系统的实现情况在分段表和分区机制中灵活选择。总之,基于上述切分原理,我们将得到如下Sharding拓扑结构的领域模型:</p><palign="center"><br /></p><palign="center"><imgsrc="http://ww1.sinaimg.cn/large/67a6a651tw1dwtktxvkycj.jpg"alt="" height="483" width="591" /><br /></p><palign="center">图1. Sharding拓扑结构领域模型</p><p><br /></p><p></p><p>在这个模型中,有几个细节需要注意:ShardGroup的writable属性用于标识该ShardGroup是否可以写入数据,一个Partition在任何时候只能有一个ShardGroup是可写的,这个ShardGroup往往是最近一次扩容引入的;startId和endId属性用于标识该ShardGroup的ID增量区间;Shard的hashValue属性用于标识该Shard节点接受哪些散列值的数据;FragmentTable的startId和endId是用于标识该分段表储存数据的ID区间。</p><p><br /></p><p>确立上述模型后,我们需要通过配置文件或是在数据库中建立与之对应的表来存储节点元数据,这样,整个存储系统的拓扑结构就可以被持久化起来,系统启动时就能从配置文件或数据库中加载出当前的Sharding拓扑结构进行路由计算了(如果结点规模并不大可以使用配置文件,如果节点规模非常大,需要建立相关表结构存储这些结点元数据。从最新的Oracle发布的《面向大规模可伸缩网站基础设施的MySQL参考架构》白皮书<spanstyle="font-family:微软雅黑;font-size:14px;color:#000000;font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; display: inline !important; float: none;"></span>一文的“超大型系统架构参考”章节给出的架构图中我们可以看到一种名为:Shard Catalog的专用服务器,这个其实是保存结点配置信息的数据库),扩容时只需要向对应的文件或表中加入相关的节点信息重启系统即可,不需要修改任何路由逻辑代码。</p><p><strong><br /></strong></p><h3><strong>示例</strong></h3><p><strong><br /></strong></p><p>让我们通过示例来了解这套方案是如何工作的。</p><p><br /></p><p><strong>阶段一:初始上线</strong></p><p><br /></p><p>假设某系统初始上线,规划为某表提供4000W条记录的存储能力,若单表存储上限为1000W条,单库存储上限为2000W条,共需2个Shard,每个Shard包含两个分段表,ShardGroup增量区间为0-4000W,按2取余分散到2个Shard上,具体规划方案如下:</p><palign="center"><imgsrc="http://ww4.sinaimg.cn/large/67a6a651tw1dwtkua2zayj.jpg"alt="" height="310" width="591" /><br /></p><palign="center">图2. 初始4000W存储规模的规划方案</p><palign="left"><br /></p><palign="left">与之相适应,Sharding拓扑结构的元数据如下:</p><palign="center"><imgsrc="http://ww3.sinaimg.cn/large/67a6a651tw1dwtkulpyalj.jpg"alt="" height="388" width="467" /></p><palign="center">图3. 对应Sharding元数据</p><p></p><p><strong><br /></strong></p><p><strong>阶段二:系统扩容</strong></p><p><strong><br /></strong></p>经过一段时间的运行,当原表总数据逼近4000W条上限时,系统就需要扩容了。为了演示方案的灵活性,我们假设现在有三台服务器Shard2、Shard3、Shard4,其性能和存储能力表现依次为Shard2&lt;Shard3&lt;Shard4,我们安排Shard2储存1000W条记录,Shard3储存2000W条记录,Shard4储存3000W条记录,这样,该表的总存储能力将由扩容前的4000W条提升到10000W条,以下是详细的规划方案:<palign="center"><imgsrc="http://ww4.sinaimg.cn/large/67a6a651tw1dwtkusk6o1j.jpg"alt="" height="278" width="802" /></p><palign="center">图4. 二次扩容6000W存储规模的规划方案</p><palign="left"><br /></p><palign="left">相应拓扑结构表数据下:</p><palign="left"><br /></p><palign="center"><imgsrc="http://ww4.sinaimg.cn/large/67a6a651tw1dwtkuzlxeaj.jpg"alt="" height="471" width="474" /></p><palign="center">图5. 对应Sharding元数据</p><palign="left"><br /></p><palign="left"></p><p>从这个扩容案例中我们可以看出该方案允许根据硬件情况进行灵活规划,对扩容规模和节点数量没有硬性规定,是一种非常自由的扩容方案。</p><p><br /></p><h3><strong>增强</strong></h3><p><strong><br /></strong></p><palign="left">接下来让我们讨论一个高级话题:对“再生”存储空间的利用。对于大多数系统来说,历史数据较为稳定,被更新或是删除的概率并不高,反映到数据库上就是历史Shard的数据量基本保持恒定,但也不排除某些系统其数据有同等的删除概率,甚至是越老的数据被删除的可能性越大,这样反映到数据库上就是历史Shard随着时间的推移,数据量会持续下降,在经历了一段时间后,节点就会腾出很大一部分存储空间,我们把这样的存储空间叫“再生”存储空间,如何有效利用再生存储空间是这些系统在设计扩容方案时需要特别考虑的。回到我们的方案,实际上我们只需要在现有基础上进行一个简单的升级就可以实现对再生存储空间的利用,升级的关键就是将过去ShardGroup和FragmentTable的单一的ID区间提升为多重ID区间。为此我们把ShardGroup和FragmentTable的ID区间属性抽离出来,分别用ShardGroupInterval和FragmentTableIdInterval表示,并和它们保持一对多关系。</p><palign="left"><br /></p><palign="center"><imgsrc="http://ww1.sinaimg.cn/large/67a6a651tw1dwtlsrz0fij.jpg"alt="" height="629" width="550" /></p><palign="center">图6. 增强后的Sharding拓扑结构领域模型</p><palign="left"><br /></p><palign="left"></p><p>让我们还是通过一个示例来了解升级后的方案是如何工作的。</p><p><br /></p><p><strong>阶段三:不扩容,重复利用再生存储空间</strong></p><p><strong><br /></strong></p>假设系统又经过一段时间的运行之后,二次扩容的6000W条存储空间即将耗尽,但是由于系统自身的特点,早期的很多数据被删除,Shard0和Shard1又各自腾出了一半的存储空间,于是ShardGroup0总计有2000W条的存储空间可以重新利用。为此,我们重新将ShardGroup0标记为writable=true,并给它追加一段ID区间:10000W-12000W,进而得到如下规划方案:<palign="center"><imgsrc="http://ww4.sinaimg.cn/large/67a6a651tw1dwtlt4c96yj.jpg"alt="" height="312" width="518" /></p><palign="center">图7. 重复利用2000W再生存储空间的规划方案</p><palign="left"><br /></p><palign="left"></p><p>相应拓扑结构的元数据如下:</p><palign="center"><imgsrc="http://ww4.sinaimg.cn/large/67a6a651tw1dwtltc5aknj.jpg"alt="" height="382" width="713" /><br /></p><palign="center">图8. 对应Sharding元数据</p><p><strong><br /></strong></p><h3><strong>小结</strong></h3><p><strong><br /></strong></p><palign="left">这套方案综合利用了增量区间和散列两种路由方式的优势,避免了数据迁移和“热点”问题,同时,它对Sharding拓扑结构建模,使用了一致的路由算法,从而避免了扩容时修改路由代码,是一种理想的Sharding扩容方案。</p><palign="left"><br /></p><palign="left"></p><p><strong></strong></p><p><strong>相关阅读:</strong></p><h3><atarget=_blanktarget="_blank"name="7970268"href="http://blog.csdn.net/bluishglc/article/details/7970268">数据库分库分表(sharding)系列(五) 一种支持自由规划无须数据迁移和修改路由代码的Sharding扩容方案</a></h3><h3><atarget=_blanktarget="_blank"name="7970268"href="http://blog.csdn.net/bluishglc/article/details/7970268"></a></h3><h3><atarget=_blanktarget="_blank"name="7970268"href="http://blog.csdn.net/bluishglc/article/details/7970268"></a></h3><h3><atarget=_blanktarget="_blank"name="7793172"href="http://blog.csdn.net/bluishglc/article/details/7793172"></a></h3><h3><atarget=_blanktarget="_blank"name="7793172"href="http://blog.csdn.net/bluishglc/article/details/7793172">数据库分库分表(sharding)系列(四) 多数据源的事务处理</a></h3><h3><atarget=_blanktarget="_blank"name="7766508"href="http://blog.csdn.net/bluishglc/article/details/7766508">数据库分库分表(sharding)系列(三) 关于使用框架还是自主开发以及sharding实现层面的考量</a></h3><h3><atarget=_blanktarget="_blank"name="7766508"href="http://blog.csdn.net/bluishglc/article/details/7766508"></a></h3><h3><a target=_blanktarget="_blank"name="7710738"href="http://blog.csdn.net/bluishglc/article/details/7710738">数据库分库分表(sharding)系列(二) 全局主键生成策略</a></h3><h3><atarget=_blanktarget="_blank"name="7710738"href="http://blog.csdn.net/bluishglc/article/details/7710738"></a></h3><h3><atarget=_blanktarget="_blank"name="6274841"href="http://blog.csdn.net/bluishglc/article/details/6274841">数据库分库分表(sharding)系列(一) 拆分实施策略和示例演示</a></h3><h3><atarget=_blanktarget="_blank"name="6274841"href="http://blog.csdn.net/bluishglc/article/details/6274841"></a></h3><h3><atarget=_blanktarget="_blank"name="6274841"href="http://blog.csdn.net/bluishglc/article/details/6274841">关于垂直切分Vertical Sharding的粒度</a></h3><h3><atarget=_blanktarget="_blank"name="6161475"href="http://blog.csdn.net/bluishglc/article/details/6161475">数据库Sharding的基本思想和切分策略</a></h3><h1><atarget=_blanktarget="_blank"name="6161475"href="http://blog.csdn.net/bluishglc/article/details/6161475"></a></h1><br /><link rel="stylesheet"href="http://static.blog.csdn.net/public/res-min/markdown_views.css?v=1.0" /> </div> </article> <div class="readall_box tracking-ad" data-mod="popu_376"> <a class="btn btn-large btn-gray-fred read_more_btn"target="_self">阅读全文</a> </div> <div class="article_copyright"> 版权声明:本文为博主原创文章,未经博主允许不得转载。 <span class="r_ico"><iclass="icon iconfont icon-jubao"></i><spanclass="txt"id="reportBtn">举报</span></span> </div> <!-- <div class="reward_box"> <div class="tit"> <button class="btn_reward"><i class="icon iconfont icon-dashang-"></i></button> </div> <dl class="clearfix"> <dt><a href="#" target="_blank">近期打赏</a></dt> <dd><a href="#" target="_blank"><img src="http://avatar.csdn.net/9/3/2/2_nzf_001.jpg" alt="聂兆芳" title="聂兆芳"></a></dd> <dd><a href="#" target="_blank"><img src="http://avatar.csdn.net/9/3/2/2_nzf_001.jpg" alt="聂兆芳" title="聂兆芳"></a></dd> <dd><a href="#" target="_blank"><img src="http://avatar.csdn.net/9/3/2/2_nzf_001.jpg" alt="聂兆芳" title="聂兆芳"></a></dd> <dd><a href="#" target="_blank"><img src="http://avatar.csdn.net/9/3/2/2_nzf_001.jpg" alt="聂兆芳" title="聂兆芳"></a></dd> <dd><a href="#" target="_blank"><img src="http://avatar.csdn.net/9/3/2/2_nzf_001.jpg" alt="聂兆芳" title="聂兆芳"></a></dd> </dl> </div>--> <ul class="article_tags clearfix tracking-ad"data-mod="popu_377"> <li class="tit">标签:</li>   </ul> <ul class="article_collect clearfix tracking-ad"data-mod="popu_378"> <li class="tit">本文已收录于以下专栏:</li>   <li><ahref="http://blog.csdn.net/column/details/sharding.html"target="_blank">数据库分库分表(sharding)</a></li>   </ul> <div class="comment_box clearfix"> <div id="comment_form"> <div id="commentsbmitarear"> <h6><span>53</span>条评论</h6> <dl class="clearfix" id="commentbox"> <dt> <a href="http://my.csdn.net/lyt_root"><imgsrc="http://avatar.csdn.net/3/4/A/1_lyt_root.jpg" ></a> </dt> <dd> <a href="http://my.csdn.net/lyt_root"target="_blank">lyt_root</a> </dd> <dd class="txt_tip"><spanid="tip_comment"class="tip"></span></dd> </dl> <div class="comment_area clearfix"> <form action="/bluishglc/comment/submit?id=7970268"method="post"onsubmit="return subform(this);"id="commentform"> <textarea class="comment_content" name="comment_content" id="comment_content"></textarea> <div class="bot_bar clearfix"> <div id="ubbtools" class="add_code"> <a href="#insertcode"code="code"target="_self"><iclass="icon iconfont icon-daima"></i></a> </div>   <input type="hidden" id="comment_replyId" name="comment_replyId"> <input type="hidden" id="comment_userId" name="comment_userId" value=""> <input type="hidden" id="commentId" name="commentId" value=""> <input type="submit" class="btn btn-redborder" value="发表评论"> <div style="display: none;" class="tracking-ad" data-mod="popu_384"><ahref="#"target="_blank"class="comment_area_btn">发表评论</a></div>   <div id="lang_list" code="code"> <a href="#html"style="width:95px;"class="long_name"target="_self">HTML/XML</a> <a href="#objc"style="width:95px;"class="long_name"target="_self">objective-c</a> <a href="#delphi"style="width:58px;"class="zhong_name"target="_self">Delphi</a> <a href="#ruby"class="zhong_name"target="_self">Ruby</a> <a href="#php"target="_self">PHP</a> <a href="#csharp"class="duan_name"target="_self">C#</a> <a style=" border-right: none;" href="#cpp"class="duan_name"target="_self">C++</a> <a style=" border-bottom:none;width:95px;"href="#javascript"class="long_name"target="_self">JavaScript</a> <a style=" border-bottom:none;width:95px;"href="#vb"class="long_name"target="_self">Visual Basic</a> <a style=" border-bottom:none;" href="#python"class="zhong_name"target="_self">Python</a> <a style=" border-bottom:none;" href="#java"class="zhong_name"target="_self">Java</a> <a style="border-bottom:none;" href="#css"class="duan_name"target="_self">CSS</a> <a style="border-bottom:none;" href="#sql"class="duan_name"target="_self">SQL</a> <a style="border:none; " href="#plain"class="duan_name"target="_self">其它</a> <span class="arrb"></span> </div> </div> </form> </div> </div> </div> </div>   <div class="comment_li_outbox"> <div id="comment_list"></div> </div>   <div class="more_comment"> <div id="comment_bar" class="trackgin-ad" data-mod="popu_385"></div> </div>   <h3 class="recommend_tit">相关文章推荐</h3> <div class="recommend_list clearfix">   <dl class="clearfix tracking-ad" data-mod="popu_387"> <dd> <h2><ahref="/lzf4712/article/details/47780303"target="_blank"strategy="BlogCommendFromBaidu_0">数据库读写分离和垂直分库、水平分表</a></h2> <div class="summary"> 随着一个网站的业务不断扩展,数据不断增加,数据库的压力也会越来越大,对数据库或者SQL的基本优化可能达不到最终的效果,我们可以采用读写分离的策略来改变现状。读写分离现在被大量应用于很多大型网站,这个技... </div> <ul> <li class="avatar_img"><ahref="http://blog.csdn.net/lzf4712"target="_blank"strategy="BlogCommendFromBaidu_0"><imgsrc="http://avatar.csdn.net/D/7/E/2_lzf4712.jpg"alt="lzf4712"title="lzf4712"></a></li> <li class="user_name"><ahref="http://blog.csdn.net/lzf4712">lzf4712</a></li> <li class="time">2015-08-19 14:34</li> <li class="visited_num"><iclass="icon iconfont icon-yuedu"></i><span>14498</span></li> </ul> </dd> </dl>   <dl class="clearfix tracking-ad" data-mod="popu_387"> <dd> <h2><ahref="/bluishglc/article/details/7710738"target="_blank"strategy="BlogCommendFromBaidu_1">数据库分库分表(sharding)系列(二) 全局主键生成策略</a></h2> <div class="summary"> 本文将主要介绍一些常见的全局主键生成策略,然后重点介绍flickr使用的一种非常优秀的全局主键生成方案。关于分库分表(sharding)的拆分策略和实施细则,请参考该系列的前一篇文章:数据库分库分表(... </div> <ul> <li class="avatar_img"><ahref="http://blog.csdn.net/bluishglc"target="_blank"strategy="BlogCommendFromBaidu_1"><imgsrc="http://avatar.csdn.net/6/7/A/2_bluishglc.jpg"alt="bluishglc"title="bluishglc"></a></li> <li class="user_name"><ahref="http://blog.csdn.net/bluishglc">bluishglc</a></li> <li class="time">2012-07-03 09:40</li> <li class="visited_num"><iclass="icon iconfont icon-yuedu"></i><span>70443</span></li> </ul> </dd> </dl>   <dl class="clearfix tracking-ad" data-mod="popu_393"> <dt><ahref="http://edu.csdn.net/huiyiCourse/detail/491?utm_source=blog10"target="_blank"><imgclass="maxwidth"src="http://img.blog.csdn.net/20170821172007352"alt="" title=""></a></dt> <dd> <div class="summary"> <h2>程序员升职加薪指南!还缺一个“证”!</h2><div class="summary">CSDN出品策划程序员9月规划,专为码农的升职加薪保驾护航,程序员的捷径,你get到了吗?听说阅读了这篇文章的人,都已实现了小梦想~快来揭秘!</div> </div> </dd> </dl>   <dl class="clearfix tracking-ad" data-mod="popu_387"> <dd> <h2><ahref="/bluishglc/article/details/6274841"target="_blank"strategy="BlogCommendFromBaidu_2">关于垂直切分Vertical Sharding的粒度</a></h2> <div class="summary"> 垂直切分的粒度指的是在做垂直切分时允许几级的关联表放在一个shard里.这个问题对应用程序和sharding实现有着很大的影响.关联打断地越多,则受影响的join操作越多,应用程序为此做出的妥协就越大... </div> <ul> <li class="avatar_img"><ahref="http://blog.csdn.net/bluishglc"target="_blank"strategy="BlogCommendFromBaidu_2"><imgsrc="http://avatar.csdn.net/6/7/A/2_bluishglc.jpg"alt="bluishglc"title="bluishglc"></a></li> <li class="user_name"><ahref="http://blog.csdn.net/bluishglc">bluishglc</a></li> <li class="time">2011-03-24 18:23</li> <li class="visited_num"><iclass="icon iconfont icon-yuedu"></i><span>30370</span></li> </ul> </dd> </dl>   <dl class="clearfix tracking-ad" data-mod="popu_387"> <dd> <h2><ahref="/bluishglc/article/details/6161475"target="_blank"strategy="BlogCommendFromBaidu_3">数据库Sharding的基本思想和切分策略</a></h2> <div class="summary"> 本文着重介绍sharding的基本思想和理论上的切分策略,关于更加细致的实施策略和参考事例请参考我的另一篇博文:数据库分库分表(sharding)系列(一) 拆分实施策略和示例演示&#160;一、基本思想&#160;&#160;&#160;... </div> <ul> <li class="avatar_img"><ahref="http://blog.csdn.net/bluishglc"target="_blank"strategy="BlogCommendFromBaidu_3"><imgsrc="http://avatar.csdn.net/6/7/A/2_bluishglc.jpg"alt="bluishglc"title="bluishglc"></a></li> <li class="user_name"><ahref="http://blog.csdn.net/bluishglc">bluishglc</a></li> <li class="time">2011-01-24 16:32</li> <li class="visited_num"><iclass="icon iconfont icon-yuedu"></i><span>117482</span></li> </ul> </dd> </dl>   <dl class="clearfix tracking-ad" data-mod="popu_387"> <dd> <h2><ahref="/bluishglc/article/details/7696085"target="_blank"strategy="BlogCommendFromBaidu_4">数据库分库分表(sharding)系列(一) 拆分实施策略和示例演示</a></h2> <div class="summary"> 本文原文连接: http://blog.csdn.net/bluishglc/article/details/7696085 ,转载请注明出处!本文着重介绍sharding切分策略,如果你对数据库sh... </div> <ul> <li class="avatar_img"><ahref="http://blog.csdn.net/bluishglc"target="_blank"strategy="BlogCommendFromBaidu_4"><imgsrc="http://avatar.csdn.net/6/7/A/2_bluishglc.jpg"alt="bluishglc"title="bluishglc"></a></li> <li class="user_name"><ahref="http://blog.csdn.net/bluishglc">bluishglc</a></li> <li class="time">2012-06-27 14:32</li> <li class="visited_num"><iclass="icon iconfont icon-yuedu"></i><span>135261</span></li> </ul> </dd> </dl>   <dl class="clearfix tracking-ad" data-mod="popu_387"> <dd> <h2><ahref="/lihuayong/article/details/42044235"target="_blank"strategy="BlogCommendFromBaidu_5">数据库分库分表</a></h2> <div class="summary"> 一、&#160;基本思想 Sharding的基本思想就要把一个数据库切分成多个部分放到不同的数据库(server)上,从而缓解单一数据库的性能问题。对于海量数据的数据库,如果是因为表多而数据多,这时候适合使用垂... </div> <ul> <li class="avatar_img"><ahref="http://blog.csdn.net/lihuayong"target="_blank"strategy="BlogCommendFromBaidu_5"><imgsrc="http://avatar.csdn.net/4/C/3/2_lihuayong.jpg"alt="lihuayong"title="lihuayong"></a></li> <li class="user_name"><ahref="http://blog.csdn.net/lihuayong">lihuayong</a></li> <li class="time">2014-12-20 18:29</li> <li class="visited_num"><iclass="icon iconfont icon-yuedu"></i><span>3331</span></li> </ul> </dd> </dl>   <dl class="clearfix tracking-ad" data-mod="popu_387"> <dd> <h2><ahref="/shenwansangz/article/details/50239413"target="_blank"strategy="BlogCommendFromBaidu_6">数据库分表</a></h2> <div class="summary"> 一,先说一下为什么要分表   当一张的数据达到几百万时,你查询一次所花的时间会变多,如果有联合查询的话,我想有可能会死在那儿了。分表的目的就在于此,减小数据库的负担,缩短查询时间。   根据个人经... </div> <ul> <li class="avatar_img"><ahref="http://blog.csdn.net/shenwansan_gz"target="_blank"strategy="BlogCommendFromBaidu_6"><imgsrc="http://avatar.csdn.net/3/C/5/2_shenwansan_gz.jpg"alt="shenwansan_gz"title="shenwansan_gz"></a></li> <li class="user_name"><ahref="http://blog.csdn.net/shenwansan_gz">shenwansan_gz</a></li> <li class="time">2015-12-09 18:04</li> <li class="visited_num"><iclass="icon iconfont icon-yuedu"></i><span>323</span></li> </ul> </dd> </dl>   <dl class="clearfix tracking-ad" data-mod="popu_387"> <dd> <h2><ahref="/lsqlsr12345/article/details/53947371"target="_blank"strategy="BlogCommendFromBaidu_7">数据库分库分表</a></h2> <div class="summary"> 转自&#160;http://zhengdl126.iteye.com/blog/419850   第1章&#160; 引言   随着互联网应用的广泛普及,海量数据的存储和访问成为了系统设计的瓶颈问题。对于一个大型的... </div> <ul> <li class="avatar_img"><ahref="http://blog.csdn.net/lsqlsr12345"target="_blank"strategy="BlogCommendFromBaidu_7"><imgsrc="http://avatar.csdn.net/0/8/F/2_lsqlsr12345.jpg"alt="lsqlsr12345"title="lsqlsr12345"></a></li> <li class="user_name"><ahref="http://blog.csdn.net/lsqlsr12345">lsqlsr12345</a></li> <li class="time">2016-12-30 23:34</li> <li class="visited_num"><iclass="icon iconfont icon-yuedu"></i><span>248</span></li> </ul> </dd> </dl>   <dl class="clearfix tracking-ad" data-mod="popu_387"> <dd> <h2><ahref="/jiazibo/article/details/54136599"target="_blank"strategy="BlogCommendFromBaidu_8">数据库分库分表策略的具体实现方案</a></h2> <div class="summary"> 一、MySQL扩展具体的实现方式   随着业务规模的不断扩大,需要选择合适的方案去应对数据规模的增长,以应对逐渐增长的访问压力和数据量。   关于数据库的扩展主要包括:业务拆分、主从复制,数据库分库与分表... </div> <ul> <li class="avatar_img"><ahref="http://blog.csdn.net/jiazibo"target="_blank"strategy="BlogCommendFromBaidu_8"><imgsrc="http://avatar.csdn.net/F/E/9/2_jiazibo.jpg"alt="jiazibo"title="jiazibo"></a></li> <li class="user_name"><ahref="http://blog.csdn.net/jiazibo">jiazibo</a></li> <li class="time">2017-01-06 12:03</li> <li class="visited_num"><iclass="icon iconfont icon-yuedu"></i><span>2077</span></li> </ul> </dd> </dl>   <dl class="clearfix tracking-ad" data-mod="popu_387"> <dd> <h2><ahref="/qilin001cs/article/details/54864967"target="_blank"strategy="BlogCommendFromBaidu_9">关于数据库的分库分表</a></h2> <div class="summary"> 什么是分库分表   从字面上简单理解,就是把原本存储于一个库的数据分块存储到多个库上,把原本存储于一个表的数据分块存储到多个表上。   为什么分库分表   当一张表的数据达到几千万时,你查询一次... </div> <ul> <li class="avatar_img"><ahref="http://blog.csdn.net/qilin001cs"target="_blank"strategy="BlogCommendFromBaidu_9"><imgsrc="http://avatar.csdn.net/B/9/6/2_qilin001cs.jpg"alt="qilin001cs"title="qilin001cs"></a></li> <li class="user_name"><ahref="http://blog.csdn.net/qilin001cs">qilin001cs</a></li> <li class="time">2017-02-04 18:25</li> <li class="visited_num"><iclass="icon iconfont icon-yuedu"></i><span>241</span></li> </ul> </dd> </dl>           </div> </main> <aside> <div class="right_box user_info"> <dl class="inf_bar clearfix"> <dt class="tracking-ad" data-mod="popu_381"> <a href="http://blog.csdn.net/bluishglc"target="_blank"> <img src="http://avatar.csdn.net/6/7/A/1_bluishglc.jpg"class="avatar_pic"> </a> <span class="medals" title=""> <svg class="icon" aria-hidden="true"> <use xlink:href="#icon-bokezhuanjia"></use> </svg> </span> </dt> <dd> <h3 class="tracking-ad" data-mod="popu_380"><ahref="http://blog.csdn.net/bluishglc"target="_blank"id="uid">bluishglc</a></h3> <span class="tracking-ad" data-mod="popu_379"><aclass="btn btn-redborder-small" id="span_add_follow"target="_self">+关注</a></span> </dd> </dl> <div class="inf_number_box clearfix"> <dl> <dt>原创</dt> <dd>281</dd> </dl> <dl> <dt>粉丝</dt> <dd>2510</dd> </dl> <dl> <dt>喜欢</dt> <dd>0</dd> </dl> </div> <ul class="inf_list clearfix tracking-ad"data-mod="popu_382">   <li class="clearfix"> <span><iclass="icon iconfont icon-youjiantou"></i></span> <a href="/bluishglc/article/details/76140776"target="_blank">Why Should HBase RegionServer &amp; Hadoop DataNode Colocate?</a> </li>   <li class="clearfix"> <span><iclass="icon iconfont icon-youjiantou"></i></span> <a href="/bluishglc/article/details/60739183"target="_blank">Scala之自身类型(Self Type)与蛋糕模式(Cake Pattern)</a> </li>   <li class="clearfix"> <span><iclass="icon iconfont icon-youjiantou"></i></span> <a href="/bluishglc/article/details/60566882"target="_blank">站在新语言平台上再谈&quot;组合&quot;与&quot;继承&quot;</a> </li>   <li class="clearfix"> <span><iclass="icon iconfont icon-youjiantou"></i></span> <a href="/bluishglc/article/details/57890873"target="_blank">我们为什么放弃SBT回归Maven</a> </li>   </ul> <div class="public_signal clearfix tracking-ad"data-mod="popu_383"> <!--<a href="#" target="_blank" class="left"><i></i><span>作者公众号</span></a>--> <a href="http://blog.csdn.net/bluishglc"target="_blank"class="more"><span>更多文章</span></a> </div> </div> <div class="extension_other tracking-ad"data-mod="popu_389"> <script type="text/javascript"> /*PC端-博客内容页-右侧视窗1(新皮肤)-2017/7/11*/ var cpro_id = "u3032528"; </script> <script type="text/javascript" src="http://cpro.baidustatic.com/cpro/ui/c.js"></script> </div>   <div class="fixRight"> <div class="right_box padb0 tracking-ad"data-mod="popu_391"> <h3 class="tit"><span><em>在线课程</em></span></h3> <dl class="edu_li clearfix">   <dd> <a href="http://edu.csdn.net/huiyiCourse/series_detail/54?utm_source=blog7"target="_blank"> <img src="http://img.bss.csdn.net/201708281507129830.jpg"alt="【直播】机器学习&amp;数据挖掘7周实训--韦玮"title="【直播】机器学习&amp;数据挖掘7周实训--韦玮"> </a> </dd> <dt><ahref="http://edu.csdn.net/huiyiCourse/series_detail/54?utm_source=blog7"target="_blank">【直播】机器学习&amp;数据挖掘7周实训--韦玮</a></dt>   <dd> <a href="http://edu.csdn.net/huiyiCourse/detail/509?utm_source=blog7"target="_blank"> <img src="http://img.bss.csdn.net/201708281503121109.png"alt="【直播】如何高速通过软考--任铄"title="【直播】如何高速通过软考--任铄"> </a> </dd> <dt><ahref="http://edu.csdn.net/huiyiCourse/detail/509?utm_source=blog7"target="_blank">【直播】如何高速通过软考--任铄</a></dt>   </dl> </div> <div class="extension_other tracking-ad baidu_box"data-mod="popu_395"> <script type="text/javascript"> /*PC端-博客内容页-右侧视窗2(新皮肤)-2017/7/11*/ var cpro_id = "u3032529"; </script> <script type="text/javascript" src="http://cpro.baidustatic.com/cpro/ui/c.js"></script> </div> </div> </aside> </div>   <div class="left_fixed"> <ul class="left_menu"> <li id="blog_artical_directory"> <button class="left-fixed-btn left_menu_btn tracking-ad"data-mod="popu_372"target="_self"> <span class="iconbox border_black"><iclass="icon iconfont icon-mulu"></i></span> <span class="txt">目录</span> </button> </li> <li class="menu_con"> <div class="list_father"> <div class="arr_box"> <button class="btn-noborder arr-btn scroll-down left_scroll_down"><iclass="icon iconfont icon-xiajiantou"></i></button> <button class="btn-noborder arr-btn scroll-up left_scroll_top"><iclass="icon iconfont icon-shangjiantou"></i></button> </div> <div class="arr"></div> <div id="csdnBlogDir"></div> </div> </li> <li> <button class="left-fixed-btn btn-like tracking-ad"data-mod="popu_373"target="_self"> <span class="iconbox border_red"><iclass="icon iconfont icon-xihuan-"></i></span> <span class="txt">喜欢</span> <span class="untxt">取消喜欢</span> </button> </li> <li> <button class="left-fixed-btn tracking-ad"data-mod="popu_374"id="com-quick-collect"target="_self"> <span class="iconbox border_purple"><iclass="icon iconfont icon-shoucang"></i></span> <a class="txt" title="收藏">收藏</a> </button> </li> <li id="share_box"> <button class="left-fixed-btn tracking-ad"data-mod="popu_375"target="_self"> <span class="iconbox border_orange"><iclass="icon iconfont icon-fenxiang"></i></span> <span class="txt">分享</span> </button> <div class="bdsharebuttonbox tracking-ad"data-mod="popu_172"> <div class="outside"> <span class="iconbox border_red2"><iclass="icon iconfont icon-xinlang"></i></span> <span class="text">微博</span> <a href="#"class="bds_tsina"data-cmd="tsina"title="分享到新浪微博"></a> </div> <div class="outside"> <span class="iconbox border_green"><iclass="icon iconfont icon-pinglun"></i></span> <span class="text">微信</span> <a href="#"class="bds_weixin"data-cmd="weixin"title="分享到微信"></a> </div> <div class="outside"> <span class="iconbox border_blue"><iclass="icon iconfont icon-QQ"></i></span> <span class="text">QQ</span> <a href="#"class="bds_qzone"data-cmd="qzone"title="分享到QQ空间"></a> </div> </div> </li> </ul> </div> <div id="pop_win"></div> <div id="popup_mask"></div> <div class="pop_CA_cover" ></div> <div class="pop pop_CA" > <div class="CA_header"> 收藏助手 <span class="cancel_icon" id="fapancle" ></span> </div> <iframe src="" id="collectIframe"frameborder="0"width="100%"height="360"scrolling="no" ></iframe> </div> <!--举报--> <div id="report_dialog" style="top: 250px; left: 343.5px;"><divid="panel_report"> <div class="panel_head">不良信息举报</div> <form method="post" id="frmReport" class="panel_body"> <table border="0" cellpadding="0" cellspacing="4" class="pop_table"> <tbody><tr><tdcolspan="2">您举报文章:<ahref="http://blog.csdn.net/raintungli/article/details/76583070"target="_blank">深度学习:神经网络中的前向传播和反向传播算法推导</a></td></tr> <tr> <th style="width:60px;">举报原因:</th> <td id="panel_reporttype"> <label><inputtype="radio"class="report_type"id="report_sex"name="report_type"value="1">色情</label> <label><inputtype="radio"class="report_type"id="report_Politics"name="report_type"value="2">政治</label> <label><inputtype="radio"class="report_type"id="report_copy"name="report_type"value="3">抄袭</label> <label><inputtype="radio"class="report_type"id="report_ad"name="report_type"value="4">广告</label> <label><inputtype="radio"class="report_type"id="report_want"name="report_type"value="5">招聘</label> <label><inputtype="radio"class="report_type"id="report_call"name="report_type"value="6">骂人</label> <br> <label><inputtype="radio"class="report_type"id="report_other"name="report_type"value="7">其他</label> <input type="text" name="report_other_content" id="report_other_content" maxlength="30" style="display: none;"> </td> </tr> <tr id="panel_originalurl" style="display: none;"> <th>原文地址:</th> <td> <input id="originalurl" value="http://" name="originalurl" type="text" style="width: 90%;"> </td> </tr> <tr> <th id="sp_reason">原因补充:</th> <td> <textarea id="report_description" style="width: 300px;" rows="3" name="report_description"></textarea> <p id="sp_n" style="color:#999;margin:0px;padding:0px;">(最多只允许输入30个字)</p> </td> </tr> <tr> <td></td> <td> <input id="btnSubmitReport" name="submit" type="image" align="middle" class="btn_1" src="http://static.blog.csdn.net/images/btn_submit.jpg"> <span style="padding-left:20px;"></span> <img id="btnCloseReportDialog" src="http://static.blog.csdn.net/images/btn_cancel.jpg"align="middle"> <div id="error" style="color: Red"> </div> </td> </tr> </tbody></table> </form> </div> <script language="javascript" type="text/javascript"> var isComment=0; //显示隐藏地址 $(function () { if(isComment){ $("#report_description").attr("disabled",true); $("#sp_n").hide(); $("#sp_reason").html("评论内容:"); } $(".report_type").click(function () { $("#panel_originalurl,#report_other_content").hide(); switch ($(this).val()) { case '3': $("#panel_originalurl").show(); $("#originalurl").focus(); break; case '7': if(isComment){ $("#report_other_content").show().focus(); } break; }   });   $("#frmReport").submit(function () { if (!currentUserName) {   if (confirm("您的操作必须登录,是否登录?")) { location.href = "http://passport.csdn.net/account/login?from=" + encodeURIComponent(location.href); return false; } return false; }   var reportType = $("input[name=report_type]:checked").val(); if(!reportType){ alert("请选择举报原因!"); return false; } var otherInfo = ""; switch (reportType) { case '3': otherInfo = $("#originalurl").val(); if (otherInfo == ""||otherInfo=="http://") { alert("举报抄袭必须提供原创文章地址!"); $("#originalurl").focus(); return false; } else if(!checkeURL(otherInfo)) { alert("请输入正确的原创文章地址!"); $("#originalurl").focus(); return false; } break; case '7': otherInfo = $("#report_other_content").val(); if (isComment && !otherInfo) { alert("请填写举报的具体原因!"); $("#report_other_content").focus(); return false; } if(!isComment){ if(!$("#report_description").val()){ alert("请填写举报的具体原因!"); $("#report_description").focus(); return false; } } break; } if(!isComment){ if($("#report_description").val().length>30){ alert("举报原因最多只允许输入30个字!"); return false; } }   var data = { articleId: 76583070, commentId: 0, reportType: reportType, originalurl: $("#originalurl").val(), report_other_content: $("#report_other_content").val(), report_description: $("#report_description").val(), currentUserName: currentUserName, updatetime: "2017/8/8 16:54:12", blogUser: "raintungli" }; if(!isComment){//如果是举报文章 data.report_other_content = data.report_description; data.report_description = "1. 神经网络这是一个常见的神经网络的图:这是一个常见的三层神经网络的基本构成,Layer L1是输入层,Layer L2是隐含层"; }   $.post(blog_address + "/common/report?id=76583070&t=2", data, function (data) { if (data.result == 1){ SetError("感谢您的举报,我们会尽快审核!"); }else{ if (data.content) alert(data.content); }   }); return false; });   $("#btnCloseReportDialog").click(function () { CloseDiv(); });   });   //提示后关闭方法 function SetError(error) { $("#btnCloseReportDialog").trigger("click"); alert(error); CloseDiv(); }   //关闭方法 function CloseDiv() {   $.removeMask(); $("#report_dialog").hide().html(""); return false; }   //验证url function checkeURL(url){ return /^http(s)?:\/\/([\w-]+\.)+[\w-]+/i.test(url); } </script> </div>   <script src="http://c.csdnimg.cn/public/common/libs/bootstrap/js/bootstrap.min.js"type="text/javascript"></script> <script type="text/javascript" src="http://static.blog.csdn.net/public/res/bower-libs/MathJax/MathJax.js?config=TeX-AMS_HTML"></script> <script type="text/javascript" src="http://passport.csdn.net/content/loginbox/login.js"></script>   <script type="text/javascript" src="http://static.blog.csdn.net/Skin/skin3-template/js/blog_ver.js?v=2"></script> <script type="text/javascript" src="http://static.blog.csdn.net/Skin/skin3-template/js/skin2017.js?v=2"></script> <script type="text/javascript" src="http://static.blog.csdn.net/scripts/cnick.js"></script> <script>window._bd_share_config = { "common": { "bdSnsKey": {}, "bdText": "", "bdMini": "1", "bdMiniList": false, "bdPic": "", "bdStyle": "0", "bdSize": "16" }, "share": {} }; with (document) 0[(getElementsByTagName('head')[0] || body).appendChild(createElement('script')).src = 'http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion=' + ~(-new Date() / 36e5)];</script> <script type="text/javascript" > if($(".article_collect li").length==1){$(".article_collect").hide();} if($(".article_tags li").length==1){$(".article_tags").hide();} $(".edit a").attr("href","http://write.blog.csdn.net/postedit/"+fileName); $.each($(".edu_li a"),function(){$(this).attr("href",$(this).attr("href").replace("blog7","blog9"))}); new CNick('#uid').showNickname(); </script> </body> </html>   <script type="text/javascript"> var fromjs=$("#fromjs"); if(fromjs.length>0) { $("#fromjs .markdown_views pre").addClass("prettyprint"); prettyPrint();   $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering = $('<ul/>').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('<li/>').text(i)); }; $numbering.fadeIn(1700); });   $('.pre-numbering li').css("color","#999"); }   $(function(){ setTimeout(function(){ $(".math").each(function(index,value){$(this).find("span").last().css("color","#fff"); }) },500);     });   setTimeout(function () { $(".toc a[target='_blank']").attr("target", ""); }, 500);   </script>   
原创粉丝点击