目录
1. PSS模式(推荐)
PSS模式由一个主节点和两个备节点所组成,Primary+Secondary+Secondary。
此模式提供数据集的两个完整副本,如果主节点不可用,则新选举出备节点作为主节点并继续正常操作。旧的主节点在可用时重新加入复制集。
2. PSA
PSA模式由一个主节点、一个备节点和一个仲裁者节点组成,即Primary+Secondary+Arbiter
Arbiter节点不存储数据副本,也不提供业务的读写操作。Arbiter节点发生故障不影响业务,仅影响选举投票。此模式仅提供数据的一个完整副本,如果主节点不可用,则复制集将选择备节点作为主节点。
1. 下载mongo安装包, 解压
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-6.0.5.tgz
tar -zxvf mongodb-linux-x86_64-rhel70-6.0.5.tgz
2. 分别建db1,db2,db3三个目录, 存放conf配置文件以及数据, 编辑配置文件, 三个文件夹下面分别修改path,dbPath,port
vim ../data/db1/mongod.conf
systemLog:
destination: file
path: /home/kk/local/mongodb-linux-x86_64-rhel70-6.0.5/data/db1/mongod.log # log path
logAppend: true
storage:
dbPath: /home/kk/local/mongodb-linux-x86_64-rhel70-6.0.5/data/db1 # data directory
net:
bindIp: 0.0.0.0
port: 28017 # port
replication:
replSetName: rs0
processManagement:
fork: true
3. 配置mongo环境变量, 方便后面启动
export PATH=/home/kk/local/mongodb-linux-x86_64-rhel70-6.0.5/bin:$PATH
4. 启动三个mongo实例
mongod -f ./data/db1/mongod.conf
mongod -f ./data/db2/mongod.conf
mongod -f ./data/db3/mongod.conf
5. 下载mongosh连接客户端
wget https://downloads.mongodb.com/compass/mongodb-mongosh-1.8.0.x86_64.rpm
yum install -y mongodb-mongosh-1.8.0.x86_64.rpm
6. 用mongosh连接, 并初始化复制集
# 连接客户端
mongosh --port 28017
# 初始化复制集
rs.initiate({
_id: "rs0",
members: [{
_id: 0,
host: "192.168.6.128:28017"
},{
_id: 1,
host: "192.168.6.128:28018"
},{
_id: 2,
host: "192.168.6.128:28019"
}]
})
7. 验证集群状态,?rs.status()
# 客户端执行
rs.help()
命令 | 描述 |
rs.add() | 为复制集新增节点 |
rs.addArb() | 为复制集新增一个?arbiter |
rs.conf() | 返回复制集配置信息 |
rs.freeze() | 防止当前节点在一段时间内选举成为主节点 |
rs.help() | 返回?replica set?的命令帮助 |
rs.initiate() | 初始化一个新的复制集 |
rs.printReplicationInfo() | 以主节点的视角返回复制的状态报告 |
rs.printSecondaryReplicationInfo() | 以从节点的视角返回复制状态报告 |
rs.reconfig() | 通过重新应用复制集配置来为复制集更新配置 |
rs.remove() | 从复制集中移除一个节点 |
rs.secondaryOk() | 为当前的连接设置?从节点可读 |
rs.status() | 返回复制集状态信息。 |
rs.stepDown() ? | 让当前的?primary?变为从节点并触发?election |
rs.syncFrom() | 设置复制集节点从哪个节点处同步数据,将会覆盖默认选取逻辑 |
1. 通过remove删除节点
# 1. 进入要删除的节点, 关闭该实例
db.shutdownServer()
# 2.连接主节点,执行remove
rs.remove("ip:port")
2. 通过reconfig, 修改节点
cfg = rs.conf()
cfg.members[0].host = "ip:port"
rs.reconfig(cfg)
MongoDB的复制集选举使用Raft算法(Raft Consensus Algorithm)来实现,选举成功的必要条件是大多数投票节点存活。
另外,MongoDB对raft协议添加了一些自己的扩展:
当复制集内存活的成员数量不足大多数时,整个复制集将无法选举出主节点,此时无法提供写服务,这些节点都将处于只读状态。此外,如果希望避免平票结果的产生,最好使用奇数个节点成员。在MongoDB复制集的实现中,对于平票问题提供了解决方案:
在复制集架构中,主节点与备节点之间是通过oplog来同步数据的,oplog是local库的一个集合,当主节点上的一个写操作完成后,会向oplog集合写入一条对应的日志,而从节点通过这个oplog不断拉取到新的日志,在本地进行回放以达到数据同步的目的。?
ts: 操作时间,当前timestamp + 计数器,计数器每秒都被重置
v:oplog版本信息
op:操作类型:
i:插?操作
u:更新操作
d:删除操作
c:执行命令(如createDatabase,dropDatabase)
n:空操作,特殊用途
ns:操作针对的集合
o:操作内容
o2:操作查询条件,仅update操作包含该字段
oplog如果设置太小, 主从同步延迟严重时, 容易覆盖老的oplog, 造成数据丢失, 所以通常需要修改默认的oplog大小(默认90M)
# oplog大小修改为60g
db.adminCommand({replSetResizeOplog: 1, size: 60000})
# 查看oplog大小
db.oplog.rs.stats().maxSize