MongoDB高可用集群配置的几种方案

RoseannaDor 8年前
   <h2><strong>高可用集群的解决方案</strong></h2>    <p>高可用性即HA(High Availability)指的是通过尽量缩短因日常维护操作(计划)和突发的系统崩溃(非计划)所导致的停机时间,以提高系统和应用的可用性。</p>    <p>计算机系统的高可用在不同的层面上有不同的表现:</p>    <p><strong>(1)网络高可用</strong></p>    <p>由于网络存储的快速发展,网络冗余技术被不断提升,提高IT系统的高可用性的关键应用就是网络高可用性,网络高可用性与网络高可靠性是有区别的,网络高可用性是通过匹配冗余的网络设备实现网络设备的冗余,达到高可用的目的。</p>    <p>比如冗余的交换机,冗余的路由器等</p>    <p><strong>(2)服务器高可用</strong></p>    <p>服务器高可用主要使用的是服务器集群软件或高可用软件来实现。</p>    <p><strong>(3)存储高可用</strong></p>    <p>使用软件或硬件技术实现存储的高度可用性。其主要技术指标是存储切换功能,数据复制功能,数据快照功能等。当一台存储出现故障时,另一台备用的存储可以快速切换,达一存储不停机的目的。</p>    <h2><strong>MongoDB的高可用集群配置</strong></h2>    <p>高可用集群,即High Availability Cluster,简称HA Cluster。</p>    <p>集群(cluster)就是一组计算机,它们作为一个整体向用户提供一组网络资源。</p>    <p>这些单个的计算机系统 就是集群的节点(node)。</p>    <p>搭建高可用集群需要合理的配置多台计算机之间的角色,数据恢复,一致性等,主要有以下几种方式:</p>    <p><strong>(1)主从方式 (非对称方式)</strong></p>    <p>主机工作,备机处于监控准备状况;当主机宕机时,备机接管主机的一切工作,待主机恢复正常后,按使用者的设定以自动或手动方式将服务切换到主机上运行,数据的一致性通过共享存储系统解决。</p>    <p><strong>(2)双机双工方式(互备互援)</strong></p>    <p>两台主机同时运行各自的服务工作且相互监测情况,当任一台主机宕机时,另一台主机立即接管它的一切工作,保证工作实时,应用服务系统的关键数据存放在共享存储系统中。</p>    <p><strong>(3)集群工作方式(多服务器互备方式)</strong></p>    <p>多台主机一起工作,各自运行一个或几个服务,各为服务定义一个或多个备用主机,当某个主机故障时,运行在其上的服务就可以被其它主机接管。</p>    <p><strong>MongoDB集群配置的实践也遵循了这几个方案,主要有主从结构,副本集方式和Sharding分片方式。</strong></p>    <h2><strong>Master-Slave主从结构</strong></h2>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/fa40baeca123a7675e70d46d54d795e6.png"></p>    <p>主从架构一般用于备份或者做读写分离。一般有一主一从设计和一主多从设计。</p>    <p>由两种角色构成:</p>    <p><strong>(1)主(Master)</strong></p>    <p>可读可写,当数据有修改的时候,会将oplog同步到所有连接的salve上去。</p>    <p><strong>(2)从(Slave)</strong></p>    <p>只读不可写,自动从Master同步数据。</p>    <p>特别的,对于Mongodb来说,并不推荐使用Master-Slave架构,因为Master-Slave其中Master宕机后不能自动恢复,推荐使用Replica Set,后面会有介绍,除非Replica的节点数超过50,才需要使用Master-Slave架构,正常情况是不可能用那么多节点的。</p>    <p>还有一点,Master-Slave不支持链式结构,Slave只能直接连接Master。Redis的Master-Slave支持链式结构,Slave可以连接Slave,成为Slave的Slave。</p>    <h2><strong>Relica Set副本集方式</strong></h2>    <p>Mongodb的Replica Set即副本集方式主要有两个目的,一个是数据冗余做故障恢复使用,当发生硬件故障或者其它原因造成的宕机时,可以使用副本进行恢复。</p>    <p>另一个是做读写分离,读的请求分流到副本上,减轻主(Primary)的读压力。</p>    <p>1.Primary和Secondary搭建的Replica Set</p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/e2cf17a0ff499df970acd574e04b6560.png"></p>    <p>Replica Set是mongod的实例集合,它们有着同样的数据内容。包含三类角色:</p>    <p><strong>(1)主节点(Primary)</strong></p>    <p>接收所有的写请求,然后把修改同步到所有Secondary。一个Replica Set只能有一个Primary节点,当Primary挂掉后,其他Secondary或者Arbiter节点会重新选举出来一个主节点。默认读请求也是发到Primary节点处理的,需要转发到Secondary需要客户端修改一下连接配置。</p>    <p><strong>(2)副本节点(Secondary)</strong></p>    <p>与主节点保持同样的数据集。当主节点挂掉的时候,参与选主。</p>    <p><strong>(3)仲裁者(Arbiter)</strong></p>    <p>不保有数据,不参与选主,只进行选主投票。使用Arbiter可以减轻数据存储的硬件需求,Arbiter跑起来几乎没什么大的硬件资源需求,但重要的一点是,在生产环境下它和其他数据节点不要部署在同一台机器上。</p>    <p>注意,一个自动failover的Replica Set节点数必须为奇数,目的是选主投票的时候要有一个大多数才能进行选主决策。</p>    <p><strong>(4)选主过程</strong></p>    <p>其中Secondary宕机,不受影响,若Primary宕机,会进行重新选主:</p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/ad4430d2b3e648a5b3c51bb5dd7aefb1.png"></p>    <p><strong>2.使用Arbiter搭建Replica Set</strong></p>    <p>偶数个数据节点,加一个Arbiter构成的Replica Set方式:</p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/c1f5e3e9fb8fcda15a658de1ec9c4cef.png"></p>    <h2><strong>Sharding分片技术</strong></h2>    <p>当数据量比较大的时候,我们需要把数据分片运行在不同的机器中,以降低CPU、内存和IO的压力,Sharding就是数据库分片技术。</p>    <p>MongoDB分片技术类似MySQL的水平切分和垂直切分,数据库主要由两种方式做Sharding:垂直扩展和横向切分。</p>    <p>垂直扩展的方式就是进行集群扩展,添加更多的CPU,内存,磁盘空间等。</p>    <p>横向切分则是通过数据分片的方式,通过集群统一提供服务:</p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/f408914f106a64f5a45be9d4d22cfb4a.png"></p>    <p><strong>(1)MongoDB的Sharding架构</strong></p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/235caebbfafac8f9b916a8439fc50a25.png"></p>    <p><strong>(2)MongoDB分片架构中的角色</strong></p>    <p><strong>A.数据分片(Shards)</strong></p>    <p>用来保存数据,保证数据的高可用性和一致性。可以是一个单独的 mongod 实例,也可以是一个副本集。</p>    <p>在生产环境下Shard一般是一个Replica Set,以防止该数据片的单点故障。所有Shard中有一个PrimaryShard,里面包含未进行划分的数据集合:</p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/887c7cb007cf4ecca27aefdf330bda99.png"></p>    <p><strong>B.查询路由(Query Routers)</strong></p>    <p>路由就是mongos的实例,客户端直接连接mongos,由mongos把读写请求路由到指定的Shard上去。</p>    <p>一个Sharding集群,可以有一个mongos,也可以有多mongos以减轻客户端请求的压力。</p>    <p>C.配置服务器(Config servers)</p>    <p>保存集群的元数据(metadata),包含各个Shard的路由规则。</p>    <p>参考:</p>    <p><a href="/misc/goto?guid=4959720532491425336" rel="nofollow,noindex">百度百科-高可用集群</a></p>    <p><a href="/misc/goto?guid=4959720532578032085" rel="nofollow,noindex">MongoDB 教程</a></p>    <p> </p>    <p>来自:https://yq.aliyun.com/articles/61516</p>    <p> </p>