美文网首页
2019-07-08 NoSQL之 MongoDB

2019-07-08 NoSQL之 MongoDB

作者: Ffvc | 来源:发表于2019-07-08 22:21 被阅读0次

    本文档参考 https://www.jianshu.com/p/44499e245b38

    Debain 和 CentOS 区别

    1.软件包管理工具不一样
    2.一些配置文件路径不一样
    3.一些默认设置不一样

    MongoDB应用场景

    1.基于地理位置计算
    
    2.日志存储
    
    3.不同用户不同选项
    
    4.评论信息
    
    5.问卷调查,《易企秀》
    
    MongoDB 应用场景? - 阿里云云栖社区的回答 - 知乎
    https://www.zhihu.com/question/32071167/answer/147896283
    
    

    MongoDB 和 mysql 区别

    mongo
    json 格式          http://www.bejson.com/
    {"FirstName":"ke","LastName":"me","email":"hikeme@aa"}
    格式化之后:
    {
        "FirstName": "zhang",
        "LastName": "ya",
        "email": "zhangya@oldboy.com",
        "job": "linux"
    }
    
    mysql
    user表
    FirstName  LastName  email               job 
    zhang      ya        zhangya@oldboy.com  linux
    

    MongoDB 特点

    1.高性能,尤其是支持嵌入式数据模型减少数据库系统上的I/O操作
    
    2.高可用性,MongoDB的复制工具,副本集,提供自动故障转移的数据冗余
    
    3.水平可扩展性
    
    4.支持多种存储引擎:WiredTiger存储引擎
    

    MongoDB 包含的存储程序

    Drivers
    
    Atlas 云扩展
    
    看不惯云计算公司流氓行为,MongoDB 更改开源协议
    https://www.oschina.net/news/100948/mongodb-switches-up-its-open-source-license
    
    

    安装部署

    安装服务套路:
    
    1.规划目录
    2.下载软件包
    3.解压到指定目录
    4.创建数据目录
    5.创建用户
    6.更改目录、授权
    7.修改配置文件
    8.启动
    9.测试
    10.编写启动关停脚本
    
    yum install libcurl openssl -y
    
    mkdir /opt/mongo_cluster/ -p
    
    #mkdir /data/soft -p
    
    cd /data/soft/
    
    #wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.6.13.tgz
    
    tar zxvf mongodb-linux-x86_64-3.6.13.tgz -C /opt/mongo_cluster/
    
    cd /opt/mongo_cluster/ && ln -s mongodb-linux-x86_64-3.6.13 mongodb
    
    mkdir /opt/mongo_cluster/mongo_27017/{conf,logs,pid} -p
    
    mkdir /data/mongo_cluster/mongo_27017 -p
    
    

    创建完后目录规划:

    image.png
    配置启动

    1. 修改配置文件:

    cat > /opt/mongo_cluster/mongo_27017/conf/monogdb.conf  << EOF
    systemLog:
      destination: file   
      logAppend: true  
      path: /opt/mongo_cluster/mongo_27017/logs/mongodb.log
    
    storage:
      journal:
        enabled: true
      dbPath: /data/mongo_cluster/mongo_27017
      directoryPerDB: true
      wiredTiger:
         engineConfig:
            cacheSizeGB: 1
            directoryForIndexes: true
         collectionConfig:
            blockCompressor: zlib
         indexConfig:
            prefixCompression: true
    
    processManagement:
      fork: true
      pidFilePath: /opt/mongo_cluster/mongo_27017/pid/mongod.pid
    
    net:
      port: 27017
      bindIp: 127.0.0.1,10.0.0.51
    EOF
    
    

    2. 启动命令

    cd /opt/mongo_cluster/
    mongodb/bin/mongod -f mongo_27017/conf/mongodb.conf 
    
    

    3.检查

    ps -ef|grep mongo
    netstat -lntup|grep 27017
    

    4.登录

    mongodb/bin/mongo db01:27017
    

    5.关闭

    mongodb/bin/mongod -f mongo_27017/conf/monogdb.conf --shutdown
    
    

    6.写入环境变量

    echo 'PATH=$PATH:/opt/mongodb/bin' >> /etc/profile
    
    tail -1 /etc/profile
    PATH=$PATH:/opt/mongodb/bin
    
    source /etc/profile
    
    优化警告
     ============= 解决大内存页警告 =============
    
    echo never > /sys/kernel/mm/transparent_hugepage/enabled 
    echo never > /sys/kernel/mm/transparent_hugepage/defrag
    
    vim /etc/init.d/disable-transparent-hugepages
    #!/bin/bash
    ### BEGIN INIT INFO
    # Provides:          disable-transparent-hugepages
    # Required-Start:    $local_fs
    # Required-Stop:
    # X-Start-Before:    mongod mongodb-mms-automation-agent
    # Default-Start:     2 3 4 5
    # Default-Stop:      0 1 6
    # Short-Description: Disable Linux transparent huge pages
    # Description:       Disable Linux transparent huge pages, to improve
    #                    database performance.
    ### END INIT INFO
    
    case $1 in
      start)
        if [ -d /sys/kernel/mm/transparent_hugepage ]; then
          thp_path=/sys/kernel/mm/transparent_hugepage
        elif [ -d /sys/kernel/mm/redhat_transparent_hugepage ]; then
          thp_path=/sys/kernel/mm/redhat_transparent_hugepage
        else
          return 0
        fi
    
        echo 'never' > ${thp_path}/enabled
        echo 'never' > ${thp_path}/defrag
    
        re='^[0-1]+$'
        if [[ $(cat ${thp_path}/khugepaged/defrag) =~ $re ]]
        then
          # RHEL 7
          echo 0  > ${thp_path}/khugepaged/defrag
        else
          # RHEL 6
          echo 'no' > ${thp_path}/khugepaged/defrag
        fi
    
        unset re
        unset thp_path
        ;;
    esac
    
    #授权目录
    chmod 755 /etc/init.d/disable-transparent-hugepages 
    
    #设置开机自启    
    chkconfig --add disable-transparent-hugepages
    
    
    #普通用户启动
    /opt/mongo_cluster/mongodb/bin/mongod -f /opt/mongo_cluster/mongo_27017/conf/mongodb.conf --shutdown
    
    #创建mongo用户、密码、授权
    useradd mongo
    echo '123456'|passwd --stdin mongo
    chown -R mongo:mongo /opt/mongo_cluster
    chown -R mongo:mongo /data/mongo_cluster
    
    #切换用户登陆
    su - mongo
    vim .bashrc 
    export PATH=/opt/mongo_cluster/mongodb/bin:$PATH
    source .bashrc
    mongod -f /opt/mongo_cluster/mongo_27017/conf/mongodb.conf
    mongo
    
     ============= rlimits 警告 =============
    
    vim /etc/profile
    ulimit -u 64000
    source /etc/profile
    重启mongo服务
    
    
    mongo基本操作
    > show databases   #查库
    admin   0.000GB
    config  0.000GB
    local   0.000GB
    
    > show dbs    
    admin   0.000GB
    config  0.000GB
    local   0.000GB
    
    > db
    test
    
    > use local   #切换
    switched to db local
    
    > db    #查看在哪个库
    local
    
    > show tables
    startup_log
    > 
    

    帮助命令

     > help   
     > db.help()
     > db.stats()
    
    #插入数据
    db.test.insert({"name":"zhangya","age":27,"ad":"北京市朝阳区"})
    db.test.insert({"name":"zhangya","age":27,"ad":"北京市朝阳区"})
    db.test.insert({"name":"yazhang","age":28,"ad":"北京市朝阳区"})
    db.test.insert({"name":"xiaozhang","age":28,"ad":"北京市朝阳区"})
    db.test.insert({"name":"xiaozhang","age":28,"ad":"北京市朝阳区","sex":"boy"})
    
    #批量插入多条数据
    db.inventory.insertMany( [
        { "item": "journal", "qty": 25, "size": { "h": 14, "w": 21, "uom": "cm" }, "status": "A" },
        { "item": "notebook", "qty": 50, "size": { "h": 8.5, "w": 11, "uom": "in" }, "status": "A" },
        { "item": "paper", "qty": 100, "size": { "h": 8.5, "w": 11, "uom": "in" }, "status": "D" },
        { "item": "planner", "qty": 75, "size": { "h": 22.85, "w": 30, "uom": "cm" }, "status": "D" },
        { "item": "postcard", "qty": 45, "size": { "h": 10, "w": 15.25, "uom": "cm" }, "status": "A" }
     ]);
    
     
    #查询所有
    db.test.find()
    db.test.findOne()
    db.inventory.find()
    db.inventory.findOne()
    
    #按条件查询
    > db.inventory.find({"status":"D"})
    { "_id" : ObjectId("5d22c043b2adc5091f6ee82a"), "item" : "paper", "qty" : 100, "size" : { "h" : 8.5, "w" : 11, "uom" : "in" }, "status" : "D" }
    { "_id" : ObjectId("5d22c043b2adc5091f6ee82b"), "item" : "planner", "qty" : 75, "size" : { "h" : 22.85, "w" : 30, "uom" : "cm" }, "status" : "D" }
    
    > db.inventory.find({"size.uom":"cm"})
    { "_id" : ObjectId("5d22c043b2adc5091f6ee828"), "item" : "journal", "qty" : 25, "size" : { "h" : 14, "w" : 21, "uom" : "cm" }, "status" : "A" }
    { "_id" : ObjectId("5d22c043b2adc5091f6ee82b"), "item" : "planner", "qty" : 75, "size" : { "h" : 22.85, "w" : 30, "uom" : "cm" }, "status" : "D" }
    { "_id" : ObjectId("5d22c043b2adc5091f6ee82c"), "item" : "postcard", "qty" : 45, "size" : { "h" : 10, "w" : 15.25, "uom" : "cm" }, "status" : "A" }
    
    > db.inventory.find({"size.uom":"cm","qty":{$lt: 50}})
    { "_id" : ObjectId("5d22c043b2adc5091f6ee828"), "item" : "journal", "qty" : 25, "size" : { "h" : 14, "w" : 21, "uom" : "cm" }, "status" : "A" }
    { "_id" : ObjectId("5d22c043b2adc5091f6ee82c"), "item" : "postcard", "qty" : 45, "size" : { "h" : 10, "w" : 15.25, "uom" : "cm" }, "status" : "A" }
    
    > db.inventory.find({"size.uom":"cm","qty":{$eq: 75}})
    { "_id" : ObjectId("5d22c043b2adc5091f6ee82b"), "item" : "planner", "qty" : 75, "size" : { "h" : 22.85, "w" : 30, "uom" : "cm" }, "status" : "D" }
    
    #分解
    db.inventory.find(
            {
            "size.uom":"cm",
            "qty":
                {
                    $lt:50
                }
            }
    )
    
    db.inventory.find( {
        $and : [
            { $or : [ { "status" : "D" }, {"qty":{$lt: 50}} },
            { $or : [ { "status" : "A" }, {"qty":{$lt: 50} } ] }
        ]
    })
     
    #按条件和正则查询
    > myCursor = db.inventory.find( { $or: [ { status: "A" }, { qty: { $lt: 30 } } ] } )
    { "_id" : ObjectId("5d22c043b2adc5091f6ee828"), "item" : "journal", "qty" : 25, "size" : { "h" : 14, "w" : 21, "uom" : "cm" }, "status" : "A" }
    { "_id" : ObjectId("5d22c043b2adc5091f6ee829"), "item" : "notebook", "qty" : 50, "size" : { "h" : 8.5, "w" : 11, "uom" : "in" }, "status" : "A" }
    { "_id" : ObjectId("5d22c043b2adc5091f6ee82c"), "item" : "postcard", "qty" : 45, "size" : { "h" : 10, "w" : 15.25, "uom" : "cm" }, "status" : "A" }
    
    > myCursor = db.inventory.find( {status: "A",$or: [ { qty: { $lt: 30 } }, { item: /^p/ } ]})
    { "_id" : ObjectId("5d22c043b2adc5091f6ee828"), "item" : "journal", "qty" : 25, "size" : { "h" : 14, "w" : 21, "uom" : "cm" }, "status" : "A" }
    { "_id" : ObjectId("5d22c043b2adc5091f6ee82c"), "item" : "postcard", "qty" : 45, "size" : { "h" : 10, "w" : 15.25, "uom" : "cm" }, "status" : "A" }
    
    #分解
    myCursor = db.inventory.find( {
         status: "A",
         $or: [ { qty: { $lt: 30 } }, { item: /^p/ } ]
    } )
    
    #更新语句
    ##更新前数据
    > db.inventory.find({"item":"paper"})
    { "_id" : ObjectId("5d22c043b2adc5091f6ee82a"), "item" : "paper", "qty" : 100, "size" : { "h" : 8.5, "w" : 11, "uom" : "cm" }, "status" : "P", "lastModified" : ISODate("2019-07-08T07:23:31.570Z") }
    
    ##更新语句(更新第一条数据)
    > db.inventory.updateOne({"item":"paper"},{$set:{"size.h":"10","size.w":"15","status":"D"}})
    { "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
    
    ##更新后数据
    > db.inventory.find({"item":"paper"})
    { "_id" : ObjectId("5d22c043b2adc5091f6ee82a"), "item" : "paper", "qty" : 100, "size" : { "h" : "10", "w" : "15", "uom" : "cm" }, "status" : "D", "lastModified" : ISODate("2019-07-08T07:23:31.570Z") }
    
    #删除数据
    ##删除前数据
    > db.inventory.find( {"status" : "D"})
    { "_id" : ObjectId("5d22c043b2adc5091f6ee82a"), "item" : "paper", "qty" : 100, "size" : { "h" : "10", "w" : "15", "uom" : "cm" }, "status" : "D", "lastModified" : ISODate("2019-07-08T07:23:31.570Z") }
    { "_id" : ObjectId("5d22c043b2adc5091f6ee82b"), "item" : "planner", "qty" : 75, "size" : { "h" : 22.85, "w" : 30, "uom" : "cm" }, "status" : "D" }
    
    ##删除语句(删除第一条数据)
    > db.inventory.deleteOne(
    ... {"status" : "D"}
    ... )
    { "acknowledged" : true, "deletedCount" : 1 }
    
    ##删除后数据
    > db.inventory.find( {"status" : "D"})
    { "_id" : ObjectId("5d22c043b2adc5091f6ee82b"), "item" : "planner", "qty" : 75, "size" : { "h" : 22.85, "w" : 30, "uom" : "cm" }, "status" : "D" }
    
    
    mongo 分析工具,系统自带
    [mongo@db01 ~]$ mongotop
    2019-07-08T15:39:09.899+0800    connected to: 127.0.0.1
    
                        ns    total    read    write    2019-07-08T15:39:10+08:00
        admin.system.roles      0ms     0ms      0ms                             
      admin.system.version      0ms     0ms      0ms                             
    config.system.sessions      0ms     0ms      0ms                             
         local.startup_log      0ms     0ms      0ms                             
      local.system.replset      0ms     0ms      0ms                             
            test.inventory      0ms     0ms      0ms                             
                 test.test      0ms     0ms      0ms 
      
    
    [mongo@db01 ~]$ mongostat
    insert query update delete getmore command dirty used flushes vsize   res qrw arw net_in net_out conn                time
        *0    *0     *0     *0       0     1|0  0.0% 0.0%       0  972M 45.0M 0|0 1|0   156b   59.9k    1 Jul  8 15:38:53.268
        *0    *0     *0     *0       0     1|0  0.0% 0.0%       0  972M 45.0M 0|0 1|0   157b   60.5k    1 Jul  8 15:38:54.270
        *0    *0     *0     *0       0     2|0  0.0% 0.0%       0  972M 45.0M 0|0 1|0   158b   60.7k    1 Jul  8 15:38:55.268
    
    
    用户授权认证
    use admin
    db.createUser(
        {
            user: "admin",
            pwd: "123456",
            roles:[ { role: "root", db:"admin"}]}
    )
    
    修改配置文件
    vim /opt/mongo_cluster/mongo_27017/conf/mongodb.conf
    security:
      authorization: enabled
    
    重启服务
    mongod -f /opt/mongo_cluster/mongo_27017/conf/mongodb.conf --shutdown
    mongod -f /opt/mongo_cluster/mongo_27017/conf/mongodb.conf
    
    登录
    [mongo@db01 ~]$ mongo -uadmin -p
    MongoDB shell version v3.6.13
    Enter password: 
    connecting to: mongodb://127.0.0.1:27017/?gssapiServiceName=mongodb
    Implicit session: session { "id" : UUID("b97926dc-1614-4da8-96c0-67d8e930b195") }
    MongoDB server version: 3.6.13
    > show dbs
    admin   0.000GB
    config  0.000GB
    local   0.000GB
    test    0.000GB
    
    
    1.使用admin用户登录 
    mongo -uadmin -p 
    show dbs 
    
    2.切换到test库,并创建一个用户赋予不同库的不同角色
    use test
    db.createUser(
      {
        user: "myTester",
        pwd: "xyz123",
        roles: [ { role: "readWrite", db: "test" },
                 { role: "read", db: "test2" } ]
      }
    )
    
    3.在test库下插入测试数据 
    db.test.insert({"name":"zhangya","age":27,"ad":"北京市朝阳区"})
    db.test.insert({"name":"zhangya","age":27,"ad":"北京市朝阳区"})
    db.test.insert({"name":"yazhang","age":28,"ad":"北京市朝阳区"})
    db.test.insert({"name":"xiaozhang","age":28,"ad":"北京市朝阳区"})
    
    4.在test2库下插入测试数据
    use test2
    db.test2.insert({"name":"zhangya","age":27,"ad":"北京市昌平区"})
    db.test2.insert({"name":"zhangya","age":27,"ad":"北京市昌平区"})
    db.test2.insert({"name":"yazhang","age":28,"ad":"北京市昌平区"})
    
    5.使用myTester用户登录到test验证库
    mongo -umyTester -pxyz123 db01:27017/test
    show dbs 
    db 
    
    6.切换到test库,测试能否读写
    use test
    db.test.insert({"name":"58NB","age":27,"ad":"北京市朝阳区"})
    db.test.find()
    
    7.切换到test2库,测试能否读写
    use test2
    db.test2.insert({"name":"58NB","age":27,"ad":"北京市昌平区"})
    db.test2.find()
    
    
    副本集配置
     [mongo@db01 ~]$ 下执行
    
    1.创建配置文件目录
    mkdir -p /opt/mongo_cluster/mongo_2801{7,8,9}/{conf,logs,pid}
    
    
    2.修改副本集配置文件
    cat >/opt/mongo_cluster/mongo_28017/conf/mongo_28017.conf <<EOF
    systemLog:
      destination: file   
      logAppend: true  
      path: /opt/mongo_cluster/mongo_28017/logs/mongodb.log
    
    storage:
      journal:
        enabled: true
      dbPath: /data/mongo_cluster/mongo_28017
      directoryPerDB: true
      wiredTiger:
         engineConfig:
            cacheSizeGB: 0.5 
            directoryForIndexes: true
         collectionConfig:
            blockCompressor: zlib
         indexConfig:
            prefixCompression: true
    
    processManagement:
      fork: true
      pidFilePath: /opt/mongo_cluster/mongo_28017/pid/mongod.pid
    
    net:
      port: 28017
      bindIp: 127.0.0.1,10.0.0.51
    
    replication:
       oplogSizeMB: 1024 
       replSetName: dba58 
    EOF
    
    3.复制配置文件到其他目录
    cp /opt/mongo_cluster/mongo_28017/conf/mongo_28017.conf /opt/mongo_cluster/mongo_28018/conf/mongo_28018.conf
    cp /opt/mongo_cluster/mongo_28017/conf/mongo_28017.conf /opt/mongo_cluster/mongo_28019/conf/mongo_28019.conf
    
    4.修改配置文件里的端口
    sed -i 's#28017#28018#g' /opt/mongo_cluster/mongo_28018/conf/mongo_28018.conf  
    sed -i 's#28017#28019#g' /opt/mongo_cluster/mongo_28019/conf/mongo_28019.conf
    
    5.创建数据目录
    mkdir /data/mongo_cluster/mongo_2801{7,8,9}
    
    6.启动多实例
    mongod -f /opt/mongo_cluster/mongo_28017/conf/mongo_28017.conf 
    mongod -f /opt/mongo_cluster/mongo_28018/conf/mongo_28018.conf 
    mongod -f /opt/mongo_cluster/mongo_28019/conf/mongo_28019.conf
    
    7.初始化副本集
    mongo db01:28017
    > config = {
    _id : "dba58", 
    members : [
    {_id : 0, host : "db01:28017"},
    {_id : 1, host : "db01:28018"},
    {_id : 2, host : "db01:28019"},
    ] }
    rs.initiate(config) 
    
    8.查看副本集状态
    dba58:PRIMARY> rs.status()
    {
        "set" : "dba58",
        "date" : ISODate("2019-07-08T09:50:16.711Z"),
        "myState" : 1,
        "term" : NumberLong(1),
        "syncingTo" : "",
        "syncSourceHost" : "",
        "syncSourceId" : -1,
        "heartbeatIntervalMillis" : NumberLong(2000),
        "optimes" : {
            "lastCommittedOpTime" : {
                "ts" : Timestamp(1562579412, 3),
                "t" : NumberLong(1)
            },
            "readConcernMajorityOpTime" : {
                "ts" : Timestamp(1562579412, 3),
                "t" : NumberLong(1)
            },
            "appliedOpTime" : {
                "ts" : Timestamp(1562579412, 3),
                "t" : NumberLong(1)
            },
            "durableOpTime" : {
                "ts" : Timestamp(1562579412, 3),
                "t" : NumberLong(1)
            }
        },
        "members" : [
            {
                "_id" : 0,
                "name" : "db01:28017",
                "health" : 1,
                "state" : 1,
                "stateStr" : "PRIMARY",
                "uptime" : 1805,
                "optime" : {
                    "ts" : Timestamp(1562579412, 3),
                    "t" : NumberLong(1)
                },
                "optimeDate" : ISODate("2019-07-08T09:50:12Z"),
                "syncingTo" : "",
                "syncSourceHost" : "",
                "syncSourceId" : -1,
                "infoMessage" : "",
                "electionTime" : Timestamp(1562579282, 1),
                "electionDate" : ISODate("2019-07-08T09:48:02Z"),
                "configVersion" : 1,
                "self" : true,
                "lastHeartbeatMessage" : ""
            },
            {
                "_id" : 1,
                "name" : "db01:28018",
                "health" : 1,
                "state" : 2,
                "stateStr" : "SECONDARY",
                "uptime" : 145,
                "optime" : {
                    "ts" : Timestamp(1562579412, 3),
                    "t" : NumberLong(1)
                },
                "optimeDurable" : {
                    "ts" : Timestamp(1562579412, 3),
                    "t" : NumberLong(1)
                },
                "optimeDate" : ISODate("2019-07-08T09:50:12Z"),
                "optimeDurableDate" : ISODate("2019-07-08T09:50:12Z"),
                "lastHeartbeat" : ISODate("2019-07-08T09:50:16.648Z"),
                "lastHeartbeatRecv" : ISODate("2019-07-08T09:50:15.644Z"),
                "pingMs" : NumberLong(0),
                "lastHeartbeatMessage" : "",
                "syncingTo" : "db01:28017",
                "syncSourceHost" : "db01:28017",
                "syncSourceId" : 0,
                "infoMessage" : "",
                "configVersion" : 1
            },
            {
                "_id" : 2,
                "name" : "db01:28019",
                "health" : 1,
                "state" : 2,
                "stateStr" : "SECONDARY",
                "uptime" : 145,
                "optime" : {
                    "ts" : Timestamp(1562579412, 3),
                    "t" : NumberLong(1)
                },
                "optimeDurable" : {
                    "ts" : Timestamp(1562579412, 3),
                    "t" : NumberLong(1)
                },
                "optimeDate" : ISODate("2019-07-08T09:50:12Z"),
                "optimeDurableDate" : ISODate("2019-07-08T09:50:12Z"),
                "lastHeartbeat" : ISODate("2019-07-08T09:50:16.648Z"),
                "lastHeartbeatRecv" : ISODate("2019-07-08T09:50:15.648Z"),
                "pingMs" : NumberLong(0),
                "lastHeartbeatMessage" : "",
                "syncingTo" : "db01:28017",
                "syncSourceHost" : "db01:28017",
                "syncSourceId" : 0,
                "infoMessage" : "",
                "configVersion" : 1
            }
        ],
        "ok" : 1,
        "operationTime" : Timestamp(1562579412, 3),
        "$clusterTime" : {
            "clusterTime" : Timestamp(1562579412, 3),
            "signature" : {
                "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
                "keyId" : NumberLong(0)
            }
        }
    }
    
    
    权重调整+主库降级
    1.查看配置信息
    rs.conf()
    
    2.配置权重
    config = rs.conf()
    config.members[2].priority=100
    
    3.重新导入配置信息
    rs.reconfig(config)
    
    4.主库降级,发起重新选举 
    rs.stepDown()
    
    5.恢复成默认权重
    config = rs.conf()
    config.members[2].priority=1
    rs.reconfig(config) 
    rs.stepDown()
    
    
    增加节点
    1.安装配置启动新节点
    mkdir /opt/mongo_cluster/mongo_28010/{conf,logs,pid} -p
    
    mkdir /data/mongo_cluster/mongo_28010
    
    cp /opt/mongo_cluster/mongo_28017/conf/mongo_28017.conf /opt/mongo_cluster/mongo_28010/conf/mongo_28010.conf
    
    sed -i 's#28017#28010#g' /opt/mongo_cluster/mongo_28010/conf/mongo_28010.conf
    
    mongod -f /opt/mongo_cluster/mongo_28010/conf/mongo_28010.conf
    
    mongo db01:28010
    
    2.主库执行添加新节点操作
    use admin
    rs.add("db01:28010")
    
    删除旧节点
    1.主库操作,删除旧节点
    mongo db01:28017
    rs.remove("db01:28010")
    
    2.节点下线
    mongod -f /opt/mongo_cluster/mongo_28010/conf/mongo_28010.conf --shutdown
    
    
    添加仲裁节点
    1.清空28010节点的数据
    rm -rf /data/mongo_cluster/mongo_28010/*
    
    2.重新启动
    mongod -f /opt/mongo_cluster/mongo_28010/conf/mongo_28010.conf
    
    3.检查
    mongo db01:28010
    
    4.主库操作
    mongo db01:28017
    rs.addArb("db01:28010")
    
    5.查看节点状态
    mongo db01:28010
    
    
    数据备份导出
    创建备份目录并授权(注意在不同用户下操作)
    [root@db01 ~]# mkdir /backup
    [root@db01 ~]# chown -R mongo:mongo /backup/
    
    导出数据
    [mongo@db01 ~]$ mongoexport --port 28017 -d test -c inventory -o /backup/log.json
    2019-07-08T19:20:43.728+0800    connected to: localhost:28017
    2019-07-08T19:20:43.729+0800    exported 5 records
    
    查看导出数据
    [mongo@db01 /backup]$ cat log.json 
    {"_id":{"$oid":"5d23149b20a88ce703b89dbf"},"item":"journal","qty":25.0,"size":{"h":14.0,"w":21.0,"uom":"cm"},"status":"A"}
    {"_id":{"$oid":"5d23149b20a88ce703b89dc0"},"item":"notebook","qty":50.0,"size":{"h":8.5,"w":11.0,"uom":"in"},"status":"A"}
    {"_id":{"$oid":"5d23149b20a88ce703b89dc1"},"item":"paper","qty":100.0,"size":{"h":8.5,"w":11.0,"uom":"in"},"status":"D"}
    {"_id":{"$oid":"5d23149b20a88ce703b89dc2"},"item":"planner","qty":75.0,"size":{"h":22.85,"w":30.0,"uom":"cm"},"status":"D"}
    {"_id":{"$oid":"5d23149b20a88ce703b89dc3"},"item":"postcard","qty":45.0,"size":{"h":10.0,"w":15.25,"uom":"cm"},"status":"A"}
    
    
    备份恢复
    导出
    mongoexport --port 28017 -d dba -c inventory -o /backup/log.json
    mongoexport --port 28017 -d dba -c inventory --type=csv -f item,qty,size,status  -o /backup/log.csv
    
    导入
    mongoimport --port 28017 -d oldboy -c inventory /backup/log.json
    
    导入CSV
    mongoimport  --port 28017 -d dba58 -c log2 --type=csv --headerline -f item,qty,size,status  --file  /backup/log.csv
    
    mysql导出csv
    select * from world.city into outfile '/tmp/city1.csv' fields terminated by ',';
    
    导入csv
    mongoimport --port 28017  -d world  -c city --type=csv -f ID,Name,CountryCode,District,Population --file  /tmp/city1.csv
    
    全备
    mongodump  --port 28017 -o /data/backup
    
    只备一个库
    mongodump  --port 28017 -d world -o /data/backup
    
    恢复:
    mongorestore --port 28017 -d world1  /data/backup/world/
    
    恢复之前先删除
    mongorestore --port 28017 -d world1  /data/backup/world/  --drop
    
    

    今天回顾:

    1.sql和nosql关系
    
    2.mongo介绍
    
    3.mongo的应用场景
    
    4.安装部署
    
    5.修改配置文件,启动关闭
    
    6.优化警告
    
    7.插入
    - 单条插入
    - 多条插入
    
    8.查询
    - 查询所有
    - 按条件查询
    - 按条件和正则查询
    
    9.更新
    
    10.删除
    - 按条件删除
    - 删除整个库或者表
    
    11.授权
    - 创建admin用户
    - 创建普通用户授予不同角色和不同权限
    
    12.副本集操作
    - 配置文件添加副本集参数
    - 启动所有节点
    - 配置副本集命令
    - 初始化副本集
    - 故障转移
    - 增加节点
    - 删除节点
    - 仲裁节点
    - 权重调整,主库降级
    - 故障案例,4台竞争,只剩一台,老张的忧伤
    
    13.工具使用
    mongostat 
    mongotop
    
    14.备份恢复
    mongoexport/mongoimport:json csv
    - 异构平台迁移  mysql  <---> mongodb
    mongodump/mongorestore
    -日常备份恢复时使用.
    
    15.故障恢复案例
    - 全备
    - 误操作
    - 查询误操作时间点
    - 备份oplog
    - 恢复到误操作时间点以前的数据
    - 检查数据是否恢复完整
    
    

    报错记录1

    主库插入数据
    dba58:PRIMARY> 
    db.inventory.insertMany( [
        { "item": "journal", "qty": 25, "size": { "h": 14, "w": 21, "uom": "cm" }, "status": "A" },
        { "item": "notebook", "qty": 50, "size": { "h": 8.5, "w": 11, "uom": "in" }, "status": "A" },
        { "item": "paper", "qty": 100, "size": { "h": 8.5, "w": 11, "uom": "in" }, "status": "D" },
        { "item": "planner", "qty": 75, "size": { "h": 22.85, "w": 30, "uom": "cm" }, "status": "D" },
        { "item": "postcard", "qty": 45, "size": { "h": 10, "w": 15.25, "uom": "cm" }, "status": "A" }
     ]);
    
    从库查看数据
    dba58:SECONDARY> show tables
    2019-07-08T18:03:06.965+0800 E QUERY    [thread1] Error: listCollections failed: {
        "operationTime" : Timestamp(1562580184, 1),
        "ok" : 0,
        "errmsg" : "not master and slaveOk=false",
        "code" : 13435,
        "codeName" : "NotMasterNoSlaveOk",
        "$clusterTime" : {
            "clusterTime" : Timestamp(1562580184, 1),
            "signature" : {
                "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
                "keyId" : NumberLong(0)
            }
        }
    } :
    _getErrorWithCode@src/mongo/shell/utils.js:25:13
    DB.prototype._getCollectionInfosCommand@src/mongo/shell/db.js:941:1
    DB.prototype.getCollectionInfos@src/mongo/shell/db.js:953:19
    DB.prototype.getCollectionNames@src/mongo/shell/db.js:964:16
    shellHelper.show@src/mongo/shell/utils.js:853:9
    shellHelper@src/mongo/shell/utils.js:750:15
    @(shellhelp2):1:1
    
    
    临时解决
    dba58:SECONDARY> rs.slaveOk()
    
    永久解决
    [mongo@db01 ~]$ echo "rs.slaveOk();" >> .mongorc.js
    [mongo@db01 ~]$ cat .mongorc.js 
    rs.slaveOk();
    
    

    报错记录2

    从库执行命令
    db.inventory.deleteOne( {"item" : "journal"})
    
    2019-07-08T18:03:45.247+0800 E QUERY    [thread1] WriteCommandError: not master :
    WriteCommandError({
        "operationTime" : Timestamp(1562580215, 1),
        "ok" : 0,
        "errmsg" : "not master",
        "code" : 10107,
        "codeName" : "NotMaster",
        "$clusterTime" : {
            "clusterTime" : Timestamp(1562580215, 1),
            "signature" : {
                "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
                "keyId" : NumberLong(0)
            }
        }
    })
    
    问题原因:
    从库不能执行增删改命令
    
    

    报错记录3

    2019-07-08T18:58:31.608+0800 I NETWORK  [thread1] trying reconnect to db01:28010 (10.0.0.51) failed
    2019-07-08T18:58:31.609+0800 I NETWORK  [thread1] reconnect db01:28010 (10.0.0.51) ok
    dba58:OTHER> 
    dba58:OTHER> 
    
    问题原因:
    不在集群内或者被集群移除了
    
    

    报错记录4

    > db.test.insert({"name":"yazhangya","age":27,"ad":"北京市朝阳区"})
    WriteResult({
        "writeError" : {
            "code" : 13,
            "errmsg" : "not authorized on test2 to execute command { insert: \"test\", ordered: true, lsid: { id: UUID(\"01431e12-5d4a-47a9-8ac4-657ab08fda7c\") }, $db: \"test2\" }"
        }
    })
    
    问题原因:
    当前登录的用户对这个库没有写入权限
    
    

    相关文章

      网友评论

          本文标题:2019-07-08 NoSQL之 MongoDB

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