1. 传统Mongodb架构和华为云Mongodb

2. MongoDB中集群有三种:主从复制、副本集、分片集群

3. 水平拓展或者横向拓展:就是在已有的集群上再增加节点到集群内

4. 深度拓展或者纵向拓展:就是在单台机器上增加硬件的配置,以提升性能

5. 项目完成步骤

(1) 先使用install.bin在三台机器上部署一个集群

(2) 在第四台机器上手动执行命令,将这台机器加入到已有集群中

① Xxx

② Xxx

(3) 将手动命令写成脚本

(4) 验证测试

6. 问题分析

想在我们有如下三个mongodb进程,启动存储服务,三节点是没有任何问题的,每一台节点都启用这样三个一模一样的服务,目的是为了实现高可用,有宕机的情况下都能使用,因为每一台中都包含了路由,配置,存储的服务。

root      1242     1  0 09:54 ?        00:00:03 /opt/mongodb/bin/mongos --configdb 192.168.1.66:20001,192.168.1.65:20001,192.168.1.67:20001 --port 30000 --chunkSize 200 --logpath /data/mongos.log --logappend --fork root      1259     1  3 09:54 ?        00:00:44 /opt/mongodb/bin/mongod --shardsvr --replSet r4 --port 29017 --dbpath /data/r4 --logpath /data/r4/r4.log --logappend --nssize 64 --oplogSize 10240 --maxConns 1000 --fork root      1394     1  0 09:55 ?        00:00:07 /opt/mongodb/bin/mongod --configsvr --dbpath /data/config --port 20001 --logpath /data/config/config.log --logappend --fork

 

下载我们想要增加一台节点(横向拓展),如下操作:在主节点中,rs.add(“ip:port”),然后等待数据同步,这样一台节点就被加入到了集群里面,通过rs.status()或者sh.status()都可以看到,新添加的节点既加入了配置中,也加入了路由中,但是,当我们重新启动路由进程,将新的ip添加到--configdb选项中的时候,发现mongos程序无法启动。

 

#1
单个每一台起自己的mongos服务是能够起来的
/opt/mongodb/bin/mongos --port 30000 --configdb 192.168.1.66:20001 --chunkSize 200 --logpath /data/mongos.log --logappend --fork
 
#2
添加路由在前面加集群名
sh.addShard ( “ rs1 / mongodb0.example.net:27017”  )

 

现在做几个方向的猜想验证:

1. 新增加节点以后,路由启动还是原来的启动方式,不添加新的配置ip,然后往数据库中插入数据,查看是否数据进行了分片,有没有插入到新的节点中数据

2. 弄清楚配置服务器是怎样原理配置,新增加的节点,配置服务器需要修改哪些东西,添加分片需要修改配置服务器,然后才能在路由中添加

3. 浏览网上的做法多是:

(1) 多台分片服务器,一台单独的配置服务器(配置服务器和路由放在同一台服务上),

(2) 多台分片服务器,一台单独的配置服务器,多台路由,和分片服务器同等数量同机启动

现在我们自己的做法是:

多台分片服务器,同等数量配置服务器,同等数量的路由,将三个进程在一台机器上全部起来,每一台都是同样的操作

初步怀疑,我们这样的做法可能不对,待验证。

4. 怀疑是mongo只能启动带有三个IP的路由,三个ip是任意组合的,只要数量为3就可以

5. 验证一次配置初始化4台节点,能不能启动路由,是不是只能添加3台ip(佐证猜想4)

 

Mongo版本:3.2.22

7. 实验一------验证猜想1

环境:4台机器,1.65,1.66,1.67,1.69

1. 在主节点1.69,fbbox数据库下插入100条数据,去其他三个从节点查看数据,全部为100条的数据记录

>for(i=0;i<100;i++){ db.user.insert({"_id":i,"Name":"darren","Age":20,"Date":new Date()}); }

>db.user.count()

100

结论:

A. 使用rs.add()添加的节点成功,数据可以实现副本备份,

B. 新添加的节点参与了节点推主的选举,并且成功成为主节点

C. 即使在启动路由mongos时,没有将新添加的ip包含在内,其功能依然具备

D. 我们现在使用的集群模式只是主从的副本集,并不具备数据分片存储功能,并且mongod的启动命令参数存在问题,导致错误判断。

 

8. 实验二------验证猜想4,5

环境:4台机器,1.65,1.66,1.67,1.69

1. 初始化四台节点ip,启动路由时使用四个ip,启动失败

2. 初始化四台节点ip,任意路由使用三个IP,成功启动

结论:

A. 可能只能使用三个ip启动路由

B. 在网上找到一段标记,正是说的路由只能有1个或者3个


 

 

 

9. Mongo副本集配置


10. Mongo分片集配置


11. 副本集与分片结合


12. 路由-配置-副本集


 

 

13. 解决方案

问题原因:通过实验1与实验2的验证,和查找资料9,10,11,12的了解,路由的ip只有1个或者3个,多了就会报错。根据这个情况,先提供以下解决方案

解决方案:写一个脚本去检测路由使用的三个节点ip,当其中的主节点挂掉之后,将主节点重新加入路由,重启路由服务即可(因为任意三个已存在节点是可以启动的),这样就实现了动态横向拓展的目的。

 

14. 新添加的节点路由启动失败

(1) 查看mongos.log文件,发现有超时提示,所以对集群的所有机器进行时间同步(根据提示可知,节点之间时间差在30s时就会导致路由启动失败)

(2) 查看mongos.log文件,发现有提示新节点的配置和集群不一样,则需要将集群的配置导入到新节点中,路由会成功启动

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

 

15. 新添加的节点未加入集群中

(1) 查看selinux是否关闭

(2) 查看防火墙是否关闭,

错误提示如下图

 

 

 

16. 如果集群节点一直处于STARTUP,查看mongo.log得知如下错误提示

 

 

 

根据错误提示解决:

 

17. 如出现如下情况

 

 

a. 请检查是否在集群的启动过程中,没有启动存储,和配置进程,并且其他的两台节点也没有启动,直接在一台上启动三个配置路由无法启动

b. 做集群,如果其他两台都已经启动,路由也已经启动,之后,只剩一台了,那么起3个ip配置的路由还是能起来的

 

 

如果大家看的不清楚,格式很别扭,可以去看我的笔记,链接

文档:mongodb实战--水平拓展实验.note
链接:http://note.youdao.com/noteshare?id=aa35bfab6e7b8377e4c1f1ccf818b248&sub=095BB36620584D55A3DE21704D4DEE87

 

 

 

 

 

 

 

 

 

 

Mongodb基础语法知识:

SQL术语/概念

MongoDB术语/概念

解释/说明

database

database

数据库

table

collection

数据库表/集合

row

document

数据记录行/文档

column

field

数据字段/域

index

index

索引

table joins

 

表连接,MongoDB不支持

primary key

primary key

主键,MongoDB自动将_id字段设置为主键

 

1. 查看数据库列表

>show dbs

2. 查看集合

>show collections

3. 如果想知道当前数据库下的表或者表collection支持哪些方法,可以使用一下命令如:

>db.suer.help();  user为表名

4.