天天看点

mongodb实战--单节点转集群

环境:

Mongo版本:3.2.22

Cnegtos6.5

第一部分:当前单节点情况分析

当前的单机,是使用常规的mongodb启动方法,与集群版数据库,端口等都不一致,数据库是导入的,没有办法做到拓展。

需要将当前节点重新搭建,使其数据库,和使用端口同集群的一致,方便单机向集群的拓展。

经过网上资料查询,发现单机节点的搭建有3种形式:

  1. 在单机上启动一个mongo实例(现在我们使用)

参考:https://www.cnblogs.com/shanshen/p/8807631.html

  1. 在单机上以副本集的方式启动一个mongo实例(将选用这一种方式建立单节点)

参考:https://blog.csdn.net/zongzhankui/article/details/78670042

  1. 在单机上开多个端口和目录,直接组成一个集群在单机上运行

根据我的项目需求,决定使用第二种,方便进行拓展。

第二部分:建立单节点(以副本集的形式存在的单节点)

  1. 安装mongo软件
  2. 创建所需的目录,文件
  3. 编辑配置文件
  4. 启动mongo实例
  1. /opt/mongodb/bin/mongod --shardsvr --replSet r4 --port 29017 --dbpath /data/r4 --logpath /data/r4/r4.log --logappend --nssize 64 --oplogSize 10240 --fork
  2. 修改hostname:

Vim /etc/hosts

改为

修改完重启

  1. 副本集初始化

rs.initiate()

因为是单节点的副本集,所以上来就是主节点了。

  1. 创建数据库
  2. 验证单节点

第三部分:建立单节点(以分片集群的形式存在的单节点---使用配置文件启动方式)

参考: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

第五部分:建立单节点(以副本集群的形式存在的单节点---多个进程的副本,与单个进程区别)

  1. 分别建立三个目录r2,r3,r4

mkdir r2 r3 r4

  1. 按照如下命令启动,注意副本集的名字不变,但是日志目录和数据存放目录要发生相应的变化

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

  1. 启动之后进行副本集配置

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)

  1. 路由配置

use admin db.runCommand({addshard:"r4/192.168.1.69:29017,192.168.1.69:29018,192.168.1.69:29019"});

  1. 数据库配置

分片,数据库配置参考init_mongodb_gluster.sh和data.sh脚本

第六部分:建立单节点(以副本集+分片集的形式存在的单节点---单个实例进程的副本,注意与第二部分的单个进程区别)

  1. 按照如下命令启动

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

  1. 进行副本集配置

config={_id:'r4',members:[{_id:0,host:'192.168.1.69:29017'}] }

rs.initiate(config)

  1. 进行分片集配置

/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

  1. 执行php56 /var/www/core/tool/toolinit.php
  2. 打开网页确认是否成功

使用第五部分建立单节点,进行转集群操作

第七部分:单节点转集群

猜想:现在有两种单节点的建立方法

  1. 单节点单实例方式,上面的第六部分
  2. 单节点多实例方式,上面的第五部分

对于A情况,将单节点转成集群,需要再添加2个节点,即可形成一个具有仲裁功能的集群

对于B情况,将单节点转成集群,需要再添加4个节点,因为mongo的仲裁需要有过半的节点存在,当多实例节点挂掉以后,还要推举出新节点,就需要4个存活的节点存在,才能形成一个具有仲裁功能的集群

验证A:

  1. 按照第六部分的操作步骤,现在一个节点上建立单机实例
  2. 新添加两个节点(不启动路由进程),由于是单节点拓展,所以1中的节点就是主节点,在主节点中添加两个节点

r4:PRIMARY> rs.add("192.168.1.65:29017")

{ "ok" : 1 }

r4:PRIMARY> rs.add("192.168.1.66:29017")

{ "ok" : 1 }

查看集群状态,等待节点变成从节点状态

  1. 新节点启动路由进程,添加路由

其实这里不需要添加路由,使用副本集和分片集一条命令启动的方式,添加了新的副本之后,自然就会在路由中添加,只需要等待即可

具体原因未知。

  1. 到这一步,通过第七部分的2操作,确定副本集生效,每一台节点的表内都有同样的数据内容
  2. 等待新添加的节点变为从节点(此过程很漫长,数据越多时间越久)
  3. 在主节点上kill掉mongos,重启mongos,将指向的配置ip由一个变为三个
  4. 使用mongodump备份主节点的配置
  5. 新增从节点启动配置服务,不启动路由
  6. 在主节点将备份的配置数据导入两个从节点
  7. 两个从节点启动带3ip的路由服务
  8. 这是会遇到第七部分第4个问题,解决即可
  9. 单机转集群完毕

第七部分:问题解决

  1. 当路由由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

之后重启路由即可。

  1. 查看副本集是否生效

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()

  1. 解决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

继续阅读