MongoDB高可用
- 主从模式(弃用)
- 使用复制集(replicaSet)
在复制集中,有且只有一个主节点(primary),可以包含一个或多个从节点(secondary),主从节点直接会通过心跳检测来确定节点是否健康或存活。所有的读写操作都是在主节点上进行的,如果要实现读写分离,需要进行相应的处理,这个最后会说。从节点会根据oplog(也就是操作日志)来复制主节点的数据。
MongoDB复制集
除了主从节点外,MongoDB的复制集中还存在着一种叫仲裁者(Arbiter)的角色。一个仲裁者节点是比较轻量级的,因为它不会去复制主库的数据,因此也就不会成为主节点;但是,它的作用是在投票选举阶段——当主节点故障时,仲裁者可以进行投票。一般来说,不建议一个复制集中包含超过一个仲裁者。
当主节点突然故障后,MongoDB有自己的机制,会自动切换,通过选举,在从节点中选出一个节点作为新的主节点。
使用复制集
比如现在有三个节点(一个primary,两个secondery,且分别部署到三台机器上)
- 首先在三台机器上分别创建对应目录(/data/mongo_replset)切启动mongodb:
mongod --port 8015 --dpath=/data/mongo_repliset --replSet test_rs
注意,复制集的名称是一样的
- 在primary的机器上把其他两个节点添加到复制集中
cnf = {_id:"test_rs", members:[
{_id:1, host:"192.168.1.186:8015"},
{_id:2, host:"192.168.1.187:8015"},
{_id:3, host:"192.168.1.188:8015"},
]
}
并初始化配置:rs.initiate(cnf)
- 连接复制集并自动切换(mongoengine用法)
mongoengine.connect(db={database}, host='mongodb://{username}:{password}@192.168.1.186:8015,192.168.1.187:8015,192.168.1.188:8015/{database}/?authSource={authSource}&replicaSet={replicaSet}', alias={alias})
Mnogo索引的种类及属性
1. 创建索引
基于python,pymongo和mongoengine创建索引的方式不一样
# 假设在集合的book_name建立index
db.collection.create_index({'book_name': 1}) # pymongo
# 而mongoengine一般则是在各个field定义完之后定义一下meta
meta = {
'index_background': True,
'indexes': [
{
'fields': ['book_name'],
'sparse': True, # 稀疏属性
},
],
}
2. 索引的种类
单字段索引,复合索引, 多键索引,地理索引,文本索引,哈希索引
3. 索引属性
唯一索引,部分索引,稀疏索引, TTL索引
索引的稀疏属性确保索引仅包含实际包含索引字段的文档的条目。稀疏索引完全跳过没有索引字段的文档。