#mongodb_shard安装配置
##1 mongodb源码安装 创建mongodb用户
adduser mongodb
在/home/mongodb/下载mongodb源码,并进行解压,生成文件夹mongodb-linux-x86_64-2.6.4
tar zxvf mongodb-linux-x86_64-1.6.2.tgz
##2 mongodb_shard结构说明 本次配置涉及到5台服务器,45,47,48,60, 126构成3个shard 需要存在的结构:replication sets,mongod,mongod config sever,mongos。 45,48————shard1(rs1) 47————shard2(rs0) 126,60————shard3(rs2) replication sets:(45,48),(47),(126,60)一主一从即primary,secondary mongod config sever:47,48,60 mongos:47,48,60
##3 具体配置 3.1 创建文件目录 219.224.135.45
mkdir /var/lib/mongodb_rs0
mkdir /var/lib/mongodb_rs1
mkdir /var/log/mongodb
同理在47,48,126,60上分别创建上述文件目录
219.224.135.60
mkdir /var/lib/mongodb_config_server
同理在47,48上创建config server的文件夹
3.2 replication sets 1)创建replication set1:rs0 219.224.135.47, 创建replication set:rs0
cd /home/mongodb/mongodb-linux-x86_64-2.6.4/bin
numactl --interleave=all ./mongod --port=27016 --replSet=rs0 --dbpath=/var/lib/mongodb_rs0_mirage --logpath=/var/log/mongodb/mongodb.log --logappend --fork --smallfiles
47上启动另一个mongod服务
numactl --interleave=all ./mongod --port=27017 --replSet=rs0 --dbpath=/var/lib/mongodb_rs0 --logpath=/var/log/mongodb/mongodb.log --logappend --fork --smallfiles
--rest表示可以通过host:28017在浏览器中管理mongodb实例 --auth表示连接时的安全性验证 创建成功会有如下说明:
child process started successfully, parent existing
2)创建replication set:rs1 在219.224.135.45和219.224.135.48:
cd /home/mongodb/mongodb-linux-x86_64-2.6.4/bin
创建replication set:rs1
numactl --interleave=all ./mongod --port=27017 --replSet=rs1 --dbpath=/var/lib/mongodb_rs1 --logpath=/var/log/mongodb/mongodb.log --logappend --fork --smallfiles
初始化replication set2:rs1 使用mongo进入一个primary mongod
mongo --port 27017 --host219.224.135.48
rs.initiate();
rs.add('219.224.135.45');
rs.status();
3)创建replication set:rs2 在219.224.135.126和219.224.135.60:
cd /home/mongodb/mongodb-linux-x86_64-2.6.4/bin
创建replication set:rs2
numactl --interleave=all ./mongod --port=27017 --replSet=rs2 --dbpath=/var/lib/mongodb_rs2 --logpath=/var/log/mongodb/mongodb.log --logappend --fork --smallfiles
初始化replication set3:rs2 使用mongo进入一个primary mongod
mongo --port 27017 --host219.224.135.126
rs.initiate();
rs.add('219.224.135.60');
rs.status();
3.3 config server 分别在60,47,48上作如下配置:
cd /home/mongodb/mongodb-linux-x86_64-2.6.4/bin
./mongod --configsvr --dbpath /var/lib/mongodb_config --port 27018 --logpath /var/log/mongodb/config.log --logappend --fork
3.4 mongos 在60,47,48config server上分别执行:
cd /home/mongodb/mongodb-linux-x86_64-2.6.4/bin
./mongos --configdb 219.224.135.60:27018,219.224.135.47:27018,219.224.135.48:27018 --port 27019 --logpath /var/log/mongodb/mongos.log --logappend --fork
3.5 shard cluster 连接到其中一个mongos进程,并切换到admin数据库进行如下配置:
mongo --port 27019 --host 219.224.135.47
>use admin;
>db.runCommand({addshard:'rs0/mirage:27017,219.224.135.47:27017'});
#这里可能会出现问题,由于在设置replication #set时primary节点的host默认为用户名,而不是ip。这个可以通过rs.status();进行查看
>db.runCommand({addshard:'rs1/219.224.135.45:27017,ubuntu4:27017'});
>db.runCommand({addshard:'rs2/ubuntu5:27017,219.224.135.60:27017'});
在添加了shards之后,查看是否配置成功
>db.runCommand({listshards:1})
{
"shards" : [
{
"_id" : "rs1",
"host" : "rs1/219.224.135.45:27017,ubuntu4:27017"
},
{
"_id" : "rs0",
"host" : "rs0/219.224.135.47:27017,mirage:27017"
},
{
"_id" : "rs2",
"host" : "rs2/219.224.135.60:27017,ubuntu5:27017"
}
],
"ok" : 1
}
激活数据库分片:
>db.runCommand({enablesharding:'54api_weibo_v2'});
>db.runCommand({enablesharding:'boat'});
查看数据库分片是否成功:
sh.status();
查看对应的database对应的partitioned是否为'true' 3.6 collection 同上也是在mongos中进行配置
>db.runCommand({shardcollection:'54api_weibo_v2.master_timeline_user',key:{id:'hashed'}});
>db.runCommand({shardcollection:'54api_weibo_v2.master_timeline_weibo',key:{id:'hashed'}});
>db.runCommand({shardcollection:'boat.boatcol',key:{'id':'hashed'}});
>db.runCommand({shardcollection:'54api_weibo_v2.master_timeline_user',key:{'id':'hashed'}});
查看配置情况:
use 54api_weibo_v2
mongos> db.stats()
{
"raw" : {
"rs0/219.224.135.47:27017,mirage:27017" : {
"db" : "54api_weibo_v2",
"collections" : 288,
"objects" : 7259812,
"avgObjSize" : 2536.4785666626076,
"dataSize" : 18414357536,
"storageSize" : 25148407792,
"numExtents" : 2647,
"indexes" : 557,
"indexSize" : 547203328,
"fileSize" : 26813923328,
"nsSizeMB" : 16,
"dataFileVersion" : {
"major" : 4,
"minor" : 5
},
"extentFreeList" : {
"num" : 0,
"totalSize" : 0
},
"ok" : 1
},
"rs1/219.224.135.45:27017,ubuntu4:27017" : {
"db" : "54api_weibo_v2",
"collections" : 273,
"objects" : 6554653,
"avgObjSize" : 2768.4976324452264,
"dataSize" : 18146541312,
"storageSize" : 22381359104,
"numExtents" : 2528,
"indexes" : 542,
"indexSize" : 544374432,
"fileSize" : 24130879488,
"nsSizeMB" : 16,
"dataFileVersion" : {
"major" : 4,
"minor" : 5
},
"extentFreeList" : {
"num" : 3,
"totalSize" : 293744640
},
"ok" : 1
}
},
"objects" : 13814465,
"avgObjSize" : 2646.0787830726704,
"dataSize" : 36560898848,
"storageSize" : 47529766896,
"numExtents" : 5175,
"indexes" : 1099,
"indexSize" : 1091577760,
"fileSize" : 50944802816,
"extentFreeList" : {
"num" : 3,
"totalSize" : 293744640
},
"ok" : 1
}
mongos> db.boatcol.getShardDistribution()
Shard rs1 at rs1/219.224.135.45:27017,ubuntu4:27017
data : 54.14Mb docs : 31377 chunks : 1
estimated data per chunk : 54.14Mb
estimated docs per chunk : 31377
Totals
data : 54.14Mb docs : 31377 chunks : 1
Shard rs1 contains 100% data, 100% docs in cluster, avg obj size on shard : 1kb
查看'raw'是否有'rs0','rs1'的相关信息
##4 相关问题 (1)在进入mongo时出现问题,使用以下语句:
export LC_ALL='C'
(2)在添加shard后一定要启动对应数据库的shard,即enablesharding。 否则在此后的collection中,不能成功给collection分片
(3)/var/log/mongodb/config.log accept() returns -1 errno:24 Too many open files
solution: vim /etc/bash.bashrc ulimit -n 65536 source /etc/bash.bashrc
mongodb修改最大连接数参考http://blog.163.com/ji_1006/blog/static/1061234120121120114047464/
(4)重要:MongoDB要求文件系统对目录支持fsync()。所以例如HGFS和Virtual Box的共享目录不支持这个操作。 推荐配置 a. 在包含数据文件的卷关闭atime配置。 b. 按照UNIX ulimit设置的推荐,设置描述符限制,-n及其他用户进程限制(ulimit),-u到多于20000。较低的ulimit配置在大压力情况下会影响MongoDB,并且可能产生错误及导致连接到MongoDB失败和服务不可用。 c. 不要使用hugepages虚拟内存页,因为MongoDB在正常虚拟内存页中表现更好。 d. 在BIOS中禁用NUMA。如果做不到,请参考MongoDB和NUMA硬件章节。 e. 确保存放数据文件的块设备的readahead配置合理。对随机访问模式,设置较低的readahead值。readahead 32(或16kb)通常工作良好。 f. 使用网络时间协议(NTP)保证服务器间的时间同步。这对于分片集群来说尤其重要。 (5)服务器时间同步
ntpdate cn.pool.ntp.org
date
hwclock
hwclock --localtime
hwclock --utc
hwclock -w
sudo apt-get install ntp
参考http://blog.sina.com.cn/s/blog_636a55070101u1mg.html,http://wiki.ubuntu.org.cn/NTP
(6) "errmsg" : "please create an index that starts with the shard key before sharding." use boat db.boat.ensureIndex({"id": "hashed"})
(7) mongodump 备份 与 mongorestore 恢复
cd /home/ubuntu3/linhao/mongodump/
mongodump --forceTableScan --host 219.224.135.47 --port 27019 -d news -o ./
mongorestore --host 219.224.135.92 --db news --directoryperdb news/
mongodump --forceTableScan --host 219.224.135.47 --port 27019 -d 54api_weibo_v2 -o ./
mongorestore --host 219.224.135.92 --db news --directoryperdb 54api_weibo_v2/
##5 mongodb服务迁移 (1)迁移原因描述:46服务器不稳定,因此需要将46服务器上相应的mongod、mongos服务移动到60服务器上
(2)config server迁移,将config server由46 47 48 变为 47 48 60
参考http://docs.mongodb.org/manual/tutorial/migrate-config-servers-with-different-hostnames/
重点是Disable the Balancer,将46上config db的数据考到60上,启动60上config server,restart the Balancer
(3)mongos服务迁移,将mongos server由46 47 48 变为 47 48 60,配置好上面config server后在47 48 60服务器上运行
./mongos --configdb 219.224.135.60:27018,219.224.135.47:27018,219.224.135.48:27018 --port 27019 --logpath /var/log/mongodb/mongos.log --logappend --fork
(4)shard服务迁移(将rs0由46:27017+47:27017变为47:27016+47:27017)
参考http://docs.mongodb.org/manual/tutorial/migrate-sharded-cluster-to-new-hardware/
-
Disable the Balancer
-
连接219.224.135.46:27017, 即rs0的primary,stepdown(),让47:27017成为primary
-
将46上/var/lib/mongodb_rs0拷贝到47/var/lib/mongodb_rs0_mirage上
-
启动47上的mongod服务,使用47:27016
ssh [email protected]
cd /home/mongodb/mongodb-linux-x86_64-2.6.4/bin
numactl --interleave=all ./mongod --port=27016 --replSet=rs0 --dbpath=/var/lib/mongodb_rs0_mirage --logpath=/var/log/mongodb/mongodb.log --logappend --fork --smallfiles
- 更新replica set rs0配置信息
cfg = rs.conf()
cfg.members[0].host = "219.224.135.47:27016"
rs.reconfig(cfg)
rs.conf()
rs.status()