MongoDB副本集加分片 两套一主一从一仲裁shard节点
分片的目的
高数据量和吞吐量的数据库应用会对单机的性能造成较大压力,大的查询量会将单机的CPU耗尽,大的数据量对单机的存储压力较大,最终会耗尽系统的内存而将压力转移到磁盘IO上。
为了解决这些问题,有两个基本的方法: 垂直扩展和水平扩展。
垂直扩展:增加更多的CPU和存储资源来扩展容量。
水平扩展:将数据集分布在多个服务器上。水平扩展即分片。
分片设计思想
分片为应对高吞吐量与大数据量提供了方法。使用分片减少了每个分片需要处理的请求数,因此,通过水平扩展,集群可以提高自己的存储容量和吞吐量。举例来说,当插入一条数据时,应用只需要访问存储这条数据的分片.
使用分片减少了每个分片存储的数据。
例如,如果数据库1tb的数据集,并有4个分片,然后每个分片可能仅持有256 GB的数据。如果有40个分片,那么每个切分可能只有25GB的数据。
mongodb - shard1分片节点 test1 172.17.64.3:27017 172.17.64.13:27017 172.17.64.16:27017
mongodb - shard2分片节点 test2 172.17.64.3:27018 172.17.64.13:27017 172.17.64.16:27018
config 配置节点 conftest3 172.17.64.3:28017 172.17.64.13:28017 172.17.64.16:28017
mongos路由节点 未使用副本集 172.17.64.14:27017
配置节点和shard分片节点节点一起安装
MongoDB-4.0副本集****
一、安装MongoDB数据库
[[email protected] ~]# wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-4.0.10.tgz
[[email protected] ~]# tar xvf mongodb-linux-x86_64-4.0.10.tgz -C /usr/local/
[[email protected] ~]# cd /usr/local/
[[email protected] ~]# ln -s mongodb-linux-x86_64-4.0.10 mongodb
[[email protected] ~]# cd /usr/local/mongodb && mkdir config
[[email protected] ~]# cd config
[[email protected] ~]# ln -s /usr/local/mongodb/bin/* /usr/local/bin/
二、配置副本集
- 、添加test1副本集的配置文件 (MongoDB1,MongoDB2,MongoDB3 都进行配置)
[[email protected] 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
[[email protected] ~]# mkdir -pv /var/lib/mongodb/27017
[[email protected] ~]# mkdir -pv /var/lib/mongodb/27018
[[email protected] ~]# mkdir -pv /var/lib/mongodb/28017
[[email protected] ~]# mongod -f /usr/local/mongodb/config/mongodb1.conf
2)、 添加test2副本集的配置文件 (MongoDB1,MongoDB2,MongoDB3 都进行配置)
[[email protected] 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 都进行配置)
[[email protected] 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)
[[email protected] 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)
[[email protected] 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)
[[email protected] 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)、添加仲裁节点
[[email protected] config ]# mongo --port 27017
test1:PRIMARY> rs.remove(‘172.17.64.16:27017’)
{ “ok” : 1 }
test1:PRIMARY> rs.add(‘172.17.64.16:27017’)
[[email protected] config ]# mongo --port 27018
test2:PRIMARY> rs.remove(‘172.17.64.16:27017’)
{ “ok” : 1 }
test2:PRIMARY> rs.add(‘172.17.64.16:27017’)
配置节点添加仲裁会报错,不需要配置,下边这一步可以省略
[[email protected] 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,也可以是副本集)本例单节点
[[email protected] 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
[[email protected] config ]# mongos -f mongos.yaml
登录
[[email protected] 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”:“penglei”})};
7)、查看分片数据是否均匀
mongos> db.c1.stats();