1、三种集群介绍
MongoDB有三种集群部署模式,分别为主从复制(Master-Slaver)、副本集(Replica Set)和分片(Sharding)模式。
1、Master-Slaver 是一种主从副本的模式,目前已经不推荐使用。
2、Replica Set 模式取代了 Master-Slaver 模式,是一种互为主从的关系。Replica Set 将数据复制多份保存,不同服务器保存同一份数据,在出现故障时自动切换,实现故障转移,在实际生产中非常实用。
3、Sharding 模式适合处理大量数据,它将数据分开存储,不同服务器保存不同的数据,所有服务器数据的总和即为整个数据集。
总结:Sharding 模式追求的是高性能,而且是三种集群中最复杂的。在实际生产环境中,通常将 Replica Set 和 Sharding 两种技术结合使用。
2、副本集角色介绍
1、主要要成员(Primary):主要接收所有写操作。就是主节点。
2、副本成员(Replicate):从主节点通过复制操作以维护相同的数据集,即备份数据,不可写操作,但可以读操作(但需要配置)。是默认的一种从节点类型。
3、仲裁者(Arbiter):不保留任何数据的副本,只具有投票选举作用。当然也可以将仲裁服务器维护为副本集的一部分,即副本成员同时也可以是仲裁者。也是一种从节点类型。
主机IP | 操作系统 | CPU架构 | 节点角色 | 节点说明 | 文件描述符 |
---|---|---|---|---|---|
192.168.1.191 | Centos7.6 | x86_64 | primary | 主节点 | 65535 |
192.168.1.192 | Centos7.6 | x86_64 | secondary | 从节点 | 65535 |
192.168.1.193 | Centos7.6 | x86_64 | arbiter | 仲裁节点 | 65535 |
说明:由于业务需要,mongodb的最大连接数需要设置为20000,由于系统默认的文件描述符为1024,所以这里都统一设置为65535。
具体设置方式如下所示:
#1、临时生效
ulimit -n 65535
#2、永久生效
echo "* soft nofile 65535" >>/etc/security/limits.conf
echo "* hard nofile 65535" >>/etc/security/limits.conf
echo "* soft nproc 65535" >>/etc/security/limits.d/20-nproc.conf
echo "* hard nproc 65535" >>/etc/security/limits.conf
官方下载MongoDB4.2.23二进制安装包
说明:建议mongodb的服务安装目录、数据目录、日志目录都放在磁盘空间最大目录下。
说明:只需在主节点上(192.168.1.191)主机上操作。
1、下载二进制安装包(假设/data磁盘空间最大)
[root@localhost ~]# mkdir -pv /data/pkgs && cd /data/pkgs
[root@localhost pkgs]# wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.2.23.tgz
[root@localhost pkgs]# tar axf mongodb-linux-x86_64-rhel70-4.2.23.tgz
[root@localhost pkgs]# mv mongodb-linux-x86_64-rhel70-4.2.23 mongodb
[root@localhost pkgs]# ll mongodb
drwxr-xr-x 2 root root 231 12月 2 14:52 bin
-rw-r--r-- 1 root root 30608 9月 29 23:36 LICENSE-Community.txt
-rw-r--r-- 1 root root 16726 9月 29 23:36 MPL-2
-rw-r--r-- 1 root root 2581 9月 29 23:37 README
-rw-r--r-- 1 root root 75405 9月 29 23:37 THIRD-PARTY-NOTICES
-rw-r--r-- 1 root root 183512 9月 29 23:38 THIRD-PARTY-NOTICES.gotools
2、创建数据目录、日志目录、key文件目录、配置文件目录、pid目录
[root@localhost ~]# cd /data/pkgs/mongodb
[root@localhost mongodb]# mkdir data logs key conf pid
3、生成key文件
说明:MongoDB使用keyfile认证,副本集中的每个mongod实例使用keyfile内容作为认证其他成员的共享密码。mongod实例只有拥有正确的keyfile才可以加入副本集。keyFile的内容必须是6到1024个字符的长度,且副本集所有成员的keyFile内容必须相同。
# 400权限是要保证安全性,否则mongod启动会报错
[root@localhost ~]# cd /data/pkgs/mongodb
[root@localhost mongodb ]# openssl rand -base64 756 > ./key/mongo.key
[root@localhost mongodb ]# chmod 400 ./key/mongo.key
4、编辑配置文件
[root@localhost ~]# cd /data/pkgs/mongodb
[root@localhost mongod]# vim conf/mongod.conf
systemLog:
destination: file
logAppend: true
path: /data/pkgs/mongodb/logs/mongod.log
storage:
dbPath: /data/pkgs/mongodb/data
journal:
enabled: true
# engine:
# wiredTiger:
# how the process runs
processManagement:
fork: true # fork and run in background
pidFilePath: /data/pkgs/mongodb/pid/mongod.pid # location of pidfile
timeZoneInfo: /usr/share/zoneinfo
# network interfaces
net:
port: 27017
bindIp: 0.0.0.0 # Enter 0.0.0.0,:: to bind to all IPv4 and IPv6 addresses or, alternatively, use the net.bindIpAll setting.
security:
clusterAuthMode: keyFile
keyFile: /data/pkgs/mongodb/key/mongo.key
authorization: enabled
#operationProfiling:
replication:
replSetName: mongodb_cluster
5、将/data/pkgs目录下的mongodb目录远程拷贝到192.168.1.192和192.168.1.193主机上,远程主机如果没有/data/pkgs目录,则请先创建该目录
[root@localhost pkgs]# scp -r /data/pkgs/mongodb [email protected]:/data/pkgs
[root@localhost pkgs]# scp -r /data/pkgs/mongodb [email protected]:/data/pkgs
说明:分别在192.168.1.191、192.168.1.192、192.168.1.193主机上启动mongodb服务,启动命令相同。
[root@localhost pkgs]# cd /data/pkgs/mongodb/
[root@localhost mongodb]# ./bin/mongod -f ./conf/mongod.conf --auth --maxConns=20000
about to fork child process, waiting until server is ready for connections.
forked process: 97708
child process started successfully, parent exiting
说明:只需在主节点上(192.168.1.191)添加副本集信息。
[root@localhost mongodb]# ./bin/mongo --eval "
rs.initiate(
{
_id : 'mongodb_cluster',
members: [
{ _id : 0, host : \"192.168.1.191:27017\", priority: 2 },
{ _id : 1, host : \"192.168.1.192:27017\", priority: 1 },
{ _id : 2, host : \"192.168.1.193:27017\", arbiterOnly: true }
]
}
)
"
说明:
1、“_id” : “mongodb_cluster” :副本集的配置数据存储的主键值,默认就是副本集的名字
2、““members” :副本集成员数组,priority表示优先级,
[root@localhost mongodb]# ./bin/mongo --eval "rs.status()"
说明:只需在主节点上(192.168.1.191)创建用户。
1、新建管理员root
[root@localhost pkgs]# cd /data/pkgs/mongodb/
[root@localhost mongodb]# vim admin-setup.js
db.createUser(
{
user: "admin",
pwd: "admin@123",
roles: [ { role: "root", db: "admin" } ]
}
)
[root@localhost mongodb]# ./bin/mongo admin ./admin-setup.js
MongoDB shell version v4.2.23
connecting to: mongodb://127.0.0.1:27017/admin?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("9962547e-7264-485b-a4f8-62752722b246") }
MongoDB server version: 4.2.23
Successfully added user: {
"user" : "admin",
"roles" : [
{
"role" : "root",
"db" : "admin"
}
]
}
[root@localhost mongodb]# ./bin/mongo --host 192.168.1.191 --port 27017 -u admin -p admin@123 --authenticationDatabase admin
MongoDB shell version v4.2.23
connecting to: mongodb://192.168.1.191:27017/?authSource=admin&compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("71df4b04-fafc-4408-aa14-a36be94c09d0") }
MongoDB server version: 4.2.23
Server has startup warnings:
如下图所示:
2、数据库possecu,新建普通(读写权限)用户lolaage
[root@localhost pkgs]# cd /data/pkgs/mongodb/
[root@localhost mongodb]# vim possecu-setup.js
db.createUser(
{
user: "lolaage",
pwd: "lolaage@123",
roles: [
{ role: "readWrite", db: "possecu" }
]
}
)
[root@localhost mongodb]# ./bin/mongo -u admin -p admin@123 --authenticationDatabase admin possecu ./possecu-setup.js
MongoDB shell version v4.2.23
connecting to: mongodb://127.0.0.1:27017/possecu?authSource=admin&compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("ca7ad103-bdbc-40dd-a237-31e1c653d9c4") }
MongoDB server version: 4.2.23
Successfully added user: {
"user" : "lolaage",
"roles" : [
{
"role" : "readWrite",
"db" : "possecu"
}
]
}
[root@localhost mongodb]# ./bin/mongo --host 192.168.1.191 --port 27017 -u lolaage -p lolaage@123 --authenticationDatabase possecu
MongoDB shell version v4.2.23
connecting to: mongodb://192.168.1.191:27017/?authSource=possecu&compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("c19599e2-5aef-4b4b-942d-557f4c619b63") }
MongoDB server version: 4.2.23
3、开启从节点临时读权限
[root@localhost mongodb]# ./bin/mongo --host 192.168.1.192 --port 27017 -u admin -p admin@123 --authenticationDatabase admin
mongodb_cluster:SECONDARY> rs.secondaryOk();
#1、创建服务脚本mongodb.service
[root@localhost ~]# vim /etc/systemd/system/mongod.service
[Unit]
Description=Mongodb Service
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
ExecStart=/data/pkgs/mongodb/bin/mongod --config /data/pkgs/mongodb/conf/mongod.conf --auth --maxConns=20000
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/data/pkgs/mongodb/bin/mongod --config /data/pkgs/mongodb/conf/mongod.conf --shutdown
PrivateTmp=true
[Install]
WantedBy=multi-user.target
#2、刷新配置(在启动前,必须先执行,否则报警告)
[root@localhost ~]# systemctl daemon-reload
#3、启动服务
[root@localhost ~]# systemctl start mongod
#4、停止服务
[root@localhost ~]# systemctl stop mongod
#5、服务加入开机自启
[root@localhost ~]# systemctl enable mongod
1、故障转移
#1、停止主节点mongodb服务
# 说明:停止前主节点为192.168.1.191
[root@localhost mongodb]# ./bin/mongod -f ./conf/mongod.conf --auth --maxConns=20000 --shutdown
killing process with pid: 99828
#2、登录从节点查看当前节点状态
[root@localhost mongodb]# ./bin/mongo --host 192.168.1.192 --port 27017 -u admin -p admin@123 --authenticationDatabase admin
mongodb_cluster:PRIMARY> rs.status()
说明:此时应该可以看到,主节点为192.168.1.192,已经完成了主从切换。如下图所示:
2、数据一致性
#1、主节点登录插入一条数据
[root@localhost mongodb]# ./bin/mongo --host 192.168.1.191 --port 27017 -u admin -p admin@123 --authenticationDatabase admin
mongodb_cluster:PRIMARY> db.users.insert({name:"jack",age:0,addr:"guangzhou",country:"China"})
WriteResult({ "nInserted" : 1 })
mongodb_cluster:PRIMARY> db.users.find()
{ "_id" : ObjectId("6389c03ceec47300d932c1aa"), "name" : "jack", "age" : 0, "addr" : "guangzhou", "country" : "China" }
mongodb_cluster:PRIMARY>
#2、从节点查看数据是否同步
[root@localhost mongodb]# ./bin/mongo --host 192.168.1.192 --port 27017 -u admin -p admin@123 --authenticationDatabase admin
mongodb_cluster:SECONDARY> rs.secondaryOk()
mongodb_cluster:SECONDARY> db.users.find()
{ "_id" : ObjectId("6389c03ceec47300d932c1aa"), "name" : "jack", "age" : 0, "addr" : "guangzhou", "country" : "China" }
说明:此时应该看到这条记录了, 证明我们的主从复制功能已经成功了。
1、查看全局所有账户
mongodb_cluster:PRIMARY> use admin
switched to db admin
mongodb_cluster:PRIMARY> db.system.users.find()
**2、查看当前库下的账户 **
mongodb_cluster:PRIMARY> use possecu
switched to db possecu
mongodb_cluster:PRIMARY> show users
3、查看最大连接数
mongodb_cluster:PRIMARY> db.serverStatus().connections
{ "current" : 8, "available" : 19992, "totalCreated" : 30, "active" : 2 }
4、修改密码
mongodb_cluster:PRIMARY> use admin
switched to db admin
mongodb_cluster:PRIMARY> db.changeUserPassword("admin", "admin@123456")
5、通过密码登陆mongo
[root@localhost mongodb]# ./bin/mongo --host 192.168.1.191 --port 27017 -u admin -p admin@123 --authenticationDatabase admin
更多详细内容请参考:Linux运维实战总结