zoukankan      html  css  js  c++  java
  • mongodb 3.4 学习 (四)分片

    https://www.linode.com/docs/databases/mongodb/build-database-clusters-with-mongodb

    由三部分组成
    shard: 每个shard包括一个所有shard数据的子集. 每个shard能够部署成replica set
    mongos: 做为查询路由, 提供clientt与sharded cluster的接口
    config servers: 存储群集的metadata和配置,必须部署为replica set
    
    
    # 生产环境部署
    kvm-70-102 10.0.70.102 # mongos
    kvm-70-103 10.0.70.103 # config
    kvm-70-102 10.0.70.104 # shard1
    kvm-70-103 10.0.70.105 # shard2
    

    config

    # 建立数据目录
    mkdir -p /opt/mongo_{27021,27022,27023}
    
    # 配置文件
    cat > /etc/mongod_27021.conf << EOF
    systemLog:
      destination: file
      logAppend: true
      path: /var/log/mongodb/mongod_27021.log
    
    storage:
      dbPath: /opt/mongo_27021
      journal:
        enabled: true
    
    processManagement:
      fork: true
      pidFilePath: /var/run/mongodb/mongod_27021.pid
    
    net:
      port: 27021
    
    security:
      keyFile: /etc/mongodb_product_key
    
    replication:
       oplogSizeMB: 2048
       replSetName: config
    
    sharding:
      clusterRole: configsvr
    EOF
    
    # 配置文件
    cat > /etc/mongod_27022.conf << EOF
    systemLog:
      destination: file
      logAppend: true
      path: /var/log/mongodb/mongod_27022.log
    
    storage:
      dbPath: /opt/mongo_27022
      journal:
        enabled: true
    
    processManagement:
      fork: true
      pidFilePath: /var/run/mongodb/mongod_27022.pid
    
    net:
      port: 27022
    
    security:
      keyFile: /etc/mongodb_product_key
    
    replication:
       oplogSizeMB: 2048
       replSetName: config
    
    sharding:
      clusterRole: configsvr
    EOF
    
    # 配置文件
    cat > /etc/mongod_27023.conf << EOF
    systemLog:
      destination: file
      logAppend: true
      path: /var/log/mongodb/mongod_27023.log
    
    storage:
      dbPath: /opt/mongo_27023
      journal:
        enabled: true
    
    processManagement:
      fork: true
      pidFilePath: /var/run/mongodb/mongod_27023.pid
    
    net:
      port: 27023
    
    security:
      keyFile: /etc/mongodb_product_key
    
    replication:
       oplogSizeMB: 2048
       replSetName: config
    
    sharding:
      clusterRole: configsvr
    EOF
    
    # 启动复制集
    mongod --config /etc/mongod_27021.conf
    mongod --config /etc/mongod_27022.conf
    mongod --config /etc/mongod_27023.conf
    
    # 配置config
    mongo --port 27021
    
    rs.initiate(
      {
        _id: 'config',
        configsvr: true,
        members: [
          { _id : 0, host : '10.0.70.103:27021' },
          { _id : 1, host : '10.0.70.103:27022' },
          { _id : 2, host : '10.0.70.103:27023' }
        ]
      }
    )
    { "ok" : 1 }
    

    shard1

    # 建立数据目录
    mkdir -p /opt/mongo_{27021,27022,27023}
    
    # 配置文件
    cat > /etc/mongod_27021.conf << EOF
    systemLog:
      destination: file
      logAppend: true
      path: /var/log/mongodb/mongod_27021.log
    
    storage:
      dbPath: /opt/mongo_27021
      journal:
        enabled: true
    
    processManagement:
      fork: true
      pidFilePath: /var/run/mongodb/mongod_27021.pid
    
    net:
      port: 27021
    
    security:
      keyFile: /etc/mongodb_product_key
    
    replication:
       oplogSizeMB: 2048
       replSetName: shard1
    
    sharding:
      clusterRole:  shardsvr
    EOF
    
    # 配置文件
    cat > /etc/mongod_27022.conf << EOF
    systemLog:
      destination: file
      logAppend: true
      path: /var/log/mongodb/mongod_27022.log
    
    storage:
      dbPath: /opt/mongo_27022
      journal:
        enabled: true
    
    processManagement:
      fork: true
      pidFilePath: /var/run/mongodb/mongod_27022.pid
    
    net:
      port: 27022
    
    security:
      keyFile: /etc/mongodb_product_key
    
    replication:
       oplogSizeMB: 2048
       replSetName: shard1
    
    sharding:
      clusterRole: shardsvr
    EOF
    
    # 配置文件
    cat > /etc/mongod_27023.conf << EOF
    systemLog:
      destination: file
      logAppend: true
      path: /var/log/mongodb/mongod_27023.log
    
    storage:
      dbPath: /opt/mongo_27023
      journal:
        enabled: true
    
    processManagement:
      fork: true
      pidFilePath: /var/run/mongodb/mongod_27023.pid
    
    net:
      port: 27023
    
    security:
      keyFile: /etc/mongodb_product_key
    
    replication:
       oplogSizeMB: 2048
       replSetName: shard1
    
    sharding:
      clusterRole: shardsvr
    EOF
    
    # 启动复制集
    mongod --config /etc/mongod_27021.conf
    mongod --config /etc/mongod_27022.conf
    mongod --config /etc/mongod_27023.conf
    
    # 配置config
    mongo --port 27021
    
    rs.initiate(
      {
        _id: 'shard1',
        members: [
          { _id : 0, host : '10.0.70.104:27021' },
          { _id : 1, host : '10.0.70.104:27022' },
          { _id : 2, host : '10.0.70.104:27023' }
        ]
      }
    )
    { "ok" : 1 }
    

    shard2

    # 建立数据目录
    mkdir -p /opt/mongo_{27021,27022,27023}
    
    # 配置文件
    cat > /etc/mongod_27021.conf << EOF
    systemLog:
      destination: file
      logAppend: true
      path: /var/log/mongodb/mongod_27021.log
    
    storage:
      dbPath: /opt/mongo_27021
      journal:
        enabled: true
    
    processManagement:
      fork: true
      pidFilePath: /var/run/mongodb/mongod_27021.pid
    
    net:
      port: 27021
    
    security:
      keyFile: /etc/mongodb_product_key
    
    replication:
       oplogSizeMB: 2048
       replSetName: shard2
    
    sharding:
      clusterRole:  shardsvr
    EOF
    
    # 配置文件
    cat > /etc/mongod_27022.conf << EOF
    systemLog:
      destination: file
      logAppend: true
      path: /var/log/mongodb/mongod_27022.log
    
    storage:
      dbPath: /opt/mongo_27022
      journal:
        enabled: true
    
    processManagement:
      fork: true
      pidFilePath: /var/run/mongodb/mongod_27022.pid
    
    net:
      port: 27022
    
    security:
      keyFile: /etc/mongodb_product_key
    
    replication:
       oplogSizeMB: 2048
       replSetName: shard2
    
    sharding:
      clusterRole: shardsvr
    EOF
    
    # 配置文件
    cat > /etc/mongod_27023.conf << EOF
    systemLog:
      destination: file
      logAppend: true
      path: /var/log/mongodb/mongod_27023.log
    
    storage:
      dbPath: /opt/mongo_27023
      journal:
        enabled: true
    
    processManagement:
      fork: true
      pidFilePath: /var/run/mongodb/mongod_27023.pid
    
    net:
      port: 27023
    
    security:
      keyFile: /etc/mongodb_product_key
    
    replication:
       oplogSizeMB: 2048
       replSetName: shard2
    
    sharding:
      clusterRole: shardsvr
    EOF
    
    # 启动复制集
    mongod --config /etc/mongod_27021.conf
    mongod --config /etc/mongod_27022.conf
    mongod --config /etc/mongod_27023.conf
    
    # 配置config
    mongo --port 27021
    
    rs.initiate(
      {
        _id: 'shard2',
        members: [
          { _id : 0, host : '10.0.70.105:27021' },
          { _id : 1, host : '10.0.70.105:27022' },
          { _id : 2, host : '10.0.70.105:27023' }
        ]
      }
    )
    { "ok" : 1 }
    

    mongos

    # 配置文件
    cat > /etc/mongod_27021.conf << EOF
    systemLog:
      destination: file
      logAppend: true
      path: /var/log/mongodb/mongod_27021.log
    
    processManagement:
      fork: true
      pidFilePath: /var/run/mongodb/mongod_27021.pid
    
    net:
      port: 27021
    
    security:
      keyFile: /etc/mongodb_product_key
    
    sharding:
      configDB: config/10.0.70.103:27021,10.0.70.103:27022,10.0.70.103:27023
    EOF
    
    # 启动mongos
    mongos --config /etc/mongod_27021.conf
    
    # 配置
    mongo --port 27021
    
    # 添加分片
    sh.addShard('shard1/10.0.70.104:27021')
    sh.addShard('shard1/10.0.70.104:27022')
    sh.addShard('shard1/10.0.70.104:27023')
    
    sh.addShard('shard2/10.0.70.105:27021')
    sh.addShard('shard2/10.0.70.105:27022')
    sh.addShard('shard2/10.0.70.105:27023')
    
    # 建立超级用户
    use admin
    
    db.createUser(
      {
        user: 'admin',
        pwd: '@admin',
        roles: [ { role: 'root', db: 'admin' } ]
      }
    );
    
    
    # 认证登录
    db.auth('admin', '@admin')
    
    # app数据库demo表插入100000条数据
    use app
    for (var i = 1; i < 100000; i++) db.demo.insert({id: i, name: 'ken'})
    WriteResult({ "nInserted" : 1 })
    
    # 查看分片状态
    sh.status()
    --- Sharding Status --- 
      sharding version: {
        "_id" : 1,
        "minCompatibleVersion" : 5,
        "currentVersion" : 6,
        "clusterId" : ObjectId("59261bca37ceff575b36ef09")
    }
      shards:
        {  "_id" : "shard1",  "host" : "shard1/10.0.70.104:27021,10.0.70.104:27022,10.0.70.104:27023",  "state" : 1 }
        {  "_id" : "shard2",  "host" : "shard2/10.0.70.105:27021,10.0.70.105:27022,10.0.70.105:27023",  "state" : 1 }
      active mongoses:
        "3.4.4" : 1
     autosplit:
        Currently enabled: yes
      balancer:
        Currently enabled:  yes
        Currently running:  no
            Balancer lock taken at Thu May 25 2017 07:48:42 GMT+0800 (CST) by ConfigServer:Balancer
        Failed balancer rounds in last 5 attempts:  0
        Migration Results for the last 24 hours: 
            No recent migrations
      databases:
        {  "_id" : "app",  "primary" : "shard1",  "partitioned" : false }
    
    # 结果显示没有分区,记录插在shard1服务器
    
    # 配置分片
    # 允许分片的数据库
    sh.enableSharding('app')
    
    # 为用做shard key的字段建立索引,实际中可以用uuid字段
    use app
    db.demo.createIndex({id: 1})
    {
        "raw" : {
            "shard1/10.0.70.104:27021,10.0.70.104:27022,10.0.70.104:27023" : {
                "createdCollectionAutomatically" : false,
                "numIndexesBefore" : 1,
                "numIndexesAfter" : 2,
                "ok" : 1,
                "$gleStats" : {
                    "lastOpTime" : {
                        "ts" : Timestamp(1495675335, 1),
                        "t" : NumberLong(1)
                    },
                    "electionId" : ObjectId("7fffffff0000000000000001")
                }
            }
        },
        "ok" : 1
    }
    
    # 允许分片的collection,指定shard key的字段
    sh.shardCollection('app.demo', { id : 'hashed' })
    { "collectionsharded" : "app.demo", "ok" : 1 }
    
    
    # 插入数据
    for (var i = 1; i < 10000; i++) db.demo.insert({id: i, name: 'ken'})
    WriteResult({ "nInserted" : 1 })
    
    # 查看状态,可以看到db与collection的分片状态
    sh.status()
    --- Sharding Status --- 
      sharding version: {
        "_id" : 1,
        "minCompatibleVersion" : 5,
        "currentVersion" : 6,
        "clusterId" : ObjectId("59261bca37ceff575b36ef09")
    }
      shards:
        {  "_id" : "shard1",  "host" : "shard1/10.0.70.104:27021,10.0.70.104:27022,10.0.70.104:27023",  "state" : 1 }
        {  "_id" : "shard2",  "host" : "shard2/10.0.70.105:27021,10.0.70.105:27022,10.0.70.105:27023",  "state" : 1 }
      active mongoses:
        "3.4.4" : 1
     autosplit:
        Currently enabled: yes
      balancer:
        Currently enabled:  yes
        Currently running:  no
            Balancer lock taken at Thu May 25 2017 07:48:42 GMT+0800 (CST) by ConfigServer:Balancer
        Failed balancer rounds in last 5 attempts:  0
        Migration Results for the last 24 hours: 
            1 : Success
      databases:
        {  "_id" : "app",  "primary" : "shard1",  "partitioned" : true }
            app.demo
                shard key: { "id" : "hashed" }
                unique: false
                balancing: true
                chunks:
                    shard1  2
                    shard2  2
                { "id" : { "$minKey" : 1 } } -->> { "id" : NumberLong("-4611686018427387902") } on : shard1 Timestamp(2, 2) 
                { "id" : NumberLong("-4611686018427387902") } -->> { "id" : NumberLong(0) } on : shard1 Timestamp(2, 3) 
                { "id" : NumberLong(0) } -->> { "id" : NumberLong("4611686018427387902") } on : shard2 Timestamp(2, 4) 
                { "id" : NumberLong("4611686018427387902") } -->> { "id" : { "$maxKey" : 1 } } on : shard2 Timestamp(2, 5) 
    
    # shard1
    db.demo.find().count()
    4992
    
    # shard2
    db.demo.find().count()
    5007
    
    如果在允许colletion前demo有数据,执行以下命令时会报错。
    sh.shardCollection('app.demo', { id : 'hashed' })
    {
        "proposedKey" : {
            "id" : "hashed"
        },
        "curIndexes" : [
            {
                "v" : 2,
                "key" : {
                    "_id" : 1
                },
                "name" : "_id_",
                "ns" : "app.demo"
            },
            {
                "v" : 2,
                "key" : {
                    "id" : 1
                },
                "name" : "id_1",
                "ns" : "app.demo"
            }
        ],
        "ok" : 0,
        "errmsg" : "please create an index that starts with the shard key before sharding."
    }
    
    做法是将collection删除,重建索引。
    
    chunksize默认是64M,如果分片过慢的话,可以适当调大,如512M。mongos的配置文件里。
    

    Hashed Sharding

    Ranged Sharding

  • 相关阅读:
    过桥问题
    修改state中数组对象某一个字段(state中某个属性为对象或数组时,需要修改该对象中的某一个属性)
    git 如何提交,新建, 拉取远程分支,git基本操作,git新手教学
    el-image组件大图预览不能定位当前图片的处理
    vue数组遍历动态渲染到页面
    vue路由传参的三基本方式
    git push时报错:error: failed to push some refs to/hint: Updates were rejected because the tip of your current branch is behind/hint: its remote counterpart. Integrate the remote changes
    时间格式转换/时间戳的转换
    Day.js :一个轻量的处理时间和日期的 JavaScript 库
    node多版本管理(node版本切换、node版本更新及降低版本)
  • 原文地址:https://www.cnblogs.com/liujitao79/p/6899793.html
Copyright © 2011-2022 走看看