笔记14:MongoDB分片集群Shard Cluster搭建

Posted Lossdate

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了笔记14:MongoDB分片集群Shard Cluster搭建相关的知识,希望对你有一定的参考价值。

一、简介

分片(sharding)是MongoDB用来将大型集合水平分割到不同服务器(或者复制集)上所采用的方法。
不需要功能强大的大型计算机就可以存储更多的数据,处理更大的负载。

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

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

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

  1. 解压并重命名MongoDB

    tar -zxvf mongodb-linux-x86_64-rhel70-4.4.5.tgz
    mv mongodb-linux-x86_64-rhel70-4.4.5 shard_cluster
    
  2. 进入并创建目录

    cd shard_cluster/
    mkdir config
    
  3. 进入config创建log目录

    cd config
    mkdir config1 logs
    
  4. 创建配置服务器配置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
    
  5. 启动

    cd ../
    ./bin/mongod -f config/config-17017.conf
    
  6. 配置集群其它两个节点

    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
    
  7. 启动配置服务

    cd ../
    ./bin/mongod -f config/config-17018.conf
    ./bin/mongod -f config/config-17019.conf
    
  8. 进入任意节点的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()
    

三、配置shard1集群

shard1集群搭建37017到37019

  1. 新建目录

    cd shard_cluster/
    mkdir shard
    
    cd shard
    mkdir shard1 shard2
    
    cd shard1
    mkdir shard1-37017 shard1-37018 shard1-37019
    
  2. 创建配置文件

    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
    

  3. 启动

    ./bin/mongod -f shard/shard1/shard1-37017.conf
    ./bin/mongod -f shard/shard1/shard1-37018.conf
    ./bin/mongod -f shard/shard1/shard1-37019.conf
    
  4. 进行集群配置

    ./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
    
  2. 启动

    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
    
  3. 进行集群配置

    ./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
    
  2. 进入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
    
  3. 启动路由

    cd ../
    ./bin/mongos -f route/route-27017.conf
    
  4. 进入mongos

    ./bin/mongo --port 27017
    
  5. 查看分片节点状态

    sh.status()
    

  6. 向路由中添加分片集群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()
    

  7. 开启数据库和集合分片(指定片键)
    为数据库开启分片功能

    sh.enableSharding("lossdate_test") 
    

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

    sh.shardCollection("lossdate_test.lossdate_test_datas","name":"hashed")
    
  8. 向集合中插入数据测试

    use lossdate_test; 
    

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

    show dbs
    


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

    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:

shard2:

七、安全认证

  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"]
    )
    
  2. 关闭所有的 配置节点 分片节点 和 路由节点

    #安装psmisc 
    yum install psmisc 
    命令 快速关闭多个进程 
    killall mongod
    killall mongo
    killall mongos
    
  3. 生成 密钥文件 并 修改权限

    cd /usr/local/mongodb/shard_cluster/
    mkdir data/mongodb -p
    openssl rand -base64 756 > data/mongodb/testKeyFile.file
    chmod 600 data/mongodb/testKeyFile.file
    
  4. 配置节点集群和分片节点集群,开启安全认证和指定密钥文件
    在分别在config、shard1和shard2集群的配置文件中加上:

    auth=true 
    keyFile=data/mongodb/testKeyFile.file
    

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

    vi config/config-17017.conf
    ...
    

    vi shard/shard1/shard1-37017.conf
    ...
    
    vi shard/shard2/shard2-47017.conf 
    ...
    
  5. 在路由配置文件中配置密钥文件

    vi route/route-27017.conf
    
    keyFile=data/mongodb/testKeyFile.file
    

  6. 启动所有的 配置节点、分片节点 和 路由节点 使用路由进行权限验证
    编写一个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
    


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

    chmod +x startup.sh
    

    最后执行脚本

    ./startup.sh
    
  7. 验证
    进入路由节点

    ./bin/mongo --port 27017
    

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

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

    再执行show dbs,生效

    退出,继续验证普通用户

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

  8. Spring boot 连接安全认证的分片集群
    配置:

    spring.data.mongodb.username=账号 
    spring.data.mongodb.password=密码 
    #spring.data.mongodb.uri=mongodb://账号:密码@IP:端口/数据库名
    


    这里账号不要用root,容易出现授权失败

以上是关于笔记14:MongoDB分片集群Shard Cluster搭建的主要内容,如果未能解决你的问题,请参考以下文章

Elasticsearch学习笔记核心概念和分片shard机制

MongoDB 分片集群

MongoDB for OPS 03:分片 shard 集群

MongoDB分片集群搭建

搭建mongodb集群(副本集+分片)

Mongodb4.4.1分片集群搭建