• mongodb配置


    Mongodb
    1. 安装
    2. CRUD
    3. 索引
    4. 副本及(replica sets)
    5. 分片(sharding)


    nosql
    简单数据模型
    元数据和应用数据分离
    弱一致性

    优势:
    避免不必要的复杂性
    高吞吐量
    高水平扩展能力和低端硬件集群
    不实用对象 - 关系映射

    劣势
    不支持ACID
    功能简单


    面向collection的数据库
    数据库: 数据库无须创建
    表:行 《----》 集合 :文档
    集合无须事先定义:

    [root@localhost data]# wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-3.2.9.tgz

    groupadd -r mongodb
    useradd -M -r -g mongodb -d /data/mongodb -s /bin/false mongodb

    mkdir -p /data/mongodb
    mkdir -p /data/mongodb/var/log/

    chown mongodb.mongodb /data/mongodb

    mongod --config /data/mongodb/etc/mongod.conf


    db.user.insert({
    name:"fengjian",
    age:25,status:1,
    groups:["news","sports"]
    })

    > db.user.find({age:{$gt:22}}).sort({age:1})
    { "_id" : ObjectId("57bb5ad01346de1830c26aa2"), "name" : "feng", "age" : 24, "status" : 1, "groups" : [ "news", "sports" ] }
    { "_id" : ObjectId("57bb5a4d1346de1830c26aa1"), "name" : "fengjian", "age" : 25, "status" : 1, "groups" : [ "news", "sports" ] }
    > db.user.find({age:{$gt:22}}).sort({age:-1})
    { "_id" : ObjectId("57bb5a4d1346de1830c26aa1"), "name" : "fengjian", "age" : 25, "status" : 1, "groups" : [ "news", "sports" ] }
    { "_id" : ObjectId("57bb5ad01346de1830c26aa2"), "name" : "feng", "age" : 24, "status" : 1, "groups" : [ "news", "sports" ] }


    > db.user.find({age:{$lt:25}}).limit(1)
    db.user.find({age:{$lt:25}},{name:1,status:1}).limit(1)


    mysql 与 mongodb 查询对比

    mysql: select name,age from su where age<38

    显示name 和 age 的字段,mongodb 先写查询条件
    mongodb: db.su.find({age: {$lt: 38}},{name:1},{age: 1})

    mysql 与 mongodb 插入对比

    mysql: insert into user values("su",24,"boy")
    mongodb: db.su.insert({name: "su",age: 24, sex: "boy"})

    mysql 与 mongodb update对比
    mysql: update su set name="feng" where age > 18
    db.su.update({age: 33}},{$set: {su:"zhang"}},{multi: true}

    {multi: true} 修改满足条件的所有数据

    mysql 与 mongodb delete对比
    mysql: delete from su where age = 18;
    mongodb: db.su.remove({age: 33}) // db.su.remove({name: "su"})

    添加创建99个用户
    for(i=1;i<100;i++) db.su.insert({name: "User"+i,age:i,sex: "boy",book: ["book1","book2"]})

    删除
    db.su.remove({name: "User12"})

    修改
    > db.su.update({name: "User1"},{$set: {age:99}})
    WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

    显示name和age age等于20的
    db.su.find({age: {$eq: 20}},{name: 1,age: 1})

    查询年龄 age 大于 80 ,小于 90的数据
    db.su.find({$and: [{age: {$gt:80}},{age: {$lt: 90}}]})

    查询名字是User80 或者 age小于15的数据
    db.su.find({$or: [{name: {$eq: "User80"}},{age: {$lt:15}}]})


    查询名字是User80 或者 age小于15的数据,只显示name数据
    db.su.find({$or: [{name: {$eq: "User80"}},{age: {$lt:15}}]},{name:1})


    元素查询

    如果要根据文档中是否存在某字段等条件来挑选文档,则需要用到元素运算
    $exists: 根据制定字段的存在性 挑选文档,"{field: {$exists:<boolean>}}",指定 <boolean>的值为true,返回
    存在指定字段的文档,false则返回不存在制定字段的文档:

    $mod: 将指定字段的值进行取模运算,并返回其余数为指定值的文档:语法为 "{field: {$mod: [divisor,remainder]}}"

    $type: 返回制定的值类型为指定类型的文档,语法格式“{field: {$type:<BSON type>}}”

    全表扫描

    索引的优点:
    1、减少了服务器需要扫描的数据量
    2、索引帮助服务器减少排序或临时表的使用
    3、索引可以将随机I/O 转变成顺序I/O


    索引:三星
    一星: 索引如果能将相关的记录放置在一起
    二星: 索引中数据的存储顺序与查询找标准中顺序一致
    三星: 如果索引中包含查询中所需要的全部数据:(覆盖索引)


    索引类别:
    1. 顺序索引
    2. 散列索引:将索引映射至散列桶上,映射是通过散列函数进行的

    顺序索引的特性:
    全值匹配: Name = “user12”
    匹配最左前缀: Name LIKE “User1%” , 无效 Name LIKE "%User%"

    组合索引:(age,name) age > 90 and name = "user12"

    mongodb 创建索引

    db.mycoll.ensureIndex(keypattern[,options]) - DEPRECATED, use createIndex() instead

    再name上创建索引
    > db.su.ensureIndex({name:1})
    {
    "createdCollectionAutomatically" : false,
    "numIndexesBefore" : 1,
    "numIndexesAfter" : 2,
    "ok" : 1
    }

    查询索引
    > db.su.getIndexes()
    [
    {
    "v" : 1,
    "key" : {
    "_id" : 1
    },
    "name" : "_id_",
    "ns" : "testdb.su"
    },
    {
    "v" : 1,
    "key" : {
    "name" : 1
    },
    "name" : "name_1",
    "ns" : "testdb.su"
    }
    ]

    删除索引

    > db.su.dropIndex("name")
    {
    "nIndexesWas" : 2,
    "ok" : 0,
    "errmsg" : "index not found with name [name]",
    "code" : 27
    }


    创建唯一索引
    > db.su.ensureIndex({name:1},{unique:true})

    创建稀疏索引
    > db.su.ensureIndex({name:1},{sparce:true})


    显示详细信息
    > db.su.find({name: "User19"}).explain()
    {
    "queryPlanner" : {
    "plannerVersion" : 1,
    "namespace" : "testdb.su",
    "indexFilterSet" : false,
    "parsedQuery" : {
    "name" : {
    "$eq" : "User19"
    }
    },
    "winningPlan" : {
    "stage" : "FETCH",
    "inputStage" : {
    "stage" : "IXSCAN",
    "keyPattern" : {
    "name" : 1
    },
    "indexName" : "name_1",
    "isMultiKey" : false,
    "isUnique" : false,
    "isSparse" : false,
    "isPartial" : false,
    "indexVersion" : 1,
    "direction" : "forward",
    "indexBounds" : {
    "name" : [
    "["User19", "User19"]"
    ]
    }
    }
    },
    "rejectedPlans" : [ ]
    },
    "serverInfo" : {
    "host" : "localhost.localdomain",
    "port" : 27017,
    "version" : "3.2.9",
    "gitVersion" : "22ec9e93b40c85fc7cae7d56e7d6a02fd811088c"
    },
    "ok" : 1
    }


    使用hint制定使用的索引
    > db.su.find({name: "User18"}).hint({name:1}).explain()


    创建组合索引
    > db.su.ensureIndex({name:1,age:1})

    {
    "v" : 1,
    "key" : {
    "name" : 1,
    "age" : 1
    },
    "name" : "name_1_age_1",
    "ns" : "testdb.su"
    }




    Oplog Size
    Storage Engine Default Oplog Size Lower Bound Upper Bound
    In-Memory Storage Engine 5% of physical memory 50 MB 50 GB
    WiredTiger Storage Engine 5% of free disk space 990 MB 50 GB
    MMAPv1 Storage Engine 5% of free disk space 990 MB 50 GB


    mongodb replica set 副本集 3台服务器

    简单定义 配置文件

    bind_ip = 0.0.0.0

    fork = true

    logappend=true

    port = 27017

    dbpath=/data/mongodb/data

    pidfilepath=/data/mongodb/run/mongo.pid

    logpath=/data/mongodb/log/mongod.log

    replSet = testtrs0

    [root@mongo~] # /data/mongodb/bin/mongod -f /data/mongodb/etc/mongo.cfg

    > rs.help()

    > rs.status()
    {
    "info" : "run rs.initiate(...) if not yet done for the set",
    "ok" : 0,
    "errmsg" : "no replset config has been received",
    "code" : 94
    }

    测试环境使用最简单的初始化
    > rs.initiate()
    {
    "info2" : "no configuration specified. Using a default configuration for the set",
    "me" : "mongodb1:27017",
    "ok" : 1
    }

    再查看状态
    testtrs0:OTHER> rs.status()
    {
    "set" : "testtrs0",
    "date" : ISODate("2016-09-17T11:44:25.991Z"),
    "myState" : 1,
    "term" : NumberLong(1),
    "heartbeatIntervalMillis" : NumberLong(2000),
    "members" : [
    {
    "_id" : 0,
    "name" : "mongodb1:27017",
    "health" : 1,
    "state" : 1,
    "stateStr" : "PRIMARY",
    "uptime" : 548,
    "optime" : {
    "ts" : Timestamp(1474112614, 1),
    "t" : NumberLong(1)
    },
    "optimeDate" : ISODate("2016-09-17T11:43:34Z"),
    "infoMessage" : "could not find member to sync from",
    "electionTime" : Timestamp(1474112613, 2),
    "electionDate" : ISODate("2016-09-17T11:43:33Z"),
    "configVersion" : 1,
    "self" : true
    }
    ],
    "ok" : 1
    }

    添加新节点
    testtrs0:PRIMARY> rs.add("192.168.1.103:27017")
    { "ok" : 1 }

    testtrs0:PRIMARY> rs.add("192.168.1.104:27017")
    { "ok" : 1 }


    设置某节点的优先级

    testtrs0:PRIMARY> cfg=rs.conf()
    {
    "_id" : "testtrs0",
    "version" : 3,
    "protocolVersion" : NumberLong(1),
    "members" : [
    {
    "_id" : 0,
    "host" : "mongodb1:27017",
    "arbiterOnly" : false,
    "buildIndexes" : true,
    "hidden" : false,
    "priority" : 1,
    "tags" : {

    },
    "slaveDelay" : NumberLong(0),
    "votes" : 1
    },
    {
    "_id" : 1,
    "host" : "192.168.1.103:27017",
    "arbiterOnly" : false,
    "buildIndexes" : true,
    "hidden" : false,
    "priority" : 1,
    "tags" : {

    },
    "slaveDelay" : NumberLong(0),
    "votes" : 1
    },
    {
    "_id" : 2,
    "host" : "192.168.1.104:27017",
    "arbiterOnly" : false,
    "buildIndexes" : true,
    "hidden" : false,
    "priority" : 1,
    "tags" : {

    },
    "slaveDelay" : NumberLong(0),
    "votes" : 1
    }
    ],
    "settings" : {
    "chainingAllowed" : true,
    "heartbeatIntervalMillis" : 2000,
    "heartbeatTimeoutSecs" : 10,
    "electionTimeoutMillis" : 10000,
    "getLastErrorModes" : {

    },
    "getLastErrorDefaults" : {
    "w" : 1,
    "wtimeout" : 0
    },
    "replicaSetId" : ObjectId("57dd2c65a94722c11cf7e0d6")
    }
    }


    testtrs0:PRIMARY> cfg.members[0].priority = 1
    1
    testtrs0:PRIMARY> cfg.members[1].priority = 3
    3
    testtrs0:PRIMARY> cfg.members[2].priority = 2
    2

    重新载入cfg
    testtrs0:PRIMARY> rs.reconfig(cfg)
    { "ok" : 1 }

    优先级已经改变
    testtrs0:PRIMARY> rs.conf()
    {
    "_id" : "testtrs0",
    "version" : 4,
    "protocolVersion" : NumberLong(1),
    "members" : [
    {
    "_id" : 0,
    "host" : "mongodb1:27017",
    "arbiterOnly" : false,
    "buildIndexes" : true,
    "hidden" : false,
    "priority" : 1,
    "tags" : {

    },
    "slaveDelay" : NumberLong(0),
    "votes" : 1
    },
    {
    "_id" : 1,
    "host" : "192.168.1.103:27017",
    "arbiterOnly" : false,
    "buildIndexes" : true,
    "hidden" : false,
    "priority" : 3,
    "tags" : {

    },
    "slaveDelay" : NumberLong(0),
    "votes" : 1
    },
    {
    "_id" : 2,
    "host" : "192.168.1.104:27017",
    "arbiterOnly" : false,
    "buildIndexes" : true,
    "hidden" : false,
    "priority" : 2,
    "tags" : {

    },
    "slaveDelay" : NumberLong(0),
    "votes" : 1
    }
    ],
    "settings" : {
    "chainingAllowed" : true,
    "heartbeatIntervalMillis" : 2000,
    "heartbeatTimeoutSecs" : 10,
    "electionTimeoutMillis" : 10000,
    "getLastErrorModes" : {

    },
    "getLastErrorDefaults" : {
    "w" : 1,
    "wtimeout" : 0
    },
    "replicaSetId" : ObjectId("57dd2c65a94722c11cf7e0d6")
    }
    }



    mongodb sharding分片配置

    mongos(router) //app server
    |
    | config server
    |
    sharding

    mongos 192.168.1.106
    config server 192.168.1.103
    shard1 192.168.1.104
    shard2 192.168.1.107


    一. 配置config server

    默认监听27019端口,可以使用如下命令启动mongod进程

    # mongod --configsvr --dbpath <path> --port <port>

    也可以直接编辑配置文件,如下:
    dbpath = /somewhere
    configsvr = true
    /data/mongodb/bin/mongod -f /data/mongodb/etc/mongo.cfg --shutdown

    二 配置mongos实例

    mongos 属于轻量级应用,完全可以与其他服务运行于同一个节点:启动时,需要为mongos实例指明各config服务器的访问地址

    默认情况下, mongos监听于27017端口,可以使用如下命令配置mongos实例

    mongos --configdb <config server hostnames((IP|Hostname):Port)>

    也可以直接编辑配置文件

    1.注释dbpath指令
    2.添加configdb指令,并制定config服务器地址:


    bind_ip = 0.0.0.0

    fork = true

    logappend=true

    #port = 27017

    #dbpath=/data/mongodb/data

    pidfilepath=/data/mongodb/run/mongo.pid

    logpath=/data/mongodb/log/mongod.log

    configdb=config:27019,config2:27019,config3:27019

    而后使用如下命令启动mongos实例:

    #mongos -f /etc/mongopd.conf



    三 配置好各副本集或独立的mongod实例

    [root@shard2 ~]# cat /data/mongodb/etc/mongo.cfg
    bind_ip = 0.0.0.0

    fork = true

    logappend=true

    port = 27017

    dbpath=/data/mongodb/data

    pidfilepath=/data/mongodb/run/mongo.pid

    logpath=/data/mongodb/log/mongod.lo


    /data/mongodb/bin/mongod -f /data/mongodb/etc/mongo.cfg

    四、向分区集群中添加各shard服务器或副本集

    4.1 添加方式

    使用mongo命令连接mongos实例,命令如下格式:

    #mongo --host <hostname of machine running mongos> --port <port mongos listens on>

    在任意节点连接mongos服务器,所有操作必须通过mongos服务器操作

    [root@shard2 bin]# ./mongo --host 192.168.1.106:27017

    接着使用sh.addShard()方法添加各shard至集群中

    如果添加的shard是副本集,需要使用如下格式:

    sh.addShard("RS_NAME/RS_SERVER:Port")

    例如: sh.addShard("rs0/mongodb0.magedu.com:27017")

    如果添加的shard 是独立的mongod实例,则使用如下方式:

    sh.addShard("RS_SERVER:Port")

    暂时为做副本集
    1.把192.168.1.104 加入到sharding中
    mongos> sh.addShard("192.168.1.104:27017")
    { "shardAdded" : "shard0000", "ok" : 1 }

    2.把192.168.1.104 加入到sharding中
    mongos> sh.addShard("192.168.1.107:27017")
    { "shardAdded" : "shard0000", "ok" : 1 }

    3.查看

    mongos> sh.status()
    --- Sharding Status ---
    sharding version: {
    "_id" : 1,
    "minCompatibleVersion" : 5,
    "currentVersion" : 6,
    "clusterId" : ObjectId("57dd416ed2336438497022cd")
    }
    shards:
    { "_id" : "shard0000", "host" : "192.168.1.104:27017" }
    { "_id" : "shard0001", "host" : "192.168.1.107:27017" }
    active mongoses:
    "3.2.9" : 1
    balancer:
    Currently enabled: yes
    Currently running: no
    Failed balancer rounds in last 5 attempts: 0
    Migration Results for the last 24 hours:
    No recent migrations
    databases:


    4.数据库 启动分区功能,默认,不启动,都回保存到主sharding上
    testdb 启动Sharding功能
    mongos> sh.enableSharding("testdb")
    { "ok" : 1 }

    5. 对collections进行顺序分区, 一个数据库中有多个collections,未必所有的collection都分区,
    要想让collections使用分区功能,必须使用sh.sharCollection 功能简单,明确说明对那个表进行分区,并
    指明分区的key

    例: 对testdb.sutable(全名),name 和 Age 进行分区
    sh.sharCollection("testdb.sutable",{name: 1, Age:1})


    mongos> db.sutable.ensureIndex({age:1,name:1})
    {
    "raw" : {
    "192.168.1.107:27017" : {
    "createdCollectionAutomatically" : false,
    "numIndexesBefore" : 1,
    "numIndexesAfter" : 2,
    "ok" : 1
    }
    },
    "ok" : 1
    }
    mongos> sh.shardCollection("feng.sutable",{age: 1,name: 1})
    { "collectionsharded" : "feng.sutable", "ok" : 1 }

    use testdb
    for(i=1;i<1000;i++) db.sutable.insert({name: "User"+i,age:i,sex: "boy",book: ["book1","book2"]})

  • 相关阅读:
    JavaScript高度和宽度详解
    VC6程序图标
    VC++中的Dlg,App,Doc,view
    Vista桌面图标无法拖动
    VC2008中IE8脚本错误问题解决
    单文件安装包制作(转)
    AutoResetEvent与ManualResetEvent区别
    纯JavaScript中调用WebServices
    动态加载程序集Assembly.Load
    VC++小知识积累
  • 原文地址:https://www.cnblogs.com/fengjian2016/p/5816644.html
Copyright © 2020-2023  润新知