一、简介

分片(sharding)是MongoDB用来将大型集合水平分割到不同服务器(或者复制集)上所采用的方法。

不需要功能强大的大型计算机就可以存储更多的数据,处理更大的负载。

mongodb分片集群原理 mongodb分片集群搭建_mongodb分片集群原理


分片集群由以下3个服务组成:

  • Shards Server: 每个shard由一个或多个mongod进程组成,用于存储数据。
  • Router Server:
    数据库集群的请求入口,所有请求都通过Router(mongos)进行协调,不需要在应用程
    序添加一个路由选择器,Router(mongos)就是一个请求分发中心它负责把应用程序的请求转发到对应的 Shard服务器上。
  • Config Server: 配置服务器。存储所有数据库元信息(路由、分片)的配置。

二、配置 并启动config节点集群

mongodb分片集群原理 mongodb分片集群搭建_mongodb分片集群原理_02

  1. 解压并重命名MongoDB
tar -zxvf mongodb-linux-x86_64-rhel70-4.4.5.tgz
mv mongodb-linux-x86_64-rhel70-4.4.5 shard_cluster
  1. 进入并创建目录
cd shard_cluster/
mkdir config
  1. 进入config创建log目录
cd config
mkdir config1 logs
  1. 创建配置服务器配置config-17017.conf
vi config-17017.conf
# 数据库文件位置
dbpath=config/config1
#日志文件位置
logpath=config/logs/config1.log
# 以追加方式写入日志
logappend=true
# 是否以守护进程方式运行
fork = true
bind_ip=0.0.0.0
port = 17017
# 表示是一个配置服务器
configsvr=true
#配置服务器副本集名称
replSet=configsvr
  1. 启动
cd ../
./bin/mongod -f config/config-17017.conf
  1. 配置集群其它两个节点
cd config/
mkdir config2
mkdir config3
cp config-17017.conf config-17018.conf
cp config-17017.conf config-17019.conf
# 数据库文件位置
dbpath=config/config2
#日志文件位置
logpath=config/logs/config2.log
# 以追加方式写入日志
logappend=true
# 是否以守护进程方式运行
fork = true
bind_ip=0.0.0.0
port = 17018
# 表示是一个配置服务器
configsvr=true
#配置服务器副本集名称
replSet=configsvr
# 数据库文件位置
dbpath=config/config3
#日志文件位置
logpath=config/logs/config3.log
# 以追加方式写入日志
logappend=true
# 是否以守护进程方式运行
fork = true
bind_ip=0.0.0.0
port = 17019
# 表示是一个配置服务器
configsvr=true
#配置服务器副本集名称
replSet=configsvr
  1. 启动配置服务
cd ../
./bin/mongod -f config/config-17018.conf
./bin/mongod -f config/config-17019.conf
  1. 进入任意节点的mongo shell 并添加配置节点集群,这里要注意 use admin
./bin/mongo --port 17017

use admin

var cfg ={"_id":"configsvr", 
    "members":[ 
        {"_id":1,"host":"192.168.200.103:17017"}, 
        {"_id":2,"host":"192.168.200.103:17018"}, 
        {"_id":3,"host":"192.168.200.103:17019"}
    ] 
};

rs.initiate(cfg)

#查看状态
rs.status()

mongodb分片集群原理 mongodb分片集群搭建_服务器_03

三、配置shard1集群

shard1集群搭建37017到37019

  1. 新建目录
cd shard_cluster/
mkdir shard

cd shard
mkdir shard1 shard2

cd shard1
mkdir shard1-37017 shard1-37018 shard1-37019
  1. 创建配置文件
vi shard1-37017.conf
dbpath=shard/shard1/shard1-37017 
bind_ip=0.0.0.0 
port=37017 
fork=true 
logpath=shard/shard1/shard1-37017.log 
replSet=shard1 
shardsvr=true
vi shard1-37018.conf
dbpath=shard/shard1/shard1-37018
bind_ip=0.0.0.0 
port=37018 
fork=true 
logpath=shard/shard1/shard1-37018.log 
replSet=shard1 
shardsvr=true
vi shard1-37019.conf
dbpath=shard/shard1/shard1-37019
bind_ip=0.0.0.0 
port=37019 
fork=true 
logpath=shard/shard1/shard1-37019.log 
replSet=shard1 
shardsvr=true

mongodb分片集群原理 mongodb分片集群搭建_配置文件_04

  1. 启动
./bin/mongod -f shard/shard1/shard1-37017.conf
./bin/mongod -f shard/shard1/shard1-37018.conf
./bin/mongod -f shard/shard1/shard1-37019.conf
  1. 进行集群配置
./bin/mongo --port 37017

var cfg ={"_id":"shard1", 
    "protocolVersion" : 1, 
    "members":[ 
        {"_id":1,"host":"192.168.200.103:37017"}, 
        {"_id":2,"host":"192.168.200.103:37018"},
        {"_id":3,"host":"192.168.200.103:37019"} 
    ] 
}; 

rs.initiate(cfg) 

rs.status()

四、配置shard2集群

shard2集群搭建47017到47019
配置和shard1大致

  1. 创建配置文件
cd shard/shard2
mkdir shard2-47017 shard2-47018 shard2-47019
mkdir logs
vi shard2-47017.conf
dbpath=shard/shard2/shard2-47017 
bind_ip=0.0.0.0 
port=47017 
fork=true 
logpath=shard/shard2/logs/shard2-47017.log 
replSet=shard2 
shardsvr=true
vi shard2-47018.conf
dbpath=shard/shard2/shard2-47018 
bind_ip=0.0.0.0 
port=47018 
fork=true 
logpath=shard/shard2/logs/shard2-47018.log 
replSet=shard2 
shardsvr=true
vi shard2-47019.conf
dbpath=shard/shard2/shard2-47019 
bind_ip=0.0.0.0 
port=47019 
fork=true 
logpath=shard/shard2/logs/shard2-47019.log 
replSet=shard2 
shardsvr=true
  1. 启动
cd ../../
./bin/mongod -f shard/shard2/shard2-47017.conf
./bin/mongod -f shard/shard2/shard2-47018.conf
./bin/mongod -f shard/shard2/shard2-47019.conf
  1. 进行集群配置
./bin/mongo --port 47017

var cfg ={"_id":"shard2", 
    "protocolVersion" : 1, 
    "members":[ 
        {"_id":1,"host":"192.168.200.103:47017"}, 
        {"_id":2,"host":"192.168.200.103:47018"},
        {"_id":3,"host":"192.168.200.103:47019"} 
    ] 
}; 

rs.initiate(cfg) 

rs.status()

五、配置和启动路由节点

  1. 新建目录
cd shard_cluster/
mkdir route/logs -p
  1. 进入route目录,新建配置文件
cd route
vi route-27017.conf
port=27017 
bind_ip=0.0.0.0 
fork=true 
logpath=route/logs/route.log 
configdb=configsvr/192.168.200.103:17017,192.168.200.103:17018,192.168.200.103:17019
  1. 启动路由
cd ../
./bin/mongos -f route/route-27017.conf
  1. 进入mongos
./bin/mongo --port 27017
  1. 查看分片节点状态
sh.status()

mongodb分片集群原理 mongodb分片集群搭建_mongodb_05

  1. 向路由中添加分片集群shard1和shard2
sh.addShard("shard1/192.168.200.103:37017,192.168.200.103:37018,192.168.200.103:37019"); 
sh.addShard("shard2/192.168.200.103:47017,192.168.200.103:47018,192.168.200.103:47019"); 
sh.status()

mongodb分片集群原理 mongodb分片集群搭建_服务器_06

  1. 开启数据库和集合分片(指定片键)
    为数据库开启分片功能
sh.enableSharding("lossdate_test")

为指定集合开启分片功能
sh.shardCollection(“lossdate_test.lossdate_test_datas”,{“片键字段名如 name”:索引说明})

sh.shardCollection("lossdate_test.lossdate_test_datas",{"name":"hashed"})
  1. 向集合中插入数据测试
use lossdate_test;

通过切换到shard1和shard2查看是否同步

show dbs

mongodb分片集群原理 mongodb分片集群搭建_mongodb分片集群原理_07


最后通过路由循环向集合中添加数

for(var i = 1; i <= 1000; i ++) { 
    db.lossdate_test_datas.insert(
        {"name":"test" + i, 
            salary:(Math.random()*20000).toFixed(2)
        }
    ); 
}

六、验证

分别进入shard1和shard2进行查询验证分片

use lossdate_test
db.lossdate_test_datas.find()

shard1:

mongodb分片集群原理 mongodb分片集群搭建_mongodb_08


shard2:

mongodb分片集群原理 mongodb分片集群搭建_服务器_09

七、安全认证

  1. 创建用户
    开启安全认证之前, 进入路由
    在admin创建管理员和在lossdate_test下创建普通用户
#创建管理员
use admin

db.createUser({
    user:"root",
    pwd:"123456",
    roles:[{role:"root",db:"admin"}]
})

#创建普通用户
use lossdate_test

db.createUser({
    user:"lossdate",
    pwd:"123456",
    roles:[{role:"readWrite",db:"lossdate_test"}]
})
  1. 关闭所有的 配置节点 分片节点 和 路由节点
#安装psmisc 
yum install psmisc 
命令 快速关闭多个进程 
killall mongod
killall mongo
killall mongos
  1. 生成 密钥文件 并 修改权限
cd /usr/local/mongodb/shard_cluster/
mkdir data/mongodb -p
openssl rand -base64 756 > data/mongodb/testKeyFile.file
chmod 600 data/mongodb/testKeyFile.file
  1. 配置节点集群和分片节点集群,开启安全认证和指定密钥文件
    在分别在config、shard1和shard2集群的配置文件中加上:
auth=true 
keyFile=data/mongodb/testKeyFile.file

例:config-17017.conf config-17018.conf config-17019.conf

vi config/config-17017.conf
...

mongodb分片集群原理 mongodb分片集群搭建_配置文件_10

vi shard/shard1/shard1-37017.conf
...
vi shard/shard2/shard2-47017.conf 
...
  1. 在路由配置文件中配置密钥文件
vi route/route-27017.conf
keyFile=data/mongodb/testKeyFile.file

mongodb分片集群原理 mongodb分片集群搭建_mongodb分片集群原理_11

  1. 启动所有的 配置节点、分片节点 和 路由节点 使用路由进行权限验证
    编写一个shell脚本批量启动
vi startup.sh
./bin/mongod -f config/config-17017.conf 
./bin/mongod -f config/config-17018.conf 
./bin/mongod -f config/config-17019.conf 
./bin/mongod -f shard/shard1/shard1-37017.conf 
./bin/mongod -f shard/shard1/shard1-37018.conf 
./bin/mongod -f shard/shard1/shard1-37019.conf 
./bin/mongod -f shard/shard2/shard2-47017.conf 
./bin/mongod -f shard/shard2/shard2-47018.conf 
./bin/mongod -f shard/shard2/shard2-47019.conf 
./bin/mongos -f route/route-27017.conf

mongodb分片集群原理 mongodb分片集群搭建_服务器_12


接着为startup.sh添加执行权限

chmod +x startup.sh

最后执行脚本

./startup.sh
  1. 验证
    进入路由节点
./bin/mongo --port 27017

执行show dbs,不生效
接着验证管理员

use admin
db.auth("root","123456")

再执行show dbs,生效

mongodb分片集群原理 mongodb分片集群搭建_mongodb分片集群原理_13


退出,继续验证普通用户

exit
./bin/mongo --port 27017
use lossdate_test
db.auth("lossdate","123456")

mongodb分片集群原理 mongodb分片集群搭建_mongodb_14

  1. Spring boot 连接安全认证的分片集群
    配置:
spring.data.mongodb.username=账号 
spring.data.mongodb.password=密码 
#spring.data.mongodb.uri=mongodb://账号:密码@IP:端口/数据库名

mongodb分片集群原理 mongodb分片集群搭建_mongodb_15