mongodb副本集(Replica Set)是一组MongoDB实例组成的集群,由一个主(Primary)服务器和多个备份(Secondary)服务器构成。
通过复制(Replication),将数据的更新由Primary推送到其他实例上,在一定的延迟之后,每个MongoDB实例维护相同的数据集副本。
通过维护冗余的数据库副本,能够实现数据的异地备份,读写分离和自动故障转移。
安装
我们准备3台centos7.4服务器,IP段 192.168.0.128 - 130 ,下面的配置在多台服务器中相同
1:下载 mongodb-linux-x86_64-3.4.12 文件,上传到linxu服务器,并解压,改名,然后配置环境变量
2:解压和重命名:tar -xvzf mongodb-linux-x86_64-3.4.12 mv mongodb-linux-x86_64-3.4.12 mongodb
3:把mongodb配置到环境变量中:vi /etc/profile
export MONGODB_HOME=/usr/local/mongodbexport PATH=$MONGODB_HOME/bin:$PATH
# 使立即生效
source /etc/profile4:在重命名mongodb文件夹中创建存放配置文件的目录和存放数据的目录
mkdir -p /usr/local/mongodb/conf
mkdir -p /usr/local/mongodb/data/data
mkdir -p /usr/local/mongodb/data/log
mkdir -p /usr/local/mongodb/rs
5:在mongodb/conf 下创建mongodb.conf文件,最新版的mongodb支持yaml语法
systemLog:
destination: file
logAppend: true
path: /usr/local/mongodb/data/log/mongod.log
storage:
dbPath: /usr/local/mongodb/data/data
journal:
enabled: true
processManagement:
fork: true # 后台启动fork and run in background
pidFilePath: /usr/local/mongodb/data/log/mongod.pid # location of pidfile
# network interfaces
net:
port: 27017
bindIp: 0.0.0.0 # Listen to local interface only, comment to listen on all interfaces.
security:
authorization: enabled
clusterAuthMode: keyFile
keyFile: /usr/local/mongodb/rs/keyfile
replication:
replSetName: zypcy
在 mongodb/rs/ 执行:使用 openssl生成一个key文件, openssl rand -base64 741 > keyfile
给 keyfile 文件设置权限 chmod 600 keyfile ,然后把keyfile文件传到各个服务器mongodb/rs 文件夹下
6:启动与停止mongodb启动:mongod -f /usr/local/mongodb/conf/mongodb.conf
停止:mongod -f /usr/local/mongodb/conf/mongodb.conf --shutdown
以上配置在多台服务器中同时配置好,并启动mongodb
7、配置只需要登录任意一台配置服务器,进行初始化副本集即可
进入mongodb中进行配置副本集
连接: mongo
config变量 , 定义副本集配置,第三个节点的 “arbiterOnly”:true 代表其为仲裁节点
config = {
_id : "zypcy",
members : [
{_id : 0, host : "192.168.0.128:27017" },
{_id : 1, host : "192.168.0.129:27017" },
{_id : 2, host : "192.168.0.130:27017" , arbiterOnly: true}
]
}
初始化副本集:rs.initiate(config) , 出现 { "ok" : 1} 表示副本集配置成功
查看副本集: rs.status()
说明:"_id" : "configs"应与配置文件中配置的 replicaction.replSetName 一致,"members" 中的 "host" 为三个节点的 ip 和 port
先进入admin数据库,创建root用户,再创建目标数据库
use admin
db.createUser({user:"admin",pwd:"admin",roles:[{role:"root",db:"admin"}]})db.auth("admin","admin")
再在业务数据库中创建用户 (要注意的是“dbAdmin”其实是没有读写权限的)
use aidb.createUser({user:"zhuyu",pwd:"zhuyu",roles:[{role:"dbAdmin",db:"ai"},{role:"readWrite",db:"ai"}]})
8:测试插入数据 use ai db.users.insert({name:“zhuyu”}); 这样就会在其他几个副本都插入数据
分别到其他几个去查数据可以查到,但会报not master slaveOk=false这样的错,莫认是不可读,需要设一下:
使用命令;db.getMongo().setSlaveOk();就可以了网友回复