方案改型成,如下:

 

mongodb副本集 释放内存 mongo副本集 分片_mongodb副本集 释放内存

四个组件:mongos、config server、shard、replica set

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

config server,顾名思义为配置服务器,存储所有数据库元信息(路由、分片)的配置。

Shard,和大数据存储HDFS分片存储的思想的东西。

Replica set,副本集服务器。

 

准备环境:

ip:192.168.2.30

ip:192.168.2.33

ip:192.168.2.36

 

在每台机器上建立mongos、config、shard1、shard2、shard3五个目录。

#建立mongos目录
 
mkdir -p /home/mongodbtest/mongos
 
#建立config server 数据文件存放目录
 
mkdir -p /home/mongodbtest/config/data
 
#建立config server 日志文件存放目录
 
mkdir -p /home/mongodbtest/config/log
 
#建立config server 日志文件存放目录
 
mkdir -p /home/mongodbtest/mongos/log
 
#建立shard1 数据文件存放目录
 
mkdir -p /home/mongodbtest/shard1/data
 
#建立shard1 日志文件存放目录
 
mkdir -p /home/mongodbtest/shard1/log
 
#建立shard2 数据文件存放目录
 
mkdir -p /home/mongodbtest/shard2/data
 
#建立shard2 日志文件存放目录
 
mkdir -p /home/mongodbtest/shard2/log
 
#建立shard3 数据文件存放目录
 
mkdir -p /home/mongodbtest/shard3/data
 
#建立shard3 日志文件存放目录
 
mkdir -p /home/mongodbtest/shard3/log

 

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

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

参数说明:

dbpath:数据存放目录 logpath:日志存放路径logappend:以追加的方式记录日志 replSet:replica set 的名字 port:mongodb 进程所使用的端口号,默认为 27017 fork:以后台方式运行进程

journal:写日志 smallfiles:当提示空间不够时添加此参数 其他参数 pidfilepath:进程文件,方便停止 mongodbdirectoryperdb:为每一个数据库按照数据库名建立文件夹存放bind_ip:mongodb 所绑定的 ip 地址 oplogSize:mongodb 操作日志文件的最大大小。单位为Mb,默认为硬盘剩余空间的 5% noprealloc:不预先分配存储 shardsvr:分片 configsvr:配置服务节点 configdb:配置 config 节点到 route 节点

7)在每台机器上启动配置服务器

/home/mongodb/bin/mongod --configsvr--replSetphReplSet --dbpath /home/mongodbtest/config/data --port21000 --logpath /home/mongodbtest/config/log/config.log --fork

连接到任意一台配置服务器上 

/home/mongodb/bin/mongo --host 192.168.2.36 --port 21000

创建配置服务器副本集

rs.initiate({_id:"phReplSet",configsvr:true,members:[{_id:0,host:"192.168.2.30:21000"},{_id:1,host:"192.168.2.33:21000"},{_id:2,host:"192.168.2.36:21000"}]})

配置各个分片的副本集

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

/home/mongodb/bin/mongod --shardsvr --replSet shard1 --port 22001 --dbpath /home/mongodbtest/shard1/data --logpath /home/mongodbtest/shard1/log/shard1.log --fork -nojournal

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

/home/mongodb/bin/mongod --shardsvr --replSet shard2 --port 22002 --dbpath /home/mongodbtest/shard2/data --logpath /home/mongodbtest/shard2/log/shard2.log --fork -nojournal

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

/home/mongodb/bin/mongod --shardsvr --replSet shard3 --port 22003 --dbpath /home/mongodbtest/shard3/data --logpath /home/mongodbtest/shard3/log/shard3.log --fork -nojournal

 

 

任意登陆一个机器,比如登陆192.168.2.36,连接mongodb  

注意"arbiterOnly" : true  可以设置仲裁节点
如{_id:2,host:"192.168.2.36:22001","arbiterOnly" : true }

#设置第一个分片副本集/home/mongodb/bin/mongo 192.168.2.36:22001 
> use admin;
 
switched to db admin 
#定义副本集配置 并初始化>rs.initiate({_id:"shard1",members:[{_id:0,host:"192.168.2.30:22001"},{_id:1,host:"192.168.2.33:22001"},{_id:2,host:"192.168.2.36:22001"}]}) 
 
#设置第二个分片副本集/home/mongodb/bin/mongo 192.168.2.36:22002 
> use admin;
 
switched to db admin 
#定义副本集配置 并初始化>rs.initiate({_id:"shard2",members:[{_id:0,host:"192.168.2.30:22002"},{_id:1,host:"192.168.2.33:22002"},{_id:2,host:"192.168.2.36:22002"}]}) 
 
#设置第三个分片副本集/home/mongodb/bin/mongo 192.168.2.36:22003 
> use admin;
 
switched to db admin 
#定义副本集配置 并初始化>rs.initiate({_id:"shard3",members:[{_id:0,host:"192.168.2.30:22003"},{_id:1,host:"192.168.2.33:22003"},{_id:2,host:"192.168.2.36:22003"}]})

选择一台服务器启动mongos路由服务。(每台)

/home/mongodb/bin/mongos --configdb  phReplSet/192.168.2.30:21000,192.168.2.33:21000,192.168.2.36:21000 --port  20000 --logpath  /home/mongodbtest/mongos/log/mongos.log --fork

登录路由服务客户端

/home/mongodb/bin/mongo--host 192.168.2.36 --port 20000

添加分片到集群

sh.addShard("shard1/192.168.2.30:22001,192.168.2.33:22001,192.168.2.36:22001")
sh.addShard("shard2/192.168.2.30:22002,192.168.2.33:22002,192.168.2.36:22002")
sh.addShard("shard3/192.168.2.30:22003,192.168.2.33:22003,192.168.2.36:22003")
 
 
Enable Sharding for a Database
sh.enableSharding("test")
 
 
Shard a Collection
sh.shardCollection("test.Log",{ id: 1})   我用了sh.shardCollection("test.Log",{ id: “hash”})

 

8、测试

use test
for(var i = 1; i <=100000; i++){
 db.Log.save({id:i,"message":"message"+i});
}
 
mongos> for(var i = 1; i <= 100000;i++){
...  db.Log.save({id:i,"message":"message"+i});
... }
WriteResult({ "nInserted" : 1 })
mongos> db.Log.stats()

 

查看分片服务器配置

db.runCommand({listshards : 1 });

察看进程

ps –ef|grep mongo

另一类为分片集群,用下面方式查看状况:   登陆mongos    mongos>printShardingStatus()

分块大小设置

登入mongos

use config

db.settings.save( { _id:"chunksize", value: 1 } )   //value 的单位MB

查看分块大小db.settings.find()

分块详细信息 db.chunks.find()

生成keyfile

openssl  rand  –base64 753  >  keyFile

给keyFile文件设置600权限(必须设置600权限):

chmod 600 keyFile  

注意:分片中所有的keyfile 多必须为同一个,当初被坑了....

 

 

建用户

db.createUser(
...   {
...     user: "dba",
...     pwd: "dba",
...     roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
...   }
... )

1. 数据库用户角色:read、readWrite;

2. 数据库管理角色:dbAdmin、dbOwner、userAdmin;
3. 集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager;
4. 备份恢复角色:backup、restore;
5. 所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
6. 超级用户角色:root
//这里还有几个角色间接或直接提供了系统超级用户的访问(dbOwner 、userAdmin、userAdminAnyDatabase)
7. 内部角色:__system

 



mongod

#!/bin/sh
 #
 #mongod - Startup script for mongod
 #
 # chkconfig: - 85 15
 # description: Mongodb database.
 # processname: mongod
 # Source function library
  
 . /etc/rc.d/init.d/functions
 # things from mongod.conf get there by mongod reading it
 # OPTIONS
 OPTIONS="-f /home/mongodb/data/mongodb.conf"
 #mongod
 mongod="/home/mongodb/bin/mongod"
 #CONFIG
 CONFIG="-f /home/mongodbtest/config/config.conf"
 #shard1
 shard1="-f /home/mongodbtest/config/shard1.conf"
 #shard2
 shard2="-f /home/mongodbtest/config/shard2.conf"
 #shard3
 shard3="-f /home/mongodbtest/config/shard3.conf"
 #MONGOS
 MONGOS=/home/mongodb/bin/mongos
 #mongos
 mongos="-f /home/mongodbtest/config/mongos.conf"
 start()
 {
   echo -n $"Starting mongod: "
   daemon $mongod $OPTIONS 
   echo -n $"Starting config: "
   daemon $mongod $CONFIG 
   echo -n $"Starting shard1: "
   daemon $mongod $shard1 
   echo -n $"Starting shard2: "
   daemon $mongod $shard2 
   echo -n $"Starting shard3: "
   daemon $mongod $shard3 
   echo -n $"Starting mongos: "
   daemon $MONGOS $mongos
   RETVAL=$?


 }
  
 stop()
 {
   echo -n $"Stopping mongos: "
   killall mongos
   echo -n $"Stopping mongod: "
   killproc $mongod -QUIT
   RETVAL=$?
 }
  
 restart () {
         stop
         start
 }
 ulimit -n 12000
 RETVAL=0
  
 case "$1" in
   start)
     start
     ;;
   stop)
     stop
     ;;
   restart|reload|force-reload)
     restart
     ;;
   condrestart)
     [ -f $lockfile ] && restart || :
     ;;
   status)
     status $mongod
     RETVAL=$?
     ;;
   *)
     echo "Usage: $0 {start|stop|status|restart|reload|force-reload|condrestart}"
     RETVAL=1
 esac
 exit $RETVAL