【澳门皇家赌场手机版】详解MongoDB中用sharding将

关于副本集

前言

副本集是一种在多台机器同步数据的进程。副本集体提供了数据冗余,扩展了数据可用性。在多台服务器保存数据可以避免因为一台服务器导致的数据丢失。也可以从硬件故障或服务中断解脱出来,利用额外的数据副本,可以从一台机器致力于灾难恢复或者备份。

最近因为工作的原因,在学习使用mongodb数据库,mongodb是最常用的nodql数据库,在数据库排名中已经上升到了前六。这篇文章介绍如何搭建高可用的mongodb集群,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍:

在一些场景,可以使用副本集来扩展读性能。客户端有能力发送读写操作给不同的服务器。也可以在不同的数据中心获取不同的副本来扩展分布式应用的能力。

在搭建集群之前,需要首先了解几个概念:路由,分片、副本集、配置服务器等。

mongodb副本集是一组拥有相同数据的mongodb实例,主mongodb接受所有的写操作,所有的其他实例可以接受主实例的操作以保持数据同步。主实例接受客户可的写操作,副本集只能有一个主实例,因为为了维持数据一致性,只有一个实例可写,主实例的日志保存在oplog。

相关概念

Client Application Driver Writes Reads | | Primary |Replication|ReplicationSecondary Secondary

从图中可以看到有四个组件:mongos、config server、shard、replica set。

二级节点复制主节点的oplog然后在自己的数据副本上执行操作,二级节点是主节点数据的反射,如果主节点不可用,会选举一个新的主节点。默认读操作是在主节点进行的,但是可以指定读取首选项参数来指定读操作到副本节点。可以添加一个额外的仲裁节点,使副本集节点保持奇数,确保可以选举出票数不同的直接点。仲裁者并不需要专用的硬件设备。仲裁者节点一直会保存仲裁者身份。

mongos,数据库集群请求的入口,所有的请求都通过mongos进行协调,不需要在应用程序添加一个路由选择器,mongos自己就是一个请求分发中心,它负责把对应的数据请求请求转发到对应的shard服务器上。在生产环境通常有多mongos作为请求的入口,防止其中一个挂掉所有的mongodb请求都没有办法操作。

1.异步复制澳门皇家赌场手机版,副本节点同步直接点操作是异步的,然而会导致副本集无法返回最新的数据给客户端程序。

config server,顾名思义为配置服务器,存储所有数据库元信息的配置。mongos本身没有物理存储分片服务器和数据路由信息,只是缓存在内存里,配置服务器则实际存储这些数据。mongos第一次启动或者关掉重启就会从 config server 加载配置信息,以后如果配置服务器信息变化会通知到所有的 mongos 更新自己的状态,这样 mongos 就能继续准确路由。在生产环境通常有多个 config server 配置服务器,因为它存储了分片路由的元数据,防止数据丢失!

2.自动故障转移如果主节点10s以上与其他节点失去通信,其他节点将会选举新的节点作为主节点。拥有大多数选票的副节点会被选举为主节点。

shard,分片是指将数据库拆分,将其分散在不同的机器上的过程。将数据分散到不同的机器上,不需要功能强大的服务器就可以存储更多的数据和处理更大的负载。基本思想就是将集合切成小块,这些块分散到若干片里,每个片只负责总数据的一部分,最后通过一个均衡器来对各个分片进行均衡。

副本集提供了一些选项给应用程序,可以做一个成员位于不同数据中心的副本集。也可以指定成员不同的优先级来控制选举。

replica set,中文翻译副本集,其实就是shard的备份,防止shard挂掉之后数据丢失。复制提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性, 并可以保证数据的安全性。

sharding转换一个副本集为分片集群1. 部署一个测试副本集创建第一个副本集实例,名称为firstset:1.1 创建副本集并且插入数据如下:

仲裁者,是复制集中的一个MongoDB实例,它并不保存数据。仲裁节点使用最小的资源并且不要求硬件设备,不能将Arbiter部署在同一个数据集节点中,可以部署在其他应用服务器或者监视服务器中,也可部署在单独的虚拟机中。为了确保复制集中有奇数的投票成员,需要添加仲裁节点做为投票,否则primary不能运行时不会自动切换primary。

 /data/example/firstset1 /data/example/firstset2 /data/example/firstset3

mkdir -p /data/example/firstset1 /data/example/firstset2 /data/example/firstset3

简单了解之后,我们可以这样总结一下,应用请求mongos来操作mongodb的增删改查,配置服务器存储数据库元信息,并且和mongos做同步,数据最终存入在shard上,为了防止数据丢失同步在副本集中存储了一份,仲裁在数据存储到分片的时候决定存储到哪个节点。

1.2 在其他终端启动三个mongodb实例,如下:

环境准备

mongod --dbpath /data/example/firstset1 --port 10001 --replSet firstset --oplogSize 700 --rest --fork --logpath /data/example/firstset1/firstset1.log --logappend --nojournal --directoryperdbmongod --dbpath /data/example/firstset2 --port 10002 --replSet firstset --oplogSize 700 --rest --fork --logpath /data/example/firstset2/firstset2.log --logappend --nojournal --directoryperdbmongod --dbpath /data/example/firstset3 --port 10003 --replSet firstset --oplogSize 700 --rest --fork --logpath /data/example/firstset3/firstset3.log --logappend --nojournal --directoryperdb

系统系统 centos6.5 三台服务器:192.168.0.75/84/86 安装包: mongodb-linux-x86_64-3.4.6.tgz

--oplog选项强制每个mongodb实例操作日志为700M,不使用该参数则默认为分区空间的5%,限制oplog的大小,可以使每个实例启动的快一点。1.3 连接一个mongodb实例的shell

服务器规划

mongo mongo01:10001/admin

服务器75

如果是运行在生产环境下,或者不同主机名或IP的机器上,需要修改mongo01为指定名称。1.4 在mongo shell上初始化副本集

服务器84

var config = { "_id" : "firstset", "members" : [ {"_id" : 0, "host" : "mongo01:10001"}, {"_id" : 1, "host" : "mongo01:10002"}, {"_id" : 2, "host" : "mongo01:10003"}, ]}rs.initiate;{ "info" : "Config now saved locally. Should come online in about a minute.", "ok" : 1}

db.runCommand( {"replSetInitiate" : {"_id" : "firstset", "members" : [ {"_id" : 0, "host" : "mongo01:10001"}, {"_id" : 1, "host" : "mongo01:10002"}, {"_id" : 2, "host" : "mongo01:10003"} ] } })

服务器86

1.5 在mongo shell中创建并插入数据:

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 主节点

use mydbswitched to db mydbanimal = ["dog", "tiger", "cat", "lion", "elephant", "bird", "horse", "pig", "rabbit", "cow", "dragon", "snake"];for(var i=0; i<100000; i++){ name = animal[Math.floor*animal.length)]; user_id = i; boolean = [true, false][Math.floor]; added_at = new Date(); number = Math.floor; db.test_collection.save({"name":name, "user_id":user_id, "boolean": boolean, "added_at":added_at, "number":number });}

端口分配:

上面的操作会向集合test_collection插入100万条数据,根据系统不同,可能会花费几分钟的时间。脚本会加入如下格式的文档:

mongos:20000config:21000shard1:27001shard2:27002shard3:27003

2. 部署一个分片设施创建三个配置服务器来保存集群的元数据。对于开发或者测试环境下,一个配置服务器足够了,在生产环境下,需要三天配置服务器,因为它们只需要占用很少的资源来保存元数据。2.1 创建配置服务器的数据文件保存目录:

集群搭建

 /data/example/config1 /data/example/config2 /data/example/config3

mkdir -p /data/example/config1 /data/example/config2 /data/example/config3

1、安装mongodb

2.2 在另外的终端下,启动配置服务器

#解压tar -xzvf mongodb-linux-x86_64-3.4.6.tgz -C /usr/local/#改名mv mongodb-linux-x86_64-3.4.6 mongodb
mongod --configsvr --dbpath /data/example/config1 --port 20001 --fork --logpath /data/example/config1/config1.log --logappendmongod --configsvr --dbpath /data/example/config2 --port 20002 --fork --logpath /data/example/config2/config2.log --logappendmongod --configsvr --dbpath /data/example/config3 --port 20003 --fork --logpath /data/example/config3/config3.log --logappend

分别在每台机器建立conf、mongos、config、shard1、shard2、shard3六个目录,因为mongos不存储数据,只需要建立日志文件目录即可。

2.3 在另外的终端下,启动mongos实例:mongos --configdb mongo01:20001,mongo01:20002,mongo01:20003 --port 27017 --chunkSize 1 --fork --logpath /data/example/mongos.log --logappend如果使用的是以前创建的表或者测试环境下,可以使用最小的chunksize,默认chunksize为64M意味着在mongodb自动分片启动前,集群必须拥有64MB的数据文件。在生产环境下是不能使用很小的分片大小的。configdb选项指定了配置服务器。mongos实例运行在默认的mongodb27017端口。2.4 可以在mongos添加第一个分片,在新的终端执行以下命令:2.4.1 连接mongos实例

mkdir -p /usr/local/mongodb/confmkdir -p /usr/local/mongodb/mongos/logmkdir -p /usr/local/mongodb/config/datamkdir -p /usr/local/mongodb/config/logmkdir -p /usr/local/mongodb/shard1/datamkdir -p /usr/local/mongodb/shard1/logmkdir -p /usr/local/mongodb/shard2/datamkdir -p /usr/local/mongodb/shard2/logmkdir -p /usr/local/mongodb/shard3/datamkdir -p /usr/local/mongodb/shard3/log

vim /etc/profile# 内容export MONGODB_HOME=/usr/local/mongodbexport PATH=$MONGODB_HOME/bin:$PATH# 使立即生效source /etc/profile
mongo mongo01:27017/admin

2、config server配置服务器

2.4.2 使用addShard命令添加第一个分片

mongodb3.4以后要求配置服务器也创建副本集,不然集群搭建不成功。

db.runCommand( { addShard : "firstset/mongo01:10001,mongo01:10002,mongo01:10003" } )
vi /usr/local/mongodb/conf/config.conf## 配置文件内容pidfilepath = /usr/local/mongodb/config/log/configsrv.piddbpath = /usr/local/mongodb/config/datalogpath = /usr/local/mongodb/config/log/congigsrv.loglogappend = true bind_ip = 0.0.0.0port = 21000fork = true #declare this is a config db of a cluster;configsvr = true#副本集名称replSet=configs #设置最大连接数maxConns=20000

2.4.3 出现以下信息,表示成功:

启动三台服务器的config server

{ "shardAdded" : "firstset", "ok" : 1 }
mongod -f /usr/local/mongodb/conf/config.conf

3. 部署另一个测试副本集创建另外一个副本集实例,名称为secondset:3.1 创建副本集并且插入数据如下:

登录任意一台配置服务器,初始化配置副本集

 /data/example/secondset1 /data/example/secondset2 /data/example/secondset3

mkdir -p /data/example/secondset1 /data/example/secondset2 /data/example/secondset3
#连接mongo --port 21000#config变量config = {... _id : "configs",... members : [... {_id : 0, host : "192.168.0.75:21000" },... {_id : 1, host : "192.168.0.84:21000" },... {_id : 2, host : "192.168.0.86:21000" }... ]... }#初始化副本集rs.initiate

3.2 在其他终端启动三个mongodb实例,如下:

其中,”_id” : “configs”应与配置文件中配置的 replicaction.replSetName 一致,”members” 中的 “host” 为三个节点的 ip 和 port

mongod --dbpath /data/example/secondset1 --port 30001 --replSet secondset --oplogSize 700 --rest --fork --logpath /data/example/secondset1/secondset1.log --logappend --nojournal --directoryperdbmongod --dbpath /data/example/secondset2 --port 30002 --replSet secondset --oplogSize 700 --rest --fork --logpath /data/example/secondset2/secondset2.log --logappend --nojournal --directoryperdbmongod --dbpath /data/example/secondset3 --port 30003 --replSet secondset --oplogSize 700 --rest --fork --logpath /data/example/secondset3/secondset3.log --logappend --nojournal --directoryperdb

3、配置分片副本集

3.3 连接一个mongodb实例的shell

vi /usr/local/mongodb/conf/shard1.conf#配置文件内容#——————————————–pidfilepath = /usr/local/mongodb/shard1/log/shard1.piddbpath = /usr/local/mongodb/shard1/datalogpath = /usr/local/mongodb/shard1/log/shard1.loglogappend = truebind_ip = 0.0.0.0port = 27001fork = true #打开web监控httpinterface=truerest=true #副本集名称replSet=shard1 #declare this is a shard db of a cluster;shardsvr = true #设置最大连接数maxConns=20000
mongo mongo01:20001/admin

启动三台服务器的shard1 server

本文由皇家赌场手机版发布于首页,转载请注明出处:【澳门皇家赌场手机版】详解MongoDB中用sharding将

相关阅读