一、关于mongodbMongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。 二、mongodb分布式应用原理MongoDB集群包括一定数量的mongod(分片存储数据)、mongos(路由处理)、config server(配置节点)、clients(客户端)、arbiter(仲裁节点:为了选举某个分片存储数据节点那台为主节点)。1、shards:一个shard为一组mongod,通常一组为两台,主从或互为主从,这一组mongod中的数据时相同的,具体可见《mongodb分布式之数据复制》。数据分割按有序分割方式,每个分片上的数据为某一范围的数据块,故可支持指定分片的范围查询,这同google的BigTable 类似。数据块有指定的最大容量,一旦某个数据块的容量增长到最大容量时,这个数据块会切分成为两块;当分片的数据过多时,数据块将被迁移到系统的其他分片中。另外,新的分片加入时,数据块也会迁移。 2、mongos:可以有多个,相当于一个控制中心,负责路由和协调操作,使得集群像一个整体的系统。mongos可以运行在任何一台服务器上,有些选择放在shards服务器上,也有放在client 服务器上的。mongos启动时需要从config servers上获取基本信息,然后接受client端的请求,路由到shards服务器上,然后整理返回的结果发回给client服务器。 3、config server:存储集群的信息,包括分片和块数据信息。主要存储块数据信息,每个config server上都有一份所有块数据信息的拷贝,以保证每台config server上的数据的一致性。 4、shard key:为了分割数据集,需要制定分片key的格式,类似于用于索引的key格式,通常由一个或多个字段组成以分发数据,比如: { name : 1 } { _id : 1 } { lastname : 1, firstname : 1 } { tag : 1, timestamp : -1 } mongoDB的分片为有序存储(1为升序,-1为降序),shard key相邻的数据通常会存在同一台服务 (数据块)上。
三、mongodb分布式部署方式服务器部署可以有多种方式。首先,每台config server、mongos、mongod都可以是单独的服务器,但这样会导致某些服务器的浪费,比如config server。下图为物理机共享的集群部署,不需要额外加机器。四、mongodb分布式的安装1、下载wget http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-2.0.4.tgz2、安装 tar zxvf mongodb-linux-2.0.4.tgz cp -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/ #创建仲裁节点存储目录 3、单机模式以及个参数说明mongod --fork --bind_ip 127.0.0.1 --port 11811 --dbpath /data0/mongodb/data --directoryperdb --logpath /data0/mongodb/log/db1.log --logappend --nohttpinterface netstat -ntlp|grep mongod 简单的参数说明: –logpath 日志文件路径 –master 指定为主机器 –slave 指定为从机器 –source 指定主机器的IP地址 –pologSize 指定日志文件大小不超过64M.因为resync是非常操作量大且耗时,最好通过设置一个足够大的oplogSize来避免resync(默认的 oplog大小是空闲磁盘大小的5%)。 –logappend 日志文件末尾添加 –port 启用端口号 –fork 在后台运行 –only 指定只复制哪一个数据库 –slavedelay 指从复制检测的时间间隔 –auth 是否需要验证权限登录(用户名和密码) –noauth 不需要验证权限登录(用户名和密码) 五、集群模式mongos,mongod,configsvr1.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 名称即可。 4.配置replSet: 连接任一mongod members mongo 192.168.201.226:11813 config = {_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/admin db.runCommand({enablesharding:'test'}) 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客户端的支持,和程序的运行,之后加到监控里,就可以在线上部署使用了。 六、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
将生成的拓展mongo.so文件添加到php.ini中,重启php-fpm,或者apache,然后查看下phpinfo() 请编辑php.ini文件。添加如下一行: extension=mongo.so 然后用php输出:phpinfo,就可以看到mongo的信息了。。这样就说明你安装成功的了!转载地址:http://freeze.blog.51cto.com/1846439/884925 转载请保留固定链接: https://linuxeye.com/architecture/531.html |