新钛云服已累计为您分享725篇技术干货
接下来的一些列文章会为大家介绍日常工作中常用的 NoSQL 产品 MongoDB。
主要涉及到:
MongoDB 分片集群的介绍及搭建
MongoDB 的备份及恢复
MongoDB 安全加密
MongoDB Change Stream 功能介绍及代码演示
MongoDB 其他
已发布文章可以点击跳转
我们会用八篇文章近五万字来阐述 MongoDB 运维相关的日常实战事宜。
您当前看到的是系列文章的第四篇:《MongoDB 分片集群的介绍及搭建》。
一般来说,在数据库系统和计算系统中,我们有两种方法来提高其性能。第一个是简单地用更强大的服务器取代我们常规的服务器,一般我们称之为垂直扩容(或纵向扩容)。
►垂直扩容的主要缺点是它有限制:它不能无限扩大,这取决于多方面的因素。诸如:硬件已达到其物理极限、云提供商不能为我们提供更强大的服务器。
提高性能的第二种方法是使用具有相同容量的服务器并增加其数量,一般我们称之为水平扩容(或横向扩容)。
当数据量比较大的时候,我们需要把数据分片运行在不同的机器中,以降低 CPU、内存和 IO 的压力,Sharding 就是数据库分片技术。
MongoDB 分片技术类似 MySQL 的水平切分和垂直切分,数据库主要由两种方式做 Sharding:垂直扩展和横向切分。
垂直扩展:添加更多的 CPU,内存,磁盘空间等。
横向切分:则是通过数据分片的方式,通过集群统一提供服务。
一个 MongoDB 分片集群由以下组件组成:
shard: 每个分片都包含分片数据的一个子集。每个分片以副本集部署。
mongos: Mongos 充当查询路由器,在客户端应用程序和分片集群之间提供接口。从 MongoDB 4.4 开始,mongos 可以支持 hedged 读取,以尽量减少延迟。
config servers: 配置服务器存储集群的元数据和配置信息。
MongoDB 在 Collection 级别进行分片处理,在集群中的分片之间分发这些 Collection 数据。
一个生产环境的集群,请确保数据的冗余性及系统的高可用性。对于一个生产级别的分片集群,需要考虑一下几点:
部署一个 3 成员的复制集作为一个配置中心服务
每个分片部署为一个 3 成员的复制集
部署一个或多个
mongos
环境准备
开始演示:
主机名 |
IP |
角色 |
mongo01.tyun.cn |
10.20.20.19 |
mongos1(27017),config1(27000),shard1 primary(27010) |
mongo02.tyun.cn |
10.20.20.11 |
mongos2(27017),config2(27000),shard1 secondary(27010) |
mongo03.tyun.cn | 10.20.20.41 |
mongos3(27017),config3(27000),shard1 secondary(27010) |
mongo04.tyun.cn |
10.20.20.14 |
shard2 primary(27010) |
mongo05.tyun.cn |
10.20.20.53 |
shard2 secondary(27010) |
mongo06.tyun.cn |
10.20.20.61 | shard2 secondary(27010) |
mongo07.tyun.cn |
10.20.20.62 |
shard3 primary(27010) |
mongo08.tyun.cn |
10.20.20.89 |
shard3 secondary(27010) |
mongo09.tyun.cn |
10.20.20.99 |
shard3 secondary(27010) |
如果大家在演示该文档时,手头上的机器资源不充足的话,可以安排一台多个角色即可(使用不同的端口号),不一定非得一台机器一个角色。
环境拓扑如下:
这里我们使用了静态 DNS 解析,如果有条件,可以用 DNS 服务进行域名的配置解析。/etc/hosts
文件如下:
10.20.20.19 mongo01.tyun.cn cfg1.tyun.cn mongos1.tyun.cn
10.20.20.11 mongo02.tyun.cn cfg2.tyun.cn mongos2.tyun.cn
10.20.20.41 mongo03.tyun.cn cfg3.tyun.cn mongos3.tyun.cn
10.20.20.14 mongo04.tyun.cn
10.20.20.53 mongo05.tyun.cn
10.20.20.61 mongo06.tyun.cn
10.20.20.62 mongo07.tyun.cn
10.20.20.89 mongo08.tyun.cn
10.20.20.99 mongo09.tyun.cn
配置 Config Server
01
准备配置文件
在 3 台配置节点上分别创建配置文件 /etc/mongo-cfg.conf
,内容如下:
# cfg1.tyun.cn 的配置文件
(venv36) [root@mongo01 ~]# cat /etc/mongo-cfg.conf
systemLog:
destination: file
logAppend: true
path: /var/log/mongodb/mongo-cfg.log
storage:
dbPath: /var/lib/mongocfg
journal:
enabled: true
wiredTiger:
engineConfig:
cacheSizeGB: 1
processManagement:
fork: true # fork and run in background
pidFilePath: /var/run/mongodb/mongo-cfg.pid # location of pidfile
timeZoneInfo: /usr/share/zoneinfo
net:
port: 27000
bindIp: cfg1.tyun.cn
sharding:
clusterRole: configsvr
replication:
replSetName: config
# cfg2.tyun.cn 的配置文件
(venv36) [root@mongo02 ~]# cat /etc/mongo-cfg.conf
systemLog:
destination: file
logAppend: true
path: /var/log/mongodb/mongo-cfg.log
storage:
dbPath: /var/lib/mongocfg
journal:
enabled: true
wiredTiger:
engineConfig:
cacheSizeGB: 1
processManagement:
fork: true # fork and run in background
pidFilePath: /var/run/mongodb/mongo-cfg.pid # location of pidfile
timeZoneInfo: /usr/share/zoneinfo
net:
port: 27000
bindIp: cfg2.tyun.cn
sharding:
clusterRole: configsvr
replication:
replSetName: config
# cfg3.tyun.cn 的配置文件
(venv36) [root@mongo03 ~]# cat /etc/mongo-cfg.conf
systemLog:
destination: file
logAppend: true
path: /var/log/mongodb/mongo-cfg.log
storage:
dbPath: /var/lib/mongocfg
journal:
enabled: true
wiredTiger:
engineConfig:
cacheSizeGB: 1
processManagement:
fork: true # fork and run in background
pidFilePath: /var/run/mongodb/mongo-cfg.pid # location of pidfile
timeZoneInfo: /usr/share/zoneinfo
net:
port: 27000
bindIp: cfg3.tyun.cn
sharding:
clusterRole: configsvr
replication:
replSetName: config
02
启动 Config Server
在 3 台配置节点上分别执行如下命令:
[root@mongo01 ~]# systemctl start mongocfg
[root@mongo02 ~]# systemctl start mongocfg
[root@mongo03 ~]# systemctl start mongocfg
检查一下进程是否已经启动成功:
(venv36) [root@mongo01 ~]# ansible -i hosts 'cfg' -m shell -a "systemctl status mongocfg" |grep "Active: active (running)"
Active: active (running) since Fri 2022-08-05 05:24:56 UTC; 1min 4s ago
Active: active (running) since Fri 2022-08-05 05:25:25 UTC; 35s ago
Active: active (running) since Fri 2022-08-05 05:25:36 UTC; 24s ago
03