搭建高可用MongoDB集群
如何搭建高可用MongoDB集群【绽放吧数据库】 【摘要】 MongoDB基础请参考: set)请参考: 背景为解决mongodb在replica set每个从节点上面的数据库均是对数据库的全量拷贝,从节点压力在高并发大数据量的场景下存在很大挑战,同时考.MongoDB基础请参考:MongoDB(replica set)请参考:一、概述1.1 背景为解决mongodb在replica set每个从节点上面的数据库均是对数据库的全量拷贝,从节点压力在高并发大数据量的场景下存在很大挑战,同时考虑到后期mongodb集群的在数据压力巨大时的扩展性,应对海量数据引出了分片机制。1.2 分片概念分片是将数据库进行拆分,将其分散在不同的机器上的过程,无需功能强大的服务器就可以存储更多的数据,处理更大的负载,在总数据中,将集合切成小块,将这些块分散到若干片中,每个片只负载总数据的一部分,通过一个知道数据与片对应关系的组件mongos的路由进程进行操作。1.3 基础组件其利用到了四个组件:mongos,config server,shard,replica setmongos:数据库集群请求的入口,所有请求需要经过mongos进行协调,无需在应用层面利用程序来进行路由选择,mongos其自身是一个请求分发中心,负责将外部的请求分发到对应的shard服务器上,mongos作为统一的请求入口,为防止mongos单节点故障,一般需要对其做HA。config server:配置服务器,存储所有数据库元数据(分片,路由)的配置。mongos本身没有物理存储分片服务器和数据路由信息,只是存缓存在内存中来读取数据,mongos在第一次启动或后期重启时候,就会从config server中加载配置信息,如果配置服务器信息发生更新会通知所有的mongos来更新自己的状态,从而保证准确的请求路由,生产环境中通常也需要多个config server,防止配置文件存在单节点丢失问题。shard:在传统意义上来讲,如果存在海量数据,单台服务器存储1T压力非常大,无论考虑数据库的硬盘,网络IO,又有CPU,内存的瓶颈,如果多台进行分摊1T的数据,到每台上就是可估量的较小数据,在mongodb集群只要设置好分片规则,通过mongos操作数据库,就可以自动把对应的操作请求转发到对应的后端分片服务器上。replica set:在总体mongodb集群架构中,对应的分片节点,如果单台机器下线,对应整个集群的数据就会出现部分缺失,这是不能发生的,因此对于shard节点需要replica set来保证数据的可靠性,生产环境通常为2个副本+1个仲裁。1.4 架构图二、安装部署2.1 基础环境 为了节省服务器,采用多实例配置,三个mongos,三个config server,单个服务器上面运行不通角色的shard(为了后期数据分片均匀,将三台shard在各个服务器上充当不同的角色。),在一个节点内采用replica set保证高可用,对应主机与端口信息如下:主机名IP地址组件mongos组件config servershard mongodb-1 172.20.6.10 端口:20000 端口:21000主节点: 22001副本节点:22002仲裁节点:22003 mongodb-2 172.20.6.11 端口:20000 端口:21000仲裁节点:22001主节点: 22002副本节点:22003 mongodb-3 172.20.6.12 端口:20000 端口:21000副本节点:22001仲裁节点:22002主节点: 220032.2、安装部署2.2.1 软件下载目录创建wget -c https:/fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel62-3.4.10.tgztar -zxvf mongodb-linux-x86_64-rhel62-3.4.10.tgzln -sv mongodb-linux-x86_64-rhel62-3.4.10 mongodbecho "PATH=$PAHT:/usr/local/mongodb/bin">/etc/profile.d/mongodb.shsource /etc/profile.d/mongodb.sh2.2.2 创建目录分别在mongodb-1/mongodb-2/mongodb-3创建目录及日志文件mkdir -p /data/mongodb/mongos/log,confmkdir -p /data/mongodb/mongoconf/data,log,confmkdir -p /data/mongodb/shard1/data,log,confmkdir -p /data/mongodb/shard2/data,log,confmkdir -p /data/mongodb/shard3/data,log,conftouch /data/mongodb/mongos/log/mongos.logtouch /data/mongodb/mongoconf/log/mongoconf.logtouch /data/mongodb/shard1/log/shard1.logtouch /data/mongodb/shard2/log/shard2.logtouch /data/mongodb/shard3/log/shard3.log2.2.3 配置config server副本集在mongodb3.4版本后要求配置服务器也创建为副本集,在此副本集名称:replconf在三台服务器上配置config server副本集配置文件,并启动服务cat>/data/mongodb/mongoconf/conf/mongoconf.conf<<EOFdbpath=/data/mongodb/mongoconf/datalogpath=/data/mongodb/mongoconf/log/mongoconf.log #定义config server日志文件logappend=trueport = 21000maxConns = 1000 #链接数journal = true #日志开启journalCommitInterval = 200fork = true #后台执行syncdelay = 60oplogSize = 1000configsvr = true #配置服务器replSet=replconf #config server配置集replconfEOFmongod -f /data/mongodb/mongoconf/conf/mongoconf.conf #三台服务器均启动config server任意登录一台服务器进行配置服务器副本集初始化use admin config = _id:"replconf",members: _id:0,host:"172.20.6.10:21000",_id:1,host:"172.20.6.11:21000",_id:2,host:"172.20.6.12:21000",rs.initiate(config);查看集群状态:replconf:OTHER> rs.status() "set" : "replconf", "date" : ISODate("2017-12-04T07:42:09.054Z"), "myState" : 1, "term" : NumberLong(1), "configsvr" : true, "heartbeatIntervalMillis" : NumberLong(2000), "optimes" : "lastCommittedOpTime" : "ts" : Timestamp(1512373328, 1), "t" : NumberLong(1) , "readConcernMajorityOpTime" : "ts" : Timestamp(1512373328, 1), "t" : NumberLong(1) , "appliedOpTime" : "ts" : Timestamp(1512373328, 1), "t" : NumberLong(1) , "durableOpTime" : "ts" : Timestamp(1512373328, 1), "t" : NumberLong(1) , "members" : "_id" : 0, "name" : "172.20.6.10:21000", "health" : 1, "state" : 1, "stateStr" : "PRIMARY", "uptime" : 221, "optime" : "ts" : Timestamp(1512373328, 1), "t" : NumberLong(1) , "optimeDate" : ISODate("2017-12-04T07:42:08Z"), "infoMessage" : "could not find member to sync from", "electionTime" : Timestamp(1512373296, 1), "electionDate" : ISODate("2017-12-04T07:41:36Z"), "configVersion" : 1, "self" : true ,