Mongodb 笔记 —- Replica Set-1-Basics

Mongodb 笔记 —- Replica Set-1-Basics

4 6 月, 2019 阅读 585 字数 2657 评论 0 喜欢 0

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

什么时候会触发选举:

选举原则

通过心跳检测,如果有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})

发表回复

蜀ICP备15005542号