服务器 | 端口 | 作用 |
192.168.37.215 Primary | 27017 | 读写 |
192.168.37.233 Secondary | 27018 | 不可写操作,但可以读操作(但需要配置),分担主节点压力,提高负载 |
192.168.37.234 Arbiter | 27019 | 投票选举作用,如果副本+主节点的个数是奇数,可以不加仲裁者 |
副本集名称 | myrs |
1、关闭防火墙,selinux
2、安装openssh-server
[root@localhost ~]# su - root
[root@localhost ~]# yum install openssh-server
[root@localhost ~]# vim /etc/ssh/sshd_config
#找到如下行将注释删除
//删除端口和监听地址行的注释
Port 22
#AddressFamily any
ListenAddress 0.0.0.0
ListenAddress ::
//删除远程登录的注释
#LoginGraceTime 2m
PermitRootLogin yes
# MaxAuthTries 6
//开启使用用户名和密码来验证远程连接
#PermitEmptPasswords no
PasswordAuthentication yes
3、开启ssh服务
[root@localhost ~]# sudo service sshd start
#设置开机自启动
[root@localhost ~]# systemctl enable sshd.service
4、清除防火墙缓存
[root@localhost ~]# sudo iptables -F
(3台)
[root@localhost ~]# tar -zxvf mongodb-linux-x86_64-rhel70-5.0.22.tgz
[root@localhost ~]# mv mongodb-linux-x86_64-rhel70-5.0.22 /usr/local/MongoDBReplicaSet
[root@localhost ~]# cd /usr/local/MongoDBReplicaSet
2.1 主节点配置:
[root@localhost MongoDBReplicaSet]# mkdir -p replica-sets/myrs_27017/log
[root@localhost MongoDBReplicaSet]# mkdir -p replica-sets/myrs_27017/data/db
[root@localhost MongoDBReplicaSet]# vim replica-sets/myrs_27017/mongod.conf
# 配置文件内容如下:
systemLog:
# MongoDB发送所有日志输出的目标指定为文件
destination: file
# mongod或mongos应向其发送所有诊断日志记录信息的日志文件的路径
path: "/usr/local/MongoDBReplicaSet/replica-sets/myrs_27017/log/mongod.log"
# 当mongos或mongod实例重新启动时,mongos或mongod会将新条目附加到现有日志文件的末尾。
logAppend: true
storage:
# mongod实例存储其数据的目录。storage.dbPath设置仅适用于mongod。
dbPath: "/usr/local/MongoDBReplicaSet/replica-sets/myrs_27017/data/db"
journal:
#启用或禁用持久性日志以确保数据文件保持有效和可恢复。
enabled: true
processManagement:
# 启用在后台运行mongos或mongod进程的守护进程模式。
fork: true
# 指定用于保存mongos或mongod进程的进程ID的文件位置,其中mongos或mongod将写入其PID
pidFilePath: "/usr/local/MongoDBReplicaSet/replica-sets/myrs_27017/log/mongod.pid"
net:
# 服务实例绑定所有IP,有副作用,副本集初始化的时候,节点名字会自动设置为本地域名,而不是ip
# bindIpAll: true
# 服务实例绑定的IP
bindIp: localhost,192.168.37.215
# 绑定的端口
port: 27017
replication:
# 副本集的名称
replSetName: myrs
启动主节点服务:
[root@localhost ~]# cd /usr/local/MongoDBReplicaSet
[root@localhost MongoDBReplicaSet]# bin/mongod -f replica-sets/myrs_27017/mongod.conf
[root@localhost ~]# cd /usr/local/MongoDBReplicaSet
[root@localhost MongoDBReplicaSet]# mkdir -p replica-sets/myrs_27018/log
[root@localhost MongoDBReplicaSet]# mkdir -p replica-sets/myrs_27018/data/db
[root@localhost MongoDBReplicaSet]# vim replica-sets/myrs_27018/mongod.conf
# 配置文件内容如下:
systemLog:
# MongoDB发送所有日志输出的目标指定为文件
destination: file
# mongod或mongos应向其发送所有诊断日志记录信息的日志文件的路径
path: "/usr/local/MongoDBReplicaSet/replica-sets/myrs_27018/log/mongod.log"
# 当mongos或mongod实例重新启动时,mongos或mongod会将新条目附加到现有日志文件的末尾。
logAppend: true
storage:
# mongod实例存储其数据的目录。storage.dbPath设置仅适用于mongod。
dbPath: "/usr/local/MongoDBReplicaSet/replica-sets/myrs_27018/data/db"
journal:
#启用或禁用持久性日志以确保数据文件保持有效和可恢复。
enabled: true
processManagement:
# 启用在后台运行mongos或mongod进程的守护进程模式。
fork: true
# 指定用于保存mongos或mongod进程的进程ID的文件位置,其中mongos或mongod将写入其PID
pidFilePath: "/usr/local/MongoDBReplicaSet/replica-sets/myrs_27018/log/mongod.pid"
net:
# 服务实例绑定所有IP,有副作用,副本集初始化的时候,节点名字会自动设置为本地域名,而不是ip
# bindIpAll: true
# 服务实例绑定的IP
bindIp: localhost,192.168.37.233
# 绑定的端口
port: 27018
replication:
# 副本集的名称
replSetName: myrs
启动副本节点服务:
[root@localhost ~]# cd /usr/local/MongoDBReplicaSet
[root@localhost MongoDBReplicaSet]# bin/mongod -f replica-sets/myrs_27018/mongod.conf
[root@localhost ~]# cd /usr/local/MongoDBReplicaSet
[root@localhost MongoDBReplicaSet]# mkdir -p replica-sets/myrs_27019/log
[root@localhost MongoDBReplicaSet]# mkdir -p replica-sets/myrs_27019/data/db
[root@localhost MongoDBReplicaSet]# vim replica-sets/myrs_27019/mongod.conf
# 配置文件内容如下:
systemLog:
# MongoDB发送所有日志输出的目标指定为文件
destination: file
# mongod或mongos应向其发送所有诊断日志记录信息的日志文件的路径
path: "/usr/local/MongoDBReplicaSet/replica-sets/myrs_27019/log/mongod.log"
# 当mongos或mongod实例重新启动时,mongos或mongod会将新条目附加到现有日志文件的末尾。
logAppend: true
storage:
# mongod实例存储其数据的目录。storage.dbPath设置仅适用于mongod。
dbPath: "/usr/local/MongoDBReplicaSet/replica-sets/myrs_27019/data/db"
journal:
#启用或禁用持久性日志以确保数据文件保持有效和可恢复。
enabled: true
processManagement:
# 启用在后台运行mongos或mongod进程的守护进程模式。
fork: true
# 指定用于保存mongos或mongod进程的进程ID的文件位置,其中mongos或mongod将写入其PID
pidFilePath: "/usr/local/MongoDBReplicaSet/replica-sets/myrs_27019/log/mongod.pid"
net:
# 服务实例绑定所有IP,有副作用,副本集初始化的时候,节点名字会自动设置为本地域名,而不是ip
# bindIpAll: true
# 服务实例绑定的IP
bindIp: localhost,192.168.37.234
# 绑定的端口
port: 27019
replication:
# 副本集的名称
replSetName: myrs
启动仲裁节点服务:
[root@localhost ~]# cd /usr/local/MongoDBReplicaSet
[root@localhost MongoDBReplicaSet]# bin/mongod -f replica-sets/myrs_27019/mongod.conf
(主节点)
[root@localhost ~]# cd /usr/local/MongoDBReplicaSet
[root@localhost MongoDBReplicaSet]# bin/mongo --host=192.168.37.215 --port=27017
#初始化副本集
rs.initiate()
#“ok”的值为1,说明创建成功,命令行提示符发生变化了,变成了一个从节点角色(myrs:SECONDARY),此时默认不能读写。稍等片刻,按一下回车,变成主节点(myrs:PRIMARY)
#查看副本集配置内容
rs.conf()
#"_id":"myrs”:副本集的配置数据存储的主键值,默认就是副本集的名字
#"members“:副本集成员数组,此时只有一个:"host" : "192.168.37.215:27017" ,
该成员不是仲裁节点:"arbiterOnly" : false ,优先级(权重值):"priority" : 1,”settings“:副本集的参数配置。
#副本集配置的查看命令,本质是查询的是 system.replset 的表中的数据:
#查看副本集状态
rs.status()
#"set" : "myrs":副本集的名字
#"myState" : 1:说明状态正常
#"members":副本集成员数组,此时只有一个:"name" : "192.168.37.215:27017",该成员的角色是"stateStr" : "PRIMARY", 该节点是健康的:"health" : 1
myrs:PRIMARY> rs.add("192.168.37.233:27018")
{
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1719742156, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
},
"operationTime" : Timestamp(1719742156, 1)
}
myrs:PRIMARY>
myrs:PRIMARY> rs.status()
db.adminCommand({
"setDefaultRWConcern" : 1,
"defaultWriteConcern" : {
"w" : 2
}
})
myrs:PRIMARY> rs.addArb("192.168.37.234:27019")
查看副本集状态rs.status()
这样我们的副本集一主一副本一仲裁就算搭建好了。
[root@localhost ~]# cd /usr/local/MongoDBReplicaSet
[root@localhost MongoDBReplicaSet]# bin/mongod -f replica-sets/myrs_27017/mongod.conf
use ldydb
db.emp.insertMany([
{"_id":"1","userid":"1001","empno":"100001","ename":"蔡文姬","age":NumberInt(18),"hiredate":new Date(),"job":"辅助","state":"5"},
{"_id":"2","userid":"1002","empno":"100002","ename":"明世隐","age":NumberInt(24),"hiredate":new Date(),"job":"辅助","state":"5"},
{"_id":"3","userid":"1003","empno":"100003","ename":"孙斌","age":NumberInt(30),"hiredate":new Date(),"job":"辅助","state":"5"},
{"_id":"4","userid":"1004","empno":"100004","ename":"庄周","age":NumberInt(18),"hiredate":new Date(),"job":"辅助","state":"5"},
{"_id":"5","userid":"1005","empno":"100005","ename":"太乙真人","age":NumberInt(18),"hiredate":new Date(),"job":"辅助","state":"5"}
]
)
db.emp.find()
测试主节点读写数据都没有问题:
[root@localhost ~]# cd /usr/local/MongoDBReplicaSet
[root@localhost MongoDBReplicaSet]# bin/mongod -f replica-sets/myrs_27018/mongod.conf
#默认情况从节点还没有读写权限,需进行配置。
#复制集不仅仅只是数据的同步,可以在从节点上执行读操作,来分摊主节点的压力。
设置读权限:
#设置为从节点,允许在该节点上进行读操作
rs.slaveOk()
然后就可以进行读操作:
use ldydb
db.emp.find()
这样就实现了读写分离。
如果要取消作为从节点则再执行rs.slaveOk(false)
[root@localhost ~]# cd /usr/local/MongoDBReplicaSet
[root@localhost MongoDBReplicaSet]# bin/mongod -f replica-sets/myrs_27019/mongod.conf
#仲裁节点是不存放任何业务数据的,即使设置为从节点同样还是看不到任何数据的,它存放的就是一些配置信息.
#仲裁节点既不能写也不能读(业务数据),它只能在local中获取副本集的配置信息.
MongoDB在副本集中,会自动进行主节点的选举,主节点选举的触发条件:
规则:票数最高的节点获胜。假设复制集内投票成员数量为N,则大多数为N/2 + 1。
#当副本集内存活成员数量不足大多数时,整个副本集将无法选举出Primary,副本集将无法提供写服务,处于只读状态。若票数相同,且都获得了“大多数”成员的投票支持的,数据新的节点获胜。数据的新旧是通过操作日志oplog来对比。
#也可以通过设置优先级(priority)来设置额外票数。优先级即权重,取值为0-1000,相当于可额外增加0-1000的票数,优先级的值越大,就越可能获得多数成员的投票(votes)数。指定较高的值可使成员更有资格成为主要成员,更低的值可使成员更不符合条件。
#选举节点的优先级必须是0,不能是别的值。即不具备选举权,但具有投票权,仲裁节点就是这样,它没有选举权,它有投票权。
修改优先级必须在主节点上执行,共3步:
[root@localhost ~]# cd /usr/local/MongoDBReplicaSet
[root@localhost MongoDBReplicaSet]# bin/mongod -f replica-sets/myrs_27017/mongod.conf
#将配置导入cfg变量
cfg=rs.conf()
#修改值
cfg.members[id].priority=2 ,id就是rs.status()-->"members"-->"_id":的值
#刷新配置
rs.reconfig(cfg)