一、简介
MongoDB中的副本集是一组维护相同数据集合的 mongod进程。副本集提供了冗余和高可用性,并且这是所有生产部署的基础。
复制提供了冗余并增加了 数据可用性。对于不同数据库服务器上的多个数据副本,复制为防止单台数据库服务器故障提供了一定程度的容错能力。
在某些情况下,复制可以提高读取性能,因为客户端可以将读操作发送到不同的服务器上。在不同的数据中心维护数据副本可以提高分布式应用程序的数据本地化和可用性。还可以维护额外的副本以实现特殊用途,比如灾难恢复、报告或备份。
复制原理:
副本集是一组维护相同数据集合的 mongod实例。
副本集包含多个数据承载节点和一个可选的仲裁节点。在数据承载节点中,有且仅有一个成员为主节点,其他节点为从节点。
主节点会将其数据集合所有的变化记录到操作日志中,即oplog
从节点复制主节点的oplog,并将这些操作应用于它们的数据集,这样以便从节点的数据集能反映出主节点的数据集。
如果主节点不可用,一个候选的从节点将会发起选举并使之成为新的主节点。
在某些情况下(比如只有一个主节点和一个从节点,但由于成本约束无法添加另一个从节点),可以选择将一个 mongod 实例作为 仲裁节点添加到一个副本集中。仲裁节点参与选举但不持有数据(即不提供数据冗余)。
仲裁节点 永远只能是仲裁节点,但在选举过程中主节点也许会降级成为 从节点, 从节点也可能会升级成为主节点。
副本集的最小推荐配置是一个包含三个数据承载成员的三成员副本集:一个主节点 和两个从节点,
一个副本集最多可以有50个成员,但仅能有7个可投票成员。
MongoDB副本集通过设置priority决定优先级,默认优先级为1,priority值是0到100之间的数字,数字越大优先级越高,priority=0,则此节点永远不能成为主节点primay。
二、注意事项
1)默认情况下,mongodb不启用验证的。
在一个新安装的 MongoDB 上配置任何用户或副本集之前,需要注释掉 auth 行。默认情况下,MongoDB 并没有创建任何用户。而如果在创建用户前启用了 auth,就不能够做任何事情。可以在创建一个用户后再次启用 auth。
副本集服务器,开启--auth参数的同时,必须指定keyfile参数,节点之间的通讯基于该keyfile,key长度必须在6到1024个字符之间,最好为3的倍数,不能含有非法字符。
若开启--auth参数不配置keyFile,在启动mongo时会报错:“BadValue: security.keyFile is required when authorization is enabled with replica sets”
三、配置
3.1 安装mongodb并创建用户
安装mongodb,登录mongo,创建并授权用户
配置keyfile文件,并传送到其他节点上
openssl rand -base64 90 -out /data/mongodb/keyfile
chmod 600 /data/mongodb/keyfile
关闭mongo,修改配置文件如下,再重启mongo,用root用户登录
dbpath = /data/mongodb/data
logpath = /data/mongodb/log/mongodb.log
logappend = true
port = 27017
fork = true
bind_ip = 0.0.0.0
#开启鉴权
auth = true
#指定副本集名称
replSet = test
#指定秘钥文件
keyFile = /data/mongodb/keyfile
2.2 主节点配置
#定义副本集配置,第一行_id后接副本集名称
> config_repl={_id:"test",members:[
... {_id:0,host:"ip:27017",priority:10},
... {_id:1,host:"ip:27018",priority:8}]}
{
"_id" : "test",
"members" : [
{
"_id" : 0,
"host" : "ip:27017",
"priority" : 10
},
{
"_id" : 1,
"host" : "ip:27018",
"priority" : 8
}
]
}
#初始化副本集(未指定配置时,使用默认配置,默认本机节点priority为1)
> rs.initiate(config_repl)
{ "ok" : 1 }
#查看副本集
test:PRIMARY> rs.status()
2.2 从节点配置
#初次数据同步会报错,先设置从节点为只读数据库
test:SECONDARY> db.getMongo().setSlaveOk()
WARNING: setSlaveOk() is deprecated and may be removed in the next major release. Please use setSecondaryOk() instead.
#新版本可用setSecondaryOk()
test:SECONDARY> db.getMongo().setSecondaryOk()
test:SECONDARY>
2.3 其他常用命令
#添加从节点
test:PRIMARY> rs.add({host:"ip:27017",priority:5})
#添加仲裁节点
test:PRIMARY> rs.addArb("ip:27017")
#查看副本集配置信息
> rs.conf()
#删除节点
test:PRIMARY> rs.remove("ip:27017")
#更改副本集配置
#设置配置
test:PRIMARY> config_repl=rs.conf()
#修改priority的值,下行命令中的[1]里面的数字代表具体的节点实例,即rs.conf()执行后"_id"行的数字
test:PRIMARY> config_repl.members[1].priority = 6
#使配置生效
test:PRIMARY> rs.reconfig(config_repl)
#在SECONDARY节点上执行命令,需添加force参数
test:SECONDARY> rs.reconfig(config_repl,{force:true})
#查看备份节点的复制信息
test:PRIMARY> db.printSlaveReplicationInfo()