Mongo 主从复制, 副本集, 分布式存储(OSX为例, 其他都一样)
版本 3.6.4为例
一、安装
无需安装,按需要下载对应平台版本,配置环境变量就行
https://www.mongodb.com/download-center
mkdir ~/soft/mongo
mv ~/Downloads/mongodb-osx-x86_64-3.6.4.tgz .
tar -xvf mongodb-osx-x86_64-3.6.4.tgz
# 改个名
mv mongodb-osx-x86_64-3.6.4 mongo-3.6.4
环境变量指向 ~/mongo/mongo-3.6.4/bin
单点启动
mongod —dbpath=~/soft/mongo/data
就启动了,前台启动,默认端口 27017
二、主从复制(一台机器,不同端口模拟)
1:创建数据目录
Nicebuild:mongo rainyhao$ mkdir -p master-slave/master
Nicebuild:mongo rainyhao$ mkdir -p master-slave/slave
Nicebuild:mongo rainyhao$ cd master-slave
2:分别启动主从
Nicebuild:master-slave rainyhao$ mongod --dbpath=master --port 10000 --master
Nicebuild:master-slave rainyhao$ mongod --dbpath=slave --port 10001 --slave --source localhost:10000
这就算完事了。
三、副本集(以三个节点为例)
cd ~/soft/mongo
Nicebuild:mongo rainyhao$ mkdir -p replset/node1/dbs
Nicebuild:mongo rainyhao$ mkdir -p replset/node2/dbs
Nicebuild:mongo rainyhao$ mkdir -p replset/node3/dbs
1:启动三个节点
mongod --dbpath repset/node1/dbs --logpath repset/node1/log.txt --logappend --port 10001 --replSet itcast/localhost:10002
mongod --dbpath repset/node2/dbs --logpath repset/node2/log.txt --logappend --port 10002 --replSet itcast/localhost:10001
mongod --dbpath repset/node3/dbs --logpath repset/node3/log.txt --logappend --port 10003 --replSet itcast/localhost:10001,localhost:10002
2:初始化副本集, 随便登录一个节点
mongo localhost:10001/admin
db.runCommand({"replSetInitiate": {"_id":"itcast", members: [{"_id": 1, "host": "localhost:10001", "priority": 30}, {"_id":2, "host":"localhost:10002", "priority": 20}, {"_id":3, "host":"localhost:10003", "priority": 10}] }})
# 按运行效果,priority值大的节点,最后初始化完成了就是主节点
此时停掉主节点(10001),上边初始化时, priority值大的从节点(10002),就会顶替挂掉的主节点,成为主节点
先主节点恢复启动以后,10002又会自动成为从节点
四、分布式存储
1:创建相关数据存储目录
cd ~/soft/mongo
# 建立配置存放库目录(mongo的config server, 2.x版本随便启动个单点就行了,3.x的,需要是一个副本集)
Nicebuild:mongo rainyhao$ mkdir -p distributed/confignode1
Nicebuild:mongo rainyhao$ mkdir -p distributed/confignode2
Nicebuild:mongo rainyhao$ mkdir -p distributed/confignode3
# 建立数据存放库目录
Nicebuild:mongo rainyhao$ mkdir -p distributed/datanode1
Nicebuild:mongo rainyhao$ mkdir -p distributed/datanode2
Nicebuild:mongo rainyhao$ mkdir -p distributed/datanode2
# 创建日志目录
Nicebuild:mongo rainyhao$ mkdir -p distributed/logs
2:启动数据存储节点
cd distributed
Nicebuild:distributed rainyhao$ mongod --dbpath=datanode1 --port 4444 --shardsvr --logpath=logs/node1.txt --logappend --fork
Nicebuild:distributed rainyhao$ mongod --dbpath=datanode2 --port 5555 --shardsvr --logpath=logs/node2.txt --logappend --fork
Nicebuild:distributed rainyhao$ mongod --dbpath=datanode3 --port 6666 --shardsvr --logpath=logs/node3.txt --logappend --fork
3:配置并启动存储副本集
confignode1使用端口7777, confignode2使用端口8888, confignode3使用端口9999
按第三部分所述,使用confignode1和confignode2启动并建立副本集
Nicebuild:distributed rainyhao$ mongod --dbpath confignode1 --port 7777 --replSet cfgset/localhost:8888 --configsvr --logpath=logs/config1.txt --logappend --fork
Nicebuild:distributed rainyhao$ mongod --dbpath confignode2 --port 8888 --replSet cfgset/localhost:7777 --configsvr --logpath=logs/config2.txt --logappend --fork
Nicebuild:distributed rainyhao$ mongod --dbpath confignode3 --port 9999 --replSet cfgset/localhost:7777,localhost:8888 --configsvr --logpath=logs/config3.txt --logappend --fork
初始化副本集
mongo localhost:9999/admin
>db.runCommand({"replSetInitiate": {"_id":"cfgset", members: [{"_id": 1, "host": "localhost:7777", "priority": 30}, {"_id":2, "host":"localhost:8888", "priority": 20}, {"_id":3, "host":"localhost:9999", "priority": 10}] }})
4:启动mongo提供的路由
Nicebuild:distributed rainyhao$ mongos --port 3333 --configdb cfgset/localhost:7777,localhost:8888,localhost:9999
5:向配置存储副本集中, 添加数据存储结点的配置信息
Nicebuild:distributed rainyhao$ mongo localhost:3333/admin
mongos> db.runCommand({"addshard": "localhost:4444", allowLocal:true})
mongos> db.runCommand({"addshard": "localhost:5555", allowLocal:true})
mongos> db.runCommand({"addshard": "localhost:6666", allowLocal:true})
设置要分片的数据库
mongos> db.runCommand({"enablesharding": "test" });
设置要分片的集合
mongos> db.runCommand({"shardcollection": "test.person", "key": {age:1}}) # 表示按存入对象的age属性分片
6:测试添加数据
mongos> for (var i = 1; i <= 10000000;i++) { db.person.insert({name:"hello", age:i}));}
1000万数据会分到4444,5555,6666三个节点中存储
分片存得不太平均,不知道还有哪里需要配置的
备注
1:第一次配置环境的过程,数据结点的配置结点可以没有启动顺序
当配置完成之后,全部服务停止,再次启动的时候,需要先启动配置结点,再启动数据结点
2:分布式分片存储的时候,被分片的字段,不能进行更新
如上边的以age作为分片,就不能更新age