【Mongodb】MongoDB分片备份策略示例与配置迁移示例

以下内容针对Linux系统配置MongoDB集群过程,具体的Windows平台自行进行修改:

部署模式:

1、Replica Set + Sharding


### 1.1.1
准备工作



正式安装MongoDB集群前需分别在三台服务器上做如下准备工作:

1. 创建安装Mongodb所需用户:Mongo,组:Mongodb

2. 创建程序数据存储目录:/data/db/shard1/data/db/shard2/data/db/shard3/data/db/config

3. 创建日志存储目录:/data/dblog/shard1/data/dblog/shard2/data/dblog/shard3/data/dblog/mongos/data/dblog/config

4. Mongo用户对数据及日志存储目录拥有读写权限

5. 上传Mongodb程序mongodb-linux-x86_64-2.4.3.tgz/home/mongo/目录下,并解压。

### 1.1.2
创建 shard服务

1) 分别在三台服务器上配置环境变量,具体操作如下:

[root@mongodb ~] su – mongo

[mongo@mongodb ~] vi .bash_profile

然后在打开的环境变量文档的export PATH后添加如下变量信息:

export MONGODB=/home/mongo/mongodb

export MONGO_DATA=/data/db

export MONGO_LOG=/data/dblog

其中MONGODB为程序包路径,MONGO_DATA为数据存放路径,MONGO_LOG为日志存放路径

2) 创建mongodb的启动脚本,具体操作如下:

[mongo@mongodb ~] cd /home/mongo

[mongo@mongodb ~] mkdir script

[mongo@mongodb ~] cd script

[mongo@mongodb script] vi startshard1.sh

然后在打开的文档中输入如下信息:

${MONGODB}/bin/mongod -fork -shardsvr -replSet shard1 -port 10001
-dbpath ${MONGO_DATA}/shard1 -logpath ${MONGO_LOG}/shard1/shard1.log


保存后为刚创建的startshard1.sh增加执行权限

[mongo@mongodb script] chmod 755 startshard1.sh

重复上述步骤在当前服务器上创建startshard2.shstartshard3.sh,其中shard2的端口为10002,shard3的端口为10003,并在其余两台服务器上创建startshard1.shstartshard2.shstartshard3.sh.

3) 启动每台服务器上的三个shard服务

[mongo@mongodb ~] cd /home/mongo/script

[mongo@mongodb script] ./startshard1.sh

[mongo@mongodb script] ./startshard2.sh

[mongo@mongodb script] ./startshard3.sh




### 1.1.3 初始化replica set

1) 连接mongodb 10001端口初始化replica set,具体操作如下:

[mongo@mongodb ~] cd ${MONGODB}bin

[mongo@mongodb ~] ./mongo –port 10001

MongoDB shell version: 2.4.3

connecting to: 127.0.0.1:10001/test

>config={_id:’shard1’,members:[{_id: 0, host: ‘IP1:10001’,priority:2},{_id: 1, host: ‘IP2:10001’ ,priority:1},{_id: 2, host: ‘IP3:10001’, “arbiterOnly”: true }]}

>rs.initiate(config)

>rs.status()

其中IP1,IP2,IP3为三台服务器的IP

2) 连接mongodb 10002端口初始化replica set,具体操作如下:

[mongo@mongodb ~] cd ${MONGODB}bin

[mongo@mongodb ~] ./mongo –port 10002

MongoDB shell version: 2.4.3

connecting to: 127.0.0.1:10002/test

>config={_id:’shard2’,members:[{_id: 0, host: ‘IP1:10002’,arbiterOnly:true},{_id: 1, host: ‘IP2:10002’,priority:2},{_id: 2, host: ‘IP3:10002’,priority:1 }]}

>rs.initiate(config)

>rs.status()

其中IP1,IP2,IP3为三台服务器的IP

3) 连接mongodb 10003端口初始化replica set,具体操作如下:

[mongo@mongodb ~] cd ${MONGODB}bin

[mongo@mongodb ~] ./mongo –port 100033

MongoDB shell version: 2.4.3

connecting to: 127.0.0.1:100033/test

>config={_id:’shard3’,members:[{_id: 0, host: ‘IP1:10003’ ,priority:1},{_id: 1, host: ‘IP2:10003’,arbiterOnly:true},{_id: 2, host: ‘IP3:10003’,priority:2 }]}

>rs.initiate(config)

>rs.status()

其中IP1,IP2,IP3为三台服务器的IP

4) 验证replica set信息

此时分别连接100011000210003端口,用执行rs.status()命令会看到如下图所示的信息:




<span style=”font-family: ‘Arial’,’sans-serif’; mso-fareast-font-family: <br />

Arial;” lang=”X-NONE”>1.1.4 创建config servers服务

1) 创建config启动脚本,具体操作如下:

[mongo@mongodb ~] cd /home/mongo

[mongo@mongodb ~] cd script

[mongo@mongodb script] vi startconfig.sh

然后在打开的文档中输入如下信息:

${MONGODB}/bin/mongod -configsvr -port 20000 -fork -dbpath
${MONGO_DATA}/dbcfg -logpath ${MONGO_LOG}/dbcfg/dbcfg.log

保存后为刚创建的startconfig.sh增加执行权限

[mongo@mongodb script] chmod 755 startconfig.sh

重复上述步骤在其余两台服务器上创建startconfig.sh

2) 启动三台服务器上的config服务

[mongo@mongodb ~] cd /home/mongo/script

[mongo@mongodb script] ./startconfig.sh

<span style=”font-family: ‘Arial’,’sans-serif’; mso-fareast-font-family: <br />

Arial;” lang=”X-NONE”>1.1.5 创建服务

1) 创建mongos启动脚本,具体操作如下:

[mongo@mongodb ~] cd /home/mongo

[mongo@mongodb ~] cd script

[mongo@mongodb script] vi startmongos.sh

然后在打开的文档中输入如下信息:

${MONGODB}/bin/mongos -fork -port 30000 -configdb “IP1:20000,IP2:20000,IP3:20000” -logpath
${MONGO_LOG}/mongos/mongos.log

其中IP1,IP2,IP3分别为三台服务器的IP

保存后为刚创建的startconfig.sh增加执行权限

[mongo@mongodb script] chmod 755 startmongos.sh

重复上述步骤在其余两台服务器上创建startmongos.sh

2) 启动三台服务器上的mongos服务

[mongo@mongodb ~] cd /home/mongo/script

[mongo@mongodb script] ./startmongos.sh

<span style=”font-family: ‘Arial’,’sans-serif’; mso-fareast-font-family: <br />

Arial;” lang=”X-NONE”>1.1.6
配置Sharding

在其中一台服务器上,连接mongod服务,即路由节点30000端口,具体操作如下:

[mongo@mongodb ~] cd ${MONGODB}bin

[mongo@mongodb ~] ./mongo –port 30000

MongoDB shell version: 2.4.3

connecting to: 127.0.0.1:30000/test

在这里需要 切换到 admin 库

> use admin

>db.runCommand({addshard:’shard1/10.1.195.47:10001,10.1.195.57:10001,10.1.195.67:10001’})

{ “shardAdded” : “shard1”, “ok” : 1 }

>db.runCommand({addshard:”shard2/10.1.195.47:10002,10.1.195.57:10002,10.1.195.67:10002”})

{ “shardAdded” : “shard2”, “ok” : 1 }

>db.runCommand({addshard:”shard3/10.1.195.47:10003,10.1.195.57:10003,10.1.195.67:10003”})

{ “shardAdded” : “shard3”, “ok” : 1 }

>db.runCommand({enablesharding:”(dbname)”})

<span style=”font-family: ‘Arial’,’sans-serif’; mso-fareast-font-family: <br />

Arial; mso-fareast-language: ZH-CN;” lang=”X-NONE”>1.1.7 配置Collection分片

为充分体现mongodb分布式的优点,需对mongodbcollection进行分片。collection分片使得数据被分散存储在不同服务器上,减少每个服务器上的数据量,即使要进行大量数据的写入、读取操作,处理起来也会很容易的。

在其中一台服务器上,连接mongod服务,即路由节点30000端口,具体操作如下:

[mongo@mongodb ~] cd ${MONGODB}bin

[mongo@mongodb ~] ./mongo –port 30000

MongoDB shell version: 2.4.3

connecting to: 127.0.0.1:30000/test

>db.runCommand({“enablesharding”:”sgccoa”})

{“OK”:”1”}

>db.runCommand({“shardcollection”:”sgccoa.XXX”,”key”:{“XXX”:”1”}})

{“collectionsharded”:”sgccoa.XXX”,”OK”:”1”}

由于协同办公一级部署系统关于mongodb如何分片,研发暂未给出明确答复,故以上分片操作中XXX为不确定信息,可暂不进行分片操作。

1.2

如何验证MongoDB集群安装部署成功


对于安装完成后的MongoDB,我们如何查看对应的状态呢,下面是具体的查询操作,以下的查询均基于生产环境实际操作截图:

–查看副本集的配置

1、shard1的副本集情况






2、shard2的副本集情况






3、shard3的副本集情况






–查看分片的配置






1.3 操作当某57磁盘空间沾满而47空间空闲时,将57中的副本集迁移到47中的操作过程:

1、首先连接到三个副本集上面,查看一下分布在57服务器上面的副本状态:

在57服务器上面部署的副本集情况为:

shard1: 57:10001 为secondary 副本节点 数据来自与primary节点,所以该节点可以删除

shard2: 57:10002 为primary 主节点,主要数据的存储目录,不建议删除

shard3: 57:10003 为arbiter 仲裁节点,数据量不大,不考虑迁移

故对shard1 在57上面的分布进行迁移

操作步骤:

1、查看shard1副本集的primary节点,10.142.51.47:10001

通过mongo -host 10.1.195.47 -port 10001 登录到shard1的主节点进行操作:

>rs.remove(“10.1.195.57:10001”)–删除指定发副本集

>rs.status()可以查看删除后的节点情况

2、由于我们的副本将迁移到47上面,所以在47上面在开启一个mongod服务,作为节点,启动脚本如下:

${MONGODB}/bin/mongod -fork -shardsvr -replSet shard1 -port 10004 -dbpath ${MONGO_DATA}/shard4 -logpath ${MONGO_LOG}/shard4/shard4.log



如以上启动脚本所示: 我们删除的副本集的名称(shard1)和我们即将创建的mongod的名称必须一致,否则在添加的时候会出现问题,提示集合名称不匹配。

前提:需要再对应的47服务器上面创建对应的目录结构。



当新的副本集mongod创建完成后,

>rs.add(“10.1.195.47:10004”) –方式一

>rs.add({_id:2,host:’10.1.195.47:10004’,priority:2})–方式二 利用配置形式创建可以指定优先级

在添加成功后,我们再次查看配置

>rs.conf()

>rs.status()


3、在以上的操作结束后,mongo会进行数据的备份过程,如果数据量大的话会比较耗时,如果数据量较大,建议将新建mongod的目录清空,让mongo进行整改数据库的备份,忽略掉匹配备份,比较省时。

4、在以上创建完副本集后,再去查看分片的配置,发现分片的配置已经自动更新为 新增的mongod了。







your support will encourage me to continue to create!
版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)