转自己的学习笔记:2016-08-17
mongodb中文文档。:www.mogoing.com
github上有很多版本;
mongodb是nosql数据库;
一、mongodb单实例。这种配置只适合简易开发时使用,生产使用不行,因为单节点挂掉整个数据业务全挂,如下图。
虽然不能生产使用,但这个模式可以快速搭建启动,并且能够用mongodb的命令操作数据库。下面列出在linux下安装单节点mongodb的步骤
1、建立mongodb测试文件夹
mkdir -p /data/mongodbtest/single
mkdir -p /data/mongodbtest/single/data
cd /data/mongodbtest/single
2、下载mongodb的安装程序包
tar xvzf mongodb-linux-x86_64-2.4.6.tgz
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的主从复制节点:
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算法,可以很方便从分布式节点中选出主节点。
Bully算法是一种协调者(主节点)竞选算法,主要思想是集群的每个成员都可以声明它是主节点并通知其他节点。别的节点可以选择接受这个声称或是拒绝并进入主节点竞争。被其他所有节点接受的节点才能成为主节点。节点按照一些属性来判断谁应该胜出。这个属性可以是一个静态ID,也可以是更新的度量像最近一次事务ID(最新的节点会胜出)。
mongodb选举主节点操作:一致协议(其实就是bully算法)
官方推荐副本集的成员数量为奇数,最多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"});
#指定数据库里需要分片的集合和片键
测试分片配置结果