mongodb复制集

mongodb复制集技术

mongodb复制结构功能

  • 1、failover过程
    选主
    切换
  • 2、是否对应用透明化
    vip
  • 3、数据补偿的问题
    两阶段数据补偿
    对于mysql用的MHA+vip+binlogserver

mongodb通过复制集技术就可以很好的解决以上所有问题
不需要第三方任何的辅助软件。自己原生态支持的。基于paxos和RAFT算法,带有投票功能,一种分布算法协议。

Replcation Set配置过程详解

1、规划

三个以上的mongodb节点(或多实例)
多实例:

  • 1.多个端口:29017、29018、29019、29020
  • 2.多套目录:
    mkdir -p /mongodb/290{17..20}/{conf,data,log}
  • 3.多套配置文件
    touch /mongodb/290{17..20}/conf/mongod.conf
  • 4.配置文件

配置文件内容如下

    cat /mongodb/29017/conf/mongod.conf
    systemLog:  
      destination: file  
      path: /mongodb/29017/log/mongodb.log  
      logAppend: true  
    storage:  
      journal:  
        enabled: true  
      dbPath: /mongodb/29017/data  
      directoryPerDB: true  
      #engine: wiredTiger  
      wiredTiger:  
        engineConfig:  
          cacheSizeGB: 1  
          directoryForIndexes: true  
        collectionConfig:  
          blockCompressor: zlib  
        indexConfig:  
          prefixCompression: true  
    processManagement:  
      fork: true  
    net:  
      port: 29017  
    replication:  
      oplogSizeMB: 2048  
      replSetName: my_repl  

复制并修改配置文件

\cp  /mongodb/29017/conf/mongod.conf          /mongodb/290{18..20}/conf/

//修改端口
sed 's#29017#29018#g'     /mongodb/29018/conf/mongod.conf -i

sed 's#29017#29019#g'     /mongodb/29019/conf/mongod.conf -i

sed 's#29017#29020#g'     /mongodb/29020/conf/mongod.conf -i

//修改属主和属组
chown -R mongod:mongod /mongodb

多实例部署脚本

#!/bin/bash  
id mongod &>/dev/null  
if [ $? == 0 ];then  
    :  
else  
    groupadd -g 800 mongod&&useradd -u 801 -g mongod  
fi  
a=1  
for i in 290{17..20};do  
    [ -d /application/mongodb/$i ] && : || mkdir -p  /application/mongodb/$i/{conf,data,log}  
    cat >/application/mongodb/$i/conf    /mongodb.conf <<EOF  
systemLog:  
  destination: file  
  path: /application/mongodb/$i/log/m  ongodb.log  
  logAppend: true  
storage:  
  journal:  
    enabled: true  
  dbPath: /application/mongodb/$i/dat  a  
  directoryPerDB: true  
  #engine: wiredTiger  
  wiredTiger:  
    engineConfig:  
      cacheSizeGB: 1  
      directoryForIndexes: true  
    collectionConfig:  
      blockCompressor: zlib  
    indexConfig:  
      prefixCompression: true  
processManagement:  
  fork: true  
net:  
  port: $i  
replication:  
  oplogSizeMB: 2048  
  replSetName: my_repl  
EOF  
   chown -R mongod:mongod    /application/mongodb/*  
done  
  • 5.启动多个实例备用

      su - mongod  
      mongod -f  /mongodb/29017/conf/mongod.        conf  
      mongod -f  /mongodb/29018/conf/mongod.        conf  
      mongod -f  /mongodb/29019/conf/mongod.        conf  
      mongod -f  /mongodb/29020/conf/mongod.        conf  
    

多实例命令脚本

#!/bin/bash
#chkconfig: 2345 80 90
#description:mongodb
MONGODIR=/application/mongodb
MONGOD=$MONGODIR/bin/mongod
. /etc/init.d/functions
start() {
  for i in 290{17..20};do
    MONGOCONF=$MONGODIR/$i/conf/mongo       db.conf
    su - mongod -c "$MONGOD -f      $MONGOCONF"
    [ $? == 0 ] && action $0        /bin/true || action $0 /bin/false
  done
}

stop() {
  for i in 290{17..20};do
    MONGOCONF=$MONGODIR/$i/conf/mongo       db.conf
    su - mongod -c "$MONGOD -f      $MONGOCONF --shutdown"
    [ $? == 0 ] && action $0        /bin/true || action $0 /bin/false
  done
}
case "$1" in
  start)
 start
 ;;
  stop)
 stop
 ;;
  restart)
 stop
sleep 2
 start
 ;;
  *)
 echo $"Usage: $0   {start|stop|restart}"
 exit 1
esac

2、配置复制集:

  • 1.一主两从,从库是两个普通从库

      //在primary节点进行配置操作  
      mongo --port 29017  
     //设置复制集参数信息  
      >use admin
      >config = {_id: 'my_repl', members: [
                                {_id: 0,host:'10.0.0.220:29017'}   ,
                                {_id: 1,host:'10.0.0.220:29018'}   ,
                                {_id: 2,host:'10.0.0.220:29019'}   ]
                }
    
      //初始化复制集
      >rs.initiate(config) 
    
  • 2.一主两从,有一个是arbiter(投票节点,只参与投票不参与数据复制)

      >config = {_id: 'my_repl', members: [
                        {_id: 0, host: '10.0.0.52:29017'},
                        {_id: 1, host: '10.0.0.52:29018'},
                        {_id: 2, host: '10.0.0.52:29019',"arbiterOnly":true}]
        }
      >rs.initiate(config) 
    
  • 3、复制集测试:

      my_repl:PRIMARY> db.movies.insert([ 
      ... { "title" : "Jaws", "year" :1975,"imdb_rating" : 8.1 },
      ... { "title" : "Batman", "year" :1989, "imdb_rating" : 7.6 },
      ... ] );
      //成功结果  
      BulkWriteResult({  
          "writeErrors" : [ ],  
          "writeConcernErrors" : [ ],  
          "nInserted" : 2,  
          "nUpserted" : 0,  
          "nMatched" : 0,  
          "nModified" : 0,  
          "nRemoved" : 0,  
          "upserted" : [ ]  
      })
    

切换到从库19,18或20查看

mongo --port 29018    
my_repl:SECONDARY> db.movies.find().pretty();
**在mongodb复制集当中,默认从库不允许读写。**
//要打开读写功能,需要如下参数
rs.slaveOk();
my_repl:SECONDARY> db.movies.find().pretty(); 
  • 4、复制集管理操作:

    • 1.查看复制集状态:

      rs.status();//查看整体复制集状态     
      rs.isMaster();//查看当前是否是主节点
      
    • 2.添加删除节点

      rs.add("ip:port"); //新增普通从节点
      rs.addArb("ip:port"); //新增仲裁节点
      rs.remove("ip:port"); //删除一个节点
      

    注:添加特殊节点时,
    1.可以在搭建过程中设置特殊节点;
    2.可以通过修改配置的方式将普通从节点 设置为特殊节点;
    找到需要改为延迟性同步的数组号;

      >config = {_id: 'my_repl', members: [
                        {_id: 0, host: '10.0.0.220:29017'},
                        {_id: 1, host: '10.0.0.220:29018'},
                        {_id: 2, host: '10.0.0.220:29019',"arbiterOnly":true}]}  
    
    • 3.配置延时节点(一般延时节点也配置成hidden)

      cfg=rs.conf()  
      cfg.members[2].priority=0    
      //members[N]  
      //[N]代表_id号码,选择操作对象     
      //priority设定为0,代表不被选主,但参与投票过程
      cfg.members[2].slaveDelay=120  
      //slaveDelay=120  //延时120秒      
      cfg.members[2].hidden=true  
      //hidden=true
      //代表设置为隐藏节点
      
      rs.reconfig(cfg) 
      
    • 4.更新复制集的ip或端口

      cfg=rs.conf()    
      cfg.members[0].host=[newip:port]
      cfg.members[1].host=[newip:port]
      cfg.members[2].host=[newip:port]
      rs.reconfig(cfg)
      

    配置投票节点
    cfg=rs.conf()
    cfg.members[2].arbiterOnly=true //arbiterOnly=true,代表设置为投票节点,不复制数据
    rs.reconfig(cfg)

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

      rs.conf(); 
      
  • 5、副本集其他操作命令:

    • 查看副本集的配置信息

      admin> rs.config()  
      
    • 查看副本集各成员的状态

      admin> rs.status()
      
    • 副本集角色切换(不要人为顺便操作)

      admin> rs.stepDown()
      

    注:
    admin> rs.freeze(300)
    //锁定从,使其不会转变成主库
    freeze()和stepDown单位都是秒。

    • 设置副本节点可读:在副本节点执行

      admin> rs.slaveOk()
      

    例:

    admin> use app  
    switched to db app  
    app> db.createCollection('a')  
    { "ok" : 0, "errmsg" : "not   master", "code" : 10107 }  
    
    • 查看副本节点

      admin> rs.printSlaveReplicationInfo()
      source: 192.168.1.22:27017
      syncedTo: Thu May 26 2016 10:28:56 GMT+0800 (CST)
      0 secs (0 hrs) behind the primary  
      

复制集重点掌握内容:
1、mongodb实现过程(raft)
2、搭建
3、添加删除节点
4、节点特性设置

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,701评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,649评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,037评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,994评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,018评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,796评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,481评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,370评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,868评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,014评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,153评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,832评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,494评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,039评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,156评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,437评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,131评论 2 356

推荐阅读更多精彩内容