Replica set:
- 一组备份集群,有一台是primary,其他都是secondary。如果primary down了,会重新在secondary中选一个primary。
- 形式上模仿了一个network partition。
- 最多50个成员,至多只能有7个成员拥有投票权。
连接replica set的方式(URL)
mongo “mongodb+srv://cluster0-xxx.mongodb.net/test” –username xxxx
mongo ” mongodb://localhost:30000,localhost:30001/ test”
以Replica set方式启动所有mongod:
mongod –replSet mdbDefGuide –dbpath ~/data/rs3 –port 27019 –smallfiles –oplogSize 200 //每个mongod 修改不同端口,不同dbpath,相同replset
使用Mongo连接一个mongod,初始化replica set
rsconf = {
_id: “mdbDefGuide”,
members: [
{_id: 0, host: “localhost:27017”},
{_id: 1, host: “localhost:27018”},
{_id: 2, host: “localhost:27019”} ] }
rs.initiate(rsconf) // 等价于 db.adminCommand({“replSetInitiate” : rsconf })
rs.status() //查看replica set状态和详细信息
1. _id 为 replica set 的名字,需要与启动mongod时候的 –replSet 参数相同
2.replica set 初始化时,不能有多于一个成员存有数据
3. 这种初始化方式,mongod会去找到配置文件中描述的其他节点开始配置。
4. 已初始化过的mongod只接受配置列表中成员发送的新的配置信息。
查看replica set 配置信息
rs.config()
使用新的配置信息配置replica set
var config = rs.config()
config.members[0].host = “localhost:27017”
rs.reconfig(config)
rs.reconfig(config, {“force” : true}) 使用force,在集群没有primary的情况下,重新配置集群。
已加入replica set的成员只接受成员组提供的新的配置文件,如果修改的是hostname,需要每台机器手动修改local.system.replset document来达到修改的目的。 reconfig将对集群不起作用。
任意节点运行,查看是否为replica set的primary(master),以及部分集群信息
db.isMaster()
hidden节点只能通过isMaster查看到
默认不允许直接连接上secondary并从secondary读,修改允许从secondary读(读出来数据可能会和primary不一致,不同步)
secondaryConn.setSlaveOk()
在secondary运行
关闭一个节点:
db.adminCommand({“shutdown” : 1})
添加一个节点:
rs.add(“localhost:27020”)
删除一个节点:
rs.remove(“localhost:27017”)
Majority 定义
定义:一个replica set需要一定数量的可投票成员来选举一个primary,这里的“数量”就是majority。一般为集群中一半的成员数量。
当一个集群,达不到一定的majority的时候,就不会有primary。即使有primary也会自动退位为sencondary。
例子:当一个SET在不同区域/机房有不同数量服务器的时候,为了防止因为网络连接问题(如网络掉PING),导致出现2个以上primary。可以在单独机房中,使用majority来判断是否选举primary。如果机房内机器数量相同,那么就至少需要有第三个机房,里面配置一台tie-breaking server (仲裁节点)来做仲裁。
Hidden节点
定义:隐藏节点,不能成为读取数据的节点。对外不可见。可以参与选举投票
Delayed节点
定义:设定数据同步延迟的节点。priority=0。可以参与投票,多数情况应该被设置为hidden
primary选举原理:
心跳检测:
每2秒成员之间会相互通过心跳检查,10秒没有响应的成员会被标记为不可用。
priority:
priority代表某个节点,希望成为primary的程度(或者被选择为primary的优先程度)。
添加节点时设置基础priority值(实际发生选举时,系统会在这个基础上再结合服务器延迟等重新计算)
rs.add({“host” : “server-4:27017”, “priority” : 1.5})
如果被添加这台机器是最高priority,那么等到它与其他成员同步之后,现有primary会自动退位为secondary,让被添加这台机器成为primary
什么时候会触发选举:
- 新增成员到replica set
初始化replica set,rs.stepDown()orrs.reconfig()- 心跳检测到primary 不可用
选举原则
通过心跳检测,如果有primary不可用,第一个发现的secondary会想所以其他节点发送选举的请求,并且开始检查自己是否符合选举条件。最终按照priority属性来进行选举。最大的为primary。Priority值,由初始值 &当前secondary运行情况实时计算。
符合被选举为Primary的条件:
- 1.存有的数据是剩下节点中最新的
- 2.priority不能为0,0表示设置为不能为primary(passive members)
Arbiter 仲裁节
在只有2个节点或者相同数据节点在不同区域/机房的时候,我们需要一个仲裁节点来提供majority。仲裁节点只参与选举仲裁。
- 仲裁节点,只能有一个。
- 仲裁节点,设置不可逆。不能转换为其他节点,除非删除后重新以其他节点方式添加
添加仲裁节点:(通过reconfig 不能让仲裁节点成为普通节点)
rs.addArb(“server-5:27017”)
或者
rs.add({“_id” : 4, “host” : “server-5:27017”, “arbiterOnly” : true})