实验步骤:
- 新建三个角色的mongodb,主节点27017,从节点27018,仲裁者27019
【主要配置三个mongodb.conf,分别启动】 - 设置主节点,添加从节点和仲裁者
- 测试:主节点,在test_db数据中写入user集合,{name:“czx”}
从节点,切换test_db数据,可以查到主节点写入的user集合及{name:“czx”} - 副本集的创建
第一步:创建主节点
建立存放数据和日志的目录
#-----------myrs
#主节点
mkdir -p /mongodb/replica_sets/myrs_27017/log \ &
mkdir -p /mongodb/replica_sets/myrs_27017/data/db
新建或修改配置文件:
vi /mongodb/replica_sets/myrs_27017/mongod.conf
myrs_27017:【注意,格式跟我们yaml格式一致,】
systemLog:
#MongoDB发送所有日志输出的目标指定为文件
destination: file
#mongod或mongos应向其发送所有诊断日志记录信息的日志文件的路径
path: "/mongodb/replica_sets/myrs_27017/log/mongod.log"
#当mongos或mongod实例重新启动时,mongos或mongod会将新条目附加到现有日志文件的末尾。
logAppend: true
storage:
#mongod实例存储其数据的目录。storage.dbPath设置仅适用于mongod。
dbPath: "/mongodb/replica_sets/myrs_27017/data/db"
journal:
#启用或禁用持久性日志以确保数据文件保持有效和可恢复。
enabled: true
processManagement:
#启用在后台运行mongos或mongod进程的守护进程模式。
fork: true
#指定用于保存mongos或mongod进程的进程ID的文件位置,其中mongos或mongod将写入其PID
pidFilePath: "/mongodb/replica_sets/myrs_27017/log/mongod.pid"
net:
#服务实例绑定所有IP,有副作用,副本集初始化的时候,节点名字会自动设置为本地域名,而不是ip
#bindIpAll: true
#服务实例绑定的IP 注意ip必须存在否启动不了mongoDB
bindIp: localhost,192.168.40.131
#bindIp
#绑定的端口
port: 27017
replication:
#副本集的名称
replSetName: myrs
启动节点服务:
mongod -f /mongodb/replica_sets/myrs_27017/mongod.conf
第二步:创建副本节点
建立存放数据和日志的目录
#-----------myrs
#副本节点
mkdir -p /mongodb/replica_sets/myrs_27018/log \ &
mkdir -p /mongodb/replica_sets/myrs_27018/data/db
新建或修改配置文件:
vi /mongodb/replica_sets/myrs_27018/mongod.conf
myrs_27018:
systemLog:
#MongoDB发送所有日志输出的目标指定为文件
destination: file
#mongod或mongos应向其发送所有诊断日志记录信息的日志文件的路径
path: "/mongodb/replica_sets/myrs_27018/log/mongod.log"
#当mongos或mongod实例重新启动时,mongos或mongod会将新条目附加到现有日志文件的末尾。
logAppend: true
storage:
#mongod实例存储其数据的目录。storage.dbPath设置仅适用于mongod。
dbPath: "/mongodb/replica_sets/myrs_27018/data/db"
journal:
#启用或禁用持久性日志以确保数据文件保持有效和可恢复。
enabled: true
processManagement:
#启用在后台运行mongos或mongod进程的守护进程模式。
fork: true
#指定用于保存mongos或mongod进程的进程ID的文件位置,其中mongos或mongod将写入其PID
pidFilePath: "/mongodb/replica_sets/myrs_27018/log/mongod.pid"
net:
#服务实例绑定所有IP,有副作用,副本集初始化的时候,节点名字会自动设置为本地域名,而不是ip
#bindIpAll: true
#服务实例绑定的IP 注意ip必须存在否启动不了mongoDB
bindIp: localhost,192.168.40.131
#bindIp
#绑定的端口
port: 27018
replication:
#副本集的名称
replSetName: myrs
启动节点服务:
mongod -f /mongodb/replica_sets/myrs_27018/mongod.conf
第三步:创建仲裁节点
建立存放数据和日志的目录
#-----------myrs
#仲裁节点
mkdir -p /mongodb/replica_sets/myrs_27019/log \ &
mkdir -p /mongodb/replica_sets/myrs_27019/data/db
新建或修改配置文件:
vi /mongodb/replica_sets/myrs_27019/mongod.conf
myrs_27019:
systemLog:
#MongoDB发送所有日志输出的目标指定为文件
destination: file
#mongod或mongos应向其发送所有诊断日志记录信息的日志文件的路径
path: "/mongodb/replica_sets/myrs_27019/log/mongod.log"
#当mongos或mongod实例重新启动时,mongos或mongod会将新条目附加到现有日志文件的末尾。
logAppend: true
storage:
#mongod实例存储其数据的目录。storage.dbPath设置仅适用于mongod。
dbPath: "/mongodb/replica_sets/myrs_27019/data/db"
journal:
#启用或禁用持久性日志以确保数据文件保持有效和可恢复。
enabled: true
processManagement:
#启用在后台运行mongos或mongod进程的守护进程模式。
fork: true
#指定用于保存mongos或mongod进程的进程ID的文件位置,其中mongos或mongod将写入其PID
pidFilePath: "/mongodb/replica_sets/myrs_27019/log/mongod.pid"
net:
#服务实例绑定所有IP,有副作用,副本集初始化的时候,节点名字会自动设置为本地域名,而不是ip
#bindIpAll: true
#服务实例绑定的IP 注意ip必须存在否启动不了mongoDB
bindIp: localhost,192.168.40.131
#bindIp
#绑定的端口
port: 27019
replication:
#副本集的名称
replSetName: myrs
启动节点服务:
mongod -f /mongodb/replica_sets/myrs_27019/mongod.conf
第四步:初始化配置副本集和主节点
使用客户端命令连接任意一个节点,但这里尽量要连接主节点(27017节点):
mongo
连接上之后,会发现show dbs等命令用不了,必须初始化副本集才行
使用默认的配置来初始化副本集:rs.initiate()
提示:
1)“ok”的值为1,说明创建成功。
2)命令行提示符发生变化,变成了一个从节点角色,此时默认不能读写。稍等片刻,回车,变成主节点。
第五步:查看副本集的配置内容
说明:
1) "_id" : "myrs" :副本集的配置数据存储的主键值,默认就是副本集的名字
2) "members" :副本集成员数组,此时只有一个: "host" : "192.168.40.131:27017" ,该成员不是仲裁节点: "arbiterOnly" : false ,优先级(权重值): "priority" : 1,
3) "settings" :副本集的参数配置。
提示:副本集配置的查看命令,本质是查询的是 system.replset 的表中的数据
第六步:查看副本集状态
说明:
1) "set" : "myrs" :副本集的名字
2) "myState" : 1:说明状态正常
3) "members" :副本集成员数组,此时只有一个: "name" : "192.168.40.131:27017" ,该成员的 角色是 "stateStr" : "PRIMARY", 该节点是健康的: "health" : 1
第七步:添加副本从节点
在主节点添加从节点,将其他成员加入到副本集
语法:
rs.add(host, arbiterOnly)
添加27018节点
“ok”“:1说明添加成功
查看副本状态
说明: "name" : "192.168.40.131:27018" 是第二个节点的名字,其角色是 "stateStr" : "SECONDARY
第八步:添加仲裁从节点
在主节点添加从节点,将其他成员加入到副本集
查看副本集状态
-
副本集的数据读写操作
目的:了解默认情况下,从节点没有读写权限(需要运行rs.slaveOk()赋予权限)
主节点:
从节点:
赋予读权限(主节点负责写,从节点负责读,取消权限slaveOk(false))
【测试】
主节点在test_db数据库插入集合user,域name:czx。
在从节点,切换到test_db,查看user集合,查看所有域。
仲裁者节点,不存放任何业务数据,只存放副本集配置等数据
- 主节点的选举原则
MongoDB在副本集中,会自动进行主节点的选举,主节点选举的触发条件:
1) 主节点故障
2) 主节点网络不可达(默认心跳信息为10秒)
3) 人工干预(rs.stepDown(600))
一旦触发选举,就要根据一定规则来选主节点。
选举规则是根据票数来决定谁获胜:
票数最高,且获得了“大多数”成员的投票支持的节点获胜。 “大多数”的定义为:假设复制集内投票成员数量为N,则大多数为 N/2 + 1。例如:3个投票成员, 则大多数的值是2。当复制集内存活成员数量不足大多数时,整个复制集将无法选举出Primary, 复制集将无法提供写服务,处于只读状态。 若票数相同,且都获得了“大多数”成员的投票支持的,数据新的节点获胜。 数据的新旧是通过操作日志oplog来对比的。
在获得票数的时候,优先级(priority)参数影响重大。 可以通过设置优先级(priority)来设置额外票数。优先级即权重,取值为0-1000,相当于可额外增加 0-1000的票数,优先级的值越大,就越可能获得多数成员的投票(votes)数。指定较高的值可使成员 更有资格成为主要成员,更低的值可使成员更不符合条件。
默认情况下,优先级的值是1
【了解】修改优先级
比如,下面提升从节点的优先级:
1)先将配置导入cfg变量
myrs:SECONDARY> cfg=rs.conf()
2)然后修改值(ID号默认从0开始):
myrs:SECONDARY> cfg.members[1].priority=2
3)重新加载配置
myrs:SECONDARY> rs.reconfig(cfg)
稍等片刻会重新开始选举。