当前位置:数据库 > DB2 >>

MongoDB集群构建

六台主机
hostname分别为wens012~017
IP:10.50.9.12~10.50.9.17
下面为部署方案
  www.zzzyk.com  
 
六个server,每个server上跑四个进程。
进程一共分三类:
shard server:启动守护进程mongod加上参数shardsvr即可。当然还有一些其他的配置。
config server:启动守护进程mongod加上参数configsvr即可。
route server:启动路由进程mongos。
部署方案中shard与rep都是shard server进程,每3个组成一个复制集,复制集中如果某个进程down掉了,会有另外一个进程成为主节点。
例如:shard11,rep12,rep13为一个复制集。
  www.zzzyk.com  
进程端口分配:

主机
ip
进程端口
Server1
10.50.9.12
Mongod shard11 : 27017
Mongod rep32  : 27018
Mongod rep33  : 27019
Mongod conf1  : 20000
Server2
10.50.9.13
Mongod shard21 : 27017
Mongod rep12  : 27018
Mongod rep13  : 27019
Mongos       : 30000
Server3
10.50.9.14
Mongod shard31 : 27017
Mongod rep22  : 27018
Mongod rep23  : 27019
Mongod conf2  : 20000
Server4
10.50.9.15
Mongod shard41 : 27017
Mongod rep62  : 27018
Mongod rep63  : 27019
Mongos       : 30000
Server5
10.50.9.16
Mongod shard51 : 27017
Mongod rep42  : 27018
Mongod rep43  : 27019
Mongod conf3  : 20000
Server6
10.50.9.17
Mongod shard61 : 27017
Mongod rep52  : 27018
Mongod rep53  : 27019
Mongds       : 30000

文件目录:
我的是下载压缩文件解压出来的mongodb,放在/erpfs/mongoDB/ 中。
加压出来后mongodb的所有执行文件都放在/erpfs/mongoDB/bin/ 中。
创建文件夹/erpfs/mongoDB/data/ 用于存放数据文件
每个server按照所需运行的mongod进程建数据目录。
例如:
server1:
mkdir -p /erpfs/mongoDB/data/shard11
mkdir -p /erpfs/mongoDB/data/rep32
mkdir -p /erpfs/mongoDB/data/rep33
mkdir -p /erpfs/mongoDB/data/config1
server2:
 
mkdir -p /erpfs/mongoDB/data/shard21
mkdir -p /erpfs/mongoDB/data/rep12
mkdir -p /erpfs/mongoDB/data/rep13
route server不需要数据目录
 
该项目还有一个需求,在server1只需执行一个启动脚本则整个集群都启动完毕,并且所有分片都加到集群中。
为了达到目的,我使用ssh。但是这样执行启动脚本之后,每当连接到另外一台server的时候都需要输入root密码,非常繁琐,需要有自动完成登录的功能。我们可以利用公钥和私钥来完成。
在server1中执行:ssh-keygen -t rsa
按回车,提示输入文件名,我用id_rsa_wens012命名
随后提示使用的加密方式,直接按回车两次,使用默认的即可。
这样会生成私钥和公钥文件id_rsa_wens12和id_rsa_wens12.pub
将私钥和公钥文件都放到/root/.ssh/中
将id_rsa_wens12.pub放到server2~6的/root/.ssh/中,并且重命名为authorized_keys(如果这个文件已存在,则id_rsa_wens12.pub的内容加到文件末尾)
这部分可以在写完所有脚本之后再补上,不过能在一开始就完成也很好。
  www.zzzyk.com  
然后开始写配置文件
还是以sever1为例:
conf文件有四个,每个进程一个。
#shard11.conf
 
shardsvr = true
replSet = shard1
dbpath = /erpfs/mongoDB/data/shard11
logpath = /erpfs/mongoDB/data/shard11.log
logappend = true
fork = true
port = 27017
journal = true
smallfiles = true
 
#rep32.conf
 
shardsvr = true
replSet = shard3
dbpath = /erpfs/mongoDB/data/rep32
logpath = /erpfs/mongoDB/data/rep32.log
logappend = true
fork = true
port = 27018
journal = true
smallfiles = true
 
#rep33.conf
 
shardsvr = true
replSet = shard3
dbpath = /erpfs/mongoDB/data/rep33
logpath = /erpfs/mongoDB/data/rep33.log
logappend = true
fork = true
port = 27019
journal = true
smallfiles = true
 
#config1.conf
 
configsvr = true
dbpath = /erpfs/mongoDB/data/config1
logpath = /erpfs/mongoDB/data/config1.log
logappend = true
fork = true
port = 20000
journal = true
smallfiles = true
 
其他server类似配置,改改名字就差不多。
server2中的mongos配置文件
#mongos
 
configdb = 10.50.9.12:20000,10.50.9.14:20000,10.50.9.16:20000
 
logpath = /erpfs/mongoDB/data/mongos.log
logappend = true
fork = true
port = 30000
chunkSize = 100
 
然后是启动脚本文件
先写好每个server的启动脚本
在每个server中都有一个serverX_start.sh(X表示1~6),用来启动该机器上的进程。
server2、4、6还有一个serverX_start_mongos.sh脚本,因为route server需要等到所有config server启动了之后才能启动。因为找不到config server 的话route server就不知道从哪里读取集群配置了。
以server1为例:
#server1_start.sh
 
#!/bin/bash
/erpfs/mongoDB/bin/mongod -f /erpfs/mongoDB/config1.conf
/erpfs/mongoDB/bin/mongod -f /erpfs/mongoDB/shard11.conf
/erpfs/mongoDB/bin/mongod -f /erpfs/mongoDB/rep32.conf
/erpfs/mongoDB/bin/mongod -f /erpfs/mongoDB/rep33.conf
 
选项-f(或--config)代表执行配置文件内容。
server2中用mongos的启动脚本,其实就是一句。
#server2_start_mongos.sh
 
#!/bin/bash
/erpfs/mongoDB/bin/mongos -f /erpfs/mongoDB/mongos.conf
 
进程都启动之后,route server已经跟config server连接上,但是所有的shard server都还是处于游离状态。我们要将他们加入到集群中,在加入集群之前还有一件事情,就是初始化复制集。
 
任意一台server上使用bin目录下的mongo连接到某一复制集的其中一个shard server上。
例如:/erpfs/mongoDB/bin/mongo 10.50.9.12:27017
就连接上了shard11了
执行初始化复制集代码
  www.zzzyk.com  
cfg={_id:'shard1',members:[{_id:1,host:'10.50.9.12:27017'},{_id:2,host:'10.50.9.13:27018'},{_id:3,host:'10.50.9.13:27019'}]}; 
rs.initiate(cfg); 
看到 'OK':1字样则初始化成功。
然后exit退出。
接着重复上述步骤初始化复制集shard2~6
 
初始化复制集完成之后就是将每个复制集加入到集群当中。
使用bin目录下的mongo连接到任意一个route server,进入admin数据库(命令:use admin)
然后执行下列代码增加分片的复制集
  www.zzzyk.com  
db.runCommand({addshard:'shard1/10.50.9.12:27017,10.50.9.13:27018,10.50.9.13:27019'}); 
db.runCommand({addshard:'shard2/10.50.9.13:27017,10.50.9.14:27018,10.50.9.14:27019'}); 
db.runCommand({addshard:'shard3/10.50.9.14:27017,10.50.9.12:27018,10.50.9.12:27019'}); 
db.runCommand({addshard:'shard4/10.50.9.15:27017,10.50.9.16:27018,10.50.9.16:27019'}); 
db.runCommand({addshard:'shard5/10.50.9.16:27017,10.50.9.17:27018,10.50.9.17:27019'}); 
Oracle
MySQL
Access
SQLServer
DB2
Excel
SQLite
SYBASE
Postgres
如果你遇到数据库难题:
请访问www.zzzyk.com 试试
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,