MongoDB 复本集搭建
复制集的特点
数据一致性
主是唯一的,但不是固定的 没有MySQL那样的双主结构
大多数原则,集群存活节点小于等于二分之一时集群不可写,只可读。
是否能选举出新的主节点,是由当前复制集成员存活量来决定的。
从库无法写入 MySQL从库的readonly对具有super权限的用户无效
自动容灾
传统主从 ---> only 选项来限制复制的数据
复制集 ---> 不支持只复制指定的库
3.0 版本前复制集参与选举的数据节点只能有7个
3.0 以上支持50个
# 创建配置文件 # 28001 cat >mongod28001.conf << EOF port=28001 # 端口,默认端口27017 bind_ip=192.168.11.166 # 监听端口,默认允许所有 logpath=/usr/local/mongodb/log/28001.log # 日志 logappend=true # 以追加的方式写入数据 dbpath=/usr/local/mongodb/data/28001 # 存放数据目录,默认/data/db/ pidfilepath=/var/run/mongd28001.pid # pid 文件 fork=true # 后台启动 #auth=true # 开启验证 oplogSize=102400 # 默认oplog 大小会使用可用磁盘空间的5% replSet=hehe #复制集名称 EOF # 28002 cat >mongod28002.conf << EOF port=28002 bind_ip=192.168.11.166 logpath=/usr/local/mongodb/log/28002.log logappend=true dbpath=/usr/local/mongodb/data/28002 pidfilepath=/var/run/mongd28002.pid fork=true #auth=true oplogSize=102400 replSet=hehe #复制集名称 EOF # 28003 cat >mongod28003.conf << EOF port=28003 bind_ip=192.168.11.166 logpath=/usr/local/mongodb/log/28003.log logappend=true dbpath=/usr/local/mongodb/data/28003 pidfilepath=/var/run/mongd28003.pid fork=true #auth=true oplogSize=102400 replSet=hehe #复制集名称 EOF
启动实例: mongod -f /usr/local/mongodb/conf/mongod28001.conf mongod -f /usr/local/mongodb/conf/mongod28002.conf mongod -f /usr/local/mongodb/conf/mongod28003.conf
# 初始化 mongo 192.168.11.166:28001/admin # 定义配置文件,存放路径use local db.system.replset.find() config = { _id:"hehe", # 应该与配置文件中的replSet 一致 members:[ # priority优先级,此节点健康时候,优先为主节点 {_id:0,host:"192.168.11.166:28001",priority:5}, {_id:1,host:"192.168.11.166:28002"}, {_id:2,host:"192.168.11.166:28003"} ] }
# 更改config,更改192.168.11.166:28003为投票节点 config.members[2] = {"_id":2,"host":"192.168.11.166:28003","arbiterOnly":true} # 执行初始化命令 rs.initiate(config) # 重新初始化,更改config时候执行,使用rs.reconfig() 会短暂断开 rs.reconfig(config) # 查看复制集状态 rs.status() # 从节点 rs.slaveOk(1) 或者rs.slaveOk(true) # 投票节点 # local 库 大小,mongodb 默认存放的物理文件local.* # 默认为local.0 为64MB,命名空间为16MB , # 默认投票节点的local库大小为79-80MB # 查看复制集状态查看 db.printSlaveReplicationInfo() rs.printSlaveReplicationInfo() # 查看状态详情 db.serverStatus().repl() # 查看oplog状态 rs.printReplicationInfo()