zoukankan      html  css  js  c++  java
  • Mongo之架构部署(Replica Sets+Sharding)

    一、环境

    要构建一个 MongoDB Sharding Cluster,需要三种角色:

    Shard Server: mongod 实例,用于存储实际的数据块。

    Config Server: mongod 实例,存储了整个 Cluster Metadata,其中包括 chunk 信息。

    Route Server: mongos 实例,前端路由,客户端由此接入,且让整个集群看上去像单一进程   

     数据库。

    方案一:

    192.168.136.14

    192.168.136.15

    192.168.136.16

    192.168.136.26

    192.168.136.29

    Shard1(master)

    Shard2(master)

    Shard3(master)

    Shard1(slave)

    Shard1(arbiter)

    Shard2(slave)

    Shard3(slave)

    Shard1(slave)

    Shard3(slave)

    Shard2(arbiter)

    Shard3(arbiter)

    Shard1(arbiter)

    Shard2(arbiter)

    Shard2(slave)

    Shard3 (arbiter)

    1.节点:

     S1: 192.168.136..14,192.168.136..26,192.168.136..16,192.168.136.15,192.168.136.29(arbiter)

     S2: 192.168.136.15,192.168.136.26,192.168.136.14,192.168.136.16,192.168.136.29(arbiter)

     S3: 192.168.136.16,192.168.136.26,192.168.136.15,192.168.136.14,192.168.136.29(arbiter)

    c

    主机

    端口信息

    192.168.136.14

    mongod shard1:27017(master)

    mongod shard2:27018(slave)

    mongod shard3:27019(arbiter)

    mongod config:30000

    mongs:40000

    192.168.136.15

    mongod shard1:27017(arbiter)

    mongod shard2:27018(master)

    mongod shard3:27019(slave)

    mongod config:30000

    mongs:40000

    192.168.136.16

    mongod shard1:27017(slave)

    mongod shard2:27018(arbiter)

    mongod shard3:27019(master)

    mongod config:30000

    mongs:40000

    192.168.136.26

    mongod shard1:27017(slave)

    mongod shard2:27018(slave)

    mongod shard3:27019(slave)

    192.168.136.29

    mongod shard1:27017(arbiter)

    mongod shard2:27018(arbiter)

    mongod shard3:27019(arbiter)

    二、安装部署

    软件准备及目录

    1.下载mongodb程序

      curl -O http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-1.8.3.tgz

    2.解压mongodb-linux-x86_64-2.0.0.tgz

      tar zxvf mongodb-linux-x86_64-1.8.3.tgz

    3.重命名mongodb-linux-x86_64-2.0.0.tgzmongodb

      mv mongodb-linux-x86_64-2.0.0 mongodb

    4.进入mongodb目录

      cd mongodb

    5.新建文件夹data

      mkdir data

      mkdir logs

    配置Replica Sets,Config Server

     

    ※配置配置文件conf

    # 1.start_mongod Shard1.conf

    shardsvr=true

    port=27017

    dbpath=/data/database/shard1/

    logpath=/data/logs/shard1.log

    logappend=true

    fork=true

    replSet=s1

    rest=true

    journal=true

    # 2.start_mongod Shard2.conf

    shardsvr=true

    port=27018

    dbpath=/data/database/shard2/

    logpath=/data/logs/shard2.log

    logappend=true

    fork=true

    replSet=s2

    rest=true

    journal=true

     

    # 3.start_mongod Shard3.conf

    shardsvr=true

    port=27019

    dbpath=/data/database/shard3/

    logpath=/data/logs/shard3.log

    logappend=true

    fork=true

    replSet=s3

    rest=true

    journal=true

     

     

     

     

     

    192.168.136.14

    1.创建相应的文件夹(注意此处的testadmin是客户端登陆名)

    mkdir -p /data/database/shard1
    mkdir -p /data/database/shard2
    mkdir -p /data/database/shard3
    mkdir -p /data/database/config

    mkdir -p /data/logs

    2.配置mongod

    ./mongod --config /mongodb/shard1.conf

    ./mongod --config /mongodb/shard2.conf

    ./mongod --config /mongodb/shard3.conf

    ./mongod --config /mongodb/configsvr.conf

    3.查看mongod的进程是否启动

    ps aux | grep mongodb | grep -v grep

    4.初始化replica sets(此处ip是对应的内网IP)

    /testadmin/mongodb/bin/mongo --port 27017

       config = {_id: 's1', members: [{_id: 0,host: '192.168.136.14:27017',priority:5},{_id: 1, host: '192.168.136.26:27017',priority:2},{_id: 2, host: '192.168.136.16:27017',priority:.5},{_id: 3, host: '192.168.136.15:27017',arbiterOnly: true},{_id: 4, host: '192.168.136.29:27017', arbiterOnly: true}]}

         rs.initiate(config)
         rs.status()

    192.168.136.15

    1.创建相应的文件夹(注意此处的testadmin是客户端登陆名)

    mkdir -p /data/database/shard1
    mkdir -p /data/database/shard2
    mkdir -p /data/database/shard3
    mkdir -p /data/database/config

    mkdir -p /data/logs

    2.配置mongod

    ./mongod --config /mongodb/shard1.conf

    ./mongod --config /mongodb/shard2.conf

    ./mongod --config /mongodb/shard3.conf

    ./mongod --config /mongodb/configsvr.conf

    3.查看mongod的进程是否启动

    ps aux | grep mongodb | grep -v grep

    4.初始化replica sets

    /testadmin/mongodb/bin/mongo --port 27018

      config={_id: 's2', members: [{_id: 0, host: '192.168.136.15:27018',priority:5},{_id: 1, host: '192.168.136.26:27018',priority:2},{_id: 2, host: '192.168.136.14:27018',priority:.5},{_id: 3, host: '192.168.136.16:27018', arbiterOnly: true},{_id: 4, host: '192.168.136.29:27018', arbiterOnly: true}]}

      rs.initiate(config)

    192.168.136.16

    1.创建相应的文件夹(注意此处的testadmin是客户端登陆名)

    mkdir -p /data/shard1
    mkdir -p /data/shard2
    mkdir -p /data/shard3
    mkdir -p /data/config

    mkdir -p /data/logs

    2.配置mongod

    ./mongod --config /mongodb/shard1.conf

    ./mongod --config /mongodb/shard2.conf

    ./mongod --config /mongodb/shard3.conf

    ./mongod --config /mongodb/configsvr.conf

    3.查看mongod的进程是否启动

    ps aux | grep mongodb | grep -v grep

    4.初始化replica sets

    /testadmin/mongodb/bin/mongo --port 27019

     config={_id: 's3',members: [{_id: 0, host: '192.168.136.16:27019',priority:5},{_id: 1, host: '192.168.136.26:27019',priority:2},{_id: 2, host: '192.168.136.15:27019',priority:.5},{_id: 3, host: '192.168.136.14:27019', arbiterOnly: true},{_id: 4, host: '192.168.136.29:27019', arbiterOnly: true}]}
    rs.status()

    192.168.136.26,192.168.136.29分别执行如下:

    1.创建相应的文件夹(注意此处的testadmin是客户端登陆名)

    mkdir -p /data/shard1
    mkdir -p /data/shard2
    mkdir -p /data/shard3
    mkdir -p /data/config

    mkdir -p /data/logs

    2.配置mongod

    ./mongod --config /mongodb/shard1.conf

    ./mongod --config /mongodb/shard2.conf

    ./mongod --config /mongodb/shard3.conf

    3.查看mongod的进程是否启动

    ps aux | grep mongodb | grep -v grep

    配置Mongos(在每一台机子上建立路由)

    /mongodb/bin/

    ./mongos --fork --port 40000 --logpath /data/logs/mongos.log --configdb 192.168.136.14:30000,192.168.136.15:30000,192.168.136.16:30000

    添加分片

    1连接任意一台,其他无需这样操作:

    /home/testadmin/bin/mongo --port 40000
    use admin
    db.runCommand({addshard:'s1/192.168.136.14:27017,192.168.136.26:27017,192.168.136.16:27017'}) db.runCommand({addshard:'s2/192.168.136.15:27018,192.168.136.26:27018,192.168.136.14:27018'}) db.runCommand({addshard:'s3/192.168.136.16:27019,192.168.136.26:27019,192.168.136.15:27019'})

    db.runCommand({ listshards:1 })

    db.runCommand({ enablesharding:'weibo' })
    db.runCommand({shardcollection:'weibo.test', key:{_id:1},unique:true}) printShardingStatus()

    db.data.stats();

    三、用户认证

    1.注意1.9.1之前复制集不支持用户认证,只能通过keyFile密匙文件,幸好这几天2.0正式版出来了,很多功能问题都已解决。呵呵

    注意:用户验证,启动mongod必须添加--auth

    #设置用户名和密码

    >use test

    >db.addUser('mongo','456123');

    >db.auth('mongo','456123')

    >db.system.users.find() --查看该用户是否添加成功

    >db.system.users.remove('mongo','456123')

    >mongo 数据库 -u mongo -p

    注意:启动时必须添加--auth用户权限才会生效,第一次配置完成后,没效果就重启下。

    四、鸭梨大了怎么办?添加服务器,怎么样添加呢?

    1.如果读得鸭梨大了,则添加加slave节点,分散读得鸭梨。

    启动后,在primary节点中添加节点

    如:rs.add("10.168.0.100:27017") 当我们看到变为secondary后,就一切正常

    2.如果写的鸭梨打了,则可以添加一组shard节点分散写的鸭梨。

    如:如上所述启动mongod,添加即可。

    五、备份恢复策略

    增量备份(添加延迟备份节点)

    1、利用另外一台secondary机器传送数据

    2、在新机器上中配置文件中添加fastsync=true配置(当需要从有数据中启动节点,那么必须加上fastsync=true否则启动会报错,如果是从主库直接同步所有数据,那么就不需要添加这个参数)

    3、启动后,在primary节点中添加节点

    如:rs.add("10.168.0.102:27017") 当我们看到变为secondary后,就一切正常,可以正常提供线上服务了

    4、通过rs.conf()命令查看现在的节点信息(需要admin库密码权限)

    5rs.remove("10.168.0.102:27017")删除节点

    6、添加arbiter节点:rs.addArb("10.73.24.171:19003")  

    7、添加延时备份机器:

    rs.add({_id:5,host:"10.168.0.102:27017",priority:0,slaveDelay:300});

    rs.add({_id:5,host:"10.168.0.102:27018",priority:0,slaveDelay:300});

    rs.add({_id:5,host:"10.168.0.102:27019",priority:0,slaveDelay:300});

    注意:slaveDelay单位秒.

    8、出现这个错误时:replSet error RS102 too stale to catch up,我们可以db.printReplicationInfo()查看主库、从库的oplog信息

    利用延迟备份节点恢复数据

    1. 先把延迟备份节点的数据,备份到各节点的master机子上。如:

    #./mongodump -h 192.168.136.14:27017 -d weibo -o /data/mongoback/

    #./mongodump -h 192.168.136.15:27018 -d weibo -o /data/mongoback/

    #./mongodump -h 192.168.136.16:27019 -d weibo -o /data/mongoback/

    1. 把备份的数据导入到个节点的master上。如:

    建议先修复下,压缩空间

    db.repairDatabase();修复数据(和压缩(删除数据)空间)

    ./mongorestore -h 127.0.0.1:27017 --directoryperdb /data/mongoback --drop --indexesLast

    ./mongorestore -h 127.0.0.1:27018 --directoryperdb /data/mongoback --drop --indexesLast

    ./mongorestore -h 127.0.0.1:27019 --directoryperdb /data/mongoback --drop --indexesLast

    全量备份(添加延迟备份节点)

    1. 写好脚本定期凌晨备份数据,如:

    ./mongodump -h 10.168.0.187:40000 -d weibo -o /data/mongoback/

    1. 恢复数据
    2. 建议先修复下,压缩空间
    3. db.repairDatabase();修复数据(和压缩(删除数据)空间)

    ./mongorestore -h 10.168.0.187:40000 --directoryperdb /data/mongoback --drop --indexesLast

    六、其他问题~

    1.如果启动不成功,则尝试修复.如:

    ./mongod --port 27017 --repair --dbpath /data/database/shard1/

    2如果master节点kill了,则起来之后通过rs.stepDown(100)让出master的位置。

  • 相关阅读:
    不懂区块链?先来看一下这篇
    ZooKeeper 分布式共享锁的实现
    关于 use-default-filters 属性的说明
    MapReduce 入门之一步步自实现词频统计功能
    Spring、SpringMVC、SpringData + JPA 整合详解
    使用 Hadoop 进行语料处理(面试题)
    顺序线性表 ---- ArrayList 源码解析及实现原理分析
    JPA + SpringData 操作数据库 ---- 深入了解 SpringData
    JPA + SpringData 操作数据库原来可以这么简单 ---- 深入了解 JPA
    JPA + SpringData 操作数据库原来可以这么简单 ---- 深入了解 JPA
  • 原文地址:https://www.cnblogs.com/ritchy/p/9275054.html
Copyright © 2011-2022 走看看