MongoDB副本集加分片 两套一主一从一仲裁shard节点

分片的目的

高数据量和吞吐量的数据库应用会对单机的性能造成较大压力,大的查询量会将单机的CPU耗尽,大的数据量对单机的存储压力较大,最终会耗尽系统的内存而将压力转移到磁盘IO上。

为了解决这些问题,有两个基本的方法: 垂直扩展和水平扩展。

垂直扩展:增加更多的CPU和存储资源来扩展容量。

水平扩展:将数据集分布在多个服务器上。水平扩展即分片。
分片设计思想

分片为应对高吞吐量与大数据量提供了方法。使用分片减少了每个分片需要处理的请求数,因此,通过水平扩展,集群可以提高自己的存储容量和吞吐量。举例来说,当插入一条数据时,应用只需要访问存储这条数据的分片.

使用分片减少了每个分片存储的数据。

例如,如果数据库1tb的数据集,并有4个分片,然后每个分片可能仅持有256 GB的数据。如果有40个分片,那么每个切分可能只有25GB的数据。

在这里插入图片描述

mongodb - shard1分片节点test1172.17.64.3:27017172.17.64.13:27017172.17.64.16:27017
mongodb - shard2分片节点test2172.17.64.3:27018172.17.64.13:27018172.17.64.16:27018
config 配置节点 conftest3test3172.17.64.3:28017172.17.64.13:28017172.17.64.16:28017
mongos路由节点 未使用副本集172.17.64.14:27017

配置节点和shard分片节点节点一起安装
MongoDB-4.0副本集****
一、安装MongoDB数据库

 [root@VM-0-16-centos ~]# wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-4.0.10.tgz[root@VM-0-16-centos ~]# tar xvf mongodb-linux-x86_64-4.0.10.tgz -C /usr/local/ [root@VM-0-16-centos ~]# cd /usr/local/ [root@VM-0-16-centos ~]# ln -s mongodb-linux-x86_64-4.0.10 mongodb[root@VM-0-16-centos ~]# cd /usr/local/mongodb && mkdir config [root@VM-0-16-centos ~]# cd config
 [root@VM-0-16-centos ~]# ln -s /usr/local/mongodb/bin/* /usr/local/bin/

二、配置副本集

  1. 、添加test1副本集的配置文件 (MongoDB1,MongoDB2,MongoDB3 都进行配置)
 [root@VM-0-16-centos config ]# cat<<"EOF">mongodb1.conf
 bind_ip = 0.0.0.0
 #bind_ip_all = true # add in 3.6 和 bind_ip 互斥
 port = 27017
 dbpath = /var/lib/mongodb/27017      # 数据目录
 logpath = /var/log/mongodb_27017.log        # 日志目录
 logappend = true
 fork = true
 auth = false
 directoryperdb = true
 storageEngine = wiredTiger
 #wiredTigerCacheSizeGB = 1
 #profile = 2
 shardsvr=true
 replSet = test1                  #副本集名称
 EOF

[root@VM-0-16-centos ~]# mkdir -pv /var/lib/mongodb/27017
[root@VM-0-16-centos ~]# mkdir -pv /var/lib/mongodb/27018
[root@VM-0-16-centos ~]# mkdir -pv /var/lib/mongodb/28017
[root@VM-0-16-centos ~]# mongod -f /usr/local/mongodb/config/mongodb1.conf
2)、 添加test2副本集的配置文件 (MongoDB1,MongoDB2,MongoDB3 都进行配置)

 [root@VM-0-16-centos config  ]# cat<<"EOF">mongodb2.conf
 bind_ip = 0.0.0.0
 #bind_ip_all = true # add in 3.6 和 bind_ip 互斥
 port = 27018
 dbpath = /var/lib/mongodb/27018      # 数据目录
 logpath = /var/log/mongodb_27018.log        # 日志目录
 logappend = true
 fork = true
 auth = false
 directoryperdb = true
 storageEngine = wiredTiger
 #wiredTigerCacheSizeGB = 1
 #profile = 2
 shardsvr=true
 replSet = test2                  #副本集名称
 EOF

3)、添加configsvr副本集的配置文件 (MongoDB1,MongoDB2,MongoDB3 都进行配置)

[root@VM-0-16-centos config ]# vim mongoconf.yml

 systemLog:
   destination: file
   #日志存储位置
   path: "/var/log/mongodb/csvr.log"  # 路径需要创建出来
   logAppend: true
 storage:
   journal:
     enabled: true
   #数据文件存储位置
   dbPath: "/var/lib/mongodb/28017"
   #是否一个库一个文件夹
   directoryPerDB: true
   #WT引擎配置
   wiredTiger:
     engineConfig:
       #WT最大使用cache(根据服务器实际情况调节)
       cacheSizeGB: 1
       #是否将索引也按数据库名单独存储
       directoryForIndexes: true
     #表压缩配置
     collectionConfig:
       blockCompressor: zlib
     #索引配置
     indexConfig:
       prefixCompression: true
 #端口配置
 net:
   bindIp: 0.0.0.0
   port: 228017
 replication:
   oplogSizeMB: 2048
   replSetName: conftest3        #置服务器副本集名称
 sharding:
   clusterRole: configsvr
 processManagement:
   fork: true

4)、启动三个副本集(test1副本集,test2副本集,conftest3副本集) (MongoDB1,MongoDB2,MongoDB3 都进行启动 ,一样的操作)

 mongod  -f    /usr/local/mongodb/config/mongo1
 mongod  -f    /usr/local/mongodb/config/mongo2
 mongod  -f    /usr/local/mongodb/config/mongoconf.yml

5)、初始化副本集(使用其中一台即可MongoDB1)

 [root@VM-0-16-centos config  ]# mongo --port 27017 
 > config = {_id: "test1", members: [] }               # _id 为副本集的名称
 >config.members.push({_id: 0, host: "172.17.64.3:27017", "priority": 1})
 >config.members.push({_id: 1, host: "172.17.64.13:27017", "priority": 1})
 > config.members.push({_id: 2, host: "172.17.64.16:27017", "priority": 1})
 rs.initiate(config)
 [root@VM-0-16-centos config  ]# mongo --port 27018
 > config = {_id: "test2", members: [] }               # _id 为副本集的名称
 >config.members.push({_id: 0, host: "172.17.64.3:27018", "priority": 1})
 >config.members.push({_id: 1, host: "172.17.64.13:27018", "priority": 1})
 > config.members.push({_id: 2, host: "172.17.64.16:27018", "priority": 1})
 rs.initiate(config) 


[root@VM-0-16-centos config ]# mongo --port 28017

> config = {_id: "conftest3", members: [] }               # _id 为副本集的名称
>config.members.push({_id: 0, host: "172.17.64.3:28017", "priority": 1})
>config.members.push({_id: 1, host: "172.17.64.13:28017", "priority": 1})
> config.members.push({_id: 2, host: "172.17.64.16:28017", "priority": 1})
rs.initiate(config) 
6)、添加仲裁节点
 [root@VM-0-16-centos config  ]# mongo --port 27017 
 test1:PRIMARY> rs.remove('172.17.64.16:27017')
 { "ok" : 1 }
 test1:PRIMARY> rs.add('172.17.64.16:27017')
 ​
 ​
 [root@VM-0-16-centos config  ]# mongo --port 27018 
 test2:PRIMARY> rs.remove('172.17.64.16:27017')
 { "ok" : 1 }
 test2:PRIMARY> rs.add('172.17.64.16:27017')
 配置节点添加仲裁会报错,不需要配置,下边这一步可以省略
 [root@VM-0-16-centos config  ]# mongo --port 28017 
 conftest3:PRIMARY> rs.remove('172.17.64.16:27017')
 { "ok" : 1 }
 conftest3:PRIMARY> rs.add('172.17.64.16:27017')
配置路由节点
1)、创建路由节点mongos的配置 (在第四台上进行配置mongos) (在一台新节点上创建mongs,也可以是副本集)本例单节点
 [root@VM-0-16-centos config ]# vi mongos.yml
 systemLog:
   destination: file       
   path: "/var/log/mongodb/mongos.log" 
   #路径需要提前创建 
   logAppend: true
 net:
   bindIp: 0.0.0.0
   port: 27017
 sharding:
   configDB: conftest3/172.17.64.3:28017,172.17.64.13:28017,172.17.64.16:28017
   #配置配置服务器的副本集# 将confige server 添加到路由
 processManagement:
   fork: true

  [root@VM-0-16-centos config ]# mongos -f mongos.yaml
登录
[root@VM-0-16-centos config ]# mongo
分片配置
1)、添加分片
 use admin
 db.runCommand( { addshard : "test1/172.17.64.13:27017,172.17.64.3:27017",name:"shard1"} )
 db.runCommand( { addshard : "test2/172.17.64.13:27018,172.17.64.3:27018",name:"shard2"} )
 
2)、打开数据库实例分片规则
 mongos> db.runCommand({"enablesharding":"dbname"}) 
 { "ok" : 1 }
 
3)、检验是否打开
 mongos> sh.status()
 
4)、创建_id的hashed索引(dbname表示数据库名称,c1表示集合名称)
 mongos> use dbname
 switched to db dbname
 mongos> db.c1.createIndex({_id:'hashed'})

5)、创建_id的片键
 mongos> use admin
 switched to db admin
 mongos> db.runCommand({"shardcollection":"dbname.c1","key":{"_id":"hashed"}})
 { "collectionsharded" : "dbname.c1", "ok" : 1 }

6)、验证分片是否成功
 mongos> sh.status()
 use  dbname;
 for(i=1;i<=100000;i++){db.c1.insert({"id":i,"name":"test"})}; 
7)、查看分片数据是否均匀
 mongos> db.c1.stats();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值