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.