一、MongoDB介绍
1.1 MongoDB简介
MongoDB是一个开源的文档数据库,使用JSON格式存储和操作数据,具有高度灵活性和可扩展性。MongoDB的数据模型是面向文档的,这意味着它可以存储各种类型的数据,如数组、嵌套文档和二进制数据。MongoDB是一种NoSQL数据库,不需要使用传统的表格结构。MongoDB是分布式的,可以在多台服务器上部署,支持自动分片,可以实现高可用性和横向扩展。MongoDB还带有很多强大的功能,包括聚合框架、索引、MapReduce等,支持多种编程语言和多种平台。它被广泛用于Web应用程序、大数据分析和实时数据处理等领域。
1.2 MongoDB特点
- 面向文档的数据模型:MongoDB是一种面向文档的数据库,这意味着它使用文档来存储数据,文档是一个键值对集合,是非常灵活的数据模型。
- 分布式:MongoDB支持分布式数据存储,可以将数据分布在多个服务器上,从而实现更高的可用性和可扩展性。
- 高性能:MongoDB支持高性能读写,能够在海量数据环境下快速响应。
- 强大的查询语言:MongoDB支持丰富的查询语言,包括聚合管道、地理空间查询、全文搜索等,能够满足各种查询需求。
- 灵活的数据模型:MongoDB的文档的格式非常灵活,没有固定的架构,可以按照需求进行调整。同时,支持动态添加字段和修改文档结构。
- 可扩展性:MongoDB非常容易扩展,可以通过水平扩展的方式来增加服务器数量,以满足不断增长的数据和请求量。
- 可视化管理工具:MongoDB提供了可视化的管理工具,如MongoDB Compass,使得管理和操作MongoDB数据库更加方便。
二、MongoDB主从复制介绍
2.1 MongoDB主从复制
MongoDB主从复制是一种数据同步机制,通过该机制可以将一个 MongoDB 实例的数据复制到其他多个实例中,以提高数据的可靠性和可用性。在主从复制中,有一个主节点(也称为主服务器),负责接收写入请求并将数据同步到从节点(也称为从服务器)。从节点只能处理读操作,而不允许写入操作。
主从复制的核心是复制集(Replica Set),它由多个 MongoDB 实例组成。一个复制集中包括一个主节点和多个从节点。主节点将写入操作同步到所有的从节点,从节点在收到主节点的更新后,将自己的数据更新为与主节点一致的状态,确保数据的一致性。
当主节点出现故障时,从节点可以接替主节点成为新的主节点,继续处理写入请求和同步数据到其他从节点。这种自动切换的机制可以保证系统的高可用性和可靠性。
主从复制还可以通过读写分离的方式提高读写性能。将读操作分发到从节点,从而减轻主节点的负载压力,提高系统的并发处理能力。MongoDB主从复制是一种可靠、高效的数据同步机制,可以帮助用户保证数据的完整性和可用性。
2.2MongoDB副本集
- 副本集在mongodb中是是一组 mongod保持相同的数据集过程,副本集提供冗余和高可用性,并且是所有生产部署的基础。
- 复制提供冗余并增加数据可用性,在不同数据库服务器上具有多个数据副本,复制可以提供一个级别的单一数据库服务器丢失的容错能力。
- 副本集至少需要3个成员,可以是一主两从,也可以是一主一从一仲裁节点,如果主节点挂掉,两个从节点会重新选举,找到一个从节点,将其提升为主。
三、本次实践介绍
3.1 实践环境规划
hostname | IP地址 | 系统版本 | MongoDB版本 | 角色 |
master | 192.168.3.141 | centos 7.9 | v5.0.21 | 主节点 |
node01 | 192.168.3.142 | centos 7.9 | v5.0.21 | 从节点 |
node02 | 192.168.3.143 | centos 7.9 | v5.0.21 | 从节点 |
3.2 本次实践简介
1.本次实践准备三台服务器,操作系统为centos7.9; 2.本次实践环境为个人测试环境,生产环境请谨慎;
3.本次实践主要配置MongoDB主从复制。
四、安装MongoDB
4.1 安装说明
- 三台服务器都需要按照以下步骤安装MongoDB环境。4.2 配置yum仓库配置mongodb的yum仓库
vim /etc/yum.repos.d/mongodb.repo | |
[mongodb-org] | |
name=MongoDB Repository | |
baseurl=https://mirrors.tuna.tsinghua.edu.cn/mongodb/yum/el7/ | |
gpgcheck=0 | |
enabled=1 |
4.3 检查yum仓库状态
检查yum仓库各镜像源状态
[root@master ~]# yum repolist all |grep enable | |
base/7/x86_64 CentOS-7 - Base - mirrors.aliyun.com enabled: 10,072 | |
extras/7/x86_64 CentOS-7 - Extras - mirrors.aliyun.com enabled: 518 | |
mongodb-org/7 MongoDB Repository enabled: 337 | |
updates/7/x86_64 CentOS-7 - Updates - mirrors.aliyun.com enabled: 5,176 |
4.4 安装MongoDB
直接使用yum安装mongodb
yum install -y mongodb-org-server mongodb-org
4.5 修改绑定IP
修改/etc/mongod.conf 配置文件中的mongodb服务绑定的IP地址为0.0.0.0。
vim /etc/mongod.conf
4.6 启动MongoDB服务
启动MongoDB服务
systemctl start mongod.service && systemctl enable mongod.service
4.7 检查MongoDB服务状态
检查MongoDB服务状态
[root@master ~]# systemctl status mongod | |
● mongod.service - MongoDB Database Server | |
Loaded: loaded (/usr/lib/systemd/system/mongod.service; enabled; vendor preset: disabled) | |
Active: active (running) since Wed 2023-09-13 16:38:48 CST; 44s ago | |
Docs: https://docs.mongodb.org/manual | |
Main PID: 1472 (mongod) | |
CGroup: /system.slice/mongod.service | |
└─1472 /usr/bin/mongod -f /etc/mongod.conf | |
Sep 13 16:38:48 master systemd[1]: Started MongoDB Database Server. | |
Sep 13 16:38:48 master mongod[1472]: {"t":{"$date":"2023-09-13T08:38:48.292Z"},"s":"I", "c":"CONTROL", "id":7484500, "ctx":"-","msg":"Environment variable MONG... to false"} | |
Hint: Some lines were ellipsized, use -l to show in full. |
4.8 查看MongoDB版本
查看当前安装的MongoDB版本
[root@master ~]# mongod --version | |
db version v5.0.21 | |
Build Info: { | |
"version": "5.0.21", | |
"gitVersion": "4fad44a858d8ee2d642566fc8872ef410f6534e4", | |
"openSSLVersion": "OpenSSL 1.0.1e-fips 11 Feb 2013", | |
"modules": [], | |
"allocator": "tcmalloc", | |
"environment": { | |
"distmod": "rhel70", | |
"distarch": "x86_64", | |
"target_arch": "x86_64" | |
} | |
} |
五、master节点配置工作
5.1 进入mongodb数据库
直接本地进入mongodb
mongo
5.2 创建admin账号
在mongodb内创建用户管理员admin账号
db.createUser({ | |
user: "admin", | |
pwd: "admin", | |
roles: [ | |
{role: "userAdminAnyDatabase",db: "admin"} | |
] | |
} | |
) |
5.3 创建测试账号
进入admin数据库内,使用admin账号验证登录。
use admin; | |
switched to db admin | |
"admin", "admin") | db.auth(|
1 |
在在mongodb内创建huawei用户,用户角色权限为“root”。
db.createUser({ | |
user: "huawei", | |
pwd: "huawei", | |
roles: [ "root" ] | |
} | |
) |
5.4 访问测试数据库
使用admin账号连接mongodb
mongo -uadmin -padmin --authenticationDatabase admin
5.5 在主节点创建key文件
在主节点创建key文件
mkdir -p /data/mongodb/ | |
openssl rand -base64 666 > /data/mongodb/mongodb.key |
- 在两个从节点创建目录
mkdir -p /data/mongodb/
5.5 拷贝key文件
将key文件发送两个从节点
scp /data/mongodb/mongodb.key root@192.168.3.142:/data/mongodb/ | |
scp /data/mongodb/mongodb.key root@192.168.3.143:/data/mongodb/ |
六、所有节点配置工作
6.1 配置说明
- 以下步骤,三个节点都需要执行。
6.2 目录及文件授权
在三个节点服务器中,执行以下命令,对相关目录及文件进行授权操作·。
chown mongod:mongod -R /data/mongodb/ | |
chmod 600 /data/mongodb/mongodb.key |
6.3 编辑/etc/mongod.conf文件
在三个节点服务器中,编辑/etc/mongod.conf文件。
systemLog: | |
destination: file | |
logAppend: true | |
path: /var/log/mongodb/mongod.log | |
storage: | |
dbPath: /var/lib/mongo | |
journal: | |
enabled: true | |
processManagement: | |
fork: true # fork and run in background | |
pidFilePath: /var/run/mongodb/mongod.pid # location of pidfile | |
timeZoneInfo: /usr/share/zoneinfo | |
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: | |
authorization: enabled | |
keyFile: /data/mongodb/mongodb.key | |
clusterAuthMode: keyFile | |
replication: | |
replSetName: rs0 | |
oplogSizeMB: 5000 |
6.4 重启mongodb服务
三个节点服务器,重启mongodb服务。
systemctl restart mongod
七、配置MongoDB主从
7.1 用户认证
连接master节点的mongodb。
mongo
使用huawei账号进行认证
use admin; | |
switched to db admin | |
"huawei","huawei") | db.auth(|
1 |
7.2 配置副本集
执行以下命令,配置副本集。
rs.initiate({ | |
_id : "rs0", | |
members: [ | |
{ _id: 0, host: "192.168.3.141:27017" }, | |
{ _id: 1, host: "192.168.3.142:27017" }, | |
{ _id: 2, host: "192.168.3.143:27017" } | |
] | |
}) |
7.3 主库查看副本集配置
master主节点,退出mongodb,重新连接后,使用huawei账号验证。
- 使用huawei账号进行认证
use admin; | |
db.auth("huawei","huawei") |
- 查看副本集配置
rs.config() | |
rs0:PRIMARY> rs.config() | |
{ | |
"_id" : "rs0", | |
"version" : 1, | |
"term" : 1, | |
"members" : [ | |
{ | |
"_id" : 0, | |
"host" : "192.168.3.141:27017", | |
"arbiterOnly" : false, | |
"buildIndexes" : true, | |
"hidden" : false, | |
"priority" : 1, | |
"tags" : { | |
}, | |
"secondaryDelaySecs" : NumberLong(0), | |
"votes" : 1 | |
}, | |
{ | |
"_id" : 1, | |
"host" : "192.168.3.142:27017", | |
"arbiterOnly" : false, | |
"buildIndexes" : true, | |
"hidden" : false, | |
"priority" : 1, | |
"tags" : { | |
}, | |
"secondaryDelaySecs" : NumberLong(0), | |
"votes" : 1 | |
}, | |
{ | |
"_id" : 2, | |
"host" : "192.168.3.143:27017", | |
"arbiterOnly" : false, | |
"buildIndexes" : true, | |
"hidden" : false, | |
"priority" : 1, | |
"tags" : { | |
}, | |
"secondaryDelaySecs" : NumberLong(0), | |
"votes" : 1 | |
} | |
], | |
"protocolVersion" : NumberLong(1), | |
"writeConcernMajorityJournalDefault" : true, | |
"settings" : { | |
"chainingAllowed" : true, | |
"heartbeatIntervalMillis" : 2000, | |
"heartbeatTimeoutSecs" : 10, | |
"electionTimeoutMillis" : 10000, | |
"catchUpTimeoutMillis" : -1, | |
"catchUpTakeoverDelayMillis" : 30000, | |
"getLastErrorModes" : { | |
}, | |
"getLastErrorDefaults" : { | |
"w" : 1, | |
"wtimeout" : 0 | |
}, | |
"replicaSetId" : ObjectId("65018aed22234a6282b793a6") | |
} | |
} |
7.4 查看副本集状态
查看副本集状态
rs0:PRIMARY> rs.status() | |
{ | |
"set" : "rs0", | |
"date" : ISODate("2023-09-13T10:18:54.675Z"), | |
"myState" : 1, | |
"term" : NumberLong(1), | |
"syncSourceHost" : "", | |
"syncSourceId" : -1, | |
"heartbeatIntervalMillis" : NumberLong(2000), | |
"majorityVoteCount" : 2, | |
"writeMajorityCount" : 2, | |
"votingMembersCount" : 3, | |
"writableVotingMembersCount" : 3, | |
"optimes" : { | |
"lastCommittedOpTime" : { | |
"ts" : Timestamp(1694600329, 1), | |
"t" : NumberLong(1) | |
}, | |
"lastCommittedWallTime" : ISODate("2023-09-13T10:18:49.099Z"), | |
"readConcernMajorityOpTime" : { | |
"ts" : Timestamp(1694600329, 1), | |
"t" : NumberLong(1) | |
}, | |
"appliedOpTime" : { | |
"ts" : Timestamp(1694600329, 1), | |
"t" : NumberLong(1) | |
}, | |
"durableOpTime" : { | |
"ts" : Timestamp(1694600329, 1), | |
"t" : NumberLong(1) | |
}, | |
"lastAppliedWallTime" : ISODate("2023-09-13T10:18:49.099Z"), | |
"lastDurableWallTime" : ISODate("2023-09-13T10:18:49.099Z") | |
}, | |
"lastStableRecoveryTimestamp" : Timestamp(1694600279, 1), | |
"electionCandidateMetrics" : { | |
"lastElectionReason" : "electionTimeout", | |
"lastElectionDate" : ISODate("2023-09-13T10:12:08.624Z"), | |
"electionTerm" : NumberLong(1), | |
"lastCommittedOpTimeAtElection" : { | |
"ts" : Timestamp(1694599918, 1), | |
"t" : NumberLong(-1) | |
}, | |
"lastSeenOpTimeAtElection" : { | |
"ts" : Timestamp(1694599918, 1), | |
"t" : NumberLong(-1) | |
}, | |
"numVotesNeeded" : 2, | |
"priorityAtElection" : 1, | |
"electionTimeoutMillis" : NumberLong(10000), | |
"numCatchUpOps" : NumberLong(0), | |
"newTermStartDate" : ISODate("2023-09-13T10:12:08.987Z"), | |
"wMajorityWriteAvailabilityDate" : ISODate("2023-09-13T10:12:10.491Z") | |
}, | |
"members" : [ | |
{ | |
"_id" : 0, | |
"name" : "192.168.3.141:27017", | |
"health" : 1, | |
"state" : 1, | |
"stateStr" : "PRIMARY", | |
"uptime" : 834, | |
"optime" : { | |
"ts" : Timestamp(1694600329, 1), | |
"t" : NumberLong(1) | |
}, | |
"optimeDate" : ISODate("2023-09-13T10:18:49Z"), | |
"lastAppliedWallTime" : ISODate("2023-09-13T10:18:49.099Z"), | |
"lastDurableWallTime" : ISODate("2023-09-13T10:18:49.099Z"), | |
"syncSourceHost" : "", | |
"syncSourceId" : -1, | |
"infoMessage" : "", | |
"electionTime" : Timestamp(1694599928, 1), | |
"electionDate" : ISODate("2023-09-13T10:12:08Z"), | |
"configVersion" : 1, | |
"configTerm" : 1, | |
"self" : true, | |
"lastHeartbeatMessage" : "" | |
}, | |
{ | |
"_id" : 1, | |
"name" : "192.168.3.142:27017", | |
"health" : 1, | |
"state" : 2, | |
"stateStr" : "SECONDARY", | |
"uptime" : 416, | |
"optime" : { | |
"ts" : Timestamp(1694600329, 1), | |
"t" : NumberLong(1) | |
}, | |
"optimeDurable" : { | |
"ts" : Timestamp(1694600329, 1), | |
"t" : NumberLong(1) | |
}, | |
"optimeDate" : ISODate("2023-09-13T10:18:49Z"), | |
"optimeDurableDate" : ISODate("2023-09-13T10:18:49Z"), | |
"lastAppliedWallTime" : ISODate("2023-09-13T10:18:49.099Z"), | |
"lastDurableWallTime" : ISODate("2023-09-13T10:18:49.099Z"), | |
"lastHeartbeat" : ISODate("2023-09-13T10:18:54.667Z"), | |
"lastHeartbeatRecv" : ISODate("2023-09-13T10:18:54.192Z"), | |
"pingMs" : NumberLong(0), | |
"lastHeartbeatMessage" : "", | |
"syncSourceHost" : "192.168.3.141:27017", | |
"syncSourceId" : 0, | |
"infoMessage" : "", | |
"configVersion" : 1, | |
"configTerm" : 1 | |
}, | |
{ | |
"_id" : 2, | |
"name" : "192.168.3.143:27017", | |
"health" : 1, | |
"state" : 2, | |
"stateStr" : "SECONDARY", | |
"uptime" : 416, | |
"optime" : { | |
"ts" : Timestamp(1694600329, 1), | |
"t" : NumberLong(1) | |
}, | |
"optimeDurable" : { | |
"ts" : Timestamp(1694600329, 1), | |
"t" : NumberLong(1) | |
}, | |
"optimeDate" : ISODate("2023-09-13T10:18:49Z"), | |
"optimeDurableDate" : ISODate("2023-09-13T10:18:49Z"), | |
"lastAppliedWallTime" : ISODate("2023-09-13T10:18:49.099Z"), | |
"lastDurableWallTime" : ISODate("2023-09-13T10:18:49.099Z"), | |
"lastHeartbeat" : ISODate("2023-09-13T10:18:54.667Z"), | |
"lastHeartbeatRecv" : ISODate("2023-09-13T10:18:54.192Z"), | |
"pingMs" : NumberLong(0), | |
"lastHeartbeatMessage" : "", | |
"syncSourceHost" : "192.168.3.141:27017", | |
"syncSourceId" : 0, | |
"infoMessage" : "", | |
"configVersion" : 1, | |
"configTerm" : 1 | |
} | |
], | |
"ok" : 1, | |
"$clusterTime" : { | |
"clusterTime" : Timestamp(1694600329, 1), | |
"signature" : { | |
"hash" : BinData(0,"TEVJDeHnCzlM41kvfsK8m3GP4L8="), | |
"keyId" : NumberLong("7278251270563954692") | |
} | |
}, | |
"operationTime" : Timestamp(1694600329, 1) | |
} |
7.5 判断主从节点
"primary" : "192.168.3.141:27017",显示192.168.3.141主机为主节点
rs.isMaster() | |
s0:PRIMARY> rs.isMaster() | |
{ | |
"topologyVersion" : { | |
"processId" : ObjectId("6501894c22234a6282b7934f"), | |
"counter" : NumberLong(6) | |
}, | |
"hosts" : [ | |
"192.168.3.141:27017", | |
"192.168.3.142:27017", | |
"192.168.3.143:27017" | |
], | |
"setName" : "rs0", | |
"setVersion" : 1, | |
"ismaster" : true, | |
"secondary" : false, | |
"primary" : "192.168.3.141:27017", | |
"me" : "192.168.3.141:27017", | |
"electionId" : ObjectId("7fffffff0000000000000001"), | |
"lastWrite" : { | |
"opTime" : { | |
"ts" : Timestamp(1694600459, 1), | |
"t" : NumberLong(1) | |
}, | |
"lastWriteDate" : ISODate("2023-09-13T10:20:59Z"), | |
"majorityOpTime" : { | |
"ts" : Timestamp(1694600459, 1), | |
"t" : NumberLong(1) | |
}, | |
"majorityWriteDate" : ISODate("2023-09-13T10:20:59Z") | |
}, | |
"maxBsonObjectSize" : 16777216, | |
"maxMessageSizeBytes" : 48000000, | |
"maxWriteBatchSize" : 100000, | |
"localTime" : ISODate("2023-09-13T10:21:02.808Z"), | |
"logicalSessionTimeoutMinutes" : 30, | |
"connectionId" : 15, | |
"minWireVersion" : 0, | |
"maxWireVersion" : 13, | |
"readOnly" : false, | |
"ok" : 1, | |
"$clusterTime" : { | |
"clusterTime" : Timestamp(1694600459, 1), | |
"signature" : { | |
"hash" : BinData(0,"K6fiimpJmajEAl5G2IovptISfL4="), | |
"keyId" : NumberLong("7278251270563954692") | |
} | |
}, | |
"operationTime" : Timestamp(1694600459, 1) | |
} |
八、测试MongoDB主从切换
8.1 停止主库的mongodb服务
停止主库的mongodb服务
systemctl stop mongod.service
8.2 查看从库状态
其他从节点登录mongodb,查看mongodb的角色,发现node01节点已经切换为主库。
mongo
我正在参与 腾讯云开发者社区数据库专题有奖征文。