阿小信大人的头像
做你说过的,说你能做的 阿小信大人

mongodb的复制与分片2014-09-02 06:26

主从复制

主从复制可用于备份、故障恢复、读扩展等。设置一个主节点,多个从节点,从节点就可以复制主节点的数据到本地。

在linux上的2612端口建一个主节点并设置为自动同步:mongod --dbpath ./mongo/dbs/master/ --port 2612 --master --autoresync

在windows上7474端口建个从节点:mongod.exe --dbpath c:\data\db --port 7474 --slave --source 192.168.2.130:2612

现在在主节点上添加数据,可以看到后台在打印同步信息,完成后到windows下去看,和主节点上的数据一样了。如果在从节点上添加数据的话,会提示not master。以从节点的身份运行mongo shell貌似不能连接上数据库,改成独立的mongod服务运行就好了。

副本集

副本集是有自动故障恢复功能的主从集群,区别是副本集没有固定的主节点。

在192.168.2.130上创建数据库:mongod --dbpath test/mongo/dbs/node2/ --port 10002 --replSet imsetname/192.168.2.108:10001

在192.168.2.108上创建数据库:mongod --dbpath test/mongo/dbs/node1/ --port 10001 --replSet imsetname/192.168.2.130:10002

连接数据库初始化服务器:

`mongo 192.168.2.130:10002/admin`

:::javascript
> db.runCommand({"replSetInitiate":{
... "_id":"imsetname",
... "members":[
...   {
...     "_id":1,
...     "host":"192.168.2.130:10002"
...   },
...   {
...     "_id":2,
...     "host":"192.168.2.108:10001"
...   }
... ]}})
{
    "info" : "Config now saved locally.  Should come online in about a minute.",
    "ok" : 1
}

进入数据库提示符变为:imsetname:PRIMARY>表示是master节点,可以进行操作,断开再次连接发现提示符变成:imsetname:SECONDARY>,再进行操作会提示错误信息。master节点是不确定的,它由其他节点选举出来。读扩展可以放在从节点上查询减轻主节点负载。

分片

将数据库集合拆分,分散存在不同的机器上,mongodb可以自动进行分片。运行一个mongos路由进程,它知道所有数据存放的位置。

启动配置服务器:

ashin@linux:~/test/mongo$ mkdir dbs/config
ashin@linux:~/test/mongo$ mongod. --dbpath ./dbs/config --port 2612

建立mongos进程:

ashin@linux:~/test/mongo$ mongos --port 2712 --configdb localhost:2612

添加分片(普通的mongod实例或副本集):

ashin@linux:~/test/mongo$ mkdir dbs/shard1
ashin@linux:~/test/mongo$ mongod  --dbpath dbs/shard1 --port 7777
ashin@linux:~/test/mongo$ mkdir dbs/shard2
ashin@linux:~/test/mongo$ mongod  --dbpath dbs/shard2 --port 7778

连接mongos,为集群添加片:

ashin@linux:~/test/mongo$ mongo localhost:2712/admin
MongoDB shell version: 2.4.1
connecting to: localhost:2712/admin
mongos> db.runCommand({
... addshard:"localhost:7777",
... allowLocal:true //在localhost上运行片,生产环境中集群部署在不同的机器上
... })
{ "shardAdded" : "shard0000", "ok" : 1 }
mongos> db.runCommand({
... addshard:"localhost:7778",
... allowLocal:true 
... })
{ "shardAdded" : "shard0001", "ok" : 1 }

切分数据:

mongos> db.runCommand({"enablesharding":"shardtest"}) //将shardtest数据库的分片功能打开
{ "ok" : 1 }
mongos> db.runCommand({"shardcollection":"shardtest.hehe", "key":{"_id":1}})    //对hehe集合按照_id来分片。
{ "collectionsharded" : "shardtest.hehe", "ok" : 1 }

管理分片:

mongos> use config  //切换到config数据库
switched to db config
mongos> db.shards.find()    //查询分片
{ "_id" : "shard0000", "host" : "localhost:7777" }
{ "_id" : "shard0001", "host" : "localhost:7778" }
mongos> db.databases.find() //查询已经在片上的数据库信息,partitioned表示是否启用分片功能,primary表示数据库最开始创建数据文件的位置
{ "_id" : "admin", "partitioned" : false, "primary" : "config" }
{ "_id" : "test", "partitioned" : false, "primary" : "shard0000" }
{ "_id" : "shardtest", "partitioned" : true, "primary" : "shard0000" }
mongos> db.chunks.find()    //块信息
{ "_id" : "shardtest.hehe-_id_MinKey", "lastmod" : { "t" : 1, "i" : 0 }, "lastmodEpoch" : ObjectId("51592a6afbb6a0314bd6a9c7"), "ns" : "shardtest.hehe", "min" : { "_id" : { "$minKey" : 1 } }, "max" : { "_id" : { "$maxKey" : 1 } }, "shard" : "shard0000" }
mongos> db.printShardingStatus()    //显示所有概要信息
--- Sharding Status --- 
  sharding version: {
    "_id" : 1,
    "version" : 3,
    "minCompatibleVersion" : 3,
    "currentVersion" : 4,
    "clusterId" : ObjectId("51592728fbb6a0314bd6a939")
}
  shards:
    {  "_id" : "shard0000",  "host" : "localhost:7777" }
    {  "_id" : "shard0001",  "host" : "localhost:7778" }
  databases:
    {  "_id" : "admin",  "partitioned" : false,  "primary" : "config" }
    {  "_id" : "test",  "partitioned" : false,  "primary" : "shard0000" }
    {  "_id" : "shardtest",  "partitioned" : true,  "primary" : "shard0000" }
        shardtest.hehe
            shard key: { "_id" : 1 }
            chunks:
                shard0000   1
            { "_id" : { "$minKey" : 1 } } -->> { "_id" : { "$maxKey" : 1 } } on : shard0000 { "t" : 1, "i" : 0 } 
mongos> use admin   //删除分片
switched to db admin
mongos> db.runCommand({"removeshard":"localhost:7777"})
{
    "msg" : "draining started successfully",
    "state" : "started",
    "shard" : "shard0000",
    "note" : "you need to drop or movePrimary these databases",
    "dbsToMove" : [
        "shardtest",
        "test"
    ],
    "ok" : 1
}

先在mongos中插入数据后,在7777上可以查到,7778上没有数据,删除7777后,7778上有了数据。数据量太小的原因。

如果您觉得从我的分享中得到了帮助,并且希望我的博客持续发展下去,请点击支付宝捐赠,谢谢!

若非特别声明,文章均为阿小信的个人笔记,转载请注明出处。文章如有侵权内容,请联系我,我会及时删除。

#数据库#   #mongodb
分享到:
阅读[1206] 评论[0]

你可能也感兴趣的文章推荐

本文最近访客

发表评论