环境:
Mongo版本:3.2.22
Cnegtos6.5
第一部分:当前单节点情况分析
当前的单机,是使用常规的mongodb启动方法,与集群版数据库,端口等都不一致,数据库是导入的,没有办法做到拓展。
需要将当前节点重新搭建,使其数据库,和使用端口同集群的一致,方便单机向集群的拓展。
经过网上资料查询,发现单机节点的搭建有3种形式:
- 在单机上启动一个mongo实例(现在我们使用)
参考:https://www.cnblogs.com/shanshen/p/8807631.html
- 在单机上以副本集的方式启动一个mongo实例(将选用这一种方式建立单节点)
参考:https://blog.csdn.net/zongzhankui/article/details/78670042
- 在单机上开多个端口和目录,直接组成一个集群在单机上运行
根据我的项目需求,决定使用第二种,方便进行拓展。
第二部分:建立单节点(以副本集的形式存在的单节点)
- 安装mongo软件
- 创建所需的目录,文件
- 编辑配置文件
- 启动mongo实例
- /opt/mongodb/bin/mongod --shardsvr --replSet r4 --port 29017 --dbpath /data/r4 --logpath /data/r4/r4.log --logappend --nssize 64 --oplogSize 10240 --fork
- 修改hostname:
Vim /etc/hosts
改为
修改完重启
- 副本集初始化
rs.initiate()
因为是单节点的副本集,所以上来就是主节点了。
- 创建数据库
- 验证单节点
第三部分:建立单节点(以分片集群的形式存在的单节点---使用配置文件启动方式)
参考:https://blog.51cto.com/noodle/1748149
第四部分:建立单节点(以分片集群的形式存在的单节点---使用命令脚本启动方式)
root 4371 1 0 18:02 ? 00:00:02 /opt/mongodb/bin/mongod --shardsvr --port 29019 --dbpath /data/r2 --logpath /data/r2/r2.log --logappend --nssize 64 --oplogSize 10240 --fork root 4396 1 0 18:03 ? 00:00:02 /opt/mongodb/bin/mongod --shardsvr --port 29018 --dbpath /data/r3 --logpath /data/r3/r3.log --logappend --nssize 64 --oplogSize 10240 --fork root 4430 1 0 18:04 ? 00:00:01 /opt/mongodb/bin/mongod --shardsvr --port 29017 --dbpath /data/r4 --logpath /data/r4/r4.log --logappend --nssize 64 --oplogSize 10240 --fork root 4456 1 0 18:05 ? 00:00:01 /opt/mongodb/bin/mongod --configsvr --dbpath /data/config --port 20001 --logpath /data/config/config.log --logappend --fork root 4480 1 0 18:05 ? 00:00:00 /opt/mongodb/bin/mongos --configdb 192.168.1.69:20001 --port 30001 --chunkSize 200 --logpath /data/mongos1.log --logappend --fork
第五部分:建立单节点(以副本集群的形式存在的单节点---多个进程的副本,与单个进程区别)
- 分别建立三个目录r2,r3,r4
mkdir r2 r3 r4
- 按照如下命令启动,注意副本集的名字不变,但是日志目录和数据存放目录要发生相应的变化
root 7421 1 3 10:06 ? 00:01:37 /opt/mongodb/bin/mongod --shardsvr --replSet r4 --port 29017 --dbpath /data/r4 --logpath /data/r4/r4.log --logappend --nssize 64 --oplogSize 10240 --fork root 7451 1 4 10:09 ? 00:01:32 /opt/mongodb/bin/mongod --shardsvr --replSet r4 --port 29018 --dbpath /data/r3 --logpath /data/r3/r3.log --logappend --nssize 64 --oplogSize 10240 --fork root 7481 1 4 10:10 ? 00:01:45 /opt/mongodb/bin/mongod --shardsvr --replSet r4 --port 29019 --dbpath /data/r2 --logpath /data/r2/r2.log --logappend --nssize 64 --oplogSize 10240 --fork root 7507 1 0 10:11 ? 00:00:16 /opt/mongodb/bin/mongod --configsvr --dbpath /data/config --port 20001 --logpath /data/config/config.log --logappend --fork root 7852 1 0 10:18 ? 00:00:05 /opt/mongodb/bin/mongos --configdb 192.168.1.69:20001 --port 30000 --chunkSize 200 --logpath /data/mongos1.log --logappend --fork
- 启动之后进行副本集配置
config={_id:'r4',members:[{_id:0,host:'192.168.1.69:29017'},{_id:1,host:'192.168.1.69:29018'},{_id:2,host:'192.168.1.69:29019'}] } rs.initiate(config)
- 路由配置
use admin db.runCommand({addshard:"r4/192.168.1.69:29017,192.168.1.69:29018,192.168.1.69:29019"});
- 数据库配置
分片,数据库配置参考init_mongodb_gluster.sh和data.sh脚本
第六部分:建立单节点(以副本集+分片集的形式存在的单节点---单个实例进程的副本,注意与第二部分的单个进程区别)
- 按照如下命令启动
root 9272 1 5 13:35 ? 00:00:26 /opt/mongodb/bin/mongod --shardsvr --replSet r4 --port 29017 --dbpath /data/r4 --logpath /data/r4/r4.log --logappend --nssize 64 --oplogSize 10240 --fork root 9298 1 0 13:35 ? 00:00:03 /opt/mongodb/bin/mongod --configsvr --dbpath /data/config --port 20001 --logpath /data/config/config.log --logappend --fork root 9322 1 0 13:36 ? 00:00:01 /opt/mongodb/bin/mongos --configdb 192.168.1.69:20001 --port 30000 --chunkSize 200 --logpath /data/mongos1.log --logappend --fork
- 进行副本集配置
config={_id:'r4',members:[{_id:0,host:'192.168.1.69:29017'}] }
rs.initiate(config)
- 进行分片集配置
/opt/mongodb/bin/mongo --port 30000 << EOF use admin db.runCommand({addshard:"r4/192.168.1.69:29017"}); use adbox use fbbox use admin db.runCommand({ enablesharding:"adbox" }); db.runCommand({ enablesharding:"fbbox" }); exit EOF
/opt/mongodb/bin/mongo --port 30000 << EOF use adbox db.createUser( { "user":"dev","pwd":"dev","roles" : [ { role: "dbOwner", db: "adbox" },{ role: "dbOwner", db: "fbbox" },{ role: "root", db: "admin" }] }) db.auth("dev","dev") use fbbox db.createUser( { "user":"dev","pwd": "dev","roles" : [ { role:"dbOwner", db: "adbox" },{ role: "dbOwner", db: "fbbox" },{ role: "root", db: "admin" }] }) db.auth("dev","dev") use admin db.createUser( { "user" : "admin","pwd": "admin","roles" : [ { role: "dbOwner", db: "adbox" },{ role: "dbOwner", db: "fbbox" },{ role: "root", db: "admin" }] }) db.auth("admin","admin") exit EOF
- 执行php56 /var/www/core/tool/toolinit.php
- 打开网页确认是否成功
使用第五部分建立单节点,进行转集群操作
第七部分:单节点转集群
猜想:现在有两种单节点的建立方法
- 单节点单实例方式,上面的第六部分
- 单节点多实例方式,上面的第五部分
对于A情况,将单节点转成集群,需要再添加2个节点,即可形成一个具有仲裁功能的集群
对于B情况,将单节点转成集群,需要再添加4个节点,因为mongo的仲裁需要有过半的节点存在,当多实例节点挂掉以后,还要推举出新节点,就需要4个存活的节点存在,才能形成一个具有仲裁功能的集群
验证A:
- 按照第六部分的操作步骤,现在一个节点上建立单机实例
- 新添加两个节点(不启动路由进程),由于是单节点拓展,所以1中的节点就是主节点,在主节点中添加两个节点
r4:PRIMARY> rs.add("192.168.1.65:29017")
{ "ok" : 1 }
r4:PRIMARY> rs.add("192.168.1.66:29017")
{ "ok" : 1 }
查看集群状态,等待节点变成从节点状态
- 新节点启动路由进程,添加路由
其实这里不需要添加路由,使用副本集和分片集一条命令启动的方式,添加了新的副本之后,自然就会在路由中添加,只需要等待即可
具体原因未知。
- 到这一步,通过第七部分的2操作,确定副本集生效,每一台节点的表内都有同样的数据内容
- 等待新添加的节点变为从节点(此过程很漫长,数据越多时间越久)
- 在主节点上kill掉mongos,重启mongos,将指向的配置ip由一个变为三个
- 使用mongodump备份主节点的配置
- 新增从节点启动配置服务,不启动路由
- 在主节点将备份的配置数据导入两个从节点
- 两个从节点启动带3ip的路由服务
- 这是会遇到第七部分第4个问题,解决即可
- 单机转集群完毕
第七部分:问题解决
- 当路由由1个ip改为3个ip时,会报ERROR: child process failed, exited with error number 5的错误,需做如下修改:
解决方法:
则需要将集群的配置导入到新节点中,路由会成功启动
function sync_config_from_master(){ #这两步要在添加的新节点上执行,同步配置 /opt/mongodb/bin/mongodump --host ${localip}:20001 -d config -o /tmp/config /opt/mongodb/bin/mongorestore --host ${add_ip}:20001 -d config /tmp/config/config }
Localip为集群内某一节点的ip,add_ip为新添加的节点ip
之后重启路由即可。
- 查看副本集是否生效
Show dbs Use dbname Show collections Db.coll.stats()
sharded字段为true表示可分片。
插入数据到集合
for (i=1;i<=10000;i++) db.haha.insert({name: "user"+i, age: (i%150)})
查看集合内数据数量
db.haha.count()
- 解决php56 /var/www/core/tool/toolinit.php运行失败,网页500错误
原因:php初始化失败-》mongodb配置错误-》修改配置toolinit.php文件
参考:
https://www.cnblogs.com/cswuyg/p/4355948.html?utm_source=tuicool
网址中的第22条
4. 在配置文件恢复之后,会报如下错误
caused by :: mongos specified a different config database string : stored
解决方法:重启mongod服务即可,三台机器全部重启
5. 当节点报mongos specified a different config 并且报could not find member to sync from时,可以查看一下连接路由的ip是不是127.0.0.1,需要换成本地ip才行
如果做完上述操作,还是不能使用,报could not find member to sync from,则去检查mongo数据库的权限,确保数据库的文件夹的权限时mongo,文件夹内的权限为777权限。
如果都没有问题,这个可能等一会会好。
总结:
到此,我们的需求,建立单节点,和单节点转集群均都实现,然后集群的水平拓展也已实现,这样一个完整的链就形成了闭环。
在完成过程中,遇到了大量的问题,其实答案在我们查找资料时已经很早的反复出现,但是我们不懂其原理,没有将一句文字与实际问题关联起来,导致解决问题缓慢,磕磕绊绊。
解决问题的时候要多查看日志,尤其的开源的大型软件,然后结合网上查找资料,基本所有问题都可以解决。
如果大家看的不清楚,格式很别扭,可以去看我的笔记,链接
文档:mongodb实战--单节点转集群.note
链接:http://note.youdao.com/noteshare?id=f4211194a2ea8795f2b3bd2fbc243500&sub=1BC3976639F84234AB5ED9E3FD020323