当前位置: 首页 > news >正文

1 建设网站目的是什么找合伙做网站的

1 建设网站目的是什么,找合伙做网站的,o2o 网站,计算机软件开发流程分片集群架构 分片简介 分片#xff08;shard#xff09;是指在将数据进行水平切分之后#xff0c;将其存储到多个不同的服务器节点上的一种扩展方式。分片在概念上非常类似于应用开发中的“水平分表”。不同的点在于#xff0c;MongoDB本身就自带了分片管理的能力#…分片集群架构 分片简介 分片shard是指在将数据进行水平切分之后将其存储到多个不同的服务器节点上的一种扩展方式。分片在概念上非常类似于应用开发中的“水平分表”。不同的点在于MongoDB本身就自带了分片管理的能力对于开发者来说可以做到开箱即用。 为什么要使用分片 MongoDB复制集实现了数据的多副本复制及高可用但是一个复制集能承载的容量和负载是有限的。在你遇到下面的场景时就需要考虑使用分片了 存储容量需求超出单机的磁盘容量。活跃的数据集超出单机内存容量导致很多请求都要从磁盘读取数据影响性能。写IOPS超出单个MongoDB节点的写服务能力。 垂直扩容Scale Up VS 水平扩容Scale Out 垂直扩容 用更好的服务器提高 CPU 处理核数、内存数、带宽等 水平扩容 将任务分配到多台计算机上 MongoDB分片集群架构 MongoDB 分片集群Sharded Cluster是对数据进行水平扩展的一种方式。MongoDB 使用 分片集群来支持大数据集和高吞吐量的业务场景。在分片模式下存储不同的切片数据的节点被称为分片节点一个分片集群内包含了多个分片节点。当然除了分片节点集群中还需要一些配置节点、路由节点以保证分片机制的正常运作。 核心概念 数据分片分片用于存储真正的数据并提供最终的数据读写访问。分片仅仅是一个逻辑的概念它可以是一个单独的mongod实例也可以是一个复制集。图中的Shard1、Shard2都是一个复制集分片。在生产环境中也一般会使用复制集的方式这是为了防止数据节点出现单点故障。配置服务器Config Server配置服务器包含多个节点并组成一个复制集结构对应于图中的ConfigReplSet。配置复制集中保存了整个分片集群中的元数据其中包含各个集合的分片策略以及分片的路由表等。查询路由mongosmongos是分片集群的访问入口其本身并不持久化数据。mongos启动后会从配置服务器中加载元数据。之后mongos开始提供访问服务并将用户的请求正确路由到对应的分片。在分片集群中可以部署多个mongos以分担客户端请求的压力。 环境搭建 分片集群搭建https://blog.csdn.net/Zhuxiaoyu_91/article/details/144230510 使用mtools搭建分片集群https://blog.csdn.net/Zhuxiaoyu_91/article/details/144193373 使用分片集群 为了使集合支持分片需要先开启database的分片功能 sh.enableSharding(shop) 执行shardCollection命令对集合执行分片初始化 sh.shardCollection(shop.product,{productId:hashed},false,{numInitialChunks:4}) shop.product集合将productId作为分片键并采用了哈希分片策略除此以外“numInitialChunks4”表示将初始化4个chunk。 numInitialChunks必须和哈希分片策略配合使用。而且这个选项只能用于空的集合如果已经存在数据则会返回错误。 向分片集合写入数据 向shop.product集合写入一批数据 dbdb.getSiblingDB(shop);var count0;for(var i0;i1000;i){var p[];for(var j0;j100;j){p.push({productId:P-i-j,name:羊毛衫,tags:[{tagKey:size,tagValue:[L,XL,XXL]},{tagKey:color,tagValue:[蓝色,杏色]},{tagKey:style,tagValue:韩风}]});}countp.length;db.product.insertMany(p);print(insert ,count)} 查询数据的分布 db.product.getShardDistribution() 分片策略 通过分片功能可以将一个非常大的集合分散存储到不同的分片上如图 假设这个集合大小是1TB那么拆分到4个分片上之后每个分片存储256GB的数据。这个当然是最理想化的场景实质上很难做到如此绝对的平衡。一个集合在拆分后如何存储、读写与该集合的分片策略设定是息息相关的。在了解分片策略之前我们先来介绍一下chunk。 什么是chunk chunk的意思是数据块一个chunk代表了集合中的“一段数据”例如用户集合db.users在切分成多个chunk之后如图所示 chunk所描述的是范围区间例如db.users使用了userId作为分片键那么chunk就是userId的各个值或哈希值的连续区间。集群在操作分片集合时会根据分片键找到对应的chunk并向该chunk所在的分片发起操作请求而chunk的分布在一定程度上会影响数据的读写路径这由以下两点决定 chunk的切分方式决定如何找到数据所在的chunkchunk的分布状态决定如何找到chunk所在的分片 分片算法 chunk切分是根据分片策略进行实施的分片策略的内容包括分片键和分片算法。当前MongoDB支持两种分片算法 范围分片range sharding 假设集合根据x字段来分片x的完整取值范围为[minKey, maxKey]x为整数这里的minKey、maxKey为整型的最小值和最大值其将整个取值范围划分为多个chunk例如 chunk1包含x的取值在[minKey-75的所有文档。chunk2包含x取值在[-7525之间的所有文档依此类推。 范围分片能很好地满足范围查询的需求比如想查询x的值在[-3010]之间的所有文档这时mongos直接将请求定位到chunk2所在的分片服务器就能查询出所有符合条件的文档。范围分片的缺点在于如果Shard Key有明显递增或者递减趋势则新插入的文档会分布到同一个chunk此时写压力会集中到一个节点从而导致单点的性能瓶颈。一些常见的导致递增的Key如下 时间值。ObjectId自动生成的_id由时间、计数器组成。UUID包含系统时间、时钟序列。自增整数序列。 哈希分片hash sharding 哈希分片会先事先根据分片键计算出一个新的哈希值64位整数再根据哈希值按照范围分片的策略进行chunk的切分。适用于日志物联网等高并发场景。 哈希分片与范围分片是互补的由于哈希算法保证了随机性所以文档可以更加离散地分布到多个chunk上这避免了集中写问题。然而在执行一些范围查询时哈希分片并不是高效的。因为所有的范围查询都必然导致对所有chunk进行检索如果集群有10个分片那么mongos将需要对10个分片分发查询请求。哈希分片与范围分片的另一个区别是哈希分片只能选择单个字段而范围分片允许采用组合式的多字段作为分片键。 哈希分片仅支持单个字段的哈希分片 { x : hashed }{x : 1 , y : hashed} // 4.4 new 4.4 以后的版本可以将单个字段的哈希分片和一个到多个的范围分片键字段来进行组合比如指定 x:1,y 是哈希的方式。 分片标签 MongoDB允许通过为分片添加标签tag的方式来控制数据分发。一个标签可以关联到多个分片区间TagRange。均衡器会优先考虑chunk是否正处于某个分片区间上被完全包含如果是则会将chunk迁移到分片区间所关联的分片否则按一般情况处理。 分片标签适用于一些特定的场景。例如集群中可能同时存在OLTP和OLAP处理一些系统日志的重要性相对较低而且主要以少量的统计分析为主。为了便于单独扩展我们可能希望将日志与实时类的业务数据分开此时就可以使用标签。 为了让分片拥有指定的标签需执行addShardTag命令 sh.addShardTag(shard01,oltp)sh.addShardTag(shard02,oltp)sh.addShardTag(shard03,olap) 实时计算的集合应该属于oltp标签声明TagRange sh.addTagRange(main.devices,{shardKey:MinKey},{shardKey:MaxKey},oltp) 而离线计算的集合则属于olap标签 sh.addTagRange(other.systemLogs,{shardKey:MinKey},{shardKey:MaxKey},olap) main.devices集合将被均衡地分发到shard01、shard02分片上而other.systemLogs集合将被单独分发到shard03分片上。 分片键ShardKey的选择 在选择分片键时需要根据业务的需求及范围分片、哈希分片的不同特点进行权衡。一般来说在设计分片键时需要考虑的因素包括 分片键的基数cardinality取值基数越大越有利于扩展。 以性别作为分片键 数据最多被拆分为 2 份 以月份作为分片键 数据最多被拆分为 12 份 分片键的取值分布应该尽可能均匀。业务读写模式尽可能分散写压力而读操作尽可能来自一个或少量的分片。分片键应该能适应大部分的业务操作。 分片键ShardKey的约束 ShardKey 必须是一个索引。非空集合须在 ShardCollection 前创建索引空集合 ShardCollection 自动创建索引 4.4 版本之前 ShardKey 大小不能超过 512 Bytes 仅支持单字段的哈希分片键 Document 中必须包含 ShardKey ShardKey 包含的 Field 不可以修改。 4.4 版本之后: ShardKey 大小无限制 支持复合哈希分片键 Document 中可以不包含 ShardKey插入时被当 做 Null 处理 为 ShardKey 添加后缀 refineCollectionShardKey 命令可以修改 ShardKey 包含的 Field 而在 4.2 版本之前ShardKey 对应的值不可以修改4.2 版本之后如果 ShardKey 为非_ID 字段 那么可以修改 ShardKey 对应的值。 数据均衡 均衡的方式 一种理想的情况是所有加入的分片都发挥了相当的作用包括提供更大的存储容量以及读写访问性能。因此为了保证分片集群的水平扩展能力业务数据应当尽可能地保持均匀分布。这里的均匀性包含以下两个方面 所有的数据应均匀地分布于不同的chunk上。每个分片上的chunk数量尽可能是相近的。 其中第1点由业务场景和分片策略来决定而关于第2点我们有以下两种选择 手动均衡 一种做法是可以在初始化集合时预分配一定数量的chunk仅适用于哈希分片比如给10个分片分配1000个chunk那么每个分片拥有100个chunk。另一种做法则是可以通过splitAt、moveChunk命令进行手动切分、迁移。 自动均衡 开启MongoDB集群的自动均衡功能。均衡器会在后台对各分片的chunk进行监控一旦发现了不均衡状态就会自动进行chunk的搬迁以达到均衡。其中chunk不均衡通常来自于两方面的因素 一方面在没有人工干预的情况下chunk会持续增长并产生分裂split而不断分裂的结果就会出现数量上的不均衡另一方面在动态增加分片服务器时也会出现不均衡的情况。自动均衡是开箱即用的可以极大简化集群的管理工作。 chunk分裂 在默认情况下一个chunk的大小为64MB该参数由配置的chunksize参数指定。如果持续地向该chunk写入数据并导致数据量超过了chunk大小则MongoDB会自动进行分裂将该chunk切分为两个相同大小的chunk。 chunk分裂是基于分片键进行的如果分片键的基数太小则可能因为无法分裂而会出现jumbo chunk超大块的问题。例如对db.users使用gender性别作为分片键由于同一种性别的用户数可能达到数千万分裂程序并不知道如何对分片键gender的一个单值进行切分因此最终导致在一个chunk上集中存储了大量的user记录总大小超过64MB。 jumbo chunk对水平扩展有负面作用该情况不利于数据的均衡业务上应尽可能避免。一些写入压力过大的情况可能会导致chunk多次失败split最终当chunk中的文档数大于1.3×avgObjectSize时会导致无法迁移。此外在一些老版本中如果chunk中的文档数超过250000个也会导致无法迁移。 自动均衡 MongoDB的数据均衡器运行于Primary Config Server配置服务器的主节点上而该节点也同时会控制chunk数据的搬迁流程。 流程说明 分片shard0在持续的业务写入压力下产生了chunk分裂。分片服务器通知Config Server进行元数据更新。Config Server的自动均衡器对chunk分布进行检查发现shard0和shard1的chunk数差异达到了阈值向shard0下发moveChunk命令以执行chunk迁移。shard0执行指令将指定数据块复制到shard1。该阶段会完成索引、chunk数据的复制而且在整个过程中业务侧对数据的操作仍然会指向shard0所以在第一轮复制完毕之后目标shard1会向shard0确认是否还存在增量更新的数据如果存在则继续复制。shard0完成迁移后发送通知此时Config Server开始更新元数据库将chunk的位置更新为目标shard1。在更新完元数据库后并确保没有关联cursor的情况下shard0会删除被迁移的chunk副本。Config Server通知mongos服务器更新路由表。此时新的业务请求将被路由到shard1。 迁移阈值 均衡器对于数据的“不均衡状态”判定是根据两个分片上的chunk个数差异来进行的 chunk个数 迁移阈值 少于20 2 2079 4 80及以上 8 迁移速度 数据均衡的整个过程并不是很快影响MongoDB均衡速度的几个选项如下 _secondaryThrottle用于调整迁移数据写到目标分片的安全级别。如果没有设定则会使用w2选项即至少一个备节点确认写入迁移数据后才算成功。从MongoDB 3.4版本开始_secondaryThrottle被默认设定为false, chunk迁移不再等待备节点写入确认。_waitForDelete在chunk迁移完成后源分片会将不再使用的chunk删除。如果_waitForDelete是true那么均衡器需要等待chunk同步删除后才进行下一次迁移。该选项默认为false这意味着对于旧chunk的清理是异步进行的。并行迁移数量在早期版本的实现中均衡器在同一时刻只能有一个chunk迁移任务。从MongoDB 3.4版本开始允许n个分片的集群同时执行n/2个并发任务。 随着版本的迭代MongoDB迁移的能力也在逐步提升。从MongoDB 4.0版本开始支持在迁移数据的过程中并发地读取源端和写入目标端迁移的整体性能提升了约40%。这样也使得新加入的分片能更快地分担集群的访问读写压力。 数据均衡带来的问题 数据均衡会影响性能在分片间进行数据块的迁移是一个“繁重”的工作很容易带来磁盘I/O使用率飙升或业务时延陡增等一些问题。因此建议尽可能提升磁盘能力如使用SSD。除此之外我们还可以将数据均衡的窗口对齐到业务的低峰期以降低影响。 登录mongos在config数据库上更新配置代码如下 use configsh.setBalancerState(true)db.settings.update({_id:balancer},{$set:{activeWindow:{start:02:00,stop:04:00}}},{upsert:true}) 在上述操作中启用了自动均衡器同时在每天的凌晨2点到4点运行数据均衡操作 对分片集合中执行count命令可能会产生不准确的结果mongos在处理count命令时会分别向各个分片发送请求并累加最终的结果。如果分片上正在执行数据迁移则可能导致重复的计算。替代办法是使用db.collection.countDocuments({})方法该方法会执行聚合操作进行实时扫描可以避免元数据读取的问题但需要更长时间。 在执行数据库备份的期间不能进行数据均衡操作否则会产生不一致的备份数据。在备份操作之前可以通过如下命令确认均衡器的状态: sh.getBalancerState()查看均衡器是否开启。sh.isBalancerRunning()查看均衡器是否正在运行。sh.getBalancerWindow()查看当前均衡的窗口设定。
http://www.w-s-a.com/news/907712/

相关文章:

  • 营销型网站图片肯德基网站开发
  • 网站的外链是什么wordpress开启菜单
  • 文字字体是什么网站西安博达网站建设
  • 北京南昌网站建设网站查看空间商
  • 网站建设人员职责分布乐清市网站建设设计
  • 网站建设etw网站建设陕西
  • 网站文章页内链结构不好可以改吗wordpress英文模板下载
  • 北京天通苑 做网站哈尔滨快速网站排名
  • 网站开发负责人是什么职位试剂网站建设
  • 什么是展示型网站wordpress链接视频
  • 佳木斯城乡建设局网站过年做哪个网站能致富
  • 石家庄快速网站搭建设计公司属于什么企业
  • 中小学智慧校园建设平台网站sem竞价推广
  • 想创建一个网站官方网站建设推广
  • 江门网站优化民间it网站建设
  • 科研实验室网站建设wordpress加载模板
  • 用r做简易的网站软件园二期做网站的公司
  • 菏泽网站建设价格长春高档网站建设
  • PHP网站开发与管理设计心得网站流量图怎么做
  • 苏州做网站企业wordpress点击文字弹出层
  • 做网站必要性中山古镇做网站
  • 增城住房和城乡建设局网站2021网站你懂我意思正能量
  • seo优秀网站深圳企业医疗网站建设
  • 单页 网站 模板重庆微信网站制作专家
  • 石家庄网站定制制作企业所得税优惠政策最新2022文件
  • 免费推广网站途径有哪些郑州企业型网站建设
  • wap网站建设设计wordpress首页名称
  • wordpress网站换空间南宁网站设计可以找我
  • 期货贵金属网站建设招远网站建设哪家专业
  • 上海网站排名个人网站可以做百度推广