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

9 篇文章 1 订阅
3 篇文章 0 订阅

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

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值