搭建之前先了解一下MongoDB分片群集主要有如下三个组件:
Shard:分片服务器,用于存储实际的数据块,实际生产环境中一个shard server 角色可以由几台服务器组成一个Replica Set 承担,防止主机单点故障。
Config Server:配置服务器,存储了整个分片群集的配置信息,其中包括chunk信息。
Routers:前端路由,客户端由此接入,且让整个群集看上去像单一数据库,前端应用可以透明使用。
从图中可以看到有四个组件:mongos、config server、shard、replica seto
mongos: 数据库集群请求的入口 ,所有的请求都通过mongos进行协调,不需要在应用程序添加一个路由选择器,mongos自己就是一请求分发中心,它负责把对应的数 据请求请求转发到对应的shard服务器上。在生产环境通常有多mongos作为请求的入口,防止其中一个挂掉所有的mongodb请求都没有办法操作。
config server: 顾名思义为配置g艮务器,存储所有数据库元信息(路由、分片)的配置mongos本身没有物理存储分片服务器和数据路由信息,只是缓存在内存里,配劃艮 务器则实际存储这些数据。mongos第一次启动或者关掉重启就会从config server加载配置信息,以后如果配賽艮务器信息变化会通知到所有的mongos更新自己的状态, 这样mongos就嶼续准确路由。在生产环境通常有多个config server配置服务器,因为它存储了分片路由的元数据,防止数据丢失!
shard: 分片(sharding )是指将»据库拆分,将其分散在不同的机器上的过程。将数据分散到不同的机器上,不需要功能强大的服务器就可以存储更多的数据和处理更大 的负载。基本思想就是将集合切成小块,这些块分散到若干片里,每个片只负责总数据的一35分,最后通过一个均衡器来对各个分片进行均衡(数据迁移)。
**replica set:**中文翻译副本集,其实就是shard的备份,防止shard挂掉之后数据丢失。复制提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用 性,并可以保证数据的安全性。
仲裁者(Arbiter ):是复制集中的一个MongoDB实例,它并不保存数据。仲裁节点使用最小的资源并且不要求硬件设备,不能将Arbitergp署在同一个数据集节点中,可以 部署在其他应用服务器或者监视服务器中,也可部署在单独的虚拟机中。为了确保复制集中有奇数的投票成员(包括primary ),需要添加仲裁节点做为投票,否则primaiy 不能运行时不会自动切换primary。
简单了解之后,我们可以这样总结一下,应用请求mongos来操作mongodb的增删改查,配置服务器存储数据库元信息,并且和mongos做同步,数据最终存入在shard (分 片)上,为了防止数据丢失同步在副本集中存储了一份,仲裁在数据存储到分片的时候决定存储到哪个节点。
三台机器的配置服务(27018)形成复制集,分片1、2、3也在各机器都部署一个实例,它们之间形成复制集,客户端直接连接3个路由服务与之交互,配置服务和分片服务对客户端是透明的。
这里按照3台搭建
主机 | 路由服务端口 | 配置服务端口 | 分片1端口 | 分片2端口 | 分片3端口 |
---|---|---|---|---|---|
zzen01 | 27017 | 27018 | 27001 | 27002 | 27003 |
zzen03 | 27017 | 27018 | 27001 | 27002 | 27003 |
zzen04 | 27017 | 27018 | 27001 | 27002 | 27003 |
到MongoDB官网下载:
https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-4.0.6.tgz
MongoDB官网下载4.0.6
解压到/home/mongodb,设置环境变量:
echo 'export PATH=.:/home/mongodb/bin:$PATH' >> /etc/profile
保存后执行:
source /etc/profile
mkdir -p /home/mongodb/conf //启动配置文件存放的文件夹
mkdir -p /home/mongodb/data/config //配置服务数据存放目录
mkdir -p /home/mongodb/data/shard1 //分片1服务数据存放目录
mkdir -p /home/mongodb/data/shard2 //分片2服务数据存放目录
mkdir -p /home/mongodb/data/shard3 //分片3服务数据存放目录
mkdir -p /home/mongodb/log //创建log目录
touch /home/mongodb/log/config.log //配置服务日志存放文件
touch /home/mongodb/log/mongos.log //路由服务日志存放文件
touch /home/mongodb/log/shard1.log //分片1服务日志存放文件
touch /home/mongodb/log/shard2.log //分片2服务日志存放文件
touch /home/mongodb/log/shard3.log //分片3服务日志存放文件
dbpath=/home/mongodb/data/config
logpath=/home/mongodb/log/config.log
port=27018
logappend=true
fork=true
maxConns=5000
#复制集名称
replSet=configs
#置参数为true
configsvr=true
#允许任意机器连接
bind_ip=0.0.0.0
分别启动三台服务器的配置服务:
mongod -f /home/mongodb/conf/config.conf
只需在任意一台机器执行即可:
mongo --host zzen01 --port 27018
切换数据库:
use admin
初始化复制集:
rs.initiate({_id:"configs",members:[{_id:0,host:"zzen01:27018"},{_id:1,host:"zzen03:27018"},{_id:2,host:"zzen04:27018"}]})
其中_id:"configs"的configs是上面config.conf配置文件里的复制集名称,把三台服务器的配置服务组成复制集
查看状态:
rs.status()
等几十秒左右,执行上面的命令查看状态,三台机器的配置服务就已形成复制集,其中1台为PRIMARY,其他2台为SECONDARY。