MongoDB是最易用的NoSQL,比较适合取代MySQL做一些存储,不过不是强一致性的。本章节主要分享高可用分片+副本集部署。从下图中可以看到有四个组件:mongos、config server、shard、replica set。
mongos
1 | mongos,数据库集群请求的入口,所有的请求都通过mongos进行协调,不需要在应用程序添加一个路由选择器,mongos自己就是一个请求分发中心,它负责把对应的数据请求请求转发到对应的shard服务器上。在生产环境通常有多mongos作为请求的入口,防止其中一个挂掉所有的mongodb请求都没有办法操作。 |
config server
1 | config server,顾名思义为配置服务器,存储所有数据库元信息(路由、分片)的配置。mongos本身没有物理存储分片服务器和数据路由信息,只是缓存在内存里,配置服务器则实际存储这些数据。mongos第一次启动或者关掉重启就会从 config server 加载配置信息,以后如果配置服务器信息变化会通知到所有的 mongos 更新自己的状态,这样 mongos 就能继续准确路由。在生产环境通常有多个 config server 配置服务器,因为它存储了分片路由的元数据,防止数据丢失! |
shard
1 | shard,分片(sharding)是指将数据库拆分,将其分散在不同的机器上的过程。将数据分散到不同的机器上,不需要功能强大的服务器就可以存储更多的数据和处理更大的负载。基本思想就是将集合切成小块,这些块分散到若干片里,每个片只负责总数据的一部分,最后通过一个均衡器来对各个分片进行均衡(数据迁移)。 |
replica set
1 | replica set,中文翻译副本集,其实就是shard的备份,防止shard挂掉之后数据丢失。复制提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性, 并可以保证数据的安全性。 |
仲裁者
1 | 仲裁者(Arbiter),是复制集中的一个MongoDB实例,它并不保存数据。仲裁节点使用最小的资源并且不要求硬件设备,不能将Arbiter部署在同一个数据集节点中,可以部署在其他应用服务器或者监视服务器中,也可部署在单独的虚拟机中。为了确保复制集中有奇数的投票成员(包括primary),需要添加仲裁节点做为投票,否则primary不能运行时不会自动切换primary。 |
架构原理-总结
1 | 简单了解之后,我们可以这样总结一下,应用请求mongos来操作mongodb的增删改查,配置服务器存储数据库元信息,并且和mongos做同步,数据最终存入在shard(分片)上,为了防止数据丢失同步在副本集中存储了一份,仲裁在数据存储到分片的时候决定存储到哪个节点。 |
环境准备
1 | 操作系统: CentOS7.2 |
服务器规划
服务器25 | 服务器26 | 服务器27 |
---|---|---|
mongos | mongos | mongos |
config server | config server | config server |
shard server1主节点 | shard server1副节点 | shard server1仲裁节点 |
shard server2仲裁节点 | shard server2主节点 | shard server2副节点 |
shard server3主节点 | shard server3仲裁节点 | shard server3副节点 |
端口分配
mongos | config server | shard server1 | shard server2 | shard server3 |
---|---|---|---|---|
20000 | 21000 | 27001 | 27002 | 27003 |
集群部署
安装MongoDB
1 | mongodb3.4.6下载: https://www.mongodb.org/dl/linux/x86_64 |
分别在每台服务器建立conf、mongos、config、shard1、shard2、shard3六个目录
1 | 注: 因为mongos不存储数据, 所以此处建立mongos目录用于存放pid。 |
配置环境变量
1 | cat >> /etc/profile <<EOF |
config server配置(3台机器)
1 | 注: mongodb3.4及以后要求config server也需要创建副本集,否则集群部署不成功 |
3台服务器-分别添加配置文件
1 | vi /data/A/mongodb/conf/config.conf |
1 | ## 配置文件内容 |
启动3台服务器的config server
1 | 启动 |
登陆任意一台配置服务器,初始化配置副本集
1 | #连接mongo config server |
其中, _id: “configs”应与配置文件中配置的副本集名称[replSet=configs]一致;
配置分片副本集(3台机器)
设置第一个分片副本集
1 | vim /data/A/mongodb/conf/shard1.conf |
1 | pidfilepath = /data/A/mongodb/shard1/shard1.pid |
分别启动3台机器的shard1 server
1 | 启动 |
在非仲裁服务器,初始化shard1副本集
1 | 连接 |
shard1 Web监控
1 | 注: 配置文件中启用了Web监控,如何访问呢? |
设置第二个分片副本集
1 | vim /data/A/mongodb/conf/shard2.conf |
1 | pidfilepath = /data/A/mongodb/shard2/shard2.pid |
分别启动3台机器的shard2 server
1 | 启动shard2 |
在非仲裁服务器,初始化shard2副本集
1 | 连接 |
shard2 Web监控
1 | Web访问: |
设置第三个分片副本集
1 | vim /data/A/mongodb/conf/shard3.conf |
1 | pidfilepath = /data/A/mongodb/shard3/shard3.pid |
分别启动3台机器的shard3 server
1 | 启动shard3 |
在非仲裁服务器,初始化shard3副本集
1 | 连接 |
shard3 Web监控
1 | Web访问: |
配置路由服务 mongos
先启动配置服务器和分片服务器,后启动路由实例(三台机器)
1 | vim /data/A/mongodb/conf/mongos.conf |
1 | pidfilepath = /data/A/mongodb/mongos/mongos.pid |
启用3台服务器的mongos
1 | 启动(启动命令为mongos) |
启用分片
1 | 目前已经成功部署了mongodb配置服务器、路由服务器,各个分片服务器,此时当应用程序连接到mongos路由服务器时并不能使用分片机制,还需要在程序里设置分片配置,让分片生效。 |
登陆任意一台mongos
1 | 连接mongos |
指定数据库自动分片及测试
1 | 目前配置服务、路由服务、分片服务、副本集服务都已经串联起来了,但我们的目的是希望插入数据,数据能够自动分片。连接在mongos上,准备让指定的数据库、指定的集合分片生效。 |
1 | 连接mongos |
1 | 我们设置testdb的 table1表需要分片,根据 id 自动分片到 shard1 ,shard2,shard3 上面去。要这样设置是因为不是所有mongodb 的数据库和表 都需要分片! |
报错处理
1 | 注:如果不切换到admin则会报错 |
测试分片配置结果
1 | 连接任意一个mongos |
查看分片情况如下,部分无关信息省掉了
1 | db.table1.stats(); |
后期运维
1 | mongodb的启动顺序: (先启动)配置服务器 -->再启动分片 --> 最后启动mongos. |
- 本文作者: GaryWu
- 本文链接: https://garywu520.github.io/2018/02/22/高可用MongoDB集群/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!