上面我们简单的了解了下mongodb的基本操作指令,现在我们来进行mongodb的高端操作,这里主要进行的是mongodb副本集和mongodb分片。
mongodb副本集
mongodb的复制有两种类型:
- master/slave
- replica set
master/slave不常用,基本处于废弃的状态,而replica set是mongodb复制常用的框架,真个运行机制和redis的哨兵机制很相似,可以在主节点出现故障的时候,副本集配置的从服务器会自动选举产生主节点,从而保障系统的稳定性。
replica set是服务于同一数据集的多个mongodb实例,一个replica set只有一个主机点,可以有多个从节点,主节点将数据修改操作保存在oplog中,从节点通过同步主节点的oplog来保障数据同步,为了实现replica set可以检测整个集群的的健康状态,整个replica set集群中的各个节点需要发送heartbeat信号。
工作特性:
- 至少3个,且应该为奇数个节点,可以使用arbiter(仲裁节点)来参加选举
- hearbeat信号检测存活
- 自动失效转移,通过选举的方式实现
复制集的节点分类:
- 0优先级的节点;冷备节点,不会被选举成为主节点,但可以参加选举
- 隐藏的从节点;首先是一个0优先级的节点,且对客户端不可见
- 延迟复制的从节点;首先是一个0节点的从节点,且复制时间落后于主节点一个固定时长
- arbiter:仲裁解节点
mongodb的复制架构:oplog,hearbeat
oplog:大小固定的文件,存储在local数据库,最小1g,默认为文件系统的5%的容量
整个复制过程:
- 初始同步(initial sync)
- 回滚后追赶(post-rollback catch-up)
- 切分块迁移(sharding chunk migrations)
local:存放了副本集的所有元数据和oplog,用于存储oplog的一个名为oplog.rs的collection:oplog.rs的大小依赖于os及文件系统,但可以自定义其大小oplogSize。
mongodb的数据同步类型:
- 初始同步:
- 节点没有任何数据时
- 节点丢失副本的复制历史
- 初始同步的步骤
- 克隆所有数据库
- 应用数据集的所有改变,复制oplog并应用于本地
- 为所有collection构建索引
配置mongodb副本集
共创建奇数个节点
1 | ~]# cat /etc/mongodb.conf |
2 | dbpath=/data/mongodb |
3 | logpath=/var/log/mongodb.log |
4 | logappend=true |
5 | port=27017 |
6 | fork=true |
7 | auth=false |
8 | nohttpinterface=false |
9 | bind_ip=0.0.0.0 |
10 | journal=true |
11 | quiet=true |
12 | replSet=testSet |
13 | replIndexPrefetch=_id_only |
14 | ~]# ./mongodb -f /etc/mongodb.conf |
主节点配置
1 | ~]# ./mongo |
2 | > rs.conf() 查看副本集节点配置 |
3 | > rs.status() 查看副本集节点状态 |
4 | > rs.initiate() 初始化副本集节点,新节点需要操作 |
5 | > rs.add() 添加从节点的ip于端口 |
从节点配置
1 | ~]# ./mongo |
2 | > rs.slaveOk() 确认从节点ok,必须操作 |
主节点切换为从节点
1 | ~]# ./mongo |
2 | > rs.stepDown() |
副本集的重新选举的影响条件:
- 心跳信息
- 优先级
- optime
- 网络连接
- 网络分区
触发选举的事件:
- 新副本初始化
- 从节点联系不到主节点
- 主节点‘下台’时
- 主节点受到stepDown()命令时
- 某从节点有更高的优先级且已经满足主节点其他所有条件
- 主节点无法联系到副本集的‘多数方’
修改优先级示例:
需要在主节点执行
1 | > cfg=rs.conf() |
2 | > cfg.members[1].priority=2 |
3 | > rs.reconfig(cfg) |
mongodb分片
单个数据集过大时,将一个数据集分成n个数据集,我们称为sharding集群。
分片架构中的角色:
- mongos:router
- config server:云数据服务器,对应shard的索引
- shard:数据节点,也称mongod实例
配置sharding集群
先配置config server
1 | ~]# cat /etc/mongodb.conf |
2 | dbpath=/data/mongodb |
3 | logpath=/var/log/mongodb.log |
4 | logappend=true |
5 | fork=true |
6 | auth=false |
7 | nohttpinterface=false |
8 | bind_ip=0.0.0.0 |
9 | journal=true |
10 | quiet=true |
11 | configsvr=true |
配置shard,即配置正常的mongd
1 | ~]cat /etc/mongodb.conf |
2 | dbpath=/data/mongodb |
3 | logpath=/var/log/mongodb.log |
4 | logappend=true |
5 | fork=true |
6 | auth=false |
7 | nohttpinterface=false |
8 | bind_ip=0.0.0.0 |
9 | journal=true |
10 | quiet=true |
11 | ~]# ./mongod -f /etc/mongodb.conf |
配置mongos
1 | ~]# ./mongos --configdb=configserver_ip:27019 --fork --logpath=/var/log/mongos.log |
2 | ~]# ./mongo |
3 | > sh.help() |
4 | > sh.addShard("10.211.55.2") |
5 | > sh.status() |
6 | > sh.enableSharding(dbname) |
7 | > sh.shardCollection(fullname,key,unique) |
8 | > use admin |
9 | > db.runCommand("listShards") |