mongdb集群的搭建和常见问题

副本集要点:
mongodb

在利用副本集时最好不要设置用户名和密码,由于这样会影响效率的,权限系统,很是耗资源,须要大量的运算。
服务器

一、为了防止在选举primary过程当中出现脑裂状态(break ties),全部节点个数(包括仲裁者arbiter)为奇数
网络

二、可使用内网app

cfg = {_id : "myset",members : [ide

{ _id : 0, host : "192.168.86.88:27001" },优化

{ _id : 1, host : "10.100.20.189:27001" },ui

{ _id : 2, host : "192.168.86.129:27001",arbiterOnly : true } ] }spa

rs.initiate(cfg).net

或者
code

cfg = {_id : "myset",members : [{ _id : 0, host : "220.181.8.67:27001" }] }

rs.initiate(cfg)

rs.add("61.135.251.189:27001")

rs.addArb("220.181.8.129:27001")

上面方法的不足:每次重启全部机器以后只有等到原来主库重启set才能正常工做

三、几个关键状态:UP、STARTUP二、RECOVERING、ARBITER、SECONDARY、DOWN

四、app经过客户端驱动链接副本集,须要指定host列表,能够不包括所有members,指定的member会将primary告诉给驱动

五、rs.slaveOk()  容许在secondary上读数据

六、走索引的写区别不大,3300req/s(set) vs 4000res/s(single)

七、当超过一半(包括一半)的机器挂掉以后会有,全部正常节点的pov小于或等于cfg机器的一半,set不在提供服务,正常节点(包括primay)变成secondary,

[rsMgr] can't see a majority of the set, relinquishing primary

[rsMgr] replSet relinquishing primary state

[rsMgr] replSet SECONDARY

八、当一个链接在操做mongodb时出现primary的切换会致使异常:

pymongo.errors.AutoReconnect: [Errno 10054] 

九、激活切片以前全部的数据写入都会指向同一个切片;

enablesharding,shardcollection 进行切片设置的时候,若是表的数据不为空,那么shard key必须有索引方能切片,若是表的数据为空,自动建立索引

十、A chunk is a range on the shard key 一个chunk定义并存储了一个shard key的范围值,是collection, minKey, and maxKey的三元组;

当一个chunk的大小超过了最大值(默认64M),会分裂为两个chunk,但若是一个chunk里的key值都是一个值,这个chunk将是不可分割的,而且肯可能会愈来愈大,出现这种状况每每说明shard key须要改进

当一个切片的数据过大,其chunk会在切片内部发生迁移;

新增切片一样会影响chunk在切片内部的迁移

十一、如何选择shard key

http://blog.csdn.net/zhangzhaokun/article/details/6324389 

Cardinality(基数):shard key 粒度得细  一个key的粒度不够能够考虑多个组合

Write scaling(写分散):为了将写操做尽可能分布到更多的chunk中去

Query isolation(查询隔离):将读操做尽量的集中在更少的chunk中

Reliability:当一个切片挂掉,但愿影响范围控制到最小,跟业务相关,好比一个用户可能有多种属性,若是以某个属性为key,那么若是一个切片挂掉,全部用户都受影响

Index optimization:索引优化,可将多个value组合在一块儿作为一个更利于分片的key

GridFS

十二、每一个Config DB上都有一份cluster's metadata的拷贝,他们之间用two-phase commit(2PC)来保证一致性;

任何一个config db挂掉都会致使cluster's metadata  goes read only,及时这样,不影响mongodb集群的写入和读出

1三、mongos之间没有协做关系,config db上任何一个修改都会 propagated to 全部mongos

mongos自己不持久化,是无状态的,每次启动从config db上加载状态

1四、系统时间的保证同步,不然mongos在balance时会出现问题,例如

caught exception while doing balance: error checking clock skew of cluster 192.168.51.65:20000,10.100.20.50:20000,10.100.20.54:20000 :: caused by :: 13650 clock skew of the cluster 192.168.51.65:20000,10.100.20.50:20000,10.100.20.54:20000 is too far out of bounds to allow distributed locking.

修正时间以后

creating distributed lock ping thread for 192.168.51.65:20000,10.100.20.50:20000,10.100.20.54:20000 and process zw29-65:30000:1336983072:1804289383 (sleeping for 30000ms)

1五、db.adminCommand({replSetGetStatus:1})

db.adminCommand({replSetSyncFrom:"otherHost:27017"})

1六、关于replication set 选举:

节点类型:主动节点、被动节点(优先级为0,只投票、有备份)、arbiter节点

心跳:set里各节点会想全部其余发送心跳报告本身的状态(角色+同步时间+优先级等等)

选举:节点在更新个节点心跳状态的同时,会判断

primary:若是有节点故障,判断本身是否有必要降级,若是本身可达的节点数据少于一半,自动降级为secondary,避免出现本身被网络隔离而不放弃primary地位

secondary:判断又不必升级为primary,若是本身知足成为primary的资格(优先级最高,数据最新),而set里没有其余的primary,则向其余的节点发起询问,其余节点判断若是该节点确实知足此条件,则表示容许发起投票,不然告之中止投票;当全部其余节点表示能够投票的状况下,节点发起接管primary的投票,其余节点再次确认,投同意票和反对票,最后选举结果依据一票否决和多数经过的原则来判断是否当选primary,注意一点一个节点投出同意票以后30s以内不能再进行其余的投票决定。


============================== mongo 切片集群上的操做 =====================

一、pymongo.errors.OperationFailure: Can't modify shard key's value fieldcode for collection: hktest.hkstocks

不能修改shared field的值

二、特别注意manipulate选项 insert默认为true,update默认为false,insert一个对象的时候,若是manipulate选项为true,驱动会添加_id属性并返回,不然id由服务器负责生成,带来的问题就是重复insert这个对象时,会致使重复id的插入,即便对象的其余属性发生变化。

三、update一个记录的时候,set的对象不能包含shared key的值,由于一条记录的shared key是不能够发生改变的

pymongo.errors.OperationFailure: Can't modify shard key's value fieldcode for collection: hktest.hkstocks

四、在mongodb set 中primary的oplogsize应该足够大,不然在导入数据的时候可能致使secondary too stale

五、对于一个已有数据的mongod想成为切片直接经过db.adminCommand( { addShard : "host:port" } ),不过切片即为他本身的库里的primary shard

六、使用一个已存在的unique索引进行切片时出现 "errmsg" : "exception: invalid parameter: expected an object ()";多是存在没有片建的记录,删除便可

七、不能使用dropcollection删除表数据,不然要从新建分片

八、config出现不一致的状况时  db.adminCommand( "flushRouterConfig" )


=============================== 单机上双切片带来的问题 ====================

一、chunk的夸切片移动会带来很大的网络负担和io负担

二、批量操做会有很大的io操做,好比删除清理一个表

相关文章
相关标签/搜索