搭建之前先了解一下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端口zzen012701727018270012700227003zzen032701727018270012700227003zzen042701727018270012700227003到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
分别启动三台服务器的配置服务:
mongod -f /home/mongodb/conf/config.conf只需在任意一台机器执行即可:
mongo --host zzen03 --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。
端口分别是27001、27002、27003,分别对应shard1.conf、shard2.conf、shard3.conf。 还有数据存放目录、日志文件这几个地方都需要对应修改。 在3台机器的相同端口形成一个分片的复制集,由于3台机器都需要这3个文件,所以根据这9个配置文件分别启动分片服务:
mongod -f /home/mongodb/conf/shard1.conf mongod -f /home/mongodb/conf/shard2.conf mongod -f /home/mongodb/conf/shard3.conf连接mongo,执行以下操作:
shard1:
//顺序执行 //1.连接mongo mongo --host zzen01 --port 27001 //2.切换数据库: use admin //3.初始化复制集: rs.initiate({_id:"shard1",members:[{_id:0,host:"zzen01:27001"},{_id:1,host:"zzen03:27001"},{_id:2,host:"zzen04:27001"}]})exit 退出
shard2:
//1.连接mongo mongo --host zzen03 --port 27002 //2.切换数据库: use admin //3.初始化复制集: rs.initiate({_id:"shard2",members:[{_id:0,host:"zzen01:27002"},{_id:1,host:"zzen03:27002"},{_id:2,host:"zzen04:27002"}]})exit 退出
shard3:
//1.连接mongo mongo --host zzen04 --port 27003 //2.切换数据库: use admin //3.初始化复制集: rs.initiate({_id:"shard3",members:[{_id:0,host:"zzen01:27003"},{_id:1,host:"zzen03:27003"},{_id:2,host:"zzen04:27003"}]})exit 退出
执行以上操作,让3个分片各自形成1主2从的复制集,注意端口及仲裁节点的问题即可,操作完成后3个分片都启动完成,并完成复制集模式。
分别在三台服务器启动:
mongos -f /home/mongodb/conf/mongos.conf连接mongo:
mongo --host zzen01 --port 27017切换数据库:
use admin添加分片,只需在一台机器执行即可:
sh.addShard("shard1/zzen01:27001,zzen03:27001,zzen04:27001") sh.addShard("shard2/zzen01:27002,zzen03:27002,zzen04:27002") sh.addShard("shard3/zzen01:27003,zzen03:27003,zzen04:27003")查看集群状态:
sh.status()显示内容如下:
--- Sharding Status --- sharding version: { "_id" : 1, "minCompatibleVersion" : 5, "currentVersion" : 6, "clusterId" : ObjectId("5f51b9580335c89d4bda8807") } shards: { "_id" : "shard1", "host" : "shard1/zzen01:27001,zzen03:27001,zzen04:27001", "state" : 1 } { "_id" : "shard2", "host" : "shard2/zzen01:27002,zzen03:27002,zzen04:27002", "state" : 1 } { "_id" : "shard3", "host" : "shard3/zzen01:27003,zzen03:27003,zzen04:27003", "state" : 1 } active mongoses: "4.0.6" : 3 autosplit: Currently enabled: yes balancer: Currently enabled: yes Currently running: no Failed balancer rounds in last 5 attempts: 5 Last reported error: Could not find host matching read preference { mode: "primary" } for set shard1 Time of Reported error: Fri Sep 04 2020 22:53:26 GMT+0800 (CST) Migration Results for the last 24 hours: No recent migrations databases: { "_id" : "config", "primary" : "config", "partitioned" : true } config.system.sessions shard key: { "_id" : 1 } unique: false balancing: true chunks: shard1 1 { "_id" : { "$minKey" : 1 } } -->> { "_id" : { "$maxKey" : 1 } } on : shard1 Timestamp(1, 0)做到这里,简单的MongoDB集群搭建已经搭建完成,如果显示上述内容,那么表示MongoDB集群已经搭建成功了,就可以继续进行其它操作了。
