软件包安装
0、主机规划
IP地址 | 访问端口 |
---|---|
10.0.0.201 | 27017 |
10.0.0.202 | 27018 |
10.0.0.203 | 27019 |
1、MongoDB安装包下载
下载地址:https://www.mongodb.com/try/download/community
版本根据需求选择,Mongodb6.0及以上的版本没有mongo命令
2、上传至服务器,并添加环境变量
- 将下载的安装包mongodb-linux-x86_64-rhel70-6.0.5.tgz分别上传到三台服务器/root目录下
- 解压安装包到指定目录,在三台服务器分别执行该命令
tar xvf mongodb-linux-x86_64-rhel70-6.0.5.tgz -C /usr/local
- 修改文件夹名称,在三台服务器分别执行该命令
mv /usr/local/mongodb-linux-x86_64-rhel70-6.0.5 /usr/local/mongodb-6.0.5
- 添加环境变量,在三台服务器分别执行该命令
echo "export PATH=$PATH:/usr/local/mongodb-6.0.5/bin" >> /etc/profile
- 使环境变量生效,在三台服务器分别执行该命令
source /etc/profile
3、安装MongoDB依赖包
在三台服务器分别执行该命令
yum install -y libcurl openssl xz-libs
4、创建目录,创建各节点配置文件
- 创建目录,根据需求分别在三台服务器上创建目录
节点服务器1
mkdir -p /data/mongodb/node1/{data,log,config}
节点服务器2
mkdir -p /data/mongodb/node2/{data,log,config}
节点服务器3
mkdir -p /data/mongodb/node3/{data,log,config}
- 修改配置文件
节点服务器1
vi /data/mongodb/node1/config/node1.conf
dbpath=/data/mongodb/node1/data #数据存放目录
logpath=/data/mongodb/node1/log/mongodb_node1.log #日志存放目录 pidfilepath=/data/mongodb/node1/data/node1.pid #指定文件保存mongod进程的进程ID
fork=true #后台运行
logappend=true #以追加的方式记录日志
bind_ip=10.0.0.201 #绑定本机
ip port=27017 #mongodb端口
replSet=rs0 #副本集名称,同一个副本集,名称必须一致
节点服务器2
vi /data/mongodb/node2/config/node2.conf
dbpath=/data/mongodb/node2/data #数据存放目录
logpath=/data/mongodb/node2/log/mongodb_node2.log #日志存放目录 pidfilepath=/data/mongodb/node2/data/node2.pid #指定文件保存mongod进程的进程ID
fork=**true** #后台运行
logappend=**true** #以追加的方式记录日志
bind_ip=10.0.0.202 #绑定本机
ip port=27018 #mongodb端口
replSet=rs0 #副本集名称,同一个副本集,名称必须一致
节点服务器3
vi /data/mongodb/node3/config/node3.conf
dbpath=/data/mongodb/node3/data #数据存放目录
logpath=/data/mongodb/node3/log/mongodb_node3.log #日志存放目录pidfilepath=/data/mongodb/node3/data/node3.pid#指定文件保存mongod进程的进程ID
fork=true #后台运行
logappend=true #以追加的方式记录日志
bind_ip=10.0.0.203 #设置绑定本机ipport=27019 #mongodb端口
replSet=rs0 #副本集名称,同一个副本集,名称必须一致
5、启动节点
- 启动节点
节点服务器1
mongod -f /data/mongodb/node1/config/node1.conf
节点服务器2
mongod -f /data/mongodb/node2/config/node2.conf
节点服务器3
mongod -f /data/mongodb/node3/config/node3.conf
- 查看节点是否启动
ps aux | grep mongo
6、安装 MongoDB Shell
因为Mongodb6.0及以上的版本没有mongo命令,所有无法使用mongo命令连接数据库
想在命令行连接数据库,需要给三台服务器安装MongoDB shell
- 下载安装包
wget https://downloads.mongodb.com/compass/mongosh-1.6.0-linux-x64.tgz
- 解压
tar -xvf /root/mongosh-1.6.0-linux-x64.tgz -C /usr/local/
- 重命名
mv /usr/local/mongosh-1.6.0-linux-x64 /usr/local/mongosh
- 添加环境变量
echo "export PATH=$PATH:/usr/local/mongosh/bin" >> /etc/profile
- 使环境变量生效
source /etc/profile
7、连接节点
- 连接第一个节点
mongosh 10.0.0.201:27017
- 副本集初始化
rs0:PRIMARY> rs.initiate()
- 添加副本节点
rs0:PRIMARY> rs.add("10.0.0.202:27018") rs0:PRIMARY> rs.add("10.0.0.203:27019")
- 查看副本节点状态
rs0:PRIMARY> rs.status()
- 查看同步进度oplog信息
返回一个汇总的各 Secondary 同步延迟信息
rs0:PRIMARY> rs.printSecondaryReplicationInfo()
返回oplog 大小、保留时长、 起始时间等信息
rs0:PRIMARY> rs.printReplicationInfo()
8、创建用户
创建超级管理员用户
rs0:PRIMARY> use admin
rs0:PRIMARY> db.createUser({user:"root",pwd:"root",roles:[{role:"root",db:"admin"}]})
rs0:PRIMARY> db.auth("root","root")
创建库管理员
rs0:PRIMARY> use admin
rs0:PRIMARY> db.createUser({user:"admin",pwd:"admin",roles:[{role:"userAdminAnyDatabase",db:"admin"}]}) rs0:PRIMARY> db.auth("admin","123456")
9、创建KeyFile文件
keyfile是mongodb副本集的实例之间的权限认证,如果keyfile文件内容不同,那么该实例添加到副本集的时候,会出现不可达的状态
将主节点中的keyfile文件拷贝到复制集其他从节点服务器中,路径地址对应mongo.conf配置文件中的kevFile字段地址,并设置kevfile权限为600
注意: 创建keyFile前,需要先停掉复制集中所有主从节点的mongod服务,然后再创建,否则有可能出现服务启动不了的情况。
- 停止Mongodb服务
节点服务器2
mongod --shutdown --config /data/mongodb/node2/config/node2.conf
节点服务器3
mongod --shutdown --config /data/mongodb/node3/config/node3.conf
节点服务器1
mongod --shutdown --config /data/mongodb/node1/config/node1.conf
- 在主节点创建keyfile文件,拷贝到另外两个节点(注意拷贝后也要改权限)
openssl rand -base64 666 > /usr/local/mongodb-6.0.5/keyfile
- 设置kevfile权限为600
chmod 600 /usr/local/mongodb-6.0.5/keyfile
10.更新节点配置文件并重启服务
- 主节点添加
vi /data/mongodb/node1/config/node1.conf
添加以下内容:
auth=true oplogSize=100 keyFile=/usr/local/mongodb-6.0.5/keyfile
2. 另外两个节点添加
vi /data/mongodb/node2/config/node2.conf vi /data/mongodb/node3/config/node3.conf
添加以下内容:
oplogSize=100 keyFile=/usr/local/mongodb-6.0.5/keyfile
3. 重启服务
先停两个SECONDARY节点,再停PRIMARY节点
SECONDARY节点1
mongod --shutdown --config /data/mongodb/node3/config/node3.conf
SECONDARY节点2
mongod --shutdown --config /data/mongodb/node3/config/node3.conf
PRIMARY节点
mongod --shutdown --config /data/mongodb/node3/config/node3.conf
先启动PRIMARY节点,再启动两个SECONDARY节点
PRIMARY节点
mongod -f /data/mongodb/node1/config/node1.conf
SECONDARY节点1
mongod -f /data/mongodb/node2/config/node2.conf
SECONDARY节点2
mongod -f /data/mongodb/node3/config/node3.conf
11、设置开机自启服务
添加mongodb服务配置文件
vi /lib/systemd/system/mongodb.service
添加以下字段
[Unit]
Description=mongodb
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
ExecStart=/usr/local/mongodb-6.0.5/bin/mongod --config /data/mongodb/node2/config/node2.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/usr/local/mongodb-6.0.5/bin/mongod --shutdown --config /data/mongodb/node2/config/node2.conf
PrivateTmp=true
[Install]
WantedBy=multi-user.target
重载配置文件
systemctl daemon-reload
设置mongodb.service权限
chmod 754 /lib/systemd/system/mongodb.service
系统mongodb.service操作命令
#启动服务
systemctl start mongodb.service
#关闭服务
systemctl stop mongodb.service
#开机启动
systemctl enable mongodb.service
#重启服务
systemctl restart mongodb.service
12、MongoDB副本集测试
在从节点的mongodb查看是否完成复制
- 在主节点的Mongodb上创建test并插入集合aaa
rs0 [direct: primary] test> db.aaa.insert({AccountID:1,UserName:"123",password:"123456"})
- 查看是否创建
rs0 [direct: primary] test> show tables
rs0 [direct: primary] test> db.aaa.find()
- 查看副节点是否同步
mongosh 10.0.0.202:27018
rs0 [direct: secondary] test> use test
rs0 [direct: secondary] test> show tables
rs0 [direct: secondary] test> db.aaa.find()
mongosh 10.0.0.203:27019
rs0 [direct: secondary] test> use test
rs0 [direct: secondary] test> show tables
rs0 [direct: secondary] test> db.aaa.find()
主从替换
通过模拟主节点宕机来检验主从替换,以通过杀死指令杀死主进程来达到宕机效果
当主节点宕机后访问27018(从节点)端口,可以看到该端口对应的mongodb变成了主节点,以及当执行rs.status()命令时,显示27017端口的mongodb的状态为不可达/健康
- 主节点状态
- 从节点状态
- 宕掉主节点
[root@localhost ~]# systemctl stop mongodb.service
- 登录从节点查看状态
rs0 [direct: secondary] test> rs.status()
- 主节点宕机后的状态
- 从节点的状态
13、报错解决
1、报错:命令列表数据库需要身份验证
MongoServerError: command listDatabases requires authentication
解决方案:认证用户
rs0 [direct: primary] test> use admin switched to db admin
rs0 [direct: primary] admin> db.auth("root","123456")
2、报错:
MongoServerError: not primary and secondaryOk=false - consider using db.getMongo().setReadPref() or readPreference in the connection string
mongodb默认是从主节点读写数据的,副本节点上不允许读
rs0 [direct: secondary] test> show dbs;
2023-04-028T22:50:43.712+0800 E QUERY [thread1] Error: listDatabases failed:{
"ok" : 0,
"errmsg" : "not master and slaveOk=false",
"code" : 13435,
"codeName" : "NotMasterNoSlaveOk"
} :
解决方案:
rs0 [direct: secondary] test> rs.slaveOk()
#当执行这条命令时会有一个警告,意思是这条参数可能在以后的版本弃用了,将会用 secondaryOk()代替
rs0 [direct: secondary] test> rs.secondaryOk()
原文地址:https://blog.csdn.net/qq_52302132/article/details/135778303
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_62157.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!