运维相关之mongodb部署安装

一、简介

MongoDB(来自于英文单词“Humongous”,中文含义为“庞大”)是可以应用于各种规模的企业、各个行业以及各类应用程序,基于分布式文件存储的数据库,由 C++ 语言编写,旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。

二、 集群架构

三种集群方式:Master-Slave主从结构、Relica Set副本集方式、Sharding分片技术

三、副本集部署

    1) 三台机器,下载mongoDB并安装
    2) 配置三台MongoDB(包括数据路径、日志路径、pid路径)
  

systemLog:
    destination: file
    path: "/usr/local/mongodb/logs/mongodb.log"
net:
    port: 27017
    bindIp: 0.0.0.0
processManagement:
    fork: true
storage:
    dbPath: /usr/local/mongodb/data
    engine: wiredTiger
    #engine: mmapv1
    directoryPerDB: true
#replication:
    #replSetName: zdvictory
#security:
    # keyFile: /usr/local/mongodb/mongodb.keyfile


    3) 启动三台MongoDB,然后随便登录一台进行配置
        > use admin
        > cfg = {_id: "ynzw",members:[{_id: 0,host: '10.211.55.10:27017',priority: 3},{_id: 1,host: '10.211.55.10:27018',priority: 2},{_id: 2,host: '10.211.55.10:27019',priority: 1}]};
        > rs.initiate(cfg)    #使配置生效
    4) 检查是否生效
        ynzw:SECONDARY> rs.status() 
    5) 副本集更新
        # 向副本集中添加成员
        rs.add("172.16.250.240:27017")
 
        # 从副本集中删除成员
        rs.remove("172.16.250.240:27017")
 
        # 向副本集中添加仲裁
        rs.addArb("172.16.250.240:27017")
 
        # 向副本集中添加备份节点
        rs.add({"_id":3,"host":"172.16.250.240:27017","priority":0,"hidden":true})
        
    6) 修改副本级别,强制让某个为主
        #查询级别
        rs.config()
        
        cfg = rs.conf()
        cfg.members[0].priority = 5
        cfg.members[1].priority = 1
        cfg.members[2].priority = 1
        rs.reconfig(cfg)
    7) 添加认证
        #首先先添加超级管理员用户
        > use admin
        switched to db admin
        > db.createUser({user:"myroot",pwd:"123456",roles:["root"]})
        Successfully added user: { "user" : "myroot", "roles" : [ "root" ] }
        > db.auth("myroot","123456")
        1
        > use articledb
        switched to db articledb
        > db.createUser({user: "bobo", pwd: "123456", roles: ["readWrite"]})
        Successfully added user: { "user" : "bobo", "roles" : [ "readWrite" ] }
        
        #创建副本认证key
        openssl rand -base64 745 > mongodb.keyfile
        chmod 600 mongodb.keyfile
        集群所有集群需要使用同一个文件(可使用远程主机拷贝或是上传)
        
        #修改配置,所有节点
        security:
             keyFile: /usr/local/mongodb/mongodb.keyfile
        
        #重启所有节点

    8) 备注
        已尝试关闭主副本,级别高的副本会自动成为主副本,当原来主副本启动后,会自动变成主副本

 

四、Sharding分片部署

    1) 规划
    IP                    Mongos端口        config端口        分片1端口        分片2端口         分片3端口
    192.168.116.158        27017            20000            27018            27019            27020
    192.168.116.159        27017            20000            27018            27019            27020
    192.168.116.160        27017            20000            27018            27019            27020
    
    2) 每个节点操作
    2.1 下载https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel62-4.2.6.tgz
    2.2 解压文件 tar –zxvf mongodb-linux-x86_64-rhel62-4.2.6.tgz
    2.3 mv mongodb-linux-x86_64-rhel62-4.2.6 /data/mongodb
    2.4 配置host
        echo "192.168.116.158     mongo-server1" >> /etc/hosts
        echo "192.168.116.159     mongo-server2" >> /etc/hosts
        echo "192.168.116.160     mongo-server3" >> /etc/hosts
    2.5  启动配置文件存放的文件夹:mkdir -p /data/mongodb/conf/{config.conf,shard1.conf,shard2.conf,shard3.conf,mongos.conf}
    2.6  配置服务数据存放目录:       mkdir -p /data/mongodb/data/config
    2.7  分片1服务数据存放目录:   mkdir -p /data/mongodb/data/shard1 
    2.8  分片2服务数据存放目录:   mkdir -p /data/mongodb/data/shard2 
    2.9  分片3服务数据存放目录:   mkdir -p /data/mongodb/data/shard3
    2.10 配置服务日志存放文件:    mkdir -p /data/mongodb/log/config.log
    2.11 路由服务日志存放文件:    mkdir -p /data/mongodb/log/mongos.log 
    2.12 分片1服务日志存放文件:   mkdir -p /data/mongodb/log/shard1.log
    2.13 分片2服务日志存放文件:   mkdir -p /data/mongodb/log/shard2.log 
    2.14 分片3服务日志存放文件:   mkdir -p /data/mongodb/log/shard3.log
    
    3) 配置config集群(每个节点操作)
    3.1 vi /data/mongodb/conf/config.conf

dbpath=/data/mongodb/data/config  #数据存放路径
logpath=/data/mongodb/log/config.log  #日志存放路径
port=20000        #端口
logappend=true  #持续写入日志
fork=true        #后台运行
maxConns=5000    #最大连接5000
replSet=configs    #复制集名称
configsvr=true    #配置参数为true,标识配置服务器
bind_ip=0.0.0.0    #允许任意机器连接

        
    3.2 分别启动三台服务器的配置服务
        /data/mongodb/bin/mongod -f /data/mongodb/conf/config.conf
    
    3.3 连接任意一台机器执行:
        /data/mongodb/bin/mongo --port 20000
        use admin
        rs.initiate({_id:"configs",members:[{_id:0,host:"mongo-server1:20000"},{_id:1,host:"mongo-server2:20000"}, {_id:2,host:"mongo-server3:20000"}]})
        rs.status()
        
    4) 配置分片集群(每个节点操作)
        vi /data/mongodb/conf/shard1.conf
        dbpath=/data/mongodb/data/shard1  #数据存放路径
        logpath=/data/mongodb/log/shard1.log  #日志存放路径
        port=27018        #端口
        logappend=true  #持续写入日志
        fork=true        #后台运行
        maxConns=5000    #最大连接5000
        replSet=shard1    #分片集名称
        shardsvr=true    #配置参数为true,标识分片服务器
        bind_ip=0.0.0.0    #允许任意机器连接    

        vi /data/mongodb/conf/shard2.conf
        dbpath=/data/mongodb/data/shard2  #数据存放路径
        logpath=/data/mongodb/log/shard2.log  #日志存放路径
        port=27019        #端口
        logappend=true  #持续写入日志
        fork=true        #后台运行
        maxConns=5000    #最大连接5000
        replSet=shard2    #分片集名称
        shardsvr=true    #配置参数为true,标识分片服务器
        bind_ip=0.0.0.0    #允许任意机器连接

        vi /data/mongodb/conf/shard3.conf
        dbpath=/data/mongodb/data/shard3  #数据存放路径
        logpath=/data/mongodb/log/shard3.log  #日志存放路径
        port=27020        #端口
        logappend=true  #持续写入日志
        fork=true        #后台运行
        maxConns=5000    #最大连接5000
        replSet=shard3    #分片集名称
        shardsvr=true    #配置参数为true,标识分片服务器
        bind_ip=0.0.0.0    #允许任意机器连接    
        
        #分别启动三台服务器的分片服务
        /data/mongodb/bin/mongod -f /data/mongodb/conf/shard1.conf
        /data/mongodb/bin/mongod -f /data/mongodb/conf/shard2.conf
        /data/mongodb/bin/mongod -f /data/mongodb/conf/shard3.conf
        
        #连接任意一台机器执行:
        #分片1操作
        /data/mongodb/bin/mongo --port 27018
        use admin
        rs.initiate({_id:"shard1",members:[{_id:0,host:"mongo-server1:27018"},{_id:1,host:"mongo-server2:27018"},{_id:2,host:"mongo-server3:27018"}]})
        rs.status()
        
        #分片2操作
        /data/mongodb/bin/mongo --port 27019
        use admin
        rs.initiate({_id:"shard2",members:[{_id:0,host:"mongo-server1:27019"},{_id:1,host:"mongo-server2:27019"},{_id:2,host:"mongo-server3:27019"}]})
        rs.status()    
        
        #分片3操作
        /data/mongodb/bin/mongo --port 27020
        use admin
        rs.initiate({_id:"shard3",members:[{_id:0,host:"mongo-server1:27020"},{_id:1,host:"mongo-server2:27020"},{_id:2,host:"mongo-server3:27020"}]})
        rs.status()        
        
    5) 配置mongos路由集群(每个节点操作)
    5.1 vi /data/mongodb/conf/mongos.conf
        logpath=/data/mongodb/log/mongos.log  #日志存放路径
        port=27017        #端口
        logappend=true  #持续写入日志
        fork=true        #后台运行
        maxConns=300    #最大连接300
        configdb=configs/mongo-server1:20000,mongo-server2:20000,mongo-server3:20000  #config集群地址
        bind_ip=0.0.0.0    #允许任意机器连接
        
    5.2 分别启动三台服务器的配置服务
        /data/mongodb/bin/mongos -f /data/mongodb/conf/mongos.conf
    
    5.3 连接任意一台机器执行:
        /data/mongodb/bin/mongo --port 27017
        use admin
        sh.addShard("shard1/mongo-server1:27018,mongo-server2:27018,mongo-server3:27018")
        sh.addShard("shard2/mongo-server1:27019,mongo-server2:27019,mongo-server3:27019")
        sh.addShard("shard3/mongo-server1:27020,mongo-server2:27020,mongo-server3:27020")
        rs.status()        
        
    6) 实现分片功能
        /data/mongodb/bin/mongo --port 27017
        use config
        db.setting.save({"_id":"chunksize","value":128})  #128M1个chunk,进行shard负载均衡的数据单元
        sh.enableSharding("orcl") #开启对orcl库的分片
        use orcl
        db.user.createIndex({"userid":1})   #创建photo集合以"age"作为索引
        #根据"id"对photo表分片,后面的key是根据哪个字段来进行分片这里设置的是age,
        #然后下面循环插入的时候age填的是i它就可以根据这个字段平均的分配到各个分片里
        sh.shardCollection('orcl.user',{"userid":1})
        use admin
        db.runCommand({"shardcollection":"orcl.photo","key":{age:1}});
        
        #查看分片分布
        sh.status()
        
    
    7) 测试分片功能
        /data/mongodb/bin/mongo --port 27017
        use orcl
        #循环插入10万条数据
        for (var i=1;i<=100000;i++){
        db.user.insert({name:"ksx",userid:i})};
        #查看是否有10万条数据
        db.photo.count()
        
        #登录分片1,查看有多少条数据
        /data/mongodb/bin/mongo --port 27018
        use orcl
        db.photo.count()
        
        #登录分片2,查看有多少条数据
        /data/mongodb/bin/mongo --port 27019
        use orcl
        db.photo.count()        

    8) 增加验证
    8.1 生成秘钥文件
    openssl rand -base64 756 > /data/mongodb/conf/keyfile
    chmod 400 /data/mongodb/conf/keyfile
    #将keyfile复制到三台机器上
    
    8.2 修改配置文件
    #在每台的config server,shard1,shard2,shard3配置文件里都加入下面的配置
    security:
        keyFile: /data/mongodb/conf/keyfile
        authorization: enabled
        
    #或者是yaml样式配置
    auth=true
    keyFile = /data/mongodb/conf/keyfile
    
    #mongos比mongod少了authorization:enabled的配置
    #每台机器上的mongos配置文件中加入下面一段配置
    security:
        keyFile: /data/mongodb/conf/keyfile
    
    8.3 新增管理用户并重启实例
    #连接任意一台机器的mongos
    /data/mongodb/bin/mongo --port 27017
    #添加root权限用户
    > use admin
    > db.createUser(
    {
    user:"myroot",
    pwd:"123456",
    roles:[{role:"root"}]
    }
    )
    Successfully added user: { "user" : "myroot", "roles" : [ "root" ] }
    #添加普通数据库权限用户        
    > use articledb
    switched to db articledb
    > db.createUser({user: "bobo", pwd: "123456", roles: ["readWrite"]})
    Successfully added user: { "user" : "bobo", "roles" : [ "readWrite" ] }        
    
    #创建用户后,重启所有MongoDB实例
    先停mongos、然后分片、然后config
    启动的顺序则反过来

 

五、其他相关操作

    1) 开启慢日志记录
        1.1 状态码及相关描述
            0: 关闭慢查询
            1: 超过阈值的查询收集(大于slowms日志)
            2: 为所有数据库开启慢查询记录(所有日志)
        1.2 shell命令启动
            #开启慢查询,超过300毫秒的就记录
            use orcl
            db.setProfilingLevel(1,300)
            #查询慢查询级别和其他信息
            db.getProfilingStatus()
            #查询慢查询级别
            db.getProfilingLevel()
            #关闭慢查询
            db.setProfilingLevel(0)
        1.2 通过配置启动
            在配置文件mongodb.conf添加以下参数
            profile = 1
            slowms = 300
            
        1.2.1 通过配置文件启动
            operationProfiling:
                slowOpThresholdMs: 3000 //记录查询时间大于3秒的日志,默认记录大于200毫秒
                mode: slowOp            //off:关闭慢日志,slowOp:只记录上面配置的参数操作记录,on:开启所有日志
            
        1.3 慢查询常用命令
            #查询最近10个慢查询
            db.system.profile.find().limit(10).sort({ts:-1}).pretty()
            #查询除命令类型为‘command’的日志
            db.system.profile.find({op:{$ne:'command'}}).pratty()
            #查询数据库为mydb集合为test的日志
            db.system.profile.find({ns:'mydb.test'}).pretty()
            #查询大于100ms的查询的20条记录
            db.system.profile.find({millis:{$gt:100}}).limit(20).pretty()
            #查询时间从2018-12-09 3点整到2018-12-09 3点30分之间的日志
            db.system.profile.find({ts:{$gt:new ISODate("2018-12-09T03:00:00Z"),$lt:new ISODate("2018-12-09T03:30:00Z")}}).pretty()
    2) 创建索引
        #col 集合名,3.0.0 之前也可以用ensureIndex()来创建,是createIndex的别名,1为指定按升序创建索引
        db.col.createIndex({"title":1}) 
        #查看集合索引
        db.col.getIndexes()
        #查看集合索引大小
        db.col.totalIndexSize()
        #删除指定索引
        db.col.dropIndex({"title"}:1)
        
    3) 清理日志
        #方法一,Linux下MongoDB服务接受一个kill -SGIUSR1命令后就立刻将当前日志文件重命名为代日期的文件,然后重新创建新的日志文件
        kill -SGIUSR1 (mongodb pid) 
        #方法二,在mongodb命令台执行,立刻将当前日志文件重命名为代日期的文件,然后重新创建新的日志文件
        mongodb 192.168.6.129:27018
        use admin
        db.auth("myroot","123456")
        db.adminCommand({logRotate:1})
        
    4) 导入导出
        #导出
        [root@tbase01 mongodb]# ./bin/mongoexport --host 192.168.130.64 --username orcladmin --password pwd123 --port 37017 -d orcl -c col -o /root/m.data
        #m.data 里面的内容为以下
        {"_id":{"$oid":"5ffbae69db29d24771ad7755"},"title":"MongoDB ","by":"123","tags":["mongodb","database","NoSQL"],"likes":100.0}
        {"_id":{"$oid":"5ffbb38f7be0dc6f40e8160b"},"title":"MongoDB 2","by":"123","tags":["mongodb","database","NoSQL"],"likes":200.0}
        #导入
        [root@tbase01 mongodb]# ./bin/mongoimport --host 192.168.130.64 --username orcladmin --password pwd123 --port 37017 -d orcl -c col2 /root/m.data
        
    5) 删除重复数据v3.4版本
        db.getCollection('col').aggregate({'$group':{'_id':{'title':'$title'},'dups':{'$addToSet':'$_id'},'count':{'$sum':1}}},{'$match':{ 'count':{'$gt':1}}})
        #查询重复数据,集合为col,以title排序,使用$addToSet在返回结果数组中增加_id字段,count汇总有多少条数据,match过滤大于1条数据的列
        
        db.getCollection('col').aggregate(
            {'$group':{'_id':{'title':'$title'},'dups':{'$addToSet':'$_id'},'count':{'$sum':1}}},{'$match':{ 'count':{'$gt':1}}}
        ).forEach(function(doc){doc.dups.shift();db.col.remove({_id:{$in:doc.dups}});})
        #删除重复数据,使用forEach循环根据_id删除数据,doc.dups.shift();表示从数组第一个值开始删除,不加会删除掉所有匹配数据
        
    6) GridFS文件操作
        #添加文件到orcl数据库
        /usr/local/mongodb/bin/mongofiles --host 192.168.130.64 --port 37017 --username orcladmin --password 123456 -d orcl put QQ20201229102100.png
        #查看文件信息和chunks集合
        db.fs.files.find()
        db.fs.chunks.find({} ,"data":0})#可以过滤二进制信息
        #下载文件
        /usr/local/mongodb/bin/mongofiles --host 192.168.130.64 --port 37017 --username orcladmin --password 123456 -d orcl get QQ20201229102100.png
        #删除文件,如果多个文件都是同一个名称,删除时将会全部删掉
        /usr/local/mongodb/bin/mongofiles --host 192.168.130.64 --port 37017 --username orcladmin --password 123456 -d orcl delete QQ20201229102100.png
        #删除后磁盘不会释放空间,需执行
        db.repairDatabase()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值