MongoDB副本集搭建

一、环境准备(一主一从一仲裁)
服务器 端口 作用
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: truestorage: # mongod实例存储其数据的目录。storage.dbPath设置仅适用于mongod。 dbPath: "/usr/local/MongoDBReplicaSet/replica-sets/myrs_27017/data/db" journal:  #启用或禁用持久性日志以确保数据文件保持有效和可恢复。  enabled: trueprocessManagement: # 启用在后台运行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: 27017replication: # 副本集的名称 replSetName: myrs

启动主节点服务:
[root@localhost ~]# cd /usr/local/MongoDBReplicaSet
[root@localhost MongoDBReplicaSet]# bin/mongod -f replica-sets/myrs_27017/mongod.conf

2.2 创建副本节点

[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: truestorage: # mongod实例存储其数据的目录。storage.dbPath设置仅适用于mongod。 dbPath: "/usr/local/MongoDBReplicaSet/replica-sets/myrs_27018/data/db" journal:  #启用或禁用持久性日志以确保数据文件保持有效和可恢复。  enabled: trueprocessManagement: # 启用在后台运行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: 27018replication: # 副本集的名称 replSetName: myrs

启动副本节点服务:
​​​​​​​[root@localhost ~]# cd /usr/local/MongoDBReplicaSet
[root@localhost MongoDBReplicaSet]# bin/mongod -f replica-sets/myrs_27018/mongod.conf

2.3 创建仲裁节点

[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: truestorage: # mongod实例存储其数据的目录。storage.dbPath设置仅适用于mongod。 dbPath: "/usr/local/MongoDBReplicaSet/replica-sets/myrs_27019/data/db" journal:  #启用或禁用持久性日志以确保数据文件保持有效和可恢复。  enabled: trueprocessManagement: # 启用在后台运行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: 27019replication: # 副本集的名称 replSetName: myrs

启动仲裁节点服务:
[root@localhost ~]# cd /usr/local/MongoDBReplicaSet
[root@localhost MongoDBReplicaSet]# bin/mongod -f replica-sets/myrs_27019/mongod.conf

2.4.初始化副本集和主节点

(主节点)
​​​​​​​[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 的表中的数据:MongoDB副本集搭建_第1张图片

#查看副本集状态
rs.status()
#"set" : "myrs":副本集的名字
#"myState" : 1:说明状态正常
#"members":副本集成员数组,此时只有一个:"name" : "192.168.37.215:27017",该成员的角色是"stateStr" : "PRIMARY", 该节点是健康的:"health" : 1

MongoDB副本集搭建_第2张图片

2.5.添加副本从节点(在主节点进行)

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()

2.6.添加仲裁从节点(主机点进行)
用addArb()添加仲裁从节点时一直无响应,很长时间后返回错误信息,解决办法:在主节点下执行如下命令:
db.adminCommand({  "setDefaultRWConcern" : 1,  "defaultWriteConcern" : {    "w" : 2  }})

myrs:PRIMARY> rs.addArb("192.168.37.234:27019")
查看副本集状态rs.status()

这样我们的副本集一主一副本一仲裁就算搭建好了。

三、副本集数据读写操作
3.1 登录主节点27017​​​​​​​
[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()
测试主节点读写数据都没有问题:

3.2 登录从节点27018

[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)

3.3 登录仲裁节点27019

[root@localhost ~]# cd /usr/local/MongoDBReplicaSet
[root@localhost MongoDBReplicaSet]# bin/mongod -f replica-sets/myrs_27019/mongod.conf

#仲裁节点是不存放任何业务数据的,即使设置为从节点同样还是看不到任何数据的,它存放的就是一些配置信息.

#仲裁节点既不能写也不能读(业务数据),它只能在local中获取副本集的配置信息.

四、主节点的选举原则

MongoDB在副本集中,会自动进行主节点的选举,主节点选举的触发条件:

  • 主节点故障
  • 主节点出现网络故障(默认心跳信息为10秒)
  • 人工干预(rs.stepDown(600))

规则:票数最高的节点获胜。假设复制集内投票成员数量为N,则大多数为N/2 + 1。

#当副本集内存活成员数量不足大多数时,整个副本集将无法选举出Primary,副本集将无法提供写服务,处于只读状态。若票数相同,且都获得了“大多数”成员的投票支持的,数据新的节点获胜。数据的新旧是通过操作日志oplog来对比。

#也可以通过设置优先级(priority)来设置额外票数。优先级即权重,取值为0-1000,相当于可额外增加0-1000的票数,优先级的值越大,就越可能获得多数成员的投票(votes)数。指定较高的值可使成员更有资格成为主要成员,更低的值可使成员更不符合条件。

#选举节点的优先级必须是0,不能是别的值。即不具备选举权,但具有投票权,仲裁节点就是这样,它没有选举权,它有投票权。

4.1 修改优先级

修改优先级必须在主节点上执行,共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)

你可能感兴趣的:(mongodb,数据库)