主从复制——数据备份、数据恢复、读写分离
建立一个主节点和一个或者多个从节点,每个从节点要知道主节点的地址。
- mongodb文件夹放在D盘和E盘,模拟放在多服务器上。
- 启动D盘上的mongodb,把该数据库指定为主数据库:
>mongod --dbpath='XXX' --master, 端口还是默认的27017。
- 同样的方式启动E盘上的mongodb,指定该数据库为从属数据库,命令也很简单,当然我们要换一个端口, source 表示主数据库的地址。
>mongod --dbpath=xxxx --port=8888 --slave --source=127.0.0.1:27017
数据同步测试:
- 再增加一台从属数据库,而不一开始指定主数据库。主或者从属数据库中都有一个叫做local的集合,主要是用于存放内部复制信息。F盘再拷贝一份mongodb的运行程序。如图:红色框内提示没有主数据库。
增加主数据库,完成同步:
副本集 ——自动故障恢复功能的主从集群。
与上面最大区别是:
- 该集群没有特定的主数据库,整个集群选举出一个“主节点”
- 如果哪个主数据库宕机了,集群中就会推选出一个从属数据库作为主数据库顶上,这就具备了自动故障恢复功能
- 初始化副本集
首先,给副本集起名,为了易于区别其他副本集,也为了将整个集合视为一个整体,这里取名为“sunny”。
--replSet作用是让服务器知道在这个副本集下还有哪些服务器。(此处需要计算机主机名:LLT。不能用127.0.0.1)
也可以继续添加服务器:
>mongod --dbpath=f:\mongodb\db --port=4444 --replSet sunny/127.0.0.1:3333
或者
>mongod --dbpath=f:\mongodb\db --port=4444 --replSet sunny/127.0.0.1:3333,127.0.0.1::2222
副本集的一个亮点就是有自动检测功能:在其中指定单台服务器后,mongodb就会自动搜索并连接其余的节点。
启动几台服务器之后,log日志显示:副本集没有初始化。
在shell中初始化副本集:
可以任意连接其中一台服务器,但是一定要进入admin集合。
查看日志:端口为2222的已经成为主数据库服务器。
- 副本集中的节点
- standard:常规节点,存储完整数据副本,可参与投票,能成为活跃节点,优先权大的成为活动节点可能性大
- passive:被动节点,优先权为0,存储完整数据副本,可参与投票,不能成为活跃节点
- arbiter:仲裁节点,只参与投票,不接收复制数据,也不能成为活跃节点。
设置仲裁节点:
先添加一个节点F
设置仲裁节点:
查看各节点的状态:
- 故障切换和活跃节点选举
如果活跃节点坏了,其余节点会选一个新的活跃节点。新的活跃节点将是优先级最高的节点,优先级相同则数据较新的节点获胜。
oplog——operation log,主节点的操作记录,存储在local数据库(用于存放所有内部复制状态,主从节点都有,其内容不会被复制)oplog.$main集合中。 每个文档都代表主节点上执行的一个操作。只记录改变数据库状态的操作,因为其只是作为主从节点保持数据同步的机制。
其中一些键的含义:
- ts 跟踪执行操作的时间
- ns 执行操作的命名空间(集合名)
- op 操作类型 (i 插入)
- o 执行操作的文档
从节点跟不上同步时,复制就会停下,从节点需要重新做完整的同步。可以用{“resync”:1}命令手动执行重新同步,也可以启动从节点时使用--autoresync自动重新同步。重新同步的代价很大,应该避免。因此主节点的oplog要足够大,能放相当长时间的操作记录。启动服务器时可以用 --oplpgSize指定大小 ,单位MB。
复制认证
主从节点都需要在本地数据库中添加用户,每个节点的用户名和口令都要相同。local数据库中的用户类似admin中的用户,能够读写整个服务器。