MongoDB之主从复制和副本集

Posted 天宇之游

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MongoDB之主从复制和副本集相关的知识,希望对你有一定的参考价值。

简单主从复制

  • 采用一主一从或一主多从的布署模式,可以将读写分离开来,提高数据库的可用性,不过mongodb的主从模式并不能在主节点崩溃后,从节点替换主节点的工作,一般可以在开发阶段使用。

实现步骤

  • 设置配置文件
# mongodb.conf1 # 主节点

dbpath=/var/lib/mongodb1 # 设置数据文件
#where to log
logpath=/var/log/mongodb/mongodb1.log # 设置日志文件

logappend=true

bind_ip = 127.0.0.1,192.168.1.21 # 设置ip
port = 27018 # 设置port
journal=true

master = true # 设置主节点

# mongodb.conf2 # 从节点
dbpath=/var/lib/mongodb2 # 设置数据文件
#where to log
logpath=/var/log/mongodb/mongodb2.log # 设置日志文件

logappend=true

bind_ip = 127.0.0.1,192.168.1.21 # 设置ip
port = 27019 # 设置port
journal=true

slave = true # 设置从节点
source = 192.168.1.21:27018 # 指定主节点
  • 使用配置文件启动
# 启动主节点
mongod -f /etc/mongodb.conf1 &
# 启动从节点
mongod -f /etc/mongodb.conf2 &
  • 测试发现,从节点可读不可写,主节点杀死后,从节点不能代替主节点。

副本集

  • 定义:复制提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性,并可以保证数据的安全性。

  • 特点:

  1. 主备节点存储数据,仲裁节点不存储数据。客户端同时连接主节点与备节点,不连接仲裁节点。

  2. 所有节点分成3类,主节点,从节点和仲裁节点。

  3. 默认设置下,主节点提供所有增删查改服务,备节点不提供任何服务。但是可以通过设置使备节点提供查询服务;

  4. 自动故障转移

  5. 自动恢复

实现步骤

  • 设置三份配置文件,分别为主节点、从节点、仲裁节点配置
# mongodb.conf
dbpath=/var/lib/mongodb # 数据文件
logpath=/var/log/mongodb/mongodb.log  # 日志文件
pidfilepath=/var/lib/mongodb/mongodb.pid  # 进程文件
logappend=true  # 添加方式
replSet=name # 设置副本集名称
bind_ip=192.168.1.21  # 绑定ip
port=27017  # port
fork=true  # 后台运行
noprealloc=true

# mongodb.conf1
dbpath=/var/lib/mongodb1 # 数据文件
logpath=/var/log/mongodb/mongodb1.log  # 日志文件
pidfilepath=/var/lib/mongodb/mongodb1.pid  # 进程文件
logappend=true  # 添加方式
replSet=name # 设置副本集名称
bind_ip=192.168.1.21  # 绑定ip
port=27018  # port
fork=true  # 后台运行
noprealloc=true

# mongodb.conf2
dbpath=/var/lib/mongodb2 # 数据文件
logpath=/var/log/mongodb/mongodb2.log  # 日志文件
pidfilepath=/var/lib/mongodb/mongodb2.pid  # 进程文件
logappend=true  # 添加方式
replSet=name # 设置副本集名称
bind_ip=192.168.1.21  # 绑定ip
port=27019  # port
fork=true  # 后台运行
noprealloc=true
  • 启动节点
mongo -f /etc/mongodb.conf
mongo -f /etc/mongodb1.conf
mongo -f /etc/mongodb2.conf
  • 配置节点
mongo ip:port
use admin  
fuben={ _id:"name", members:[ {_id:0,host:\'192.168.1.21:27017\',priority:2}, {_id:1,host:\'192.168.1.21:27018\',priority:1},   
{_id:2,host:\'192.168.1.21:27019\',arbiterOnly:true}] };  
rs.initiate(fuben)   

参数:
priority:优先级
arbiterOnly:仲裁节点

  • 有时报错
"errmsg" : "couldn\'t initiate : member 192.168.1.21:27018 has data already, cannot initiate set.  All members except initiator must be empty."

# 需要清空数据库,将数据库文件都删除
  • 生效后,从节点目前是不允许读写的,设置:
# 登录从节点
rs.slaveOk();
  • 杀死主节点,可以看到从节点变为主节点,重新启动主节点后,主节点还是主节点,不会变为从节点(老大永远是老大);

参考:

以上是关于MongoDB之主从复制和副本集的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB主从复制和副本集

MongoDB--架构搭建(主从副本集)之主从

MongoDB的主从复制和副本集

MongoDB主从复制以及副本集的配置和使用

MongoDB主从复制以及副本集的配置和使用

Mongodb副本集和分片的概念