简单主从复制
采用一主一从或一主多从的布署模式, 可以将读写分离开来, 提高数据库的可用性, 不过 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 &
测试发现, 从节点可读不可写, 主节点杀死后, 从节点不能代替主节点.
副本集
定义: 复制提供了数据的冗余备份, 并在多个服务器上存储数据副本, 提高了数据的可用性, 并可以保证数据的安全性.
特点:
主备节点存储数据, 仲裁节点不存储数据. 客户端同时连接主节点与备节点, 不连接仲裁节点.
所有节点分成 3 类, 主节点, 从节点和仲裁节点.
默认设置下, 主节点提供所有增删查改服务, 备节点不提供任何服务. 但是可以通过设置使备节点提供查询服务;
自动故障转移
自动恢复
实现步骤
设置三份配置文件, 分别为主节点, 从节点, 仲裁节点配置
- # 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();
杀死主节点, 可以看到从节点变为主节点, 重新启动主节点后, 主节点还是主节点, 不会变为从节点 (老大永远是老大);
参考:
- https://www.cnblogs.com/hadoop-dev/p/6069780.html
- https://docs.mongodb.com/manual/introduction/
来源: http://www.bubuko.com/infodetail-2727744.html