MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构很是松散,是相似json的bjson格式,所以能够存储比较复杂的数据类型。Mongo最大的特色是他支持的查询语言很是强大,其语法有点相似于面向对象的查询语言,几乎能够实现相似关系数据库单表查询的绝大部分功能,并且还支持对数据创建索引。 |
MongoDB集群包括必定数量的mongod(分片存储数据)、mongos(路由处理)、config server(配置节点)、clients(客户端)、arbiter(仲裁节点:为了选举某个分片存储数据节点那台为主节点)。 |
一、shards:一个shard为一组mongod,一般一组为两台,主从或互为主从,这一组mongod中的数据时相同的,具体可见《mongodb分布式之数据复制》。数据分割按有序分割方式,每一个分片上的数据为某一范围的数据块,故可支持指定分片的范围查询,这同google的BigTable 相似。数据块有指定的最大容量,一旦某个数据块的容量增加到最大容量时,这个数据块会切分红为两块;当分片的数据过多时,数据块将被迁移到系统的其余分片中。另外,新的分片加入时,数据块也会迁移。二、mongos:能够有多个,至关于一个控制中心,负责路由和协调操做,使得集群像一个总体的系统。mongos能够运行在任何一台服务器上,有些选择放在shards服务器上,也有放在client 服务器上的。mongos启动时须要从config servers上获取基本信息,而后接受client端的请求,路由到shards服务器上,而后整理返回的结果发回给client服务器。三、config server:存储集群的信息,包括分片和块数据信息。主要存储块数据信息,每一个config server上都有一份全部块数据信息的拷贝,以保证每台config server上的数据的一致性。四、shard key:为了分割数据集,须要制定分片key的格式,相似于用于索引的key格式,一般由一个或多个字段组成以分发数据,好比:{ name : 1 }{ _id : 1 }{ lastname : 1, firstname : 1 }{ tag : 1, timestamp : -1 }mongoDB的分片为有序存储(1为升序,-1为降序),shard key相邻的数据一般会存在同一台服务(数据块)上。
服务器部署能够有多种方式。首先,每台config server、mongos、mongod均可以是单独的服务器,但这样会致使某些服务器的浪费,好比config server。下图为物理机共享的集群部署,不须要额外加机器。php
固然也有其余的方案,好比把mongos部署在全部的mongod(server1-6)上,又或者在每一个运用服务器(server7)上部署mongos。这样部署有个好处在于,appserver和mongos之间的通讯创建在localhost interface上,减小了通讯成本。固然,此乃官方说法,但本人有想法,尽管减小了appserver和mongos之间的通讯成本,但mongos与mongod之间的通讯成本却增长了,并且把mongos部署在appserver上并非很利于sa管理,mongoDB应该是一个相对独立的系统,与应用的耦合度应该尽可能降到最低,万一应用想要换数据库,也能多少减小些工做量。 |
4、mongodb分布式的安装html
一、下载mysql
wget http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-2.0.4.tgz
二、安装linux
tar zxvf mongodb-linux-2.0.4.tgzcp -fr mongodb-linux-*2.0.4/* /data/mongodb/mkdir -p /data/mongodb/data/ #建立数据存储目录mkdir -p /data/mongodb/log/ #建立日志存储目录mkdir -p /data/mongodb/config/ #建立配置存储目录mkdir -p /data/mongodb/arbiter/ #建立仲裁节点存储目录
三、单机模式以及个参数说明redis
mongod --fork --bind_ip 127.0.0.1 --port 11811 --dbpath /data0/mongodb/data --directoryperdb --logpath /data0/mongodb/log/db1.log --logappend --nohttpinterfacenetstat -ntlp|grep mongod
简单的参数说明:–logpath 日志文件路径–master 指定为主机器–slave 指定为从机器–source 指定主机器的IP地址–pologSize 指定日志文件大小不超过64M.由于resync是很是操做量大且耗时,最好经过设置一个足够大的oplogSize来避免resync(默认的 oplog大小是空闲磁盘大小的5%)。–logappend 日志文件末尾添加–port 启用端口号–fork 在后台运行–only 指定只复制哪个数据库–slavedelay 指从复制检测的时间间隔–auth 是否须要验证权限登陆(用户名和密码)–noauth 不须要验证权限登陆(用户名和密码)
5、集群模式mongos,mongod,configsvrsql
1.Shard分片--第一组分片 192.168.200.226: /data/mongodb/bin/mongod --replSet rep1 --fork --port 11813 --maxConns 65535 --dbpath /data/mongodb/data --directoryperdb --logpath /data/mongodb/log/db.log --logappend --nohttpinterface#启动rep1分片的一个数据节点/data/mongodb/bin/mongos --configdb 192.168.201.226:11812 --port 11811 --fork --chunkSize 256 --logpath /data/mongodb/log/ms.log #启动路由节点,读取201.226上的配置节点的配置文件,(在配置节点启动后启动)/data/mongodb/bin/mongod --replSet rep1 --fork --port 11814 --dbpath /data/mongodb/arbiter --directoryperdb --logpath /data/mongodb/log/arbiter.log --logappend --nohttpinterface#启动分片的仲裁节点192.168.201.226: /data/mongodb/bin/mongod --replSet rep1 --fork --port 11813 --maxConns 65535 --dbpath /data/mongodb/data --directoryperdb --logpath /data/mongodb/log/db.log --logappend --nohttpinterface#启动rep1分片的第二个数据节点/data/mongodb/bin/mongos --configdb 192.168.201.226:11812 --port 11811 --fork --chunkSize 256 --logpath /data/mongodb/log/ms.log #启动第二个路由节点 (在配置节点启动后启动)2.ConfigServer--- #启动config server 192.168.201.226: /data/mongodb/bin/mongod --configsvr --dbpath /data/mongodb/config --port 11812 --fork --logpath /data/mongodb/log/mc.log#启动配置节点,注意配置节点应该优先启动,否则路由节点读取不到配置节点信息则会启动失败。3.Mongos路由--- #启动mongos,指定config server, chunkSize 256M 192.168.201.226: /data/mongodb/bin/mongos --configdb 192.168.201.226:11812 --port 11811 --fork --chunkSize 256 --logpath /data/mongodb/log/ms.log#启动路由节点
因为机器有限,只配置了一个shard分片,该分片里有2个节点,新增长分片只需对应改replSet 名称便可。mongodb
4.配置replSet: 链接任一mongod membersmongo 192.168.201.226:11813config = {_id: 'rep1', members: [{_id: 0, host: '192.168.200.226:11813', priority: 2}, #priority 为定义优先级,默认为1,高优先级会被认为是主节点优先启用。{_id: 1, host: '192.168.201.226:11813'},{_id: 2, host: '192.168.200.226:11814', arbiterOnly: true}]} rs.initiate(config); rs.status()
5.链接mongos增长shard 80G mongo 192.168.201.226:11811/admin show dbs use admin db.runCommand({addshard:'rep1/192.168.201.226:11813,192.168.200.226:11813',maxsize:81920}) db.runCommand({listshards:1})
6.链接mongos增长建立test库和c1集合,并测试数据库
mongo 192.168.201.226:11811/adminapache
db.runCommand({enablesharding:'test'})json
printShardingStatus()
db.runCommand({shardcollection:'test.auto_increment_id', key:{_id:1}, unique : true})
db.runCommand({shardcollection:'test.c1', key:{_id:1}, unique : true})
for (var i = 1; i <= 100; i++)db.c1.save({id:i,value1:"1234567890",value2:"1234567890",value3:"1234567890",value4:"1234567890"})
db.c1.stats()
db.createCollection("cap_coll", {capped:true, size:100000, max:100});
db.mycoll.validate();
7.检查: db.printCollectionStats()
8.管理: mongo 127.0.0.1:11811
show dbs
use admin
show collections
db.serverStatus()
db.shutdownServer()
exit
9.索引:db.product_data.ensureIndex({data_id: 1}, {unique: true,dropDups: true}); #建立索引db.product_data.dropIndexes(); #删除索引
至此,mongodb的分布式架构就架起来了,而且经过测试和log的分析,可看服务是否正常,下面就须要php客户端的支持,和程序的运行,以后加到监控里,就能够在线上部署使用了。 |
6、PHP的MongoDB拓展的安装
# wget http://pecl.php.net/get/mongo-1.2.6.tgz # tar zxvf mongo-1.2.6.tgz # cd mongo-1.2.6 # /usr/local/php5/bin/phpize # ./configure --enable-mongo=share--with-php-config=/usr/local/php5/bin/php-config # make && make installl
PHP支持mongodb
将生成的拓展mongo.so文件添加到php.ini中,重启php-fpm,或者apache,而后查看下phpinfo()请编辑php.ini文件。添加以下一行:extension=mongo.so而后用php输出:phpinfo,就能够看到mongo的信息了。。这样就说明你安装成功的了!
7、监控配置:
早在去年已经出现MongoDB和Redis的Cacti模板,使用它,你能够对你的MongoDB和Redis服务进行流量监控。cacti的模板一直在更新,若企业已经用到nosql这种非关系数据库如mongodb和redis。可按照如下教程,对mongodb和redis进行监控。
该模板能够监控如下资源:
mongodb:
redis:
1、下载模板:
wget http://mysql-cacti-templates.googlecode.com/files/better-cacti-templates-1.1.8.tar.gz
2、配置ssh公私钥无需密码登陆:
由于cacti监控mongodb是须要登陆到mongodb的服务端运行mongo的状态获取命令,因此须要ssh链接登陆。
因此须要配置非交互式账号密码登陆。这里采用公私钥模式。
先在监控服务器生成一对公私钥。
ssh-keygen ##若是是root用户,生成的默认目录为/root/.ssh下2个文件id_rsa(公钥) id_rsa.pub(私钥)cd /root/.ssh/ && chmod 600 id_rsa* 把这2个文件修改权限,为600 ssh-copy-id -i /root/.ssh/id_rsa root@192.168.200.1 #加被监控节点公私钥认证
把id_rsa.pub复制出来,放到被监控机器上,而后公钥的内容追加到须要被监控的主机也就是mongodb和redis的服务端。追加到.ssh/authorized_keys
而后用ssh链接你所安装mongodb或者redis的服务端,若是不需输密码链接上。则正常。下面就能够开始添加监控文件了。
3、配置监控脚本:
mongodb或redis的监控所需到的是你下载目录中的better-cacti-templates-1.1.8\scripts下的ss_get_by_ssh.php 这个脚本 这个脚本须要放在cacti的服务端。若是你cacti是装到/var/www/html/cacti/目录下。把该文件放在其下面的scripts目录下。别忘了看下权限。要有执行权限。
而后修改该文件。主要修改一下选项,大概在40行。
# ============================================================================$ssh_user = 'root'; # SSH username$ssh_port = 22; # SSH port$ssh_iden = '-i /root/.ssh/id_rsa'; # SSH identity##修改根据你的配置,你的ssh链接用户,还有认证私钥的位置。
大该在50行,还能够修改其默认的去探测的端口(若是redis不是正常默认端口启动须要修改这些)。
$memcache_port = 11211; # Which port memcached listens on$redis_port = 6379; # Which port redis listens on
若是是mongodb不是正常端口启动,则须要这样修改。找到如下字段,添加红色字段,这里注意mongo这个命令必定要找对。
function mongodb_cmdline ( $options ) {return “echo \”db._adminCommand({serverStatus:1, repl:1})\” | /usr/local/mongo/mongodb/bin/mongo –port 10000″;}
配置完后保存退出。
能够先用测试命令测一下。语法以下:
php /var/www/html/scripts/ss_get_by_ssh.php --type mongodb --host 192.168.200.1 --items c,de,df,dg,dh,di,dj,dk,dl,dm,dn,do,dp,dq,dr,ds,dt,du
若是有数据输出。则表示正常。
4、在cacti里添加mongodb和redis模板:
4.1 模板导入
模板目录为better-cacti-templates-1.1.8\templates
4.2 导入后对被监控机添加模板:
4.3 添加后为其绘图:
五:实际效果测试:
此文凝聚笔者很多心血请尊重笔者劳动,转载请注明出处。
linux运维培训 http://www.magedu.com
喜欢linux,或者有问题还能够来QQ群89342115交流。