mongo 集群(副本)搭建过程记录

最近搭建mongo集群,回忆总结,作以记录。
整个过程主要参考以下两篇文章,但是过程并不顺利,有些问题需要记录。
https://www.cnblogs.com/dba-devops/p/7130710.html
https://blog.csdn.net/thinktik/article/details/82118190

选择一台服务器,进行如下操作,最后再用scp命令复制到其他服务器,方便迅速。
我选择的二进制包的安装方式,先把tgz包上传到linux,然后解压。
然后创建文件夹data、logs、etc,分别用于存放mongo的数据、日志、配置文件。
logs目录下新建文件 touch mongo.log
etc目录下新建文件 mongo.conf

编辑vi mongo.conf
填写一下配置:

dbpath = /usr/mongodb/data
logpath = /usr/mongodb/logs/mongo.log
logappend = true
journal = true
quiet = true
port = 27017
bind_ip = 0.0.0.0  # 改为0.0.0.0监听所有ip的访问
fork=true
#副本集名称
replSet=tcl

由于第一次配置,不知道都要 配置写什么,参考了许多文文章,最终我的配置如上。其它文章中的一些配置最后导致mongo无法启动,具体报错就是说,配置中的 某个关键字 无法识别云云。具体环境具体对待吧。具体的话就要涉及到mongo配置只是的学习了。上述最基本的数据路径、日志路径、追加方式、端口、是否后台运行 等。

为了方便,吧mongo的环境变量配置一下,

#java
export JAVA_HOME=/usr/java/jdk1.8.0_181-cloudera
export CLASSPATH=.:$CLASSPATH:$JAVA_HOME/lib
export PATH=$PATH:$JAVA_HOME/bin
export PATH=$PATH:/usr/mongodb/detailFileMongoDBv4.0/:/usr/mongodb/detailFileMongoDBv4.0/bin

碰到一个问题,就是突然发现linux的各种命令失效了,提示 command not found。
原因就是环境变量写的有问题,导致系统环境变量失效。具体解决方案很多文章都有介绍,很容容易搜到。不再赘述。

使用scp命令拷贝mongo文件到其他服务器,并修改环境变量。
启动mongo服务器。到mongo文件目录下的bin目录下;
./mongod -f /usr/mongodb/etc/mongo.conf
-f 指定要使用的配置文件(就是上面自己配置的mongo.conf),启动mongo。

启动成功后可以使用ps查看状态
[root@master01 bin]# ps -ef|grep mongodb
root 7588 28412 0 09:54 pts/0 00:00:00 grep --color=auto mongodb
root 17932 1 0 Aug30 ? 00:18:02 ./mongod -f /usr/mongodb/etc/mongo.conf


接下来,我按照文章中步骤,准备往mongo中写入数据:

命令:mongo 进入mongo服务器,
1、创建副本集配置
config= {
    "_id" : "tcl",
    "members" : [
      {
        "_id" : 0,
        "host" : "xxx.xx.xx.xx:27017"
      },
      {
        "_id" : 1,
        "host" : "xxx.xx.xx.xx:27017"
      },
      {
        "_id" : 2,
        "host" : "xxx.xx.xx.xx:27017"
      }
    ]  
  }

2、 初始化副本集
> rs.initiate(config)
这一步,出现 "ok" : 1, ,表示成功,失败的话会有errormsg提示。成功表示副本集设置成功。
3、当前这台mongo是从机,我们可以再手动设置它为主机
tcl:SECONDARY> rs.isMaster()
4、查看副本集状态
tcl:PRIMARY> rs.status()

5、验证同步功能
# 主库建一个库和表并插入一条数据
tcl:PRIMARY> use testdb;
switched to db testdb
tcl:PRIMARY> db.synctable.insert({name:"验证"});
但是我这边执行失败了。提示异常 can't create user databases on a --configsvr instance"
具体原因也没搞明白,【有知道的小伙伴欢迎指正】加上mongo.conf当时一直在修改,所以决定终止mongo进程再重启。

接下来蛋疼的事情出现了,我想关闭mongo服务,但是由于对mongo并不了解,没有足够重视,直接老样子 kill -9 。这下坏了,mongo再也起不来了。一启动就报错:
couldn't connect to server 127.0.0.1:27017 src/mongo/shell/mongo.js:91
然后就搜索mongo异常关闭的处理办法,这个过程中才发现意识到,mongo不能kill -9 的重要性。

网上的办法大多都是删除data下的mongod.lock文件,还有重新指定数据目录的方式启动:
./mongod --dbpath=/usr/local/mongodb/data/db/ ,
这种方式的确能启动,但是当前窗口已关闭,一切照旧老样子,这肯定不行。
这篇文章中涵盖了上述办法:用作详细参考:https://blog.csdn.net/wangli61289/article/details/44459467

首先,data下的mongod.lock文件,肯定是要先删除掉的。然后,修复启动,指定配置文件的方式秀启动 :
./mongod -f /usr/mongodb/etc/mongo.conf --repair

如果不指定配置文件 修复启动,就会出现如下异常:mongo默认为数据目录在/mongo/data,所以找不到这个目录,报错。
'exception in initAndListen: NonExistentPath: Data directory /data/db not found., terminating'

还有,mongo的关闭,一定要先切换到admin库,再关闭。https://www.cnblogs.com/gaopeng527/p/5117188.html
> use admin;
switched to db admin
> db.shutdownServer();
Wed Nov 14 06:07:33 DBClientCursor::init call() failed
Wed Nov 14 06:07:33 query failed : admin.$cmd { shutdown: 1.0 } to: 127.0.0.1:27017
server should be down...
Wed Nov 14 06:07:33 trying reconnect to 127.0.0.1:27017
Wed Nov 14 06:07:33 reconnect 127.0.0.1:27017 failed couldnt connect to server 127.0.0.1:27017。

继续测试数据同步,在主库写入数据:【摘抄自https://blog.csdn.net/thinktik/article/details/82118190】

# 主库建一个库和表并插入一条数据
tcl:PRIMARY> use testdb;
switched to db testdb
tcl:PRIMARY> db.synctable.insert({name:"验证"});
WriteResult({ "nInserted" : 1 })


# 进入从库

# 报错,正常。因为SECONDARY是不允许读写的,可以执行rs.slaveOk();解除
tcl:SECONDARY>
tcl:SECONDARY> show dbs;
2018-08-27T14:13:17.963+0800 E QUERY [js] Error: listDatabases failed:{
  "operationTime" : Timestamp(1535350391, 1),
  "ok" : 0,
  "errmsg" : "not master and slaveOk=false",
  "code" : 13435,
  "codeName" : "NotMasterNoSlaveOk",
  "$clusterTime" : {
    "clusterTime" : Timestamp(1535350391, 1),
    "signature" : {
      "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
      "keyId" : NumberLong(0)
    }
  }
} :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
Mongo.prototype.getDBs@src/mongo/shell/mongo.js:67:1
shellHelper.show@src/mongo/shell/utils.js:876:19
shellHelper@src/mongo/shell/utils.js:766:15
@(shellhelp2):1:1


# 解除限制
tcl:SECONDARY> rs.slaveOk();
tcl:SECONDARY> show dbs;
admin 0.000GB
config 0.000GB
local 0.000GB
testdb 0.000GB
tcl:SECONDARY> use testdb;
switched to db testdb
tcl:SECONDARY> db.synctable.find();
{ "_id" : ObjectId("5b8395ae80365b296a69ddc0"), "name" : "验证" }

猜你喜欢

转载自www.cnblogs.com/dxxdsw/p/11445931.html