一些基本内容的记录,没有深度,只是简单的使用。

一、replication set 复制集

TIM截图20180516133532.jpg
replication set 多台服务器维护相同的数据副本,提高服务器的可用性。

指定三个节点都属于一个数据集:--replSet rs2

1、创建三个复制集:

./mongod --dbpath /data/dbdata1 --logpath /data/mongolog/db1.log --fork --port 2017 --replSet rs2 --smallfiles

./mongod --dbpath /data/dbdata2 --logpath /data/mongolog/db2.log --fork --port 2018 --replSet rs2 --smallfiles

 ./mongod --dbpath /data/dbdata3 --logpath /data/mongolog/db3.log --fork --port 2019 --replSet rs2 --smallfiles

3、编写复制集配置文件

let rsconf = {
    _id:'rs2',
    members:[
            {
                _id:0,
                host:'127.0.0.1:2017'
            },
            {
                _id:1,
                host:'127.0.0.1:2018'
            },
            {
                _id:2,
                host:'127.0.0.1:2019'
            }
        ]
}

4、根据配置进行初始化

> rs.initiate(rsconf)

{
    "ok" : 1,
    "operationTime" : Timestamp(1526449917, 1),
    "$clusterTime" : {
        "clusterTime" : Timestamp(1526449917, 1),
        "signature" : {
            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
            "keyId" : NumberLong(0)
        }
    }
}

5、查看数据集状态

初始化之后,会显示数据集,而不是当前链接。

rs2:OTHER> rs.status()

6、删除节点

rs.remove('127.0.0.1:2018')

{
    "ok" : 1,
    "operationTime" : Timestamp(1526451937, 1),
    "$clusterTime" : {
        "clusterTime" : Timestamp(1526451937, 1),
        "signature" : {
            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
            "keyId" : NumberLong(0)
        }
    }
}

7、添加节点

rs.add('127.0.0.1:2018')

{
    "ok" : 1,
    "operationTime" : Timestamp(1526451957, 1),
    "$clusterTime" : {
        "clusterTime" : Timestamp(1526451957, 1),
        "signature" : {
            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
            "keyId" : NumberLong(0)
        }
    }
}

8、重新配置 rsconf

rs.reconfig(rsconf)

9、slaveOK secondary 无法读写错误

"errmsg" : "not master and slaveOk=false",

slave 默认是不允许读也不允许写的

rs.slaveOk();

10、切换到 secondary

rs.stepDown()

11、模拟主节点 挂掉

当主节点挂掉后,会自动的将另外的一个节点提升到主节点。

rs2:PRIMARY> db.shutdownServer()

rs2:SECONDARY> db.status()

二、shard 分片

分片的几个关键要素:

名称描述
节点N>=2个 mongod 服务做节点
configsvr维护 meta 信息
mongos启动 mongos 做路由
分片规则只有设置好分片规则,才能做 configsvr 的维护信息

mongodb 的分片不是以单片文档的级别,绝对平均的散落在各个片上,而是N片文档形成一个 chunk,优先放在某个 shard 上,当这个 shard 上的 chunk 比另一 shard 的 chunk 相比较差别比较大的时候,会本 shard 上的 chunk 移动到另一个 shard 上,以 chunk 为单位,维护 shard 之间的平衡。

默认的 chunk 大小是 64M,修改默认的 chunk 大小:

use config
db.settings.find()

db.settings.update({_id:'chunksize'},{$set:{value:1}})

下面这个图来自网上:

6e9d29e442b07737d004213f43c49f5.png

1、开启两台服务器作为 shard

./mongod --logpath /data/mongolog/mongod-27017.log --port 27017   --fork --small
./mongod --logpath /data/mongolog/mongod-27018.log --port 27018   --fork --small

2、开启一台服务器作为 configsvr

参数描述
--configsvr指明该台服务器是作为 configsvr 使用的
./mongod --logpath /data/mongolog/mongodconfigsvr.log --port 27070  --configsvr --fork --small

3、启动 mongos

参数描述
--configdb指明提供 configsvr 的服务器的 ip:port
./mongos --logpath /data/mongolog/mongos-20180516.log --port 30000 --configdb 127.0.0.1:27020 --fork

4、编辑分片规则:

mongos 下操作:

查看 shard 状态

> sh.status()

添加等待分片的库:

sh.enableSharding(dbName)

添加等待分片的collection:

参数描述
fieldcollection 的一个字段

系统将会利用 field 的值,来计算应该分到哪一个片上,这个field 叫做 shard key,一般而言用主键

sh.shardCoolection('dbName.collectionName',{field:1})

三、手动预先分片

1、指定分片的 collection

sh.shardCollection('shop.user',{uid:1})

2、指定 chunk 的锚点

以 1000 条作为一个 chunk 的分割点,预先在 0,1k,2k,3k...40k 切好 chunk(此时 chunk 是空的),这些 chunk 会均匀的分配到各个 shard 上。

for(let i=0;i<40;i++){
    sh.splitAt('shop.user',{userid:i*1000});
}

3、通过 mongos 添加数据

添加的数据会均分分配到各个 chunk 中,数据是均匀分配的。

mongos> for(let i=0;i<40000;i++){db.user.insert({uid:i,name:'ptbird'})}