27005:基于docker的Mongodb部署文档 文件映射方式

Mongodb异地部署(本地读写)

分片作用:

l 复制所有的写入操作到主节点

l 延迟的敏感数据会在主节点查询

l 单个副本集限制在12个节点

l 当请求量巨大时会出现内存不足。

l 本地磁盘不足

l 垂直扩展价格昂贵

 

MongoDB副本集:

搭配方式使用一主多从模式

一个分片内有一个主节点和多个从节点,数据写入通过mongos(路由)访问主节点并写入,且只能通过主节点写入。客户端需要读取分片内容时,可以通过全部节点读取,所以主节点可读可写,从节点只能读文件。

通过Zones(区域)方式实现数据的本地读写,将数据集合(数据库的表)分片,指定之分给一个分片,也就是一个区域,只允许该分片或该区域的节点对数据进行读写,实现过程如下:

给集合添加分片索引(两种方法 哈希和索引唯一),使用索引唯一方式,随机指定一个分片为索引,需要使用索引迁移,将索引重新指定给对应分片。

两个问题:

对数据建立索引时,如果不是在对应分片上,需要再对集合进行索引迁移,集合在迁移到指定分片之前的数据会留在第一次指定的分片上,不影响对应分片上的数据读写。例如,现在集合“水果”中有“香蕉、苹果、葡萄”,需要将该集合索引到成都分片上,但是随机索引到了上海,现在我们在上海的分片上是可以查询到集合“水果”内容为“香蕉、苹果、葡萄”,现在将索引迁移到成都,并在集合中插入“火龙果”,这时在成都上查询该集合的结果时“香蕉、苹果、葡萄、火龙果”,而在上海分片上查到的还是之前状态的集合内容“香蕉、苹果、葡萄”。可直接在上海分片上删除该集合。

如果在上海分片中删除集合“水果”,在路由中这看不到该集合,只能在成都分片(索引的分片)查询到。路由对该表的查询和写入不会受到影响

分片主节点挂掉,其他从节点会随机升级一个主节点。原主节点恢复后会变成从节点继续工作。

 

五节点mongodb集群部署

五个节点公网IP

文中IP请更换为自己不同节点的IP

部署过程的部分操作已经写成脚本:

https://download.csdn.net/download/charles_zhang_/11832579

 

开始部署mongodb(确保各服务器之间的27001、27002、27003、27004、27005、27017、27018端口开启状态),分别在五台服务器创建mongodb文件路径:

mkdir -p /home/mongodb/data/shard{1,2,3,4,5}​mkdir -p /home/mongodb/conf​mkdir -p /home/mongodb/data/config​mkdir -p /home/mongodb/log/​touch /home/mongodb/log/config.log​touch /home/mongodb/log/mongos.log​touch /home/mongodb/log/shard{1,2,3,4,5}.log

 

系统没有mongodb时安装:

安装mongodb

创建yum源文件:

cat >/etc/yum.repos.d/mongodb-org-4.0.repo <<EOF​[mngodb-org]​name=MongoDB Repository​baseurl=http://mirrors.aliyun.com/mongodb/yum/redhat/7Server/mongodb-org/4.0/x86_64/​gpgcheck=0​enabled=1​EOF

安装之前先更新所有包 :

yum update

安装命令:

yum -y install mongodb-org

 

启动mongodb :systemctl start mongod.service​设置mongodb开启自启动:systemctl enable mongod​停止mongodb :systemctl stop mongod.service​查看mongodb的状态:systemctl status mongod.service

 

 

配置服务器部署(五台同时)

cat >/home/mongodb/conf/config.conf<<EOF​dbpath=/home/mongodb/data/config​logpath=/home/mongodb/log/config.log​port=27018​logappend=true​fork=true​maxConns=5000​replSet=configs​configsvr=true​bind_ip=0.0.0.0​EOF

 

分片服务部署(五个服务器同步):

cat >/home/mongodb/conf/shard1.conf<<EOF​dbpath=/home/mongodb/data/shard1​logpath=/home/mongodb/log/shard1.log​port=27001​logappend=true​fork=true​maxConns=5000​storageEngine=mmapv1​shardsvr=true​replSet=shard1​bind_ip=0.0.0.0​EOF​ ​cat >/home/mongodb/conf/shard2.conf<<EOF​dbpath=/home/mongodb/data/shard2​logpath=/home/mongodb/log/shard2.log​port=27002​logappend=true​fork=true​maxConns=5000​storageEngine=mmapv1​shardsvr=true​replSet=shard2​bind_ip=0.0.0.0​EOF​ ​cat >/home/mongodb/conf/shard3.conf<<EOF​dbpath=/home/mongodb/data/shard3​logpath=/home/mongodb/log/shard3.log​port=27003​logappend=true​fork=true​maxConns=5000​storageEngine=mmapv1​shardsvr=true​replSet=shard3​bind_ip=0.0.0.0​EOF​ ​cat >/home/mongodb/conf/shard4.conf<<EOF​dbpath=/home/mongodb/data/shard4​logpath=/home/mongodb/log/shard4.log​port=27004​logappend=true​fork=true​maxConns=5000​storageEngine=mmapv1​shardsvr=true​replSet=shard4​bind_ip=0.0.0.0​EOF​ ​cat >/home/mongodb/conf/shard5.conf<<EOF​dbpath=/home/mongodb/data/shard5​logpath=/home/mongodb/log/shard5.log​port=27005​logappend=true​fork=true​maxConns=5000​storageEngine=mmapv1​shardsvr=true​replSet=shard5​bind_ip=0.0.0.0​EOF

 

路由服务部署(5台服务器执行相同操作):

cat >/home/mongodb/conf/mongos.conf<<EOF​logpath=/home/mongodb/log/mongos.log​logappend = true​port = 27017​fork = true​configdb = configs/124.251.74.76:27018,211.148.19.220:27018,47.103.118.8:27018,122.128.107.99:27018,47.103.117.111:27018​maxConns=20000​bind_ip=0.0.0.0​EOF

 

正式环境部署时需要使用使用上面的启动格式 -v参数的添加是将本地的文件映射到docker镜像中,配置、log、data文件需要写在本地(使用k8s时)

docker run -d -e "container=docker" --privileged=true -v /home/vm_mongodb-2/etc/mongod.conf:/etc/mongod.conf -v /home/vm_mongodb-2/var/lib/mongo/:/var/lib/mongo/ -v /home/vm_mongodb-2/var/log/mongodb/:/var/log/mongodb/ --name mongodb-2 -h mongodb-2 --network host mongodb:init /usr/sbin/init

 

登录(任意一台即可)配置设置复制集:

mongod -f /home/mongodb/conf/config.conf​mongo --port 27018​use admin​config={_id:"configs",members:[{_id:0,host:"122.128.107.99:27018"},{_id:1,host:"211.148.19.220:27018"}, {_id:2,host:"47.103.118.8:27018"},{_id:3,host:"124.251.74.76:27018"},{_id:4,host:"47.103.117.111:27018"}]}​rs.initiate(config)​rs.status()

 

 

<!--错误:"No host described in new configuration 1 for replica set configs maps to this node"-->

<!--说明端口不通或者端口没有开放-->

--><!--

<!--如果端口状态为"stateStr" : "STARTUP"-->

<!--STARTUP:刚加入到复制集中,配置还未加载-->

<!--STARTUP2:配置已加载完,初始化状态-->

<!--RECOVERING:正在恢复,不适用读-->

<!--ARBITER: 仲裁者-->

<!--DOWN:节点不可到达-->

<!--UNKNOWN:未获取其他节点状态而不知是什么状态,一般发生在只有两个成员的架构-->

<!--REMOVED:移除复制集-->

<!--ROLLBACK:数据回滚,在回滚结束时,转移到RECOVERING或SECONDARY状态-->

<!--FATAL:出错。查看日志grep “replSet FATAL”找出错原因,重新做同步-->

<!--PRIMARY:主节点-->

<!--SECONDARY:备份节点-->

 

启动分片:

mongod -f /home/mongodb/conf/shard1.conf​mongod -f /home/mongodb/conf/shard2.conf​mongod -f /home/mongodb/conf/shard3.conf​mongod -f /home/mongodb/conf/shard4.conf​mongod -f /home/mongodb/conf/shard5.conf​

 

将分片配置为复制集(五个节点同步)

登录分片,配置复制集(可在任意一台服务器登录配置):

mongo --port 27001​use admin​rs.initiate({_id:"shard1",members:[{_id:0,host:"124.251.74.76:27001"},{_id:1,host:"211.148.19.220:27001"}, {_id:2,host:"47.103.118.8:27001"},{_id:3,host:"122.128.107.99:27001"},{_id:4,host:"47.103.117.111:27001"}]})​ ​mongo --port 27002​use admin​rs.initiate({_id:"shard2",members:[{_id:0,host:"211.148.19.220:27002"},{_id:1,host:"124.251.74.76:27002"}, {_id:2,host:"47.103.118.8:27002"},{_id:3,host:"122.128.107.99:27002"},{_id:4,host:"47.103.117.111:27002"}]})​​mongo --port 27003​use admin​rs.initiate({_id:"shard3",members:[{_id:0,host:"47.103.118.8:27003"},{_id:1,host:"124.251.74.76:27003"},{_id:2,host:"211.148.19.220:27003"},{_id:3,host:"122.128.107.99:27003"}, {_id:4,host:"47.103.117.111:27003"}]})​​mongo --port 27004​use admin​rs.initiate({_id:"shard4",members:[{_id:0,host:"122.128.107.99:27004"},{_id:1,host:"124.251.74.76:27004"},{_id:2,host:"211.148.19.220:27004"},{_id:3,host:"47.103.118.8:27004"},{_id:4,host:"47.103.117.111:27004"}]})​ ​mongo --port 27005​use admin​rs.initiate({_id:"shard5",members:[{_id:0,host:"47.103.117.111:27005"},{_id:1,host:"211.148.19.220:27005"}, {_id:2,host:"47.103.118.8:27005"},{_id:3,host:"124.251.74.76:27005"},{_id:4,host:"122.128.107.99:27005"}]})

 

​启动mongoes​mongos -f /home/mongodb/conf/mongos.conf​ 启动分片功能​连接mongo:​mongo --port 27017​use admin​sh.addShard("shard1/124.251.74.76:27001,211.148.19.220:27001,47.103.118.8:27001,122.128.107.99:27001,47.103.117.111:27001")​sh.addShard("shard2/211.148.19.220:27002,124.251.74.76:27002,47.103.118.8:27002,122.128.107.99:27002,47.103.117.111:27002")​sh.addShard("shard3/47.103.118.8:27003,124.251.74.76:27003,211.148.19.220:27003,122.128.107.99:27003,47.103.117.111:27003")​sh.addShard("shard4/122.128.107.99:27004,124.251.74.76:27004,211.148.19.220:27004,47.103.118.8:27004,47.103.117.111:27004")​sh.addShard("shard5/47.103.117.111:27005,124.251.74.76:27005,211.148.19.220:27005,47.103.118.8:27005,122.128.107.99:27005")​sh.status()

 

之后登录mongos验证分片和配置

mongo --port 27017​usemongo​db.mongod1.insert({_id:1,name:"香蕉",price:13})​db.mongod2.insert({_id:1,name:"葡萄",price:13})​db.mongod3.insert({_id:1,name:"苹果",price:13})​db.mongod4.insert({_id:1,name:"李子",price:13})​db.mongod5.insert({_id:1,name:"梨",price:13})

 

关闭平衡器

sh.stopBalancer()

查看平衡器状态

sh.isBalancerRunning()

首先允许数据库可以被分片

sh.enableSharding("dbname")

 

为分片的集合配置shard key

db.mongodb1.createIndex({ _id:1}) #唯一索引​db.mongodb2.createIndex({ _id:1})​db.mongodb3.createIndex({ _id:1})​db.mongodb4.createIndex({ _id:1})​db.mongodb5.createIndex({ _id:1})

 

对集合进行分片

sh.shardCollection("mongo.mongodb1",{"_id":1})​sh.shardCollection("mongo.mongodb2",{"_id":1})​sh.shardCollection("mongo.mongodb3",{"_id":1})​sh.shardCollection("mongo.mongodb4",{"_id":1})​sh.shardCollection("mongo.mongodb5",{"_id":1})​可以通过sh.status()查看分片情况

 

迁移数据块(chunks) (迁移到指定分片或区域中)在迁移过程中不可以进行数据写入,否则会导致机器卡死 :

db.adminCommand( { moveChunk : "mongo.mongodb1",find : {_id : 1},to : "shard1" } )​db.adminCommand( { moveChunk : "mongo.mongodb2",find : {_id : 1},to : "shard2" } )​db.adminCommand( { moveChunk : "mongo.mongodb3",find : {_id : 1},to : "shard3" } )​db.adminCommand( { moveChunk : "mongo.mongodb4",find : {_id : 1},to : "shard4" } )​db.adminCommand( { moveChunk : "mongo.mongodb5",find : {_id : 1},to : "shard5" } )

 

在使用sh.status()确认分片情况

 

(可选)设置chunk的大小(默认为64M):

db.settings.save( { _id:"chunksize", value: <sizeInMB> } )

(可选)可以为分片添加tag :

sh.addShardTag("shard1","sh")

 

(可选)合并数据块

db.runCommand( { mergeChunks: "mydb.mongod",​bounds: [ { "_id": 30 },​{ "_id":32} ]​} )

 

配置过程:

通过改动priority的值来实现(默认的优先级是1(0-100)。priority的值设的越大,就优先成为主)

PRIMARY> config=rs.conf()​PRIMARY>config.members[1].priority = **3**PRIMARY> rs.reconfig(config)

 

参考 设置优先级:https://blog.csdn.net/weixin_34082695/article/details/93544809

 

 

相关推荐

相关文章