MongoDB的配置服务器(config server)


  • Lv 1

    【MongoDB简介/设计理论/使用技巧】

    MongoDB的配置服务器(config server)

    1. 前言:
    MongoDB 集群存在许多角色的服务器,上节我们提到了MongoDB的”客户服务窗口” ─ mongos,本节我们将针对MongoDB的”服务指南” ─ config服务器做详细介绍。

    2. config server简介
    config server,即MongoDB的配置服务器。上节提到的mongos本身是不保存任何数据,仅做为路由使用,数据是保存在分片的集合中,而config server就是保存说明数据结构的元数据信息。Mongos启动后会从config server加载数据库配置信息到缓存,而分片数据结构做了变更,也会在config server中做相应的调整。
    一般情况下,我们不该对config的数据做直接的变更,否则可能会造成异常,倘若真的做了修改,必须重启所有的mongos才会达到变更后的结果。
    在生产环境中,通常会建置多个config server(最常见的数量为3个),因为它保存了分片的元数据,这些数据一旦丢失,问题会非常严重,当存在多个config server的情况下,挂掉一台是不影响集群运作的。

    2.1. config数据库的集合说明
    config DB是mongodb集群本身内部运作所需使用的数据库,基本上一般的使用者操作都不应该直接变更它的内容,若要直接对它做操作,强烈建议先执行mongodump产生一个全备份之后再操作。
    在config数据库中可以用show collections指令查到许多集合,这些集合分别保存的不同的重要信息,接下来我们将一一对这些集合作简单的介绍。

    mongos> use config
    switched to db config
    mongos> show collections
    actionlog
    changelog
    chunks
    collections
    databases
    lockpings
    locks
    mongos
    settings
    shards
    tags
    version
    
    
    • config.actionlog
      actionlog集合保存数据库每一个动作的纪录(log)。
    mongos> db.actionlog.find().pretty().limit(1)
    {
        "_id" : "host-hostIP-2016-10-21T18:42:54.913+0800-5809f12ee403086460eac249",
        "server" : "host-hostIP",
        "clientAddr" : "",
        "time" : ISODate("2016-10-21T10:42:54.913Z"),
        "what" : "balancer.round",
        "ns" : "",
        "details" : {
            "executionTimeMillis" : 321,
            "errorOccured" : false,
            "candidateChunks" : 2,
            "chunksMoved" : 0
        }
    }
    
    
    • config.changelog
      changelog集合内存了分片集合元数据变化的相关信息,其中包含:
      _id:hostname – timestamp – increment
      server:实际保存此分片数据的主机名(hostname)
      clientAddr:保存触发此次变更的client(mongos) ip
      time:变更发生时间(ISO格式Date)
      what:变更记录的类别(dropCollection / dropCollection.start / dropDatabase / dropDatabase.start / moveChunk.start / moveChunk.commit / split / multi - split)
      ns:变更数据的namespace
      details:记录关于本次变更的额外信息,内容依每个变更类别而不同
    mongos> db.changelog.find().sort({time:-1}).pretty().limit(1)
    {
        "_id" : "host- hostIP -26-10-31T12:36:01.164+0800-5816ca313c6e1abbaeddb91e",
        "server" : "host-hostIP",
        "clientAddr" : "hostIP:32839",
        "time" : ISODate("2016-10-31T04:36:01.164Z"),
        "what" : "moveChunk.start",
        "ns" : "logs.NotesLog",
        "details" : {
            "min" : {
                "_id" : { "$minKey" : 1 }
            },
            "max" : {
                "_id" : NumberLong("-9184931293421389241")
            },
            "from" : "shard2",
            "to" : "shard1"
        }
    }
    
    
    • config.chunks
      是MongoDB集群重要的一个保存数据库元数据的集合,保存集群中每个chunk的信息。文档中的min和max记录了这个chunk的片键范围,shard字段则表示此chunk所存在的分片。
    mongos> db.chunks.find().pretty().limit(1)
    {
        "_id" : "dbtest.coll1-id_MinKey",
        "lastmod" : Timestamp(6, 0),
        "lastmodEpoch" : ObjectId("57bd13dfcb987b00ed5f8b5c"),
        "ns" : "dbtest.coll1",
        "min" : {
            "id" : { "$minKey" : 1 }
        },
        "max" : {
            "id" : NumberLong("-6148914691236517204")
        },
        "shard" : "shard1"
    }
    
    
    • config.collections
      此为MongoDB集群重要的一个保存数据库元数据的集合,collections集合记录集群中每个分片集合的信息。
    mongos> db.collections.find().pretty().limit(1)
    {
        "_id" : "dbtest.coll1",
        "lastmodEpoch" : ObjectId("57bd13dfcb987b00ed5f8b5c"),
        "lastmod" : ISODate("1970-02-19T17:02:47.298Z"),
        "dropped" : false,
        "key" : {
            "id" : "hashed"
        },
        "unique" : false
    }
    
    
    • config.databases
      此为MongoDB集群重要的一个保存数据库元数据的集合,记录集群中每个数据库的信息,包含数据库名称/主节点/是否做partition。
    mongos> db.databases.find().pretty().limit(10)
    { "_id" : "dbtest", "primary" : "shard3", "partitioned" : true }
    { "_id" : "NotesLog", "primary" : "shard2", "partitioned" : true }
    { "_id" : "logs", "primary" : "shard2", "partitioned" : true }
    { "_id" : "test", "primary" : "shard2", "partitioned" : true }
    { "_id" : "SDtest", "primary" : "shard2", "partitioned" : true }
    { "_id" : "com_test", "primary" : "shard3", "partitioned" : false }
    { "_id" : "commend", "primary" : "shard3", "partitioned" : true }
    
    
    • config.lockpings
      lockpings集合储存对于集群内正在运作的组件作追踪后的结果记录。
    mongos> db.lockpings.find().pretty().limit(5)
    {
        "_id" : "host-hostIP:27017:1472005978:766477986",
        "ping" : ISODate("2016-08-24T02:32:58.994Z")
    }
    {
        "_id" : "host-hostIP:27017:1472006013:-108755969",
        "ping" : ISODate("2016-08-24T02:33:33.904Z")
    }
    {
        "_id" : "host-hostIP:27017:1472006329:1249242723",
        "ping" : ISODate("2016-08-24T02:38:49.378Z")
    }
    {
        "_id" : "host-hostIP:27017:1472006664:-1002322418",
        "ping" : ISODate("2016-08-24T02:44:24.387Z")
    }
    {
        "_id" : "host-hostIP:27017:1472006967:-426885201",
        "ping" : ISODate("2016-08-24T06:02:50.580Z")
    }
    
    
    • config.locks
      locks集合储存distributed lock,确保每次只有一个mongos才能在集群执行特殊任务,以下第一笔是迁移chunk的处理记录文档。
    mongos> db.locks.find().sort({when:-1}).pretty().limit(2)
    {
        "_id" : "logs.NotesLog",
        "state" : 2,
        "ts" : ObjectId("5816ca313c6e1abbaeddb91d"),
        "who" : "host-10-207-248-253:27017:1474960153:-455317803:conn2670",
        "process" : "host-10-207-248-253:27017:1474960153:-455317803",
        "when" : ISODate("2016-10-31T04:36:01.148Z"),
        "why" : "migrating chunk [{ _id: MinKey }, { _id: -9184931293421389241 }) in logs.NotesLog"
    }
    {
        "_id" : "balancer",
        "state" : 2,
        "who" : "host-10-207-248-185:15017:1474609827:2139761040:Balancer",
        "ts" : ObjectId("5816ca31e0f0eb0a2d1b8c1f"),
        "process" : "host-10-207-248-185:15017:1474609827:2139761040",
        "when" : ISODate("2016-10-31T04:36:01.098Z"),
        "why" : "doing balance round"
    }
    
    
    • config.mongos
      mongos集合保存集群中每个mongos实例信息。Mongos实例每30秒会发出pings给集群的所有成员,因此集群可以确认mongos持续运作。下图ping字段表示ping的时间点,up字段则表示截至最后一次ping时,mongos实例所运行的时间,这个集合一般是做为mongos的运行报告使用。
      下图第一个文档up为NumberLong(264985),表示该mongos服务最后才启动。
    mongos> db.mongos.find().sort({ping:-1}).pretty().limit(3)
    {
        "_id" : "host-10-207-248-184:15017",
        "ping" : ISODate("2016-10-31T09:01:01.169Z"),
        "up" : NumberLong(264985),
        "waiting" : true,
        "mongoVersion" : "3.2.9"
    }
    {
        "_id" : "host-10-207-248-182:15017",
        "ping" : ISODate("2016-10-31T09:00:55.456Z"),
        "up" : NumberLong(537449),
        "waiting" : true,
        "mongoVersion" : "3.2.9"
    }
    {
        "_id" : "host-10-207-248-185:15017",
        "ping" : ISODate("2016-10-31T04:36:01.080Z"),
        "up" : NumberLong(3278734),
        "waiting" : false,
        "mongoVersion" : "3.2.9"
    }
    
    
    • config.settings
      setting集合里面记录着分片的配置,其中chunksize表示chunk的大小,预设为64,可调整。balancer则说明是否自动作平衡转移。
    mongos> db.settings.find().pretty()
    { "_id" : "chunksize", "value" : NumberLong(64) }
    { "_id" : "balancer", "stopped" : false }
    
    
    • config.shards
      shards集合记录着整个集群里面的每一个分片(shard),若该分片是副本集(replica set),则host字段会列出副本集名/主机名与端口
    mongos> db.shards.find().pretty()
    {
        "_id" : "shard2",
        "host" : "shard2/hostIP:27017,hostIP:27017,hostIP:27017"
    }
    {
        "_id" : "shard3",
        "host" : "shard3/hostIP:27017,hostIP:27017,hostIP:27017"
    }
    {
        "_id" : "shard1",
        "host" : "shard1/hostIP:27017,hostIP:27017,hostIP:27017"
    }
    
    
    • config.tags
      tags集合存储着集群中每个被tag的片键范围(如果有做tag的话才会有)。
      Tag是用来标示每个分片的片键范围,让mongos在读写的时候根据键值范围写到正确的分片上。
    {
        "_id" : { "ns" : "commend.users", "min" : { "zipcode" : "10001" } },
        "ns" : "commend.users",
        "min" : { "zipcode" : "10001" },
        "max" : { "zipcode" : "10281" },
        "tag" : "NYC"
    }
    
    • config.version
      version记录着元数据的版本号,要查这个集合,必须使用db.getCollection方法。
    mongos> db.getCollection("version").find()
    { "_id" : 1, "version" : 3 }
    

    2.2. 结语
    再次强调,config server虽然只是普通的mongod实例,不过为了确保整个MongoDB可以正常运行,必须尽可能的将你的config server分到不同的故障域(failure domain)中,比如说可以分布在地理位置不同的三个数据中心,这样才能尽可能确保config server服务不会同时挂掉,造成欲哭无泪的后果。


登录后回复
 

与 萌阔论坛 的连接断开,我们正在尝试重连,请耐心等待