zoukankan      html  css  js  c++  java
  • Mongo服务器集群配置学习三——分片

    MongoDB的分片主要是指将集合拆分成小块并分别存在不同服务器上的过程。MongoDB支持自动分片,可摆脱手动分片管理上的困难。

    在以下情况下需要运用分片:

    1.服务器的磁盘不够用。

    2.单个Mongod不能满足写数据的性能需求。

    3.需要将大数据放入内存中提高性能。

    下图为我们要实现的分片结构:

    从图中我们看到原本一台Mongod节点被分成了A和B两个分片,由路由D读取配置服务器C的分片策略,然后决定数据存储在哪个分片上,而路由隐藏了决策的细节,用户直接访问路由就可以享受分片带来的优点,而不必关心路由读取分片的细节。

    配置步骤:

    1.创建配置服务器C

    创建配置文件如下,端口为10000,并启动mongod -f config.cnf

    dbpath=D:\mongodb\test\sharded\C\Data
    bind_ip=127.0.0.1
    port=10000

    2.创建路由服务器D

    路由器的配置文件如下:

    bind_ip=127.0.0.1
    port=20000
    configdb=127.0.0.1:10000

    其中configdb=127.0.0.1:10000配置的是路由监听的配置服务器的地址

    路由器用mongos启动

    mongos -f config.cnf

      注意:配置服务器要先启动,因为路由服务器需要监听配置服务器。

    3.新建分片服务器A和B

    A的配置,然后启动A

    dbpath=D:\mongodb\test\sharded\A\Data
    bind_ip=127.0.0.1
    port=8001  

    B的配置,然后启动B

    dbpath=D:\mongodb\test\sharded\B\Data
    bind_ip=127.0.0.1
    port=8002
    

    4.建立集群中分片服务器与路由器的连接

    这个操作需要在路由器中配置,打开路由器的shell,执行数据库命令

    db.runCommand({addshard:"127.0.0.1:8001",allowLocal:true})
    db.runCommand({addshard:"127.0.0.1:8002",allowLocal:true})

     可以看到执行添加分片的操作要在admin库中进行

    5.为业务数据库添加分片功能

    为person添加分片功能,在路由中执行db.runCommand({"enablesharding":"person"})

    6.为集合进行分片

      片键:集合中的一个键作为分拆的依据。

          为person库的集合info进行分片,key字段设置了片键

      执行下列命令db.runCommand({"shardcollection":"person.info","key":{"_id":1}})

    7.添加一定的大数据量,测试分片的功能

    用脚本插入80万条数据

    for(i=1;i<=800001;i++){

      db.info.insert({name:i})

    }

    在分别在分片服务器A和B上查询数据量,如图:看到这800001条数据已经分别存放在2个分片中了

    正式环境配置

    成功地构建分片需要如下条件:

    1.多个配置服务器

    2.多个mongos服务器

    3.每个片都是副本集

    1.多个配置服务器

    创建配置服务器如上,现在启动mongos的时候应将其连接到这3个配置服务器。假如3个配置文件的端口号是20001~20003

    mongos --configdb localhost:20001,localhost:20002,localhost:20003

    配置服务器使用的是两步提交机制,不是普通的MongoDB的异步复制,来维护集群配置的不同副本。这样能保证集群状态的一致性。这意味着某台配置服务器down了后,集群配置信息将是只读的。但是客户端还是能够读写的,只有所有配置服务器备份了以后才能重新均衡数据。

    2.多个mongos

    Mongos的数量不受限制,建议针对一个应用服务器只运行一个mongos进程。这样每个应用服务器就可以与mongos进行本地会话。

    3.每个片都是副本集

    生产环境中,每个片都应是副本集。这样单个服务器坏了,就不会导致整个片失效。用addshard命令就可以讲副本集作为片添加,添加时只要指定副本集的名字和种子就好了。

    实现即达到数据的分片存储也实现备份和故障自动修复功能,可以副本集和分片混合使用,构建如下图的架构,(为了举例简单仅给shardA做了副本集配置)

    1.修改A的配置如下:

    dbpath=D:\mongodb\test\sharded\A\Data
    bind_ip=127.0.0.1
    port=8001
    replSet=replicademo/127.0.0.1:8003
    

     新添加A1和A2两台节点与A组成副本集

    A1的配置:

    dbpath=D:\mongodb\test\sharded\A1\Data
    bind_ip=127.0.0.1
    port=8004
    replSet=replicademo/127.0.0.1:8003

    A2的配置:

    dbpath=D:\mongodb\test\sharded\A2\Data
    bind_ip=127.0.0.1
    port=8003
    replSet=replicademo/127.0.0.1:8001

    在A的shell中执行副本集的舒适化

    db.runCommand({"replSetInitiate":
        {
            "_id":'replicademo',
            "members":[
                   {
                    "_id":1,
                    "host":"127.0.0.1:8001"
                   },
                   {
                    "_id":2,
                    "host":"127.0.0.1:8003"
                   },
            {
                    "_id":3,
                    "host":"127.0.0.1:8004"
                   }
            ]
        }
    })

    这样A,A1,A2的副本集就建立完成,查询配置看到A为活跃节点,如下图:

    回到路由器上设置分片配置

    mongos> db.runCommand({addshard:"replicademo/127.0.0.1:8001"})

    这样mongos会知道它所连接的是replicademo副本集,在活跃节点down掉之后就会去寻找新的活跃结点。

    执行db.printShardingStatus(),会看到副本集的节点都已经自动的配置进来了,如下图:

    管理分片

    分片的信息主要存放在config数据库上,这样就能被任何连接到mongos的进程访问到了。

    配置集合

    下面的代码都假设已经在shell中连接了mongos,并且已经运行了use config

     1.片

    可以在shards集合中查到所有的片    >db.shards.find();

    2.数据库

    databases集合含有已经在片上的数据库列表和一些相关信息。

    >db.databases.find()   键的解释如下

    "_id" : 表示数据名

    "partitioned" : 是否启用分片功能

    "primary" :这个值与"_id"对应,表示这个数据的大本营在哪里。也就是开始创建数据库文件的位置

     3.块

    块信息保存在chunks集合中,你可以看到数据到底是怎么切分到集群的。

    >db.chunks.find()

     分片命令

    1.获得概要

    >db.printShardingStatus() 给出前面说的那些集合的概要

    2.删除片

    removeshard就能从集群中删除片,removeshard会把给定片上的所有块都挪到其他片上。

    >db.runCommand({"removeshard":"localhost:10000"})

     

  • 相关阅读:
    洛谷 P6851 【onu】贪心
    联赛模拟测试12 C. sum 莫队+组合数
    晚间测试4 哪一天她能重回我身边 神奇建图+基环树
    联赛模拟测试11 D. 甜圈 线段树维护哈希值
    CF741D Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths 树上启发式合并(DSU ON TREE)
    CF788B Weird journey 题解
    联赛模拟测试10 C. 射手座之日
    晚间测试3 B. 单(single)
    CF538B Quasi Binary 思维题
    CF600E Lomsat gelral 树上启发式合并
  • 原文地址:https://www.cnblogs.com/wly923/p/3021165.html
Copyright © 2011-2022 走看看