ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

HDFS跨数据中心部署:数据一致性与容错性实战解析

HDFS跨数据中心部署:数据一致性与容错性实战解析 搞过大数据基础架构的人应该都有同感单机房HDFS跑得再顺心里始终悬着一块石头万一机房整体出问题业务可就全停了。我前两年接手过一套跨地域双机房HDFS集群这里分享一下我对跨数据中心部署的完整理解和实操记录。这个话题的核心就两个关键词数据一致性和容错性——这两个词在你把集群从“一个机房”扩展到“多个机房”的时候会从纸面概念变成实实在在的坑。这篇文章适合两类人一类是正准备评估HDFS容灾方案、做跨机房架构设计的工程师另一类是集群已经跨机房跑起来了、但在一致性或故障恢复上遇到问题的运维同学。内容以HDFS为主但很多思路对大文件存储类系统都有借鉴意义。1. 为什么要在多个数据中心部署HDFS先理清场景与约束1.1 跨机房部署到底解决什么问题跨数据中心部署HDFS最常见的业务诉求有三类。第一类是容灾。同机房单集群遇到光缆被挖断、电力故障、甚至整机房不可用业务就得跟着停。跨机房部署后一个机房故障另一个机房的副本还在元数据也有热备可以继续对外服务。这是最原始的驱动。第二类是数据本地化。很多公司业务本身就是多地部署的用户和数据天然分散在不同区域。如果数据全放一个机房另一端业务读写都要走跨城专线延迟和带宽成本都受不了。把数据放到离业务近的地方这是很实际的需求。第三类是资源隔离与治理。有些场景下多个业务团队的HDFS负载相互影响严重拆到不同机房天然做了物理隔离故障半径更小。但跨机房部署不是无代价的。先说最核心的成本跨机房带宽。HDFS是数据密集型系统block的复制、均衡、校验都要走网络。机房之间带宽贵且有限而且远距离链路的延迟远高于机房内万兆以太网。如果你的双机房距离上千公里光纤延迟就有几十毫秒这会对写入确认、节点心跳、元数据同步产生直接影响。我见过不少团队在评估时只盯着存储成本和计算资源忽略了带宽预算上线后才发现跨机房复制把专线打满了业务写延迟飙升。所以做方案之前先算清楚流量模型。1.2 选型思考为什么跨机房场景仍然值得选HDFS很多人会问都上云的时代了跨机房HDFS还有必要自建吗其实要看场景。HDFS适合大文件、流式读写的批处理和数仓场景吞吐量高、成本可控、生态完善Hive、Spark、Flink等都能直接对接。对象存储虽然弹性好但在强一致性语义和文件系统操作上和HDFS还是有差距。HDFS跨机房部署有一个底层优势副本机制天然支持多副本跨节点分布。也就是说它不需要借助额外的同步工具本身就能把同一份数据的多个副本放到不同机房。配合NameNode高可用HA元数据层面也能做到机房级故障切换。这一点比很多分布式存储系统更成熟。当然HDFS也有明显的短板单命名空间的元数据水平扩展受限跨机房时要特别考虑NameNode部署形态。跨机房写入的链路变长如果写入策略是“所有副本都确认成功才返回”延迟会显著增加。但这些都是可以通过架构设计和参数调优来解决的后面展开讲。1.3 主备、双活还是联邦跨机房架构的关键取舍跨机房HDFS的架构形态大体有几种我按实际效果排序第一种是主备模式也是最稳妥、最常见的。主集群放在主机房备集群放在灾备机房。数据通过HDFS自带的DistCp定期同步或者使用镜像Snapshot机制做周期复制。元数据层面NameNode本身有HAJournalNodes跨机房部署可以实现自动故障切换但客户端在切换后的行为需要提前规划。这种架构实现简单、一致性模型清晰缺点是灾备机房的资源利用率低只能承担只读业务或离线计算。第二种是双活读写模式。两个机房各自有HDFS集群通过业务层做数据分流两套集群之间用同步或近似同步的方式互相复制关键数据。这里要冷静看待HDFS没有类似数据库主主同步的成熟机制双活更多是“读多写少”或“分区读写”的双活要求业务方对“最终一致”有充分容忍。我在生产环境中见过强行做双活写而踩了大坑的案例问题都出在跨机房元数据协调和冲突处理上。除非业务确实需要否则我不建议一开始就上双活写。第三种是联邦Federation或ViewFS模式。这种模式主要用于扩展命名空间或把多个互不影响的目录挂在同一个入口适合多租户场景。它解决的是“规模”问题而不是“一致性”问题跨机房场景下可以作为辅助手段。我给大多数团队的建议先主备再考虑双活读。主备架构贴合HDFS的原生设计故障域隔离清晰回切流程好控制能覆盖绝大多数容灾需求。双活写除非你们对数据冲突解决有十足的把握否则慎重。2. 跨数据中心的数据一致性机制从写入链路说起2.1 写入流程的逐级确认Pipeline与ACK机制跨机房场景下谈数据一致性第一步得把HDFS写入流程吃透。很多问题比如“为什么写入这么慢”“为什么某个副本是旧的”根源都在写入链路的确认机制里。HDFS客户端写入一个文件时流程大致是这样客户端调用DistributedFileSystem.createNameNode在命名空间创建文件INode并返回输出流客户端开始写第一个block时向NameNode申请DataNode列表NameNode按网络拓扑返回一组节点客户端把这组节点排成Pipeline通常第一个是最近的节点后面依次串起来客户端以packet为单位向第一个DataNode发送数据每个DataNode收到后一边落盘一边继续传给管线中的下一个节点每个节点的写成功后ack会沿Pipeline反向逐级返回最终回到客户端整个block写完且全部DataNode确认后客户端通知NameNode完成block提交。这套Pipeline机制让数据沿链路逐级复制不需要客户端同时给多个节点分发节省了客户端出口带宽也能在传输过程感知丢包和超时。但对跨机房场景来说Pipeline跨越机房意味着每一份数据都要经过跨机房链路传输一遍而且是“串行复制”而非“并行复制”。当第二、第三个副本在远端机房时写入延迟会叠加若干次跨机房往返。因此跨机房写入要重点考虑机房内和跨机房的占比。数据副本尽量做到“本地优先”让至少一个副本落在本地机房内避免每次写入都强制跨机房完成全部副本。如果业务允许也可以采用“本地副本写入成功即返回、远端副本异步补齐”的方式但这时要接受短时间窗口内的副本缺失。2.2 租约与锁防止并发写入互相踩踏HDFS的文件锁机制是“租约”Lease。客户端在写文件时需要持有该文件的租约租约保证了同一时间段只有一个客户端能写同一个文件。这里有一个容易被忽略的重要细节租约与客户端会话绑定而不是与DataNode绑定。所以当客户端进程异常退出、网络闪断时租约并不会立即释放而要靠NameNode的租约回收机制来处理。NameNode维护租约有两个超时阈值软限制默认60秒和硬限制默认60分钟。软限制内未续约NameNode不会主动干预其他客户端尝试获取同一文件的租约时会等待超过软限制NameNode会进入租约回收流程超过硬限制NameNode会强制回收租约允许其他客户端重新获取写权限。这个机制在单机房内已经很微妙了跨机房时更需要注意。原因是租约的续约依赖客户端和NameNode之间的RPC如果客户端在远端机房跨机房网络的抖动可能导致续约延迟触发不必要的等待或租约竞争。我在实际生产里调过两个参数一是适度调大软限制给跨机房写入留出缓冲二是把NameNode端到客户端的心跳超时参数配置得更宽容一些避免因为链路抖动就触发昂贵的恢复流程。还有一点HDFS的append和truncate操作对租约更加敏感。跨机房场景下如果业务经常追加写同一个文件建议评估一下文件访问模型尽量改成“批量写新文件”模式减少对append的依赖否则租约冲突会成为常态。2.3 块版本与一致性视图fsck如何扮演“审计员”很多人以为HDFS只要写完了数据就一致了其实分布式系统里“肉眼看到的”和“实际存储的”经常不一致。HDFS通过Block ID块ID和Generation Stamp代际戳来区分同一block的多个版本。每次block重新写入或复制代际戳都会递增这样NameNode就能分辨出哪些是陈旧副本哪些是最新副本。这个机制非常关键——它在底层保证了即使DataNode上有旧数据也不会被当成有效数据提供给客户端。但代际戳并不能保证你随时看到的文件内容一定是最新的。如果文件名和路径变了、block副本不完整或者在运行中发生过故障恢复文件系统元数据和实际存储的block之间就可能出现偏差。这时候就要用到hdfs fsck命令。fsck会扫描文件系统所有block的状态报告健康副本数、损坏副本数、缺失副本数、副本因子是否满足等信息。跨机房部署下fsck几乎是运维必用的工具。集群刚完成机房迁移、一次网络抖动、一次NameNode切换之后我都会先跑一轮fsck观察集群自检结果。排查手法上可以先跑整体扫描再按目录维度定位问题hdfs fsck / -files -blocks -locations /tmp/fsck_report.txt报告里重点看几个状态HEALTHY表示副本充足CORRUPT表示有block损坏且备用副本不可用MISSING表示block在元数据中存在但实际上找不到任何副本。注意fsck是只读操作不影响线上业务。执行时机建议放在业务低峰期因为全量扫描会产生较多元数据请求和DataNode的block报告。2.4 快照与时间点恢复一致性读的灾备视角HDFS快照Snapshot是很多人低估的一个功能。它允许你对某个目录做时间点快照即使后续文件被删除或修改也能从快照中读取当时的数据版本。快照不是拷贝数据而是对目录和block列表做“指针级留档”几乎不额外占存储直到原数据变化后才会复制被修改的block。跨机房场景下快照的价值主要体现在三个方面第一作为周期性的数据备份基线比如每天凌晨对重要目录打快照配合主备集群的数据同步第二作为故障恢复的“后悔药”数据误删、意外覆盖时能快速找回第三在主备切换前先在备机房创建一个快照点回切和恢复流程会清晰很多。快照操作本身很简单hdfs dfsadmin -allowSnapshot /data/warehouse hdfs dfs -createSnapshot /data/warehouse snapshot_20250115但要注意快照建立之后目录中原有文件被修改时HDFS会触发block的复制copy-on-write如果快照目录数据量大且修改频繁会产生额外的存储开销。跨机房场景下这种开销可能会波及DataNode的磁盘水位和网络。所以快照策略要控制好范围和数据生命周期不要随手对整个根目录打快照。3. 容错性保障副本策略、HA与脑裂防护3.1 机架感知与副本放置跨机房副本怎么放HDFS的副本放置策略默认是3副本第一个副本放在客户端所在节点第二个副本放在同一机架的另一个节点第三个副本放在不同机架。这是单机房内的经典策略兼顾了机架级容错和跨机架带宽控制。到了跨机房场景默认策略就不适用了。你需要通过机架感知脚本告诉NameNode每个DataNode属于哪个“网络拓扑位置”然后基于这个拓扑来配置副本放置策略。HDFS的副本放置本质上是一个可编程的优化问题跨机房时核心原则是本地机房必须有副本远端机房副本至少一个副本在远端的布局要考虑故障隔离。举个例子假设双机房A和B3副本策略可以这样配副本1和副本2放在A机房的不同机架副本3放在B机房的某个机架。这样当A机房整体故障时B机房还能提供完整数据当A机房的单个机架故障时本地至少还有一个副本。机架感知脚本通常很简单本质就是根据主机名返回拓扑路径#!/bin/bash case $1 in dn-a1*) echo /dcA/rack1 ;; dn-a2*) echo /dcA/rack2 ;; dn-b1*) echo /dcB/rack1 ;; *) echo /default/rack ;; esac配置后重启NameNode让它加载拓扑信息。然后可以用命令验证副本位置是否符合预期hdfs fsck /data -files -blocks -locations | grep -A2 Block机器名里嵌入机房和机架信息这个习惯在跨机房集群里非常值得坚持。否则几个月后扩节点时你根本分不清哪台机器在哪个机房排障和均衡都无从下手。3.2 NameNode高可用QJM日志同步与自动切换客户端读取文件元数据依赖NameNode。跨机房容灾NameNode的高可用比DataNode的副本策略还重要。HDFS的HA方案基于JournalNodesQJM同步编辑日志EditLogActive NameNode把每次元数据变更写入JournalNodes集群Standby NameNode从JournalNodes读取日志并持续重放保持内存中的元数据状态基本同步。QJM要求奇数个JournalNode至少要部署3台典型配置是“三机房各一台”或“双机房三台时在主要机房放两台”。为什么是奇数因为QJM本质上使用了类Paxos的多数派提交机制写操作只要被多数派JournalNode确认就算成功。3台容忍1台故障5台容忍2台故障这是固定的数学约束。跨机房部署QJM时要特别注意两件事。第一是网络延迟对提交时延的影响。每次元数据更新都要等待多数派JournalNode确认如果多数派节点分布在两个机房每笔操作都会增加一次跨机房往返。第二是避免“少数派机房”和“多数派机房”之间出现分区时集群自动切换产生意外。自动切换依赖ZKFCZooKeeper FailoverController。ZKFC本身需要一套ZooKeeper集群也建议跨机房部署奇数节点。ZooKeeper本身也是多数派协议部署时同样遵循奇数节点原则。这里顺便说一句很多团队只顾着HDFS的QJM配置忽略了ZKFC和ZooKeeper的机房分布导致整体容灾链路有一个单点这是不应该的。3.3 脑裂防护与Fencing避免“两个主节点”同时写HA架构最危险的问题是脑裂网络分区导致两个NameNode都认为自己是Active同时接收写操作元数据就会分叉。HDFS解决这个问题的机制叫Fencing隔离。Fencing的目标是确保旧Active节点在切换后无法继续对外提供服务。HDFS内置了两种常见fencing方式sshfence通过SSH远程执行命令杀掉旧Active的进程和shell fencing调用自定义脚本来隔离。生产环境中我更推荐shell fencing它可以结合硬件管理接口或云平台API把节点强制隔离比单纯SSH更可靠。单单依赖系统防火墙或进程杀灭有时候不够快。配置片段示例hdfs-site.xmlproperty namedfs.ha.fencing.methods/name valueshell(/path/to/fence-namenode.sh)/value /property脑裂防护不是“配置了HA就自动有”的能力需要对fencing脚本反复演练验证。我见过一个案例fencing脚本里使用了某个主机的SSH密钥结果那台主机密钥轮转失效切换时旧Active没被及时隔离导致两个NameNode同时写入随后花了大量时间修复元数据分叉。跨机房部署后SSH链路走的是跨机房网络密钥连通性、防火墙变更都可能影响fencing这些细节一定要纳入应急预案。3.4 数据节点故障与恢复流程DataNode的容错机制是心跳加BlockReport。DataNode默认每3秒向NameNode发送一次心跳NameNode根据心跳判断节点是否存活。节点长时间心跳超时后NameNode会把它标记为dead并启动该节点上副本的复制补偿逻辑。复制补偿会找其他存活节点来弥补因节点下线而减少的副本数把副本因子补回到配置值。跨机房环境下有几个参数需要仔细调整心跳超时阈值、block report周期、复制补偿的并发度。远距离网络抖动时心跳很容易超时如果阈值太紧节点会被误标记为dead产生不必要的复制流量和副本重分布阈值太松则故障发现太慢容错能力下降。另外跨机房场景下要特别关注“慢节点”问题。一个DataNode如果磁盘性能差或网络拥塞会拖慢整个Pipeline的写入速度。这时它会表现为“写入越来越慢但没有失败”很多团队在单机房时对这个不敏感因为排障容易跨机房时链路延迟会让问题更难定位。定位手法上先检查DataNode日志里是否有超时重试再看节点网卡流量和磁盘IO。必要时用工具直接测两个机房之间的网络质量确认链路时延和丢包率。4. 实操配置与调优跨机房部署的核心参数4.1 网络拓扑与客户端配置先解决“能不能连通”的问题跨机房HDFS部署首先得让客户端能正确访问远端DataNode。很多初接触跨机房部署的工程师会遇到一个问题NameNode返回给客户端的DataNode地址是IP而这些IP在客户端所处网络环境下不可达。解决办法是启用主机名模式。在core-site.xml中加一项property namedfs.client.use.datanode.hostname/name valuetrue/value /property客户端通过主机名而不是IP去连接DataNode这样只要DNS或hosts文件配置正确远端机房的数据节点就能被访问到。这个配置在跨机房场景下可以说是“必填项”否则客户端会一直报连接超时。另一个与网络拓扑相关的是RPC和传输端口的开放策略。HDFS默认的DataNode数据传输端口是9866NameNode RPC端口是8020。跨机房部署时这些端口要在防火墙上放行且要限定来源IP范围不要暴露到公网。另外要设置dfs.namenode.rpc-bind-hostHDFS的NameNode RPC绑定地址等参数确保绑定到预期网络接口。4.2 数据一致性相关参数调优建议跨机房场景下数据一致性相关参数集中在这几个方面写副本相关dfs.replication副本因子。跨机房建议至少3如果双机房且特别看重容灾也可以设4每个机房至少2副本。但副本越多写入放大越高带宽开销越大。dfs.namenode.replication.max单次复制任务最多跨多少节点默认3跨机房时如果副本拓扑复杂需要适当调大。dfs.namenode.replication.min最小存活副本数低于这个值NameNode会优先复制而不是接受新block写入。心跳与超时dfs.heartbeat.interval默认3秒跨机房时如果链路较稳可以保持不变如果链路波动明显可以适度调大。dfs.namenode.heartbeat.recheck-interval默认5分钟这个参数决定了NameNode检测到节点超时后做判断的周期跨机房建议保持默认或适度调大避免因瞬时丢包引发过度反应。租约dfs.lease.softlimit默认60秒跨机房写入链路长时建议调到120秒左右。dfs.lease.hardlimit默认1小时这个一般不轻易调如果业务的写入经常超过1小时那就是业务模型问题不是参数问题。快照与删除dfs.namenode.snapshot.capture.openfiles是否允许对正在写的文件做快照跨机房场景看业务诉求默认即可。4.3 容错与高可用相关参数与常用命令速查容错相关核心配置配置项默认值跨机房建议说明dfs.ha.fencing.methodssshfenceshell脚本更好隔离旧Active的方式dfs.journalnode.edits.dir/hadoop/journal多盘配置JournalNode本地目录建议做RAID或至少独立磁盘dfs.namenode.handler.count10扩容到 50~100跨机房请求量更大避免单节点RPC瓶颈dfs.replication33~4副本因子结合容灾需求dfs.namenode.decommission.interval30s保持默认节点退役检查周期NameNode主备切换的常用命令hdfs haadmin -getAllServiceState hdfs haadmin -transitionToActive nn1 hdfs haadmin -failover nn1 nn2日常巡检常用命令hdfs dfsadmin -report hdfs dfsadmin -safemode get hdfs fsck / -files -blocks -locations hdfs dfsadmin -metainfo -format跨机房巡检建议增加一条定期用网络工具监控两个机房之间的时延和丢包HDFS的心跳和Pipeline都依赖底层网络质量这条链路一旦劣化上层再调优都只是缓解。4.4 存储均衡与跨机房带宽控制跨机房部署后数据均衡是一项长期任务。HDFS的balancer会把副本较多的节点向副本较少、磁盘空间空闲的节点迁移但跨机房模式下默认的均衡可能把数据从A机房搬到B机房产生大量跨机房流量。在对均衡目标有限制的情况下可以用带宽限制参数控制迁移速率。HDFS的balancer通过dfs.datanode.balance.bandwidthPerSec限制单节点均衡带宽跨机房场景建议压低一点比如调整到20~50MB/s避免均衡任务打满专线。另外计划内跨机房复制任务比如主备同步数据建议放在业务低峰期窗口执行并启用限速。例如使用DistCp时可以用-bandwidth参数控制带宽上限。总之跨机房链路在所有HDFS副本相关操作里都是稀缺资源不控速就是给自己埋雷。5. 常见故障与排查实录5.1 写超时与Pipeline重建跨机房的经典开胃菜症状跨机房写入频率高时客户端周期性报“write to datanode timeout”写入失败后重试业务感知是“时好时坏”。排查思路首先确认跨机房链路的时延和丢包率。跨地域光纤即便正常往返延迟也可能有几十毫秒这会让Pipeline的ack传递变慢。其次检查DataNode的写入路径特别是磁盘使用率超过80%后的写放大。最后查看是否是Pipeline中的某个远端节点网络拥塞。解决办法有几种一是确认副本放置策略让本地客户端优先把数据写到本地机房降低跨机房Pipeline频率二是调大客户端的socket超时参数dfs.socket.timeout给长链路留出余量三是检查数据节点是否频繁触发GC导致节点暂时无法响应。我遇到过最隐蔽的问题是远端机房DataNode的所有节点在业务高峰期被另一个计算任务占满IO导致Pipeline里的远端节点处理缓慢客户端不断重试但始终不报明确错误。定位方法是在DataNode日志里看block接收耗时而不是只看客户端日志。5.2 元数据与文件系统不一致fsck报告CORRUPT症状业务反馈某些文件读取失败但DataNode磁盘看起来正常。执行fsck后发现部分block状态为CORRUPT或UNDER_CONSTRUCTION且长时间卡住。排查路径先定位corrupt block的具体文件判断是副本全部丢失还是只有一个副本损坏。如果只是损坏NameNode会启动恢复复制但要确认是否有可用副本。如果副本数为1且损坏基本只能从备份或快照恢复。这一点再次说明多副本和快照的价值。如果corrupt block集中在某个DataNode上大概率是那台节点的磁盘或网络故障。如果corrupt block刚出现但分布零散可能是某些block在写入Pipeline中途断开最终只写入了部分副本。这时要检查NameNode日志里对应的block commit记录确认提交状态是否一致。日常建议跨机房集群每周做一次fsck整体扫描保留历史报告对比趋势。出现corrupt时不要急于手动干预先判断NameNode是否已经在自动补偿复制避免重复操作带来更多跨机房流量。5.3 HA切换后的租约恢复缓慢症状NameNode自动切换后业务长时间无法对某些文件做写操作客户端一直报“Failed to get lease”。原因分析Active NameNode切换后所有租约状态需要重新验证。在旧节点上持有租约的客户端如果连接断开租约只有在软限制超时后才被回收。多机房场景下客户端重连和租约恢复时间更长容易让业务方误以为集群卡死。处理建议确认ZKFC切换本身正常后可以先看租约回收进展。如果业务可以接受把软限制时长调低缩短租约回收时间。更根本的改进是让业务端的写操作具备自动重试机制提前做好幂等设计这样即使租约短暂不可用重试后也能恢复。HDFS写同一文件不保证幂等所以业务侧能避免对同一路径反复append就尽量避免。5.4 跨机房带宽瓶颈与数据均衡的取舍症状主备集群数据同步耗时长、备机房数据滞后或者跨机房上线了一段时间某些目录的数据副本分布严重不均匀。原因分析跨机房带宽在上线初期大家都会算“峰值带宽”但实际中副本复制、快速备份验证、客户端的写流量都共享同一条链路平时看着够用一有大任务就冲突。处理建议对DataNode均衡、DistCp备份、Hive/Spark临时数据都设置独立的带宽限制避免大任务把链路打满。同时检查副本放置策略是否真的“本地优先”很多集群初始化时没有配机架感知导致副本随机分布后期跨机房流量长期偏高。修正方式先补齐机架感知然后小流量慢慢均衡不要一次性把均衡带宽调太大防止跨机房链路雪崩。5.5 日常巡检的几条心得跨机房HDFS运维我把日常巡检固定成了几个动作每天检查NameNode Active状态和QJM同步延迟每周跑一次fsck扫描并对比上周报告每两周检查一次跨机房链路质量每月检查一次数据均衡度hdfs dfsadmin -report。这些动作本身不复杂但贵在坚持。尤其要注意QJM的同步延迟。JournalNode之间同步延迟一旦持续升高说明跨机房链路或磁盘性能出现问题它会直接影响NameNode的元数据提交时延。这个延迟在高峰期虽然不致命但积累到一定程度所有写元数据的操作都会受影响表现为“HDFS变慢但找不到明确瓶颈”。写在后面我对跨机房HDFS最深的体会是永远不要抱侥幸心理。机房之间那条链路才是最不可控的故障源。你在单机房里调好的心跳、租约、Pipeline跨上专线之后全都需要重新审视一遍。我的做法是上线前先做故障演练——拔网线、重启NameNode、停一个机房的DataNode进程把这些流程都跑熟。演练中你会发现很多平时想不到的问题比如fencing脚本失效、客户端连接池没设置跨机房重试、防火墙规则限制了应急操作端口这些都是文档里看不到的坑提前踩完总比生产环境出事再来补强好。数据一致性和容错性是HDFS跨数据中心部署最底层的两条线也是整个方案的核心设计准绳。现阶段能给你的最具体建议是先把机房拓扑写清楚再把副本放置策略想明白最后再谈HA、参数和优化。拓扑错了后面的一切都是在错误的基础上修修补补成本只会越滚越高。
返回列表