提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
mongodb副本集集群部署,结合网上查找资料及自己实践,进行一次完整的安装记录,并附上对应安装包,提供给需要的人使用。此安装包支持linux-x86架构;
mongodb安装包:此博客可下载
准备3台服务器(自己电脑上装了3台虚拟机进行测试安装,没有问题后安装至生产环境)
副本集有两种类型,三种角色。
两种类型:
1.主节点(Primary)类型:数据操作的主要连接点,可读写
2.次、辅助、从节点(Secondaries)类型:数据冗余备份节点,可以读(需要设置)或选举
三种角色:
1.主要成员(Primary):主要接收所有写操作。就是主节点。
2.副本成员(Replicate):从主节点通过复制操作以维护相同的数据集,即备份数据,不可写操作,但可以读操作(但需要配置)。是默认的一种从节点类型。
3.仲裁者(Arbiter):不保留任何数据的副本,只具有投票选举作用。当然也可以将仲裁服务器维护为副本集的一部分,即副本成员同时也可以是仲裁者。也是一种从节点类型
将压缩的安装移动到/usr/local目录下,并且将其解压重命名为mongodb,最后在mongodb下创建一些文件目录和配置文件。
#移动安装包到/usr/local目录
mv mongodb-linux-x86_64-rhel70-5.0.7.tgz /usr/local/
进行解压
tar zxvf mongodb-linux-x86_64-rhel70-4.4.5.tgz
#重命名文件
mv mongodb-linux-x86_64-rhel70-4.4.5 mongodb
#创建目录
cd mongodb && mkdir {data,log,conf,pid}
#创建配置文件
touch /usr/local/mongodb/conf/mongo.conf
各目录介绍:
data目录用来存放数据库数据文件
log目录存放mongo的日志文件
conf目录存放mongodb的配置文件
pid目录存放mongodb运行时的pid文件
编辑配置文件(/usr/local/mongodb/conf/mongo.conf),编辑完成后保存退出。
systemLog:
#MongoDB发送所有日志输出的目标指定为文件
destination: file
#mongod或mongos应向其发送所有诊断日志记录信息的日志文件的路径
path: "/usr/local/mongodb/log/mongod.log"
#当mongos或mongod实例重新启动时,mongos或mongod会将新条目附加到现有日志文件的末尾
logAppend: true
storage:
#mongod实例存储其数据的目录。storage.dbPath设置仅适用于mongod
dbPath: "/usr/local/mongodb/data"
journal:
#启用或禁用持久性日志以确保数据文件保持有效和可恢复。
enabled: true
processManagement:
#启用在后台运行mongos或mongod进程的守护进程模式。
fork: true
#指定用于保存mongos或mongod进程的进程ID的文件位置,其中mongos或mongod将写入其PID
pidFilePath: "/usr/local/mongodb/pid/mongod.pid"
#从中加载时区数据库的完整路径
timeZoneInfo: /usr/share/zoneinfo
net:
#服务实例绑定所有IP
#bindIpAll: true
#服务实例绑定的IP,0.0.0.0让所有机器都能连接。
bindIp: 0.0.0.0
#绑定的端口
port: 27017
replication:
#副本集的名称
replSetName: "bdcjq"
注:replication(副本集)配置项不配置的话就是单机配置文件
设置好环境变量,方便后续直接执行mongo脚本
# 将mongodb的bin目录添加环境变量PATH中去
[root@localhost mongodb]# echo "export PATH=$PATH:/usr/local/mongodb/bin" >> /etc/profile
# 刷新环境变量
[root@localhost mongodb]# source /etc/profile
# 测试环境变量设置是否成功
[root@localhost mongodb]# mongo -version
MongoDB shell version v4.4.5
Build Info: {
"version": "4.4.5",
"gitVersion": "b977129dc70eed766cbee7e412d901ee213acbda",
"openSSLVersion": "OpenSSL 1.0.1e-fips 11 Feb 2013",
"modules": [],
"allocator": "tcmalloc",
"environment": {
"distmod": "rhel70",
"distarch": "x86_64",
"target_arch": "x86_64"
}
}
启动测试下mongo是否启动成功。显示started successfully,说明启动成功
[root@localhost mongodb]# mongod -f /usr/local/mongodb/conf/mongo.conf
about to fork child process, waiting until server is ready for connections.
forked process: 18064
child process started successfully, parent exiting
[root@localhost mongodb]# ps -ef | grep mongo
root 71114 1 29 23:44 ? 00:00:01 mongod -f /usr/local/mongodb/conf/mongo.conf
root 80560 36922 0 23:44 pts/0 00:00:00 grep --color=auto mongo
[root@localhost mongodb]# kill -9 71114
清空 data,log, pid 三个目录,后面再复制mongodb目录至其它两台机器上,其他两台机器上的数据目录就是全新的。
[root@localhost mongodb]# cd /usr/local/mongodb/
[root@localhost mongodb]# rm -rf {data/*,log/*,pid/*}
[Unit]
Description=mongodb service
Documentation=https://docs.mongodb.com/manual/
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/usr/local/mongodb/pid/mongod.pid
ExecStart=/usr/local/mongodb/bin/mongod -f /usr/local/mongodb/conf/mongo.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/usr/local/mongodb/bin/mongod --shutdown --config /usr/local/mongodb/conf/mongo.conf
PrivateTmp=true
Restart=always
RestartSec=1
[Install]
WantedBy=multi-user.target
systemctl start mongod.service
systemctl restart mongod.service
systemctl stop mongod.service
systemctl enable mongod.service
其它两台服务器可以参考上面的方式进行创建服务。
将上面已经安装好的mongodb目录完整的拷贝到其它两台服务器上,下面使用scp命令进行拷贝文件。(登录主节点129.168.112.128)
使用 scp 的 -r 选项,进行文件夹拷贝,根据提示输入远程机器的root密码即可。
#拷贝到 129.168.112.129
[root@localhost local]# scp -r /usr/local/mongodb [email protected]:/usr/local/
The authenticity of host ‘192.168.112.129 (192.168.112.129)’ can’t be established.
ECDSA key fingerprint is SHA256:h72YDYewH4bpsq408yVkdF5S2hPzsbeYO03UqMselWI.
ECDSA key fingerprint is MD5:55:ed:19:03:c0:2e:3b:9d:2e:7e:ef:74:17:c9:e2:59.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added ‘192.168.112.129’ (ECDSA) to the list of known hosts.
[email protected]’s password:
#拷贝到 129.168.112.130
[root@localhost local]# scp -r /usr/local/mongodb [email protected]:/usr/local/
[email protected]’s password:
登录129.168.112.129
# 将mongodb的bin目录添加环境变量PATH中去
[root@localhost mongodb]# echo "export PATH=$PATH:/usr/local/mongodb/bin" >> /etc/profile
# 刷新环境变量
[root@localhost mongodb]# source /etc/profile
登录129.168.112.130
# 将mongodb的bin目录添加环境变量PATH中去
[root@localhost mongodb]# echo "export PATH=$PATH:/usr/local/mongodb/bin" >> /etc/profile
# 刷新环境变量
[root@localhost mongodb]# source /etc/profile
3台机器均启动mongodb
mongod -f /usr/local/mongodb/conf/mongo.conf
登录主节点服务器,连接mongodb进行副本集初始化
mongo
注:如果提示命令不存在,检查2.7章节"发布为系统服务"是否配置或是否配置错误
>cfg={ _id:"bdcjq", members:[
{_id:0,host:'192.168.112.128:27017',priority:10},
{_id:1,host:'192.168.112.130:27017',priority:5},
{_id:2,host:'192.168.112.129:27017',arbiterOnly:true}] };
>rs.initiate(cfg)
#此输出代表初始化集群成功:{ “ok” : 1 }
#查看副本集状态 :rs.status()
说明:
- 当执行完初始化成功后,我们使用mongo终端连接到192.168.112.129(仲裁节点),192.168.112.130(次节点)。可以发现命令提示符分别变成了bdcjq:ARBITER>和bdcjq:SECONDARY>
- 默认次节点是不可以读写操作的,但是我们可以设置拥有读权限(次节点认证过后,执行:rs.secondaryOk() 或者rs.secondaryOk(true)即可)
- 我们可以取消次节点的读权限(rs.secondaryOk(false))
一般生产环境都是需要登录才能够操作数据库,下面就如何开起mongodb副本集集群登录认证做出说明。
启用登录验证之前创建管理员账号
[root@localhost mongodb]# mongo
>use admin
>db.createUser({user: "root",pwd: "123456",roles:[{role:"userAdminAnyDatabase",db:"admin"},"readWriteAnyDatabase"]})
>db.grantRolesToUser("root", ["clusterAdmin"])
登录主节点192.168.112.128,创建keyFile(keyfile是用于mongodb集群内部成员认证用的。keyfile主要是用于集群内部认证用,唯一的要求是6-1024长度内容,集群内部成员该文件值必须一样才可以)-
-主节点创建后复制到次节点和仲裁节点
openssl rand -base64 21 > /usr/local/mongodb/keyFile
chmod 400 /usr/local/mongodb/keyFile
vi /usr/local/mongodb/conf/mongo.conf
mongo.conf配置文件增加以下内容
#安全配置
security:
#配置密码文件
keyFile:/usr/local/mongodb/keyFile
#开启认证方式运行
authorization: "enabled"
将主节点配置完整的keyFile与mongo.conf两个文件复制到次节点和仲裁节点
scp /usr/local/mongodb/keyFile [email protected]:/usr/local/mongodb
scp /usr/local/mongodb/keyFile [email protected]:/usr/local/mongodb
scp /usr/local/mongodb/conf/mongo.conf [email protected]:/usr/local/mongodb/conf
scp /usr/local/mongodb/conf/mongo.conf [email protected]:/usr/local/mongodb/conf
[root@localhost mongodb]# systemctl restart mongodb.service
启用用户验证后,登录主节点创建数据库及用户即可,主节点创建后会自动同步至次节点
[root@localhost mongodb]# mongo
bdcjq:PRIMARY>use admin
bdcjq:PRIMARY>db.auth("root","123456")
1
#此处显示1说明正常登录,不是1说明登录失败#
#开始创建数据库及普通用户
bdcjq:PRIMARY>use test
switched to db test
bdcjq:PRIMARY>db.test.insert({"name":"aaa"})
WriteResult({ "nInserted" : 1 })
bdcjq:PRIMARY>db.createUser(
{
user: "ceshi",
pwd: "123456",
roles: [ { role: "readWrite", db: "test" }]
}
)
用户创建显示下方内容即创建成功
Successfully added user: {
“user” : “ceshi”,
“roles” : [
{
“role” : “readWrite”,
“db” : “test”
}
] }
验证创建数据库及用户是否成功
bdcjq:PRIMARY>show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
test 0.000GB
第一次梳理,如不清楚可留言