美文网首页
二、Mongodb搭建及集群、库和集合的基本操作

二、Mongodb搭建及集群、库和集合的基本操作

作者: 一个反派人物 | 来源:发表于2021-05-30 11:27 被阅读0次

    1. 逻辑结构


    Mongodb的存储格式为json格式,存储结构灵活,数据压缩比高。

    {
      id:101,
      name:'john'
    }
    

    适用场景:对数据一致性要求不高,数据量级大,数据格式灵活
    应用场景:银行流水系统,大数据平台

    2. 安装MongoDB

    2.1 安装依赖软件

    yum install libcurl openssl xz-libs
    

    2.2 关闭大叶内存(THP)

    透明大页面(THP)是一种Linux内存管理系统,它通过使用较大的内存页面来减少具有大量内存的计算机上的转换后备缓冲区(TLB)查找的开销。但是,启用THP时,数据库工作负载通常表现不佳,因为它们往往具有稀疏而不是连续的内存访问模式。在Linux上运行MongoDB时,应禁用THP以获得最佳性能。

    创建服务文件vim /etc/systemd/system/disable-transparent-huge-pages.service

    [Unit]
    Description=Disable Transparent Huge Pages (THP)
    DefaultDependencies=no
    After=sysinit.target local-fs.target
    Before=mongod.service
    
    [Service]
    Type=oneshot
    ExecStart=/bin/sh -c 'echo never | tee /sys/kernel/mm/transparent_hugepage/enabled > /dev/null'
    
    [Install]
    WantedBy=basic.target
    

    重新加载systemd,并关闭大页内存

    systemctl daemon-reload
    systemctl start disable-transparent-huge-pages
    systemctl enable disable-transparent-huge-pages
    

    检查结果

    cat /sys/kernel/mm/transparent_hugepage/enabled
    #部分redhat系统需要执行下面的命令
    cat /sys/kernel/mm/redhat_transparent_hugepage/enabled
    

    2.3 下载安装MongoDB

    下载tar包

    wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.4.5.tgz
    

    解包后制作软链接

    mv <mongodb-install-directory> /usr/local/
    ln -s /usr/local/<mongodb-install-directory> /usr/local/mongodb
    

    配置环境变量vim /etc/profile

    export PATH=/usr/local/mongodb/bin:$PATH
    

    创建数据和日志目录

    mkdir -p /var/lib/mongodb
    mkdir -p /var/log/mongodb
    mkdir -p /usr/local/mongodb/conf
    

    创建mongod用户

    useradd mongod -M -s /usr/sbin/nologin
    

    更改目录权限

    chown -R mongod:mongod /var/lib/mongodb
    chown -R mongod:mongod /var/log/mongodb
    chown -R mongod:mongod /usr/local/mongodb
    

    2.4 编辑MongoDB配置文件

    配置文件详解

    --系统日志有关  
    systemLog:
       destination: file        
       path: "/var/log/mongodb/mongodb.log"    --日志位置
       logAppend: true                     --日志以追加模式记录
      
    --数据存储有关   
    storage:
       journal:
          enabled: true
       dbPath: "/var/lib/mongodb"            --数据路径的位置
    
    -- 进程控制  
    processManagement:
       fork: true                         --后台守护进程
       pidFilePath: <string>              --pid文件的位置,一般不用配置,可以去掉这行,自动生成到data中
        
    --网络配置有关   
    net:            
       bindIp: <ip>                       -- 监听地址
       port: <port>                       -- 端口号,默认不配置端口号,是27017
       
    -- 安全验证有关配置      
    security:
      authorization: enabled              --是否打开用户名密码验证
      
    ------------------以下是复制集与分片集群有关----------------------  
    
    replication:
     oplogSizeMB: <NUM>
     replSetName: "<REPSETNAME>"
     secondaryIndexPrefetch: "all"
     
    sharding:
       clusterRole: <string>
       archiveMovedChunks: <boolean>
          
    ---for mongos only
    replication:
       localPingThresholdMs: <int>
    
    sharding:
       configDB: <string>
    ---
    

    配置文件示例vim /usr/local/mongodb/conf/mongo.conf

    systemLog:
       destination: file
       path: "/var/log/mongodb/mongodb.log"
       logAppend: true
    storage:
       journal:
          enabled: true
       dbPath: "/var/lib/mongodb"
    processManagement:
       fork: true
    net:
       port: 27017
       bindIp: 127.0.0.1,10.0.0.51
    

    2.5 手工启动mongodb

    启动

    mongod --dbpath=/var/lib/mongodb --logpath=/var/log/mongodb/mongodb.log --port=27017 --logappend --fork 
    
    mongod -f /usr/local/mongodb/conf/mongo.conf
    

    停止

    mongod -f /usr/local/mongodb/conf/mongo.conf --shutdown
    

    2.6 使用systemd管理Mongodb

    vim /etc/systemd/system/mongod.service

    [Unit]
    Description=mongodb 
    After=network.target remote-fs.target nss-lookup.target
    [Service]
    User=mongod
    Type=forking
    ExecStart=/usr/local/mongodb/bin/mongod --config /usr/local/mongodb/conf/mongo.conf
    ExecReload=/bin/kill -s HUP $MAINPID
    ExecStop=/usr/local/mongodb/bin/mongod --config /usr/local/mongodb/conf/mongo.conf --shutdown
    PrivateTmp=true  
    [Install]
    WantedBy=multi-user.target
    

    2.7 登录Mongodb

    本地登录

    #没有开启认证
    mongo
    
    #开启认证
    mongo -u 用户名 -p 密码
    

    远程登录

    mongo -u 用户名 -p 密码 IP:端口/认证库
    

    2.8 日志切割

    修改配置文件/etc/mongod.conf

    ...
    systemLog:
    ...
      logAppend: true
      logRotate: reopen
    ...
    

    配置logrotate

    /var/log/mongodb/*log {
            create 0664 mongod mongod
            daily
            dateext
            rotate 10
            missingok
            notifempty
            nocompress
            sharedscripts
            postrotate
                    /bin/kill -SIGUSR1 `cat /var/run/mongodb/mongod.pid` 2>/dev/null || true
            endscript
    }
    

    3. MongoDB常用基本操作

    3.1 MongoDB默认存在的库

    系统库:

    • admin:系统预留库,MongoDB系统管理库
    • local库:本地预留库,存储关键日志
    • config库:MongoDB配置信息库

    默认库:
    test:登录时默认存在的库

    3.2 常用操作

    查询所有数据库

    show databases/show dbs
    

    查询库中的所有表

    show tables/show collections
    

    切换/创建数据库

    use admin
    

    查看当前使用的数据库,等于mysql中select database()

    db
    

    3.3 命令查看帮助

    3.3.1 db对象相关

    db.[TAB][TAB]:按两下TAB,显示db类的所有操作
    db.help():查询db所有操作的用法
    db.表1.[TAB][TAB]:按两下TAB,显示db下表1的所有操作,表1不用事先创建
    db.表1.help():显示db下表1的所有操作的用法

    3.3.2 rs(replication set)复制集相关

    rs.[TAB][TAB]:按两下TAB,显示rs类的所有操作
    rs.help():查询rs所有操作的用法

    3.3.3 sh(sharding cluster)分片集群相关

    sh.[TAB][TAB]:按两下TAB,显示sh类的所有操作
    sh.help():查询sh所有操作的用法

    3.4 MongoDB对象操作

    3.4.1 库的操作

    use 库1:切换/创建数据库
    db.dropDatabase():删除当前库

    3.4.2 集合的操作

    对集合进行操作时,无需提前创建集合
    db.集合名.insert({id:101,name:"wmz",age:18}):创建集合,并插入1行json格式数据
    db.集合名.insert([{"id":1},{"id":2}]):创建集合,并插入多行json格式数据
    db.集合名.find():查询集合的数据

    > db.test.find()
    { "_id" : ObjectId("6093b26b23a521588011c703"), "id" : 101, "name" : "wmz", "age" : 18 }
    

    db.集合名.find().pretty():查询集合的数据,并优雅显示

    > db.test.find().pretty()
    {
        "_id" : ObjectId("6093b26b23a521588011c703"),
        "id" : 101,
        "name" : "wmz",
        "age" : 18
    }
    

    db.集合名.find({id:100}):条件查询,查询id=100的数据
    db.集合名.count():查询集合中有多少行数据
    for(i=0;i<10000;i++){db.集合名.insert({"uid":i})}:利用for函数,循环插入10000行数据
    db.集合名.drop():删除集合
    db.集合名.remove({}):删除集合中的所有记录
    db.集合名.totalSize():集合中索引+数据压缩存储之后的大小
    db.getCollectionInfos({"name":"集合名"}):显示集合或视图的配置信息,不配置{"name":"集合名"}则显示全部的配置信息

    4. 用户及权限管理

    4.1 验证库

    建立用户时use到的库,在使用用户时,要加上验证库才能登录

    注意事项:

    1. 对于管理员用户,必须在admin下创建
    2. 登录时,必须明确指定验证库才能登录
    3. 通常,管理员用的验证库是admin,普通用户的验证库一般是所管理的库设为验证库
    4. 如果直接登录到数据库,不进行use,默认的验证库是test,生产中不建议
    5. 从3.6版本开始,不添加bindIp参数,默认不允许远程登录,只能本地管理员登录

    4.2 创建用户语法

    use admin
    db.createUser(
    {
      user:"<name>",
      pwd:"<cleartext password>",
      roles:[
        { role:"<role>",
        db:"database" } | "<role>",
      ...
      ]
    }
    )
    

    语法说明:
    user:用户名
    pwd:密码
    roles:

    • role:角色名,常用有3种root,readWrite,read
    • db:作用对象

    4.3 管理员用户创建流程

    创建超级管理员:管理所有数据库,必须use admin再去创建

    use admin
    db.createUser(
    {
      user:"root",
      pwd:"123",
      roles:[ { role:"root",db:"admin" } ]
    }
    )
    

    验证用户

    > db.auth('root','123')
    1
    

    配置文件中加入以下配置vim /usr/local/mongodb/conf/mongo.conf

    注意:一定要在创建完管理员用户后配置,否则会远程登录不上数据库

    security:
      authorization: enabled
    

    重启mongodb服务

    4.4 应用用户创建

    创建应用用户:use 到应用库再去创建

    use bigsky
    db.createUser(
    {
      user:"app",
      pwd:"123",
      roles:[ { role:"readWrite",db:"bigsky" } ]
    }
    )
    

    4.5 登录命令

    mongo -u 用户名 -p 密码 IP地址/验证库

    mongo -u bigsky -p 123 10.0.0.51/school
    

    4.6 MongoDB中的用户信息查询

    use admin
    db.system.users.find().pretty()
    

    4.7 删除用户

    需要管理员用户进入用户的验证库删除

    #登录
    mongo -uroot -p123 10.0.0.51/admin
    #删除
    use bigsky
    db.dropUser("app2")
    

    5 MongoDB复制集RS(Replication Set)

    基础架构 演变架构

    5.1 基本原理

    基本结构是1主2从结构,自带相互监控投票机制(Raft协议,Mysql的MGR使用的是变种的Paxos协议),具有如下特点:

    1. 不需要额外的中间件,能够保证数据实时复制及一致性
    2. 如果主库宕机,复制集内部会进行投票选举,选出新的主库带外服务
    3. 主库宕机发生切换,会自动通知客户端连接新的主库

    演变架构,1主1从1仲裁者,仲裁者不参与数据的同步,只有仲裁投票的功能。

    默认登录到Secondary节点不能进行读写操作,需要在Secondary节点上运行rs.slaveOK(),从而开启当前登录会话在从节点上的读权限

    5.2 Replication Set配置

    5.2.1 环境准备

    创建多实例目录

    mkdir -p /mongodb/28017/conf /mongodb/28017/data /mongodb/28017/log
    mkdir -p /mongodb/28018/conf /mongodb/28018/data /mongodb/28018/log
    mkdir -p /mongodb/28019/conf /mongodb/28019/data /mongodb/28019/log
    mkdir -p /mongodb/28020/conf /mongodb/28020/data /mongodb/28020/log
    

    编写配置文件

    cat > /mongodb/28017/conf/mongod.conf <<EOF
    systemLog:
        destination: file
        path: "/mongodb/28017/log/mongodb.log"
        logAppend: true
    storage:
        journal:
            enabled: true
        dbPath: "/mongodb/28017/data"
        directoryPerDB: true
        #engine: wiredTiger
        wiredTiger:
            engineConfig:
                cacheSizeGB: 1
                directoryForIndexes: true
            collectionConfig:
                blockCompressor: zlib
            indexConfig:
                prefixCompression: true
    processManagement:
        fork: true
    net:
        port: 28017
        bindIp: 127.0.0.1,接口IP地址
    replication:
        oplogSizeMB: 2048
        replSetName: my_repl
    EOF
    
    cp /mongodb/28017/conf/mongod.conf /mongodb/28018/conf/mongod.conf
    cp /mongodb/28017/conf/mongod.conf /mongodb/28019/conf/mongod.conf
    cp /mongodb/28017/conf/mongod.conf /mongodb/28020/conf/mongod.conf
    
    sed -i 's/28017/28018/g' /mongodb/28018/conf/mongod.conf
    sed -i 's/28017/28019/g' /mongodb/28019/conf/mongod.conf
    sed -i 's/28017/28020/g' /mongodb/28020/conf/mongod.conf
    

    启动多实例

    mongod -f /mongodb/28017/conf/mongod.conf
    mongod -f /mongodb/28018/conf/mongod.conf
    mongod -f /mongodb/28019/conf/mongod.conf
    mongod -f /mongodb/28020/conf/mongod.conf
    

    5.2.1.1 配置文件参数解释

    #使用wiredTiger存储引擎
        wiredTiger:
            engineConfig:
                cacheSizeGB: 1
                directoryForIndexes: true
            collectionConfig:
                blockCompressor: zlib
            indexConfig:
                prefixCompression: true
    
    
    #复制集相关参数
    replication:
        #类似于mysql的binlog,日志大小设置
        oplogSizeMB: 2048
        #复制集的名字
        replSetName: my_repl
    

    5.2.2 配置普通复制集

    1主2从,从库普通从库

    连接mongodb

    mongo 127.0.0.1:28017/admin
    

    添加复制集配置,_id必须和配置文件中的replSetName字段的值一致,本例是my_repl

    config = {_id: "my_repl", members: [
                {_id: 0, host: '127.0.0.1:28017'},
                {_id: 1, host: '127.0.0.1:28018'},
                {_id: 2, host: '127.0.0.1:28019'}
                ]
            }
    
    rs.initiate(config)
    

    查询复制集状态

    rs.status()
    

    此时登录的节点已经能够显示所在的复制集和主从状态


    5.2.3 配置扩展复制集

    1主1从1个arbiter,与普通复制集配置config稍有变化,其余步骤一样

    config = {_id: "my_repl", members: [
                {_id: 0, host: '127.0.0.1:28017'},
                {_id: 1, host: '127.0.0.1:28018'},
                {_id: 2, host: '127.0.0.1:28019',"arbiterOnly":true}
                ]
            }
    
    rs.initiate(config)
    

    5.3 Replication Set管理操作

    5.3.1 查看复制集状态

    rs.status()查看整个复制集的状态
    rs.isMaster()查看当前是否是主节点

    rs.conf()查看当前复制集的配置信息

    5.3.2 添加删除节点

    只能在primary节点上操作,将现有节点变更为arbiter,需要先删除节点,再添加为arbiter
    rs.remove("ip:port")删除一个节点
    rs.add("ip:port")新增从节点
    rs.addArb("ip:port")新增仲裁节点

    5.4 特殊从节点

    介绍:
    arbiter节点:主要负责选主过程中的投票,但是不存储任何数据,也不提供任何服务
    hidden节点:隐藏节点,不参与选主,也不对外提供服务
    delay节点:延时节点,数据落后于主库一段时间,因为数据是延时的,也不应该提供服务或参与选主,所以通常会配合hidden(隐藏)

    一般情况下会将delay+hidden一起配置使用

    5.4.1 配置延时节点

    一般延时节点也配置成hidden

    cfg=rs.conf()
    cfg.members[节点索引].priority=0
    cfg.members[节点索引].hidden=true
    cfg.members[节点索引].slaveDelay=120
    rs.reconfig(cfg)
    
    #用members的节点索引来确定更改的是哪个节点
    

    配置成功后,通过以下命令查询配置后的属性

    rs.conf()
    

    5.4.2 恢复普通节点

    cfg=rs.conf()
    cfg.members[节点索引].priority=1
    cfg.members[节点索引].hidden=false
    cfg.members[节点索引].slaveDelay=0
    rs.reconfig(cfg)
    

    6 MongoDB Sharding Cluster 分片集群


    节点功能:

    • shard: 存储数据的节点,需要复制集部署
    • mongos: 承接用户请求的路由节点,负责将用户的请求分发到后端的shard节点,无需存储数据,需要向Config Server请求Shard集群信息
    • config servers: 存储节点元数据和整个集群的配置,路由分片的规则也在整个节点上,需要复制集部署

    规划:
    10个实例:38017-38026

    1. configserver:3台构成的复制集(1主2从,不支持arbiter)38018-38020,复制集名字configsvr
    2. shard节点:
      • sh1:38021-23,1主2从,其中一个节点为arbiter,复制集名字sh1
      • sh2:38024-26,1主2从,其中一个节点为arbiter,复制集名字sh2

    configserver可以是一个节点,官方建议复制集。configserver不能有arbiter。
    3.4版本之后,虽然要求config server为replica set,但是不支持arbiter

    1. mongos节点

    6.1 sh复制集

    6.1.1 环境准备

    创建多实例目录

    mkdir -p /mongodb/38021/conf /mongodb/38021/data /mongodb/38021/log
    mkdir -p /mongodb/38022/conf /mongodb/38022/data /mongodb/38022/log
    mkdir -p /mongodb/38023/conf /mongodb/38023/data /mongodb/38023/log
    mkdir -p /mongodb/38024/conf /mongodb/38024/data /mongodb/38024/log
    mkdir -p /mongodb/38025/conf /mongodb/38025/data /mongodb/38025/log
    mkdir -p /mongodb/38026/conf /mongodb/38026/data /mongodb/38026/log
    

    编写sh1节点组配置文件

    cat > /mongodb/38021/conf/mongod.conf <<EOF
    systemLog:
        destination: file
        path: "/mongodb/38021/log/mongodb.log"
        logAppend: true
    storage:
        journal:
            enabled: true
        dbPath: "/mongodb/38021/data"
        directoryPerDB: true
        #engine: wiredTiger
        wiredTiger:
            engineConfig:
                cacheSizeGB: 1
                directoryForIndexes: true
            collectionConfig:
                blockCompressor: zlib
            indexConfig:
                prefixCompression: true
    net:
        port: 38021
        bindIp: 127.0.0.1
    replication:
        oplogSizeMB: 2048
        replSetName: sh1
    sharding:
        clusterRole: shardsvr
    processManagement:
        fork: true
    EOF
    
    
    cp /mongodb/38021/conf/mongod.conf /mongodb/38022/conf/mongod.conf
    cp /mongodb/38021/conf/mongod.conf /mongodb/38023/conf/mongod.conf
    
    sed -i 's/38021/38022/g' /mongodb/38022/conf/mongod.conf
    sed -i 's/38021/38023/g' /mongodb/38023/conf/mongod.conf
    

    编写sh2节点组配置文件

    cat > /mongodb/38024/conf/mongod.conf <<EOF
    systemLog:
        destination: file
        path: "/mongodb/38024/log/mongodb.log"
        logAppend: true
    storage:
        journal:
            enabled: true
        dbPath: "/mongodb/38024/data"
        directoryPerDB: true
        #engine: wiredTiger
        wiredTiger:
            engineConfig:
                cacheSizeGB: 1
                directoryForIndexes: true
            collectionConfig:
                blockCompressor: zlib
            indexConfig:
                prefixCompression: true
    net:
        port: 38024
        bindIp: 127.0.0.1
    replication:
        oplogSizeMB: 2048
        replSetName: sh2
    sharding:
        clusterRole: shardsvr
    processManagement:
        fork: true
    EOF
    
    
    cp /mongodb/38024/conf/mongod.conf /mongodb/38025/conf/mongod.conf
    cp /mongodb/38024/conf/mongod.conf /mongodb/38026/conf/mongod.conf
    
    sed -i 's/38024/38025/g' /mongodb/38025/conf/mongod.conf
    sed -i 's/38024/38026/g' /mongodb/38026/conf/mongod.conf
    

    启动所有节点

    mongod -f /mongodb/38021/conf/mongod.conf
    mongod -f /mongodb/38022/conf/mongod.conf
    mongod -f /mongodb/38023/conf/mongod.conf
    mongod -f /mongodb/38024/conf/mongod.conf
    mongod -f /mongodb/38025/conf/mongod.conf
    mongod -f /mongodb/38026/conf/mongod.conf
    

    6.1.2 复制集创建

    复制集sh1

    mongo 127.0.0.1:38021
    
    config = {_id: "sh1", members: [
                {_id: 0, host: '127.0.0.1:38021'},
                {_id: 1, host: '127.0.0.1:38022'},
                {_id: 2, host: '127.0.0.1:38023',"arbiterOnly":true}
                ]
            }
    
    rs.initiate(config)
    

    复制集sh2

    mongo 127.0.0.1:38024
    
    config = {_id: "sh2", members: [
                {_id: 0, host: '127.0.0.1:38024'},
                {_id: 1, host: '127.0.0.1:38025'},
                {_id: 2, host: '127.0.0.1:38026',"arbiterOnly":true}
                ]
            }
    
    rs.initiate(config)
    

    6.2 config复制集

    6.2.1 环境准备

    创建多实例目录

    mkdir -p /mongodb/38018/conf /mongodb/38018/data /mongodb/38018/log
    mkdir -p /mongodb/38019/conf /mongodb/38019/data /mongodb/38019/log
    mkdir -p /mongodb/38020/conf /mongodb/38020/data /mongodb/38020/log
    

    编写配置文件

    cat > /mongodb/38018/conf/mongod.conf <<EOF
    systemLog:
        destination: file
        path: "/mongodb/38018/log/mongodb.log"
        logAppend: true
    storage:
        journal:
            enabled: true
        dbPath: "/mongodb/38018/data"
        directoryPerDB: true
        #engine: wiredTiger
        wiredTiger:
            engineConfig:
                cacheSizeGB: 1
                directoryForIndexes: true
            collectionConfig:
                blockCompressor: zlib
            indexConfig:
                prefixCompression: true
    net:
        port: 38018
        bindIp: 127.0.0.1
    replication:
        oplogSizeMB: 2048
        replSetName: configReplSet
    sharding:
        clusterRole: configsvr
    processManagement:
        fork: true
    EOF
    
    
    cp /mongodb/38018/conf/mongod.conf /mongodb/38019/conf/mongod.conf
    cp /mongodb/38018/conf/mongod.conf /mongodb/38020/conf/mongod.conf
    
    sed -i 's/38018/38019/g' /mongodb/38019/conf/mongod.conf
    sed -i 's/38018/38020/g' /mongodb/38020/conf/mongod.conf
    

    启动节点

    mongod -f /mongodb/38018/conf/mongod.conf
    mongod -f /mongodb/38019/conf/mongod.conf
    mongod -f /mongodb/38020/conf/mongod.conf
    

    6.2.2 复制集创建

    mongo 127.0.0.1:38018
    
    config = {_id: "configReplSet", members: [
                {_id: 0, host: '127.0.0.1:38018'},
                {_id: 1, host: '127.0.0.1:38019'},
                {_id: 2, host: '127.0.0.1:38020'}
                ]
            }
    
    rs.initiate(config)
    

    6.3 mongos节点

    6.3.1 环境装备

    创建目录

    mkdir -p /mongodb/38017/conf /mongodb/38017/data /mongodb/38017/log
    

    编写配置文件

    cat > /mongodb/38017/conf/mongos.conf <<EOF
    systemLog:
        destination: file
        path: "/mongodb/38017/log/mongos.log"
        logAppend: true
    net:
        port: 38017
        bindIp: 127.0.0.1
    sharding:
        configDB: configReplSet/127.0.0.1:38018,127.0.0.1:38019,127.0.0.1:38020
    processManagement:
        fork: true
    EOF
    

    启动节点

    mongos -f /mongodb/38017/conf/mongos.conf
    

    6.4 将sh添加到集群

    连接到一个mongos(127.0.0.1:38017),做以下配置
    (1)连接到mongos的admin数据库

    mongo 127.0.0.1:38017/admin
    

    (2)添加分片

    db.runCommand({addshard : "sh1/127.0.0.1:38021,127.0.0.1:38022,127.0.0.1:38023",name:"shard1"})
    db.runCommand({addshard : "sh2/127.0.0.1:38024,127.0.0.1:38025,127.0.0.1:38026",name:"shard2"})
    

    (3)列出分片

    db.runCommand( { listshards : 1 } )
    

    (4)整体状态查看

    sh.status()
    

    7 Shard规则

    7.1 Shard功能


    chunk:MongoDB存储数据的基本单位是chunk,缺省chunk的大小是64MB,MongoDB会自动拆分&迁移chunk。
    chunk拆分:

    数据初始会向第1个chunk中存储,当存储量达到64MB时,会分裂为2个32MB的chunk。chunk分裂只在一个shard中进行。
    chunk迁移:

    Mongos中的balancer进程会自动监控chunk在shard中的分布情况,并进行chunk到其他shard的迁移。
    shard key:

    collection的分片键,基于一个或多个列(类似一个索引),可以按照分片键进行Range和Hash分片。
    • 分片键不可变
    • 分片键必须有索引
    • 分片键大小限制512bytes
    • 分片键由于路由查询
    • MongoDB不接受已进行collection级分片的collection上插入无分片键的文档(也不支持空值插入)

    7.2 使用Shard功能

    7.2.1 Range分片配置及测试

    7.2.1.1 激活数据库分片功能

    登录mongosadmin

    mongo --port 38017 admin
    

    开启数据库的分片功能db.runCommand( { enablesharding : "数据库名称" } )

    db.runCommand( { enablesharding : "test" } )
    

    7.2.1.2 指定分片键

    vast集合创建id键索引

    use test
    db.vast.ensureIndex( { id : 1 } )
    
    #参数{ id : 1 }表示索引是升序的,如果为{ id : -1 }表示索引是降序的
    

    开启集合的分片功能

    use admin
    db.runCommand( { shardcollection : "test.vast",key : { id : 1 } } )
    

    7.2.1.3 集合分片验证

    vast集合插入数据

    use test
    for(i=1;i<1000000;i++){ db.vast.insert({"id":i,"name":"shenzheng","age":70,"date":new Date()})}
    

    查看shard中的计数
    shard1

    mongo --port 38021 test
    db.vast.count()
    

    shard2

    mongo --port 38024 test
    db.vast.count()
    

    7.2.2 Hash分片配置及测试

    7.2.2.1 激活数据库分片功能

    登录mongosadmin

    mongo --port 38017 admin
    

    开启数据库的分片功能db.runCommand( { enablesharding : "数据库名称" } )

    db.runCommand( { enablesharding : "bigsky" } )
    

    7.2.2.2 指定分片键

    vast集合创建id键索引

    use bigsky
    db.vast.ensureIndex( { id : "hashed" } )
    

    开启集合的分片功能

    use admin
    sh.shardCollection("bigsky.vast",{id:"hashed"})
    

    7.2.2.3 集合分片验证

    vast集合插入数据

    use bigsky
    for(i=1;i<1000;i++){ db.vast.insert({"id":i,"name":"shenzheng","age":70,"date":new Date()})}
    

    查看shard中的计数
    shard1

    mongo --port 38021 bigsky
    db.vast.count()
    

    shard2

    mongo --port 38024 bigsky
    db.vast.count()
    

    7.3 分片集群信息的查询操作

    7.3.1 判断是否Shard集群

    use admin
    db.runCommand({isdbgrid:1})
    

    7.3.2 列出所有分片信息

    use admin
    db.runCommand({listshards:1})
    

    7.3.3 列出开启分片功能的库

    use config
    db.databases.find({"partitioned":true})
    

    7.3.4 查看分片的片键

    use config
    db.collections.find().pretty()
    

    7.3.5 查看分片的详细信息

    sh.status()
    

    7.3.6 删除分片节点(谨慎)

    (1)确认balancer是否工作

    sh.getBalancerState()
    true
    

    (2)删除shard2节点
    注意:删除操作一定会立即触发balance

    db.runCommand( {removeShard: "shard2"} )
    

    8 Balancer操作

    mongos的一个重要功能,自动巡查所有shard节点上的chunk情况,自动做chunk迁移

    什么时候工作?

    1. 自动运行,会检测系统不繁忙的时候做迁移
    2. 在做节点删除的时候,立即开始迁移工作
    3. balancer只能在预设定的时间窗口内运行

    8.1 开启、关闭Balancer

    #关闭
    sh.stopBalancer()
    #开启
    sh.startBalancer()
    

    8.2 自定义Balancer开启的时间段

    登录mongos

    mongo --port 38017 
    

    设置在3:00到5:00开启Balancer

    use config
    sh.setBalancerState(true)
    db.settings.update({_id: "balancer"},{ $set : { activeWindow : {start : "3:00", stop : "5:00"}}},true)
    

    sh.status()查看结果

    相关文章

      网友评论

          本文标题:二、Mongodb搭建及集群、库和集合的基本操作

          本文链接:https://www.haomeiwen.com/subject/jseurltx.html