主从模式:
在10.3.13.213 主节点, 10.3.2.33 从节点。mongodb 安装路径均为:/usr/local/server/mongodb
参考文章:http://www.lanceyan.com/tech/mongodb/mongodb_cluster_1.html
主从模式没有继续测试下去,在下载的最新的mongodb安装包中,已经不支持主从复制了:
MongoDB 4.0删除了对主从复制的支持。在升级到MongoDB 4.0之前,如果部署使用主从复制,则必须升级到副本集。
一般情况下,配置一个主节点,一个或多个从节点,主节点用于写入数据,从节点用于读取数据(也是可以配置写的,默认只读),实现读写分离。
配置从节点从主节点同步数据,默认马上同步,可以设置时间(slavedelay)。
source = 10.3.13.213:27017 配置主节点的ip与端口,only = abc也可以配置只同步某个数据库
问题:
主节点挂了,不能自动切换,得手动切换。(高可用性不好)
主节点的写压力没有减轻。
从节点的数据都是从主节点同步过来的,对从节点压力过大
不能自动扩展(扩展性不好)
副本集模式
参考:http://www.lanceyan.com/tech/mongodb/mongodb_repset1.html\
副本集的一些概念:
各个节点之间有一个心跳机制,检测是否有节点挂了,若出现主节点挂了则从从节点中选出一个新的主节点。
环境搭建:
1. 10.3.13.213 副本集主节点,10.3.2.33 副本集副本节点,10.3.2.34 副本集副本节点
2. 每个节点上依次运行:./bin/mongod --config /usr/local/server/mongodb/mongodb.conf
mongodb.conf的内容:
3. 在任意一个节点上面:./bin/mongo 任意一个节点上运行脚本
4. use admin 转到admin数据库(自带的)
5. 初始化副本集配置
config = { _id:"repset", members:[
... {_id:0,host:"10.3.13.213:27017"},
... {_id:1,host:"10.3.2.33:27017"},
... {_id:2,host:"10.3.2.34:27017"}]
... }
> rs.initiate(config);
config里面的members里面的配置解释:
priority:1 members里包含的是所有节点的地址以及优先级。优先级最高的即成为主节点
Secondary-Only:不能成为primary节点,只能作为secondary副本节点,防止一些性能不高的节点成为主节点。
Hidden:这类节点是不能够被客户端制定IP引用,也不能被设置为主节点,但是可以投票,一般用于备份数据。
Delayed:可以指定一个时间延迟从primary节点同步数据。主要用于备份数据,如果实时同步,误删除数据马上同步到从节点,恢复又恢复不了。
Non-Voting:没有选举权的secondary节点,纯粹的备份数据节点
查看集群节点的状态:
在mogo脚本下运行:rs.status() 查看返回结果。
主节点写入的数据会自动复制到副本节点
在主节点 10.3.2.33上运行:
repset:PRIMARY> use test
repset:PRIMARY> db.testcc.insert("test1","test11111")
在副本节点10.3.13.213上查看
因为mongodb默认从主节点读和写数据,所以需要设置从节点的可读
repset:SECONDARY> db.getMongo().setSlaveOK()
repset:SECONDARY> db.testcc.find()
返回结果:{ "_id" : ObjectId("5c048ff317f3022be4577b9f"), "test1" : "test11111" }
副本集的故障转移 :
若一个节点挂掉了(即便是主节点),数据库还可以继续使用,数据不会丢失。
若主节点挂掉了,就从原来的从节点中自动投票选出主节点。
将主节点10.3.2.33的进程kill掉。之后 repset:PRIMARY> rs.status() 发现,在原来的两个副本节点中一个变成了主节点。
将原来挂掉的那个主节点重新跑起来后,发现它就变成了副节点了。
读写分离:
为了减轻主节点的读写压力,可以设置读时只从副节点进行读参见:
仲裁节点:
仲裁节点不负责存储数据,只负责故障转移时的群体投票
设置仲裁节点:在初始化配置时,members中设置{_id:2,host:'10.3.2.34:27017',arbiterOnly:true}
这样设置好这个仲裁节点后,这个节点没有数据存储到本地,但是可以读取到副本集的相关信息。
参考:
https://yq.aliyun.com/wenji/263333
bully算法,竞选出主节点
在主节点挂掉之后,需要在剩下的从节点中选出一个新的主节点
具体参考:http://www.lanceyan.com/tech/mongodb_repset2.html