mongdb集群的搭建和常见问题

副本集要点:

在利用副本集时最好不要设置用户名和密码,因为这样会影响效率的,权限系统,非常耗资源,需要大量的运算。

1、为了防止在选举primary过程中出现脑裂状态(break ties),所有节点个数(包括仲裁者arbiter)为奇数

2、可以使用内网

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

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

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

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

rs.initiate(cfg)

或者

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才能正常工作

3、几个关键状态:UP、STARTUP2、RECOVERING、ARBITER、SECONDARY、DOWN

4、app通过客户端驱动连接副本集,需要指定host列表,可以不包括全部members,指定的member会将primary告诉给驱动

5、rs.slaveOk()  允许在secondary上读数据

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

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

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

[rsMgr] replSet relinquishing primary state

[rsMgr] replSet SECONDARY

8、当一个连接在操作mongodb时出现primary的切换会导致异常:

pymongo.errors.AutoReconnect: [Errno 10054] 

9、激活切片之前所有的数据写入都会指向同一个切片;

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

10、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在切片内部的迁移

11、如何选择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

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

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

13、mongos之间没有协作关系,config db上任何一个修改都会 propagated to 所有mongos

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

14、系统时间的保证同步,否则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)

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

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

16、关于replication set 选举:

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

心跳:set里各节点会想所有其他发送心跳报告自己的状态(角色+同步时间+优先级等等)

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

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

secondary:判断又没必要升级为primary,如果自己满足成为primary的资格(优先级最高,数据最新),而set里没有其他的primary,则向其他的节点发起询问,其他节点判断如果该节点确实满足此条件,则表示允许发起投票,否则告之停止投票;当所有其他节点表示可以投票的情况下,节点发起接管primary的投票,其他节点再次确认,投赞成票和反对票,最后选举结果依据一票否决和多数通过的原则来判断是否当选primary,注意一点一个节点投出赞成票之后30s之内不能再进行其他的投票决定。


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

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

不能修改shared field的值

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

3、update一个记录的时候,set的对象不能包含shared key的值,因为一条记录的shared key是不可以发生改变的

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

4、在mongodb set 中primary的oplogsize应该足够大,否则在导入数据的时候可能导致secondary too stale

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

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

7、不能使用dropcollection删除表数据,否则要重新建分片

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


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

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

2、批量操作会有很大的io操作,比如删除清理一个表


你可能感兴趣的:(mongdb集群的搭建和常见问题)