原⽂地址:
1. 集群架构(⽣产可⽤)
MongoDB机器信息
192.168.252.121mongosconfig server
192.168.252.122mongosconfig server
192.168.252.123mongosconfig server
shard server1 主节点shard server1 副节点shard server1 仲裁shard server2 仲裁
shard server2 主节点shard server2 副节点
shard server3 主节点
shard server3 副节点shard server3 仲裁端⼝分配:
mongos:20000config:21000shard1:27001shard2:27002shard3:27003
Sharding分⽚技术
当数据量⽐较⼤的时候,我们需要把数据分⽚运⾏在不同的机器中,以降低CPU、内存和IO的压⼒,Sharding就是数据库分⽚技术。MongoDB分⽚技术类似MySQL的⽔平切分和垂直切分,数据库主要由两种⽅式做Sharding:垂直扩展和横向切分。垂直扩展的⽅式就是进⾏集群扩展,添加更多的CPU,内存,磁盘空间等。横向切分则是通过数据分⽚的⽅式,通过集群统⼀提供服务:
(1)MongoDB的Sharding架构
(2)MongoDB分⽚架构中的⾓⾊A.数据分⽚(Shards)
⽤来保存数据,保证数据的⾼可⽤性和⼀致性。可以是⼀个单独的mongod实例,也可以是⼀个副本集。
在⽣产环境下Shard⼀般是⼀个Replica Set,以防⽌该数据⽚的单点故障。所有Shard中有⼀个PrimaryShard,⾥⾯包含未进⾏划分的数据集合:
B.查询路由(Query Routers)
路由就是mongos的实例,客户端直接连接mongos,由mongos把读写请求路由到指定的Shard上去。⼀个Sharding集群,可以有⼀个mongos,也可以有多mongos以减轻客户端请求的压⼒。C.配置服务器(Config servers)
保存集群的元数据(metadata),包含各个Shard的路由规则。Sharding分⽚技术(混合模式)⾼可⽤⽅案的⼤体架构图:
Sharding分⽚技术(混合模式)⾼可⽤⽅案架构下向mongodb写数据的流程图:
Sharding分⽚技术(混合模式)⾼可⽤⽅案架构下向mongodb读数据的流程图:
以下所有配置在3台服务器上都要进⾏配置
2. 下载安装
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-amazon-3.6.2.tgztar -xzvf mongodb-linux-x86_64-amazon-3.6.2.tgz -C /usr/local/
所有版本⼆进制⽂件,⾃⾏下载
https://www.mongodb.org/dl/win32/x86_64-2008plus-ssl?_ga=2.87139544.1567998244.1517190032-1153843332.1517190032&_gac=1.204211492.151721
改名
cd /usr/local/
mv mongodb-linux-x86_64-amazon-3.6.2 mongodb
分别在每台机器建⽴conf、mongos、config、shard1、shard2、shard3六个⽬录,因为mongos不存储数据,只需要建⽴⽇志⽂件⽬录即可。
mkdir -p /usr/local/mongodb/conf \\mkdir -p /usr/local/mongodb/mongos/log \\mkdir -p /usr/local/mongodb/config/data \\mkdir -p /usr/local/mongodb/config/log \\mkdir -p /usr/local/mongodb/shard1/data \\mkdir -p /usr/local/mongodb/shard1/log \\mkdir -p /usr/local/mongodb/shard2/data \\mkdir -p /usr/local/mongodb/shard2/log \\mkdir -p /usr/local/mongodb/shard3/data \\mkdir -p /usr/local/mongodb/shard3/log
配置环境变量
vi /etc/profile
# MongoDB 环境变量内容
export MONGODB_HOME=/usr/local/mongodbexport PATH=$MONGODB_HOME/bin:$PATH
使⽴即⽣效
source /etc/profile
3. 配置config server服务器
mongodb3.4以后要求配置服务器也创建副本集,不然集群搭建不成功。添加配置⽂件
vi /usr/local/mongodb/conf/config.conf## 配置⽂件内容
pidfilepath = /usr/local/mongodb/config/log/configsrv.piddbpath = /usr/local/mongodb/config/data
logpath = /usr/local/mongodb/config/log/congigsrv.loglogappend = truebind_ip = 0.0.0.0port = 21000fork = true
#declare this is a config db of a cluster;configsvr = true#副本集名称replSet = configs#设置最⼤连接数
启动三台服务器的config server
mongod -f /usr/local/mongodb/conf/config.conf
登录任意⼀台配置服务器,初始化配置副本集
连接 MongoDB
mongo --port 21000
config 变量
config = { _id : \"configs\ members : [
{_id : 0, host : \"192.168.252.121:21000\" }, {_id : 1, host : \"192.168.252.122:21000\" }, {_id : 2, host : \"192.168.252.123:21000\" } ]}
初始化副本集
rs.initiate(config)
其中,\"_id\" : \"configs\"应与配置⽂件中配置的 replicaction.replSetName ⼀致,\"members\" 中的 \"host\" 为三个节点的 ip 和 port响应内容如下
> config = {... _id : \"configs\... members : [
... {_id : 0, host : \"192.168.252.121:21000\" },... {_id : 1, host : \"192.168.252.122:21000\" },... {_id : 2, host : \"192.168.252.123:21000\" }... ]... }{
\"_id\" : \"configs\ \"members\" : [ {
\"_id\" : 0,
\"host\" : \"192.168.252.121:21000\" }, {
\"_id\" : 1,
\"host\" : \"192.168.252.122:21000\" },
此时会发现终端上的输出已经有了变化。
//从单个⼀个>//变成了
configs:SECONDARY>
查询状态
configs:SECONDARY> rs.status()
4. 配置分⽚副本集
第⼀分⽚副本集
配置⽂件
vi /usr/local/mongodb/conf/shard1.conf#配置⽂件内容
#——————————————–
pidfilepath = /usr/local/mongodb/shard1/log/shard1.piddbpath = /usr/local/mongodb/shard1/data
logpath = /usr/local/mongodb/shard1/log/shard1.loglogappend = truebind_ip = 0.0.0.0port = 27001fork = true#副本集名称replSet = shard1
#declare this is a shard db of a cluster;shardsvr = true
启动三台服务器的shard1 server
mongod -f /usr/local/mongodb/conf/shard1.conf
登陆任意⼀台服务器,初始化副本集(除了192.168.252.123)连接 MongoDB
mongo --port 27001
使⽤admin数据库
use admin
定义副本集配置
config = { _id : \"shard1\ members : [
{_id : 0, host : \"192.168.252.121:27001\" }, {_id : 1, host : \"192.168.252.122:27001\" },
{_id : 2, host : \"192.168.252.123:27001\" , arbiterOnly: true } ] }
初始化副本集配置
rs.initiate(config)
响应内容如下
> use admin
switched to db admin> config = {... _id : \"shard1\... members : [
... {_id : 0, host : \"192.168.252.121:27001\" },... {_id : 1, host : \"192.168.252.122:27001\" },
... {_id : 2, host : \"192.168.252.123:27001\" , arbiterOnly: true }... ]... }{
\"_id\" : \"shard1\ \"members\" : [ {
\"_id\" : 0,
\"host\" : \"192.168.252.121:27001\" }, {
\"_id\" : 1,
此时会发现终端上的输出已经有了变化。
//从单个⼀个>//变成了
shard1:SECONDARY>
查询状态
shard1:SECONDARY> rs.status()
第⼆分⽚副本集
配置⽂件
vi /usr/local/mongodb/conf/shard2.conf#配置⽂件内容
#——————————————–
pidfilepath = /usr/local/mongodb/shard2/log/shard2.piddbpath = /usr/local/mongodb/shard2/data
logpath = /usr/local/mongodb/shard2/log/shard2.loglogappend = truebind_ip = 0.0.0.0port = 27002fork = true#副本集名称replSet=shard2
#declare this is a shard db of a cluster;shardsvr = true
启动三台服务器的shard2 server
mongod -f /usr/local/mongodb/conf/shard2.conf
连接 MongoDB
mongo --port 27002
使⽤admin数据库
use admin
定义副本集配置
config = { _id : \"shard2\ members : [
{_id : 0, host : \"192.168.252.121:27002\" , arbiterOnly: true }, {_id : 1, host : \"192.168.252.122:27002\" }, {_id : 2, host : \"192.168.252.123:27002\" } ] }
初始化副本集配置
rs.initiate(config)
响应内容如下
> use admin
switched to db admin> config = {... _id : \"shard2\... members : [
... {_id : 0, host : \"192.168.252.121:27002\" , arbiterOnly: true },... {_id : 1, host : \"192.168.252.122:27002\" },... {_id : 2, host : \"192.168.252.123:27002\" }... ]... }{
\"_id\" : \"shard2\ \"members\" : [ {
\"_id\" : 0,
\"host\" : \"192.168.252.121:27002\ \"arbiterOnly\" : true }, {
第三分⽚副本集
vi /usr/local/mongodb/conf/shard3.conf#配置⽂件内容
#——————————————–
pidfilepath = /usr/local/mongodb/shard3/log/shard3.piddbpath = /usr/local/mongodb/shard3/data
logpath = /usr/local/mongodb/shard3/log/shard3.loglogappend = truebind_ip = 0.0.0.0port = 27003fork = true#副本集名称replSet=shard3
#declare this is a shard db of a cluster;shardsvr = true
启动三台服务器的shard3 server
mongod -f /usr/local/mongodb/conf/shard3.conf
登陆任意⼀台服务器,初始化副本集(除了192.168.252.121)
mongo --port 27003
使⽤admin数据库
use admin
定义副本集配置
config = { _id : \"shard3\ members : [
{_id : 0, host : \"192.168.252.121:27003\" },
{_id : 1, host : \"192.168.252.122:27003\" , arbiterOnly: true}, {_id : 2, host : \"192.168.252.123:27003\" } ] }
初始化副本集配置
rs.initiate(config)
响应内容如下
> use admin
switched to db admin> config = {... _id : \"shard3\... members : [
... {_id : 0, host : \"192.168.252.121:27003\" },
... {_id : 1, host : \"192.168.252.122:27003\" , arbiterOnly: true},... {_id : 2, host : \"192.168.252.123:27003\" }... ]... }{
\"_id\" : \"shard3\ \"members\" : [ {
\"_id\" : 0,
\"host\" : \"192.168.252.121:27003\" }, {
\"_id\" : 1,
5. 配置mongos路由服务器
(三台机器)先启动配置服务器和分⽚服务器,后启动路由实例启动路由实例:
vi /usr/local/mongodb/conf/mongos.conf#内容
pidfilepath = /usr/local/mongodb/mongos/log/mongos.pidlogpath = /usr/local/mongodb/mongos/log/mongos.loglogappend = truebind_ip = 0.0.0.0port = 20000fork = true
#监听的配置服务器,只能有1个或者3个 configs为配置服务器的副本集名字
configdb = configs/192.168.252.121:21000,192.168.252.122:21000,192.168.252.123:21000#设置最⼤连接数maxConns = 20000
启动三台服务器的mongos server
mongos -f /usr/local/mongodb/conf/mongos.conf
串联路由服务器
⽬前搭建了mongodb配置服务器、路由服务器,各个分⽚服务器,不过应⽤程序连接到mongos路由服务器并不能使⽤分⽚机制,还需要在程序⾥设置分⽚配置,让分⽚⽣效。登陆任意⼀台mongos
mongo --port 20000
使⽤admin数据库
use admin
串联路由服务器与分配副本集
sh.addShard(\"shard1/192.168.252.121:27001,192.168.252.122:27001,192.168.252.123:27001\");sh.addShard(\"shard2/192.168.252.121:27002,192.168.252.122:27002,192.168.252.123:27002\");sh.addShard(\"shard3/192.168.252.121:27003,192.168.252.122:27003,192.168.252.123:27003\");
查看集群状态
sh.status()
响应内容如下
mongos> sh.status()--- Sharding Status --- sharding version: { \"_id\" : 1,
\"minCompatibleVersion\" : 5, \"currentVersion\" : 6,
\"clusterId\" : ObjectId(\"5a713a37d56e076f3eb47acf\") } shards:
{ \"_id\" : \"shard1\ { \"_id\" : \"shard2\ { \"_id\" : \"shard3\ active mongoses: \"3.6.2\" : 3 autosplit:
Currently enabled: yes balancer:
Currently enabled: yes Currently running: no
启⽤集合分⽚⽣效
⽬前配置服务、路由服务、分⽚服务、副本集服务都已经串联起来了,但我们的⽬的是希望插⼊数据,数据能够⾃动分⽚。连接在mongos上,准备让指定的数据库、指定的集合分⽚⽣效。登陆任意⼀台mongos
mongo --port 20000
使⽤admin数据库
use admin
指定testdb分⽚⽣效,如下图:
db.runCommand( { enablesharding :\"testdb\或
mongos> sh.enablesharding(\"testdb\")
指定数据库⾥需要分⽚的集合和⽚键,哈希name分⽚,如下图:
db.runCommand( { shardcollection : \"testdb.table1\或
mongos> sh.shardcollection(\"testdb.table1\
通过命令查看mongodb路由服务器上的shards集合会有数据展⽰,如下图:
通过命令查看mongodb路由服务器上的chunks集合会有数据展⽰,如下图:
我们设置testdb的 table1 表需要分⽚,根据 id 或name⾃动分⽚到 shard1 ,shard2,shard3 上⾯去。要这样设置是因为不是所有mongodb 的数据库
和表 都需要分⽚!测试分⽚配置结果连接 MongoDB 路由服务
mongo 127.0.0.1:20000
切换到 testdb 数据库
use testdb;
插⼊测试数据
for(i=1;i<=100000;i++){db.table1.insert({\"id\":i,\"name\":\"penglei\
总条数
db.table1.aggregate([{$group : {_id : \"$name\
查看分⽚情况如下
shard1: \"count\": 33755shard2: \"count\": 33143,shard3: \"count\": 33102结论数据基本均匀
db.table1.stats();
mongos> db.table1.stats();{
\"sharded\": true, \"capped\": false, \"ns\": \"testdb.table1\ \"count\": 100000, \"size\": 5200000, \"storageSize\": 1519616, \"totalIndexSize\": 3530752, \"indexSizes\": { \"_id_\": 892928, \"id_hashed\": 2637824 },
\"avgObjSize\": 52, \"nindexes\": 2, \"nchunks\": 6, \"shards\": { \"shard1\": {
\"ns\": \"testdb.table1\
分组查看总数量是:100000
mongos> db.table1.aggregate([{$group : {_id : \"$name\{ \"_id\" : \"penglei\mongos>
6. 后期运维
参考
⼿把⼿教你 MongoDB 的安装与详细使⽤(⼀)⼿把⼿教你 MongoDB 的安装与详细使⽤(⼆)创建索引
db.table1.createIndex({\"name\":1})db.table1.getIndexes()
7. 启动说明
mongodb的启动顺序是,先启动配置服务器,在启动分⽚,最后启动mongos.
mongod -f /usr/local/mongodb/conf/config.confmongod -f /usr/local/mongodb/conf/shard1.confmongod -f /usr/local/mongodb/conf/shard2.confmongod -f /usr/local/mongodb/conf/shard3.confmongod -f /usr/local/mongodb/conf/mongos.conf
启动报错
about to fork child process, waiting until server is ready for connections.forked process: 1303
child process started successfully, parent exiting
[root@node1 ~]# mongod -f /usr/local/mongodb/conf/shard1.confabout to fork child process, waiting until server is ready for connections.forked process: 1384
删除 mongod.lock
cd /usr/local/mongodb/shard1/datarm -rf mongod.lock
关闭
#debian、ubuntu系统下:apt-get install psmisc#centos或、rhel系统下:yum install psmisc
关闭时,直接killall杀掉所有进程
killall mongodkillall mongos
参考:Runoob 教程:MongoDB 官⽹地址:MongoDB 官⽅英⽂⽂档:MongoDB 各平台下载地址:MongoDB 安装
mongodb⾼可⽤具体配置参考:
Mongodb主从复制 及 副本集+分⽚集群梳理:搭建 MongoDB分⽚(sharding) / 分区 / 集群环境:
因篇幅问题不能全部显示,请点此查看更多更全内容