mongodb分片学习笔记

转自己的学习笔记:2016-08-17

mongodb中文文档。:www.mogoing.com

github上有很多版本;

mongodb是nosql数据库;


一、mongodb单实例。这种配置只适合简易开发时使用,生产使用不行,因为单节点挂掉整个数据业务全挂,如下图。

虽然不能生产使用,但这个模式可以快速搭建启动,并且能够用mongodb的命令操作数据库。下面列出在linux下安装单节点mongodb的步骤

1、建立mongodb测试文件夹

  • #存放整个mongodb文件

mkdir -p /data/mongodbtest/single 

 

  • #存放mongodb数据文件

mkdir -p /data/mongodbtest/single/data

 

  • #进入mongodb文件夹

cd  /data/mongodbtest/single

2、下载mongodb的安装程序包

 

  • #解压下载的压缩包  

tar xvzf mongodb-linux-x86_64-2.4.6.tgz

  • #进入mongodb程序执行文件夹

cd mongodb-linux-x86_64-2.4.6/bin/

3、启动单实例mongodb

mongod  --dbpath /data/mongodbtest/single/data

输出日志如下,成功!

[initandlisten] db version v2.4.6

……..

[initandlisten] waiting for connections on port 27017

[websvr] admin web console waiting for connections on port 28017

mongodb默认自带提供了web访问接口,通过 IP + 端口的形式可以访问。

http://192.168.0.1:28017/

 

错误:

下载的文件名称有问题,不用wget,而是直接下载好版本再用;


二、主从模式。使用mysql数据库时大家广泛用到,采用双机备份后主节点挂掉了后从节点可以接替主机继续服务。所以这种模式比单节点的高可用性要好很多。

下面看一下怎么一步步搭建一个mongodb的主从复制节点:

  • 1、准备两台机器 192.168.0.1 和 192.168.0.2。 192.168.0.1 当作主节点, 192.168.0.2作为从节点。(这里采用10.1.15.193和10.1.15.196)
  • 2、分别下载mongodb安装程序包。在192.168.0.1上建立文件夹 /data/mongodbtest/master,192.168.0.2建立文件夹/data/mongodbtest/slave。
  • 3、在192.168.0.1启动mongodb主节点程序。注意后面的这个 “ –master ”参数,标示主节点。

mongod –dbpath /data/mongodbtest/master –master

输出日志如下,成功!

[initandlisten] MongoDB starting : pid=18285 port=27017 dbpath=/data/mongodbtest/master master=1

#日志显示主节点参数

[initandlisten] options: { dbpath: “/data/mongodbtest/master”, master: true }

……..

[initandlisten] waiting for connections on port 27017


mongoDB官方已经不建议使用主从模式了,替代方案是采用副本集的模式。

mongoDB的副本也是这个,主从模式其实就是一个单副本的应用,没有很好的扩展性和容错性。而副本集具有多个副本保证了容错性,就算一个副本挂掉了还有很多副本存在,并且解决了上面第一个问题“主节点挂掉了,整个集群内会自动切换”。

mongoDB副本集的架构图:

主服务器挂掉后的架构:

副本集中的副本节点在主节点挂掉后通过心跳机制检测到后,就会在集群内发起主节点的选举机制,自动选举一位新的主服务器。


Bully算法 mongodb副本集故障转移功能得益于它的选举机制。选举机制采用了Bully算法,可以很方便从分布式节点中选出主节点。

  1. 指定主节点的架构,这种架构一般都会申明一个节点为主节点,其他节点都是从节点,如我们常用的mysql就是这样。但是这样架构我们在第一节说了整个集群如果主节点挂掉了就得手工操作,上架一个新的主节点或者从从节点恢复数据,不太灵活。
  2. 不指定主节点,集群中的任意节点都可以成为主节点。mongodb也就是采用这种架构,一但主节点挂了其他从节点自动接替变成主节点。如下图:

 

Bully算法是一种协调者(主节点)竞选算法,主要思想是集群的每个成员都可以声明它是主节点并通知其他节点。别的节点可以选择接受这个声称或是拒绝并进入主节点竞争。被其他所有节点接受的节点才能成为主节点。节点按照一些属性来判断谁应该胜出。这个属性可以是一个静态ID,也可以是更新的度量像最近一次事务ID(最新的节点会胜出)。

mongodb选举主节点操作:一致协议(其实就是bully算法)

  1. 得到每个服务器节点的最后操作时间戳。每个mongodb都有oplog机制会记录本机的操作,方便和主服务器进行对比数据是否同步还可以用于错误恢复。
  2. 如果集群中大部分服务器down机了,保留活着的节点都为 secondary状态并停止,不选举了。
  3. 如果集群中选举出来的主节点或者所有从节点最后一次同步时间看起来很旧了,停止选举等待人来操作。
  4. 如果上面都没有问题就选择最后操作时间戳最新(保证数据是最新的)的服务器节点作为主节点。

官方推荐副本集的成员数量为奇数,最多12个副本集节点,最多7个节点参与选举。


mongodb——分片

分片:

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

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

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

shard,这就是传说中的分片了。上面提到一个机器就算能力再大也有天花板,就像军队打仗一样,一个人再厉害喝血瓶也拼不过对方的一个师。俗话说三个臭皮匠顶个诸葛亮,这个时候团队的力量就凸显出来了。在互联网也是这样,一台普通的机器做不了的多台机器来做,如下图:

一台机器的一个数据表 Collection1 存储了 1T 数据,压力太大了!在分给4个机器后,每个机器都是256G,则分摊了集中在一台机器的压力。

replica set,上两节已经详细讲过了这个东东,怎么这里又来凑热闹!其实上图4个分片如果没有 replica set 是个不完整架构,假设其中的一个分片挂掉那四分之一的数据就丢失了,所以在高可用性的分片架构还需要对于每一个分片构建 replica set 副本集保证分片的可靠性。生产环境通常是 2个副本 + 1个仲裁。

机器1:(10.1.15.196)

 

机器2:(10.1.15.193)

 

分别在每台机器上建立mongodb分片对应测试文件夹。

下载mongodb的安装程序包

分别在每台机器建立mongos 、config 、 shard1 、shard2四个目录。

因为mongos不存储数据,只需要建立日志文件目录即可。

 

 

 

规划5个组件对应的端口号,由于一个机器需要同时部署 mongos、config server 、shard1、shard2、shard3,所以需要用端口进行区分。

这个端口可以自由定义,在本文 mongos为 20000, config server 为 21000, shard1为 22001 , shard2为22002, shard3为22003.

在每一台服务器分别启动配置服务器。

/mongodb-linux-x86_64-amazon-3.6.2/bin/mongod --configsvr --dbpath config/data --port 21000 --logpath config/log/config.log --fork

在每一台服务器分别启动mongos服务器。(因为只有两台服务器所以配置一个config,只能配置奇数个config)

/mongodb-linux-x86_64-amazon-3.2.6/bin/mongos  --configdb 10.1.15.196:21000  --port 20000   --logpath  mongos/log/mongos.log --fork

配置各个分片的副本集。

#在每个机器里分别设置分片1服务器及副本集shard1

(10.1.15.196)mongodb-linux-x86_64-amazon-3.2.6/bin/mongod --shardsvr --replSet shard1 --port 22001 --dbpath shard1-1/data  --logpath shard1-1/log/shard1.log --fork --nojournal  --oplogSize 10

(10.1.15.193)mongodb-linux-x86_64-amazon-3.2.6/bin/mongod --shardsvr --replSet shard1 --port 22001 --dbpath shard1-2/data  --logpath shard1-2/log/shard1.log --fork --nojournal  --oplogSize 10

(10.1.15.196)mongodb-linux-x86_64-amazon-3.2.6/bin/mongod --shardsvr --replSet shard1 --port 22001 --dbpath shard1-3/data  --logpath shard1-3/log/shard1.log --fork --nojournal  --oplogSize 10

(10.1.15.193)mongodb-linux-x86_64-amazon-3.2.6/bin/mongod --shardsvr --replSet shard2 --port 22001 --dbpath shard2-1/data  --logpath shard2-1/log/shard1.log --fork --nojournal  --oplogSize 10

(10.1.15.196)mongodb-linux-x86_64-amazon-3.2.6/bin/mongod --shardsvr --replSet shard2 --port 22001 --dbpath shard2-2/data  --logpath shard2-2/log/shard1.log --fork --nojournal  --oplogSize 10

(10.1.15.193)mongodb-linux-x86_64-amazon-3.2.6/bin/mongod --shardsvr --replSet shard2 --port 22001 --dbpath shard2-3/data  --logpath shard2-3/log/shard1.log --fork --nojournal  --oplogSize 10

#设置第一个分片副本集

mongodb-linux-x86_64-amazon-3.2.6/bin/mongo  127.0.0.1(10.1.15.196):22001--shard1

#设置第二个分片副本集

mongodb-linux-x86_64-amazon-3.2.6/bin/mongo  127.0.0.1(10.1.15.193):22002--shard2

#使用admin数据库

use admin

#定义副本集配置

config = { _id:"shard1", members:[{_id:0,host:"10.1.15.196:22001"},{_id:1,host:"10.1.15.193:22001"},{_id:2,host:"10.1.15.196:22002",arbiterOnly:true}]}

config = { _id:"shard2", members:[{_id:0,host:"10.1.15.193:22002"},{_id:1,host:"10.1.15.196:22003"},{_id:2,host:"10.1.15.193:22003",arbiterOnly:true}]}

#初始化副本集配置

rs.initiate(config);

目前搭建了mongodb配置服务器、路由服务器,各个分片服务器,不过应用程序连接到 mongos 路由服务器并不能使用分片机制,还需要在程序里设置分片配置,让分片生效。

先连接mongos在使用admin数据库

#串联路由服务器与分配副本集1

db.runCommand( { addshard : "shard1/10.1.15.196:22001,10.1.15.193:22001,10.1.15.196:22002"});

#串联路由服务器与分配副本集2

db.runCommand( { addshard : "shard2/10.1.15.193:22002,10.1.15.196:22003,10.1.15.193:22003"});

#查看分片服务器的配置

db.runCommand( { listshards : 1 } );

连接在mongos上,准备让指定的数据库、指定的集合分片生效。

#指定cldb分片生效

db.runCommand( { enablesharding :"cldb"});

#指定数据库里需要分片的集合和片键

测试分片配置结果

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值