MongoDB分布式高可用集
一、分布式集搭建方案
运用MongoDB的复制集(Replica Sets)+分片(Sharding)就能实现MongoDB分布式高可用的集。分片(sharding)能够增加更多的机器来应对不断增加的负载和数据,也不影响应用。复制集(Replica Sets)能确保每个分片节点都具有自动备份、自动故障恢复能力。
二、MongoDB的高可用集配置
高可用集,即High Availability Cluster,简称HA Cluster。集(cluster)就是一组计算机,它们作为一个整体向用户提供一组网络资源。这些单个的计算机系统就是集的节点(node)。搭建高可用集需要合理的配置多台计算机之间的角,数据恢复,一致性等,主要有以下几种方式:
(1)、主从方式
(2)、双机双工方式
(3)、集工作方式(多服务器互备方式)
MongoDB集配置的实践也遵循了这几个方案,主要有主从结构,副本集方式和Sharding分片方式。
三、Master-Slave主从结构
主从架构一般用于备份或者读写分离,一般有一主一从和一主多从设计。
由两种角构成:
(1)、Master
可读可写,当数据有修改的时候,会将oplog同步到所有Slave上。
(2)、Slave
只读不可写,自动从Master同步数据。
特别的,对于Mongodb来说,并不推荐使用Master-Slave架构,因为Master-Slave其
中Master宕机后不能自动恢复,除非Replica的节点数超过50,才需要使用Master-Slave架构,正常情况是不可能用那么多节点的。
还有一点,Master-Slave不支持链式结构,Slave只能直接连接Master。Redis的Master-Slave支持链式结构,Slave可以连接Slave,成为Slave的Slave。
四、Relica Set副本集方式
Mongodb的Replica Set即副本集方式主要有两个目的,一个是数据冗余做故障恢复使用,当发生硬件故障或者其它原因造成的宕机时,可以使用副本进行恢复。
另一个是做读写分离,读的请求分流到副本上,减轻主(Primary)的读压力。
1.Primary和Secondary搭建的Replica Set
Replica Set是mongod的实例集合,它们有着同样的数据内容。包含三类角:(1)主节点(Primary)
接收所有的写请求,然后把修改同步到所有Secondary。一个Replica Set只能有一个Primary节点,当Primary挂掉后,其他Secondary或者Arbiter节点会重新选举出来一个主节点。默认读请求也是发到Primary节点处理的,需要转发到Secondary需要客户端修改一下连接配置。
(2)副本节点(Secondary)
与主节点保持同样的数据集。当主节点挂掉的时候,参与选主。
(3)仲裁者(Arbiter)
不保有数据,不参与选主,只进行选主投票。使用Arbiter可以减轻数据存储的硬件需求,Arbiter跑起来几乎没什么大的硬件资源需求,但重要的一点是,在生产环境下它和其他数据节点不要部署在同一台机器上。
(4)选主过程
其中Secondary宕机,不受影响,若Primary宕机,则进行重新选主:
2.使用Arbiter搭建Replica Set
偶数个数据节点,加一个Arbiter构成的Replica Set方式:
>>Sharding分片技术
mongodb和mysql结合当数据量比较大的时候,我们需要把数据分片运行在不同的机器中,以降低CPU、内存和IO的压力,Sharding就是数据库分片技术。
MongoDB分片技术类似MySQL的水平切分和垂直切分,数据库主要由两种方式做Sharding:垂直扩展和横向切分。
垂直扩展的方式就是进行集扩展,添加更多的CPU,内存,磁盘空间等。
横向切分则是通过数据分片的方式,通过集统一提供服务:
(1)MongoDB的Sharding架构
(2)MongoDB分片架构中的角
A.数据分片(Shards)
用来保存数据,保证数据的高可用性和一致性。可以是一个单独的mongod实例,也可以是一个副本集。
在生产环境下Shard一般是一个Replica Set,以防止该数据片的单点故障。所有Shard中有一个Primar
yShard,里面包含未进行划分的数据集合:
B.查询路由(Query Routers)
路由就是mongos的实例,客户端直接连接mongos,由mongos把读写请求路由到指定的Shard上去。
一个Sharding集,可以有一个mongos,也可以有多mongos以减轻客户端请求的压力。
C.配置服务器(Config servers)
保存集的元数据(metadata),包含各个Shard的路由规则。
>>Replica sets+Sharding分布式高可用集运用MongoDB的复制集(Replica Sets)+分片(Sharding)就能实现MongoDB分布式高可用的集。
构建一个MongoDB Sharding Cluster,需要三种角: