4-1MongoDB 复制集 & 分片

第1关:MongoDB 架构

复制集

复制集对于新手来说不是一个好理解的概念,那么我们就从为什么要使用复制集来理解它吧。

为什么使用复制集:

  • 备份数据 数据库的数据只有一份的话是极不安全的,一旦数据所在的电脑坏掉,我们的数据就彻底丢失了,所以要有一个备份数据的机制。
  • 故障自动转移 部署了复制集,当主节点挂了后,集群会自动投票再从节点中选举出一个新的主节点,继续提供服务。而且这一切都是自动完成的,对运维人员和开发人员是透明的。当然,发生故障了还是得人工及时处理,不要过度依赖复制集,万一都挂了,那就连喘息的时间都没有了。
  • 在某些特定的场景下提高读性能 默认情况下,读和写都只能在主节点上进行。 下面是 MongoDB 的客户端支持5种复制集读选项:

    • primary :默认模式,所有的读操作都在复制集的主节点进行的;
    • primaryPreferred :在大多数情况时,读操作在主节点上进行,但是如果主节点不可用了,读操作就会转移到从节点上执行;
    • secondary :所有的读操作都在复制集的从节点上执行;
    • secondaryPreferred :在大多数情况下,读操作都是在从节点上进行的,但是当从节点不可用了,读操作会转移到主节点上进行;
    • nearest :读操作会在复制集中网络延时最小的节点上进行,与节点类型无关。

分片

分片(sharding)是指将数据库拆分,使其分散在不同的机器上的过程。将数据分散到不同的机器上,不需要功能强大的服务器就可以存储更多的数据和处理更大的负载。基本思想就是将集合切成小块,这些块分散到若干片里,每个片只负责总数据的一部分,最后通过一个均衡器来对各个分片进行均衡(数据迁移)。通过一个名为 mongos 的路由进程进行操作,mongos 知道数据和片的对应关系(通过配置服务器)。

什么时候使用分片:

  • 机器的磁盘不够用了,使用分片解决磁盘空间的问题;
  • 单个 mongod 已经不能满足写数据的性能要求,通过分片让写压力分散到各个分片上面,使用分片服务器自身的资源;
  • 想把大量数据放到内存里提高性能,通过分片使用分片服务器自身的资源。

第2关:MongoDB 复制集搭建

配置文件设置

因为我们要启动三个 mongodb 服务,所以要准备三个数据存放位置,三个日志文件,三个配置文件。

  • 数据存放位置;

    在 /data 路径下创建文件夹 db1、db2 和 db3 来存放三个服务的数据。

  • 日志文件;

    在 /logs 路径下创建文件夹 mongo 存放日志文件 mongod1.log、mongod2.log 和 mongod3.log(文件不用创建,到时候会自动生成,但路径即文件夹必须提前创建好)。

  • 配置文件。

    在 /etc/mongod 路径下新建三个配置文件,使用配置文件启动 mongod 服务(在之前的实训中我们都是用命令启动的)。

    mongod1.conf 内容如下:

    port=27018     #配置端口号dbpath=/data/db1     #配置数据存放的位置logpath=/logs/mongo/mongod1.log     #配置日志存放的位置logappend=true     #日志使用追加的方式fork=true     #设置在后台运行replSet=YOURMONGO     #配置复制集名称,该名称要在所有的服务器一致

    mongod2.conf 内容如下:

    port=27019     #配置端口号dbpath=/data/db2     #配置数据存放的位置logpath=/logs/mongo/mongod2.log     #配置日志存放的位置logappend=true     #日志使用追加的方式fork=true     #设置在后台运行replSet=YOURMONGO     #配置复制集名称,该名称要在所有的服务器一致

    mongod3.conf 内容如下:

    port=27020     #配置端口号dbpath=/data/db3     #配置数据存放的位置logpath=/logs/mongo/mongod3.log     #配置日志存放的位置logappend=true     #日志使用追加的方式fork=true     #设置在后台运行replSet=YOURMONGO     #配置复制集名称,该名称要在所有的服务器一致

以上工作准备完成,便可以开启服务了,配置文件启动命令(在命令行中输入):

mongod -f /etc/mongod/mongod1.confmongod -f /etc/mongod/mongod2.confmongod -f /etc/mongod/mongod3.conf

具体效果如图1所示:

图1

配置主从节点

三个端口的服务全部启动成功后,需要进入其中一个进行配置节点。 设置27019为 arbiter 节点。

  • 进入端口号为27018的进行配置,连接数据库:mongo --port 27018;
  • 选择数据库 admin;
  • 输入配置要求如下:

    config = {  _id:"YOURMONGO",  members:[      {_id:0,host:'127.0.0.1:27018'},      {_id:1,host:'127.0.0.1:27019',arbiterOnly:true},      {_id:2,host:'127.0.0.1:27020'},  ]}
  • 使用 rs.initiate(config)进行初始化:

    rs.initiate(config)

    具体效果如图2所示:

    图2

    如上所示配置成功后,不同端口的数据库登陆后左边的>可能变为如下两种状态:

    • 说明该端口为主节点,如图3所示:

      图3

    • 说明该端口为从节点,如图4所示:

      图4

  • 使用 rs.status() 查看状态。

验证复制集同步

在主数据库插入数据,然后去从数据库查看数据是否一致。

连接主数据库:mongo --port 27018;

use testdb.person.insert({name:'王小明',age:20})

具体步骤如图5所示:

图5

连接从数据库:mongo --port 27020; 从库查询数据需要设置 slaveOk 为 true;

use testrs.slaveOk(true)db.person.find()

具体步骤如图6所示:

图6

至此复制集搭建完成,主数据库的数据的更新后,从数据库的数据也会同步更改,一旦主数据库挂掉,从数据库可自动变为主数据库,极大地保障了数据的安全,这也是搭建复制集的必要性。

切换 Primary 节点到指定的节点

在实际应用中,如果想指定某服务器或端口作为主节点,而不是随机选举一个主节点,可以通过以下方法改变 Primary 节点:

  • 先进入主节点中进行操作:

    mongo --port 27018
  • 查看目前的节点状态:

    rs.conf()     #查看配置rs.status()   #查看状态

    其中 priority : 是优先级,默认为 1,优先级 0 为被动节点,不能成为活跃节点。优先级不为 0 则按照由大到小选出活跃节点。

因为默认的都是1,所以只需要把给定的服务器的 priority 加到最大即可。让27020成为主节点,操作如下: 现进入目前的主节点进行操作如下:

cfg=rs.conf()
cfg.members[2].priority=2     #修改priority,members[2]即对应27020端口
rs.reconfig(cfg)     #重新加载配置文件,强制了副本集进行一次选举,优先级高的成为Primary。在这之间整个集群的所有节点都是secondary
rs.status()

这样,给定的服务器或端口就成为了主节点。

搭建复制集

在 /data 路径下创建文件夹 db1、db2 和 db3 来存放三个服务的数据

mkdir -p /data/test/db1
mkdir -p /data/test/db2
mkdir -p /data/test/db3

在 /logs/test 路径下创建文件夹 mongo 存放日志文件 mongod1.log、mongod2.log 和 mongod3.log

mkdir -p /logs/test
touch /logs/test/mongod1.log
touch /logs/test/mongod2.log
touch /logs/test/mongod3.log

在 /etc/test 路径下新建三个配置文件,使用配置文件启动 mongod 服务

mkdir -p /etc/test/db1
vim /etc/test/mongod1.conf
port=20001     #配置端口号
dbpath=/data/test/db1     #配置数据存放的位置 
logpath=/logs/test/mongod1.log     #配置日志存放的位置 
logappend=true     #日志使用追加的方式
fork=true     #设置在后台运行
replSet=YOURMONGO     #配置复制集名称,该名称要在所有的服务器一致
vim /etc/test/mongod2.conf
port=20002     #配置端口号
dbpath=/data/test/db2     #配置数据存放的位置 
logpath=/logs/test/mongod2.log     #配置日志存放的位置 
logappend=true     #日志使用追加的方式
fork=true     #设置在后台运行
replSet=YOURMONGO     #配置复制集名称,该名称要在所有的服务器一致
vim /etc/test/mongod3.conf
port=20003     #配置端口号
dbpath=/data/test/db3     #配置数据存放的位置 
logpath=/logs/test/mongod3.log     #配置日志存放的位置 
logappend=true     #日志使用追加的方式
fork=true     #设置在后台运行
replSet=YOURMONGO     #配置复制集名称,该名称要在所有的服务器一致
mongod -f /etc/test/mongod1.conf
mongod -f /etc/test/mongod2.conf
mongod -f /etc/test/mongod3.conf

image-20211025113313807

配置主从节点

mongo --port 20001;
use admin;
config = {
  _id:"YOURMONGO",
  members:[
      {_id:0,host:'127.0.0.1:20001'},
      {_id:1,host:'127.0.0.1:20002',arbiterOnly:true},
      {_id:2,host:'127.0.0.1:20003'},
  ]
};

image-20211025113712051

rs.initiate(config);

image-20211025113802558

第3关:MongoDB 分片集搭建

配置文件设置

创建数据、日志和配置文件存放路径

mkdir -p /data/test2/shard1/db
mkdir -p /logs/test2/shard1/log
mkdir -p /data/test2/shard2/db
mkdir -p /logs/test2/shard2/log
mkdir -p /data/test2/shard3/db
mkdir -p /logs/test2/shard3/log
mkdir -p /data/test2/config/db
mkdir -p /logs/test2/config/log
mkdir -p /logs/test2/mongs/log
mkdir -p /etc/test2

修改配置文件

mongod1.conf

vim /etc/test2/mongod1.conf
dbpath=/data/test2/shard1/db
logpath=/logs/test2/shard1/log/mongodb.log
port=21001
shardsvr=true
fork=true

mongod2.conf

vim /etc/test2/mongod2.conf
dbpath=/data/test2/shard2/db
logpath=/logs/test2/shard2/log/mongodb.log
port=21002
shardsvr=true
fork=true

mongod3.conf

vim /etc/test2/mongod3.conf
dbpath=/data/test2/shard3/db
logpath=/logs/test2/shard3/log/mongodb.log
port=21003
shardsvr=true
fork=true

从配置文件启动 mongod 服务

mongod -f /etc/test2/mongod1.conf
mongod -f /etc/test2/mongod2.conf
mongod -f /etc/test2/mongod3.conf

image-20211030153127158

配置config 节点

配置启动节点服务

mongod --dbpath /data/test2/config/db --logpath /logs/test2/config/log/mongodb.log --port 21004 --configsvr --replSet cs --fork

image-20211030153655489

连接 route 节点

mongo localhost:21004

输入命令

use admin;
cfg = {
  _id:'cs',
  configsvr:true,
  members:[
      {_id:0,host:'localhost:21004'}
   ]
};
rs.initiate(cfg);

image-20211030153843758

配置route节点

配置启动节点服务

mongos --configdb cs/localhost:21004 --logpath /logs/test2/mongs/log/mongodb.log --port 21005 --fork

image-20211030154044412

连接上 route 节点

mongo localhost:21005

添加分片

sh.addShard('localhost:21001');
sh.addShard('localhost:21002');
sh.addShard('localhost:21003');

image-20211030154210492

查看集群的状态:分片摘要信息、数据库摘要信息、集合摘要信息等

sh.status();

image-20211030154345989

删除数据库索引(防止影响测评结果)

db.collection.dropIndexes()
最后修改:2021 年 10 月 30 日 03 : 53 PM