mongodb复制集和分片

首先了解大致了解mongodb复制集和分片的做用,简单来讲复制集是保证数据的安全性,分片提升了数据库的并发性。(随便提一下对于数据安全性这里,mongodb是经过复制集实现的,固然也能够经过计算机的硬件来实现好比有的公司硬盘采用磁盘阵列冗余存储,没见过这东东是啥)mongodb

目录结构

mongodb安装目录下新建data目录用于存放数据数据库

1__bash

data下对应五个文件夹,分别对应配置父亲,mongos服务器以及三个分片服务器,因为每一个分片又是经过复制集来实现的,全部每一个shard下面又有三台mongod实例。gulp

 安全

脚本管理

因为在配置过程当中会有大量重复的命令,全部我经过脚本形式来启动。bash

因为复制集是分片的基础,先说复制集服务器

shard1.sh并发

/usr/local/mongodb/bin/mongod --dbpath=/usr/local/mongodb/data/shard1/db1/db --logpath=/usr/local/mongodb/data/shard1/db1/log.log --logappend --fork --port 2000 --replSet=shard1app

/usr/local/mongodb/bin/mongod --dbpath=/usr/local/mongodb/data/shard1/db2/db --logpath=/usr/local/mongodb/data/shard1/db2/log.log --logappend --fork --port 2001 --replSet=shard1性能

/usr/local/mongodb/bin/mongod --dbpath=/usr/local/mongodb/data/shard1/db3/db --logpath=/usr/local/mongodb/data/shard1/db3/log.log --logappend --fork --port 2002 --replSet=shard1测试

其实就是启动一个mongodb实例,—replSet=shard1,是要建立的复制集的标志。

执行后并无造成一个复制集,仍是须要初始化。

登录任意一个mongod实例,/usr/local/mongodb/bin/mongod 127.0.0.1:2000/admin

执行rs.status(),会有相应的报错提示,大致意思是复制集尚未初始化,请先初始化

那输入配置config = {_id: “shard1”,members: [_{id: 0, host: “127.0.0.1:2000”},{_id: 1, host: “127.0.0.1:2001”},{_id:2, host: “127.0.0.1:2002”}]}

而后执行rs.initiate(config);

OK,第一个复制集就建立好了。其余三个复制集相似,须要注意的是每一个分片的复制集的名字。为了好记,我是用shard1 shard2 shard3,另外端口我也是每一个shard分别用2001 2001 2002,3000 3001 3002,4000 401 4002

配置服务器

首先启动配置服务器

/usr/local/mongodb/bin/mongod --dbpath=/usr/local/mongodb/data/conf/db --logpath=/usr/local/mongodb/data/conf/log.log --logappend --fork -port 5000 –configsvr

而后相似复制集同样须要分片配置的初始化

/usr/local/mongodb/bin/mongod 127.0.0.1:5000/admin

经过命令 db.runCommand({addshard: “replicaSetName/[serverhost[: port], …]”}),添加复制集分片

db.runCommand({addshard: “shard1/127.0.0.1:2000,127.0.0.1:2001,127.0.0.1:2002”})

db.runCommand({addshard: “shard2/127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002”})

db.runCommand({addshard: “shard3/127.0.0.1:4000,127.0.0.1:4001,127.0.0.1:4002”})

分片添加成功,查看 db.runCommand({listshards:1});

或是 show dbs

use conf

db.conf.find();

mongos服务器

启动服务器 /usr/local/mongodb/bin/mongos –port 5001 –configdb 127.0.0.1:5000

链接 /usr/local/mongodb/bin/mongo 127.0.0.1:5001/admin

使分片生效 db.runCommand({enablesharding: “sand”}),指定数据库

db.runCommand({shardcollection: “sand.decision”, key: {order: 1}}); 指定要分片的collection以及片键,由于并非须要全部的collection都不要分片,分片的片键也不同。

至此,分片工做以及完成

测试

链接mongos,如上

use sand

for(var i=1;i<100000000;i++){db.decision.save({name: “decision”+i, order: i});}

千万级仍是要等老久了。。。

db.decision.count()

而后分别链接每一个复制集的任意一个mongod的实例,执行db.decision.count()查看

复制集的secondary级别的默认是不容许操的,能够经过命令rs.status0k(),使之临时能够操做,此时会发现每一个分片上都有数据且不一样,但同一个分片上不一样的mongod上数据是同样的。

&#160;

自动化

本身目前能够经过gulp实现简单的自动化部署,因为对gulp没有深刻研究,一致在想能不能经过gulp实现所有的自动化呢?

公司没有这样的需求,只是本身平时玩玩,对稳定性,性能上都没有什么经验,若是有写过这方便的亲们给发个连接。

相关文章
相关标签/搜索