您的位置:首页 > 数据库 > Mongodb

mongodb基础系列—主从复制具体搭建以及解说

2013-12-18 17:46 543 查看
距离上次的mongodb有一段日子了,当时说好了要尽快更新这块,但是由于各种事情,就暂时搁置下来。回头看看自己第一篇博客,竟然是半年以前,oh,my god,我和我的小伙伴们都惊呆了。

       不过还是鼓起勇气,go on……

       以前博客中,也曾介绍过java操作mongodb的事例,那么这篇博客就不再介绍命令行下增删改查了。因为mongodb集成了shell命令,同时对javascript也有很好的集成,在命令行下就可以操作简单的javascript。

      比如for 循环。 for(var i=0;i<3;i++){db.my.insert({name:"test",age:18})} 其中my是自定义集合collection。你可以试试,肯定没问题,若有问题,直接call me

      之所以不过多介绍这块,因为在控制台下可以直接查看其api,并且mongodb有方法补全功能哦,类似java ide环境,再次方便了我们。

      在控制台下,按一次tab键,mongodb可以自动补全,这就是shell命令的好处。同时,在控制台下,直接敲相应的方法,不要加括号,即可打印其api哦。比如db.my.update;快试试哦。

     OK,转到今天的主题。

     主从复制:master-slave模式。通俗的来说,主服务器copy到从服务器中,从而保证了两者同步一致。这样的好处就不言而喻喽,若主服务器坏了,哈哈,莫怕,从服务器中还有哩。但是从服务器中有归有哈,却不能自动转正哈。【咋感觉有点像小妾呢,O(∩_∩)O】

      不过啊,先不说他的缺点,来看看他的优点,人呢,就不能太贪,一口可不能吃个胖子哦。

      主从复制,自动保持同步,这样就不用咱们手动维护喽。以前原来的项目,咋保证数据的安全呢?首先insert到这个数据库中,因为当时数据很重要,所以需要备份,然后insert success后,再insert another database中。所以在测试insert功能时,就可以去喝杯咖啡~\(≧▽≦)/~啦

       手动测试一下这个功能。

       


1.准备阶段:因为一个服务器,所以建两个文件夹来模拟:master文件夹、slave文件夹。注意开启两个不同的端口。

2.启动主节点:mongod --dbpath E:\E:\mastersavle\master --port 10000 --master

启动从节点:mongod --dbpath E:\E:\mastersavle\master\slave --port 10001 --slave --source localhost:10000

   注意是两个控制台哦。

          启动效果如下:

    


3.再开启一个窗口,连接10000主服务器。然后我们插入一条数据,然后看效果。

默认是连接test服务器,那么使用类似mysql的use 切换数据库。 use my; 注意:执行这条语句,若存在my数据库,则直接切换,若不存在,则隐含创建一个,此时你查看文件夹下,则看不到,因为是隐含,只有你insert数据后,才可以看到这个my数据库。

        db.my.insert({name:"test"});插入一条数据,同时创建了my集合(表),可以通过db;命令查看当前数据库。通过db.showtables;或者db.showcollections;查看该数据库下的表。system.index默认有这个表,这是存放索引的表,稍后有时间我们再讨论这块。

 4.主服务器中插入后,我们看看从数据库中的效果:

 


    注意:从服务器中只可以查询,不可以insert、delete、update。

5.其实我们所做的操作,mongodb都给我们记录了oplog,保存在特殊数据库中local的oplog.$main集合中。注意:local数据库中只保存更改数据库状态的操作,insert、delete、update.查询操作find()是不会跟我们记录的。

查看oplog记录:【后期另一种主从复制模式也是保存在此集合中】



6.介绍oplog.$main集合的数据结构,这些都代表什么意思,我们又是如何找到有用的信息呢?为什么我们要了解这块呢?

         因为复制机制,就是通过查看oplog信息来维护数据库同步一致。

  如上图,这个集合中,有属性key :ts,op,n,o
         其实:ts:代表的是8字节的 时间戳,由4字节unix timestamp + 4字节自增计数表示

        这个值很重要,在选举(如master宕机时)新primary时,会选择ts最大的那个secondary作为新primary。【后面我们介绍另一种主从模式复本集中就会用到】

        op:1 字节的操作类型,例如i表示insert,d表示delete。【如上图中,我们在日志中查看op 是i,正是我们刚插入的一条信息】

       ns:操作所在的namespace。【namespace是当前数据.当前集合。使用db.my.insert则是默认创建my集合】

       o:操作所对应的 document,即当前操作的内容(比如更新操作时要更新的的字段和值【上图正是我们insert的一条具体信息】)

      o2: 在执行更新操作时的where条件,仅限于 update时才有该属性【下图则会展示此属性】

     其中op,可以是如下几种情形之一:

     "i": insert

     "u": update

     "d": delete

     "c": db cmd

     "db": 声明当前数据库 (其中ns 被设置成为=>数据库名称+ '.')

     "n":  no op,即空操作,其会定期执行以确保时效性 

 7.展示日志记录中op其他值,比如删除、更新。【前提我们在主服务器中执行这些操作】

 op:d 删除操作。o:具体删除那一条。因为_id是唯一的。



 op:u 更新操作。o:具体更新那一条记录,o2:更新那个字段。 



 哎,絮絮叨叨了N长,下篇博客再更新另一种主从复制模式吧:副本集。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: