距离上次的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功能时,就可以去喝杯咖啡~\(≧▽≦)/~啦
手动测试一下这个功能。
注意是两个控制台哦。
启动效果如下:
默认是连接test服务器,那么使用类似mysql的use 切换数据库。 use my; 注意:执行这条语句,若存在my数据库,则直接切换,若不存在,则隐含创建一个,此时你查看文件夹下,则看不到,因为是隐含,只有你insert数据后,才可以看到这个my数据库。
db.my.insert({name:"test"});插入一条数据,同时创建了my集合(表),可以通过db;命令查看当前数据库。通过db.showtables;或者db.showcollections;查看该数据库下的表。system.index默认有这个表,这是存放索引的表,稍后有时间我们再讨论这块。
注意:从服务器中只可以查询,不可以insert、delete、update。
查看oplog记录:【后期另一种主从复制模式也是保存在此集合中】
因为复制机制,就是通过查看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,即空操作,其会定期执行以确保时效性
op:d 删除操作。o:具体删除那一条。因为_id是唯一的。
op:u 更新操作。o:具体更新那一条记录,o2:更新那个字段。
哎,絮絮叨叨了N长,下篇博客再更新另一种主从复制模式吧:副本集。