MongoDB Cluster 之 sharding module

一 工作原理

sharding 将数据水平切分到不同的物理节点,通过多台机器分配数据以大数据集和高吞吐量的操作,把计算量分摊到多个机器上同时运算,通过分布式来提高速度。这是MongoDB官方推荐的一种集群模式。

sharding module可以动态扩容、自动平衡数据,具有透明的使用接口。可以实现实例平滑升级,可以动态增加删除节点,响应数据快速增长。可以自动在节点间平衡数据量,避免负载集中在少数节点,而在这期间不影响数据库读写访问。对客户端,可以使用完全相同的驱动,大部分功能可复用,基本不需要更改任何代码。

一个功能完备的sharding module主要由shard,config,OS三个角色组成。其各自的职能如下:

shard:存储数据。

config存储元数据。

os:对客户端透明,提供客户端连接。

二 名词解释

Replica Sets :副本集合

Sharding :分片集合

Primary :主节点

Secondary :副本节点

Arbiter :仲裁调度

Elected :选主

Chunk :数据块

Range :数域,是一个左闭右开的区间

Balance :动态平衡

Split :动态扩容

Shard key :聚簇索引

HeartBeat :活性检测

三 相关逻辑图

  1   Sharding Cluster 

 

2  Elected Process

 

3   Replica Set

 

4  A Business Scenario

 

 

四 安装配置步骤及说明

Step 1 确认服务器平台信息【本次实验服务器平台信息为:Intel i5M480CPU,6GBDDR3RAM,CentOS7-1104版本】;

Step 2 下载 mongodb-linux-x86_64 源码包并作完整性校验【本次实验版本为 mongodb-linux-x86_64-4.0.6.tgz 】;

Step 3 规划服务器进程、目录、端口安排,并提供规划清单【本次实验规划清单如下所示:】

服务器

主机 IP

服务

端口

目录

服务器 一

192.168.0.121

Mongod s 1-1

27020

/data/mongo/s1_1

Mongod s 2-1

27021

/data/mongo/s2_1

Mongond c 1

27018

/data/mongo/config

Mongod os 1

27017

 

服务器 二

192.168.0.185

Mongod s1-2

27020

/data/mongo/s1_2

Mongod s2-2

27021

/data/mongo/s2_1

Mongod c 2

27018

/data/mongo/config

Mongod os 2

27017

 

服务器 三

192.168.0.192

Mongod s1-3

27020

/data/mongo/s1_3

Mongod s2-3

27021

/data/mongo/s2_3

Mongod c 3

27018

/data/mongo/config

Mongod os 3

27017

 

 

Step 4 检查并校准主机时间

date -s "20190224 16:12:00" &&hwclock --systohc

Step 5 在物理服务器上创建已规划的目录,如

mkdir -p /data/mongo/{s1_1,s2_1,config}

Step 6 上传经过完整性校验的mongodb-linux-x86_64 源码包至 /home/loginuser/temprory/

Step 7 将所上传的mongodb-linux-x86_64 源码包解压到 /opt/ ,并将加压后的目录以“ software_architecture_version_user_current-time ” 的形式重命名,如:

tar -xzvPf mongodb-linux-x86_64-4.0.6.tgz -C /opt/mongodb_linux64_406_loginuser_20190224/

Step 8 在三台服务器上分别创建

在三台服务器上分别创建

在三台服务器上分别创建

在三台服务器上分别运行

     Step 9 配置节点:

1 示例为 Mongod s 1-1 节点:

systemLog:  
    quiet: false  
    path: /data/mongo/s1_1/logs/mongod.log  
    logAppend: false  
    destination: file  
processManagement:  
    fork: true  
    pidFilePath: /data/mongo/s1_1/mongod.pid  
net:  
    bindIp: 127.0.0.1  
    port: 27020  
    maxIncomingConnections: 65536  
    wireObjectCheck: true  
    ipv6: false   
storage:  
    dbPath: /data/mongo/s1_1/db  
    indexBuildRetry: true  
    journal:  
        enabled: true  
    directoryPerDB: false  
    engine: mmapv1  
    syncPeriodSecs: 60   
    mmapv1:  
        quota:  
            enforced: false  
            maxFilesPerDB: 8  
        smallFiles: true      
        journal:  
            commitIntervalMs: 100  
operationProfiling:  
    slowOpThresholdMs: 100  
    mode: off  
sharding:  
    clusterRole: shardsvr  
    archiveMovedChunks: false

2 示例为 Mongond c 1 :

systemLog:  
    quiet: false  
    path:/data/mongo/config/logs/mongod.log  
    logAppend: false  
    destination: file  
processManagement:  
    fork: true  
    pidFilePath:/data/mongo/config/mongod.pid  
net:  
    bindIp: 127.0.0.1  
    port: 27018  
    maxIncomingConnections: 65536  
    wireObjectCheck: true  
    ipv6: false   
storage:  
    dbPath:/data/mongo/config/db  
    indexBuildRetry: true  
    journal:  
        enabled: true  
    directoryPerDB: false  
    engine: mmapv1  
    syncPeriodSecs: 60   
    mmapv1:  
        quota:  
            enforced: false  
            maxFilesPerDB: 8  
        smallFiles: true      
        journal:  
            commitIntervalMs: 100  
operationProfiling:  
    slowOpThresholdMs: 100  
    mode: off  
sharding:  
    clusterRole: configsvr

3 示例为 Mongod os 1 :

systemLog:  
    quiet: false  
    path: /data/mongo/logs/mongod.log  
    logAppend: false  
    destination: file  
processManagement:  
    fork: true  
    pidFilePath: /data/mongo/mongod.pid  
net:  
    bindIp: 127.0.0.1  
    port: 27017  
    maxIncomingConnections: 65536  
    wireObjectCheck: true  
    ipv6: false   
sharding:  
    configDB: 127.0.0.1:27018 
    chunkSize: 64

  Step 10 配置relica set ,以配置shard1用到的RS为例:

在服务器一上:

mongod --replSet s1 --port 27020 --dbpath=/data/mongo/s1_1/db --logpath=/data/mongo/s1_1/log/mongo.log --logappend --fork
 
mongod --replSet s1 --port 27020 --dbpath=/data/mongo/s1_2/db --logpath=/data/mongo/s1_2/log/mongo.log --logappend --fork
 
mongod --replSet s1 --port 27020 --dbpath=/data/mongo/s1_3/db --logpath=/data/mongo/s1_3/log/mongo.log --logappend --fork

  连接三个节点的任一个初始化RS: 

>use admin
>config = {_id:'s1',members:[{_id:0,host:'fuwuqiyi:27020',priority:1},{_id:1,host:'fuwuqier:27020'},{_id:2,host:'fuwuqisan:27020'}]}
>rs.initiate(config)
>rs.status()

  另外对RS的所有节点都执行如下命令确保所有节点都能分担读取的压力

>db.getMongo().setSlaveOk();

Step 11 配置 config服务,以Mongond c 1为例:

mongod  -fork --configsvr --dbpath /data/mongo/config/db --port 27018 --logpath /data/mongo/config/log/mongo.log --fork

Step 12 配置 os 服务,以Mongond os 1为例:

mongos -fork --logpath /data/mongo/route/log/mongo.log --configdb fuwuqiyi:27018,fuwuqier:27018,fuwuqisan:27018 --port 27017

Step 13 配置Shard Cluster:

use admin
db.runCommand({addShard:"shard1/fuwuqiyi:27020,fuwuqier:27020,fuwuqisan:27020"})
db.runCommand({addShard:"shard2/fuwuqiyi:27021,fuwuqier:27021,fuwuqisan:27021"})
db.printShardingStatus()

Step 14 激活数据库及集合的分片:

db.runCommand({enablesharding:"testdb"})
db.runCommand({shardcollection:"testdb.collection_test",key:{_id:1}})

Step 15 添加 OS 用户:

use admin
db.addUser("<user>","<password>")
db.addUser("<user>","<password>",true)

Step 16 生成keyfile:

openssl rand -base64 753 >keyfile

Step 17 指定 keyfile 重启服务,以启动 RS1 为例:

mongod --replSet s1 --port 27020 --dbpath=/data/mongo/s1_1/db --logpath=/data/mongo/s1_1/log/mongo.log --logappend --fork --keyFile  /data/mongo/s1_1/keyfile
 
mongod --replSet s1 --port 27020 --dbpath=/data/mongo/s1_2/db --logpath=/data/mongo/s1_2/log/mongo.log --logappend --fork --keyFile  /data/mongo/s1_2/keyfile
 
mongod --replSet s1 --port 27020 --dbpath=/data/mongo/s1_3/db --logpath=/data/mongo/s1_3/log/mongo.log --logappend --fork --keyFile  /data/mongo/s1_3/keyfile
 
mongod  -fork --configsvr --dbpath /data/mongo/config/db --port 27018 --logpath /data/mongo/config/log/mongo.log --fork --keyFile  /data/mongo/config/keyfile
 
mongos -fork --logpath /data/mongo/route/log/mongo.log --configdb ServerA:27018,ServerB:27018,ServerC:27018 --port 27017 --keyFile  /data/mongo/route/keyfile

 

五 应用建议

  在真实业务场景中应用时,建议按需配置Replica Set 的Primary节点、Secondary节点、Arbiter节点、Election规则、OS路由规则和Collection配置。

 

附录:

本次安装配置清单:

序号

项目

规格

1

宿主机

DELL N4010

2

宿主平台

ArchLinux 201901

3

虚拟化组件

Virtual Box 5.2

4

宿主机CPU

Inter i5 M480,2.67G

5

宿主机RAM

DDR3,6GB

6

服务器平台

CentOS7,64,1104

7

MongoDB版本

mongodb-linux-x86_64-4.0.6.tgz