MongoDB环境搭建

来源:互联网 发布:redis做数据库 编辑:程序博客网 时间:2024/05/21 22:23

MongoDB环境搭建

实验目的

为5台主机搭建MangoDB环境。
实验原理就不再赘述了,课上都讲过,网上博客也都不错。

实验步骤:

0x01硬件条件:

5台centos7主机,IP地址:x.x.x.46~50。机器的名称分别为lk,node1,node2,node3,node4(后来时间紧,任务重,就稍微缩水一下,只配了lk,node1,node2)。
实验条件默认使用root账户,有需要切回普通用户的情况我会提到。

0x02材料准备:

MongoDB安装包:去官网上随便找一个包即可,我是3.0.6的版本

0x03环境搭建:

首先创建目录:

#存放整个mongodb文件mkdir -p /data/mongodbtest/single #存放mongodb数据文件mkdir -p /data/mongodbtest/single/data#进入mongodb文件夹cd  /data/mongodbtest

之后解压缩:tar xvzf mongodb-linux-x86_64-3.0.6.tgz

进入程序执行文件夹:cd mongodb-linux-x86_64-3.0.6/bin/

然后启动单实例mongod:./mongod --dbpath /data/mongodbtest/single/data

反馈信息如下:

MongoDB starting : pid=12632 port=27017 dbpath=/data/mongodbtest/single/data 64-bit host=lk** WARNING: You are running this process as the root user, which is not recommended.** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.** We suggest setting it to 'never'WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.** We suggest setting it to 'never'db version v3.0.6git version: 1ef45a23a4c5e3480ac919b28afcba3c615488f2build info: Linux build6.ny.cbi.10gen.cc 2.6.32-431.3.1.el6.x86_64 #1 SMP Fri Jan 3 21:39:27 UTC 2014 x86_64 BOOST_LIB_VERSION=1_49allocator: tcmallocoptions: { storage: { dbPath: "/data/mongodbtest/single/data" } }waiting for connections on port 27017

然后本机另起一个终端,在相同的目录下执行mongo:./mongo

MongoDB shell version: 3.0.6connecting to: test>

出现以下字样说明已经连接上本机的MongoDB数据库test,然后可以试着执行一些操作如show等等,验证mongodb是否正常工作。

> show dbslocal  0.078GB> 1+23> 

运行结果如下:
这里写图片描述

至此单机环境搭建完毕。

之后开始搭建分片环境:

  • 首先在mongodb外建立文件夹:
分别在lk,node1,node2 三台机器上执行以下命令:#建立mongos及日志目录sudo  mkdir -p /data/mongodbtest/mongos/log#建立config server 数据文件存放目录sudo mkdir -p /data/mongodbtest/config/data#建立config server 日志文件存放目录sudo mkdir -p /data/mongodbtest/config/log#建立shard1 数据文件存放目录sudo mkdir -p /data/mongodbtest/shard1/data#建立shard1 日志文件存放目录sudo mkdir -p /data/mongodbtest/shard1/log#建立shard2 数据文件存放目录sudo mkdir -p /data/mongodbtest/shard2/data#建立shard2 日志文件存放目录sudo mkdir -p /data/mongodbtest/shard2/log#建立shard3 数据文件存放目录sudo mkdir -p /data/mongodbtest/shard3/data#建立shard3 日志文件存放目录sudo mkdir -p /data/mongodbtest/shard3/log
  • 规划5个组件对应的端口号,由于一个机器需要同时部署 mongos、config server 、shard1、shard2、shard3,所以需要用端口进行区分。

    这个端口可以自由定义,在本文 mongos为 20000, config server 为 21000, shard1为 22001 , shard2为22002, shard3为22003.

  • 为了统一管理,我把mongodb主程序放在了/usr/local/mongodb/中。当准备工作都做好之后,分别在lk,node1,node2三台机器上执行下面命令:sudo /usr/local/mongodb/bin/mongod --configsvr --dbpath /data/mongodbtest/config/data --port 21000 --logpath /data/mongodbtest/config/log/config.log —fork

    运行结果如下:
    这里写图片描述

  • 然后连接一下mongodb服务器(任一台):
./mongo --host  lk --port 21000
  • 输入以下语句:
rs.initiate({members:[{_id:0,host:"lk:21000"},                   {_id:1,host:"node1:21000"},                   {_id:2,host:"node2:21000"}]})

结果如图:
这里写图片描述

  • 在每一台服务器分别启动分片及副本集。在每一台服务器分别以副本集方式启动分片,执行以下命令:
./mongod --shardsvr --replSet shard1ReplSet --port 22001 --dbpath /data/mongodbtest/shard1/data --logpath /data/mongodbtest/shard1/log/shard1.log --fork --nojournal./mongod --shardsvr --replSet shard2ReplSet --port 22002 --dbpath /data/mongodbtest/shard2/data --logpath /data/mongodbtest/shard2/log/shard2.log --fork --nojournal./mongod --shardsvr --replSet shard3ReplSet --port 22003 --dbpath /data/mongodbtest/shard3/data --logpath /data/mongodbtest/shard3/log/shard3.log --fork --nojournal

结果如图:
这里写图片描述

  • 找一台机器连接任一台服务器,然后执行以下3条命令:
./mongo --host lk --port 22001 rs.initiate({_id:"shard1ReplSet",          members:[{_id:0,host:"lk:22001"},                   {_id:1,host:"node1:22001"},                   {_id:2,host:"node2:22001"}]})
./mongo --host lk --port 22002  rs.initiate({_id:"shard2ReplSet",          members:[{_id:0,host:"lk:22002"},                   {_id:1,host:"node1:22002"},                   {_id:2,host:"node2:22002"}]})
./mongo --host lk --port 22003  rs.initiate({_id:"shard3ReplSet",          members:[{_id:0,host:"lk:22003"},                   {_id:1,host:"node1:22003"},                   {_id:2,host:"node2:22003"}]})

结果如图:
这里写图片描述

这里写图片描述

这里写图片描述

  • 之后需要选择一台机器作为路由服务:
./mongos  --configdb lk:21000,node1:21000,node2:21000 --port  20000  --logpath  /data/mongodbtest/mongos/log/mongos.log --fork./mongos  --configdb 10.113.10.46:21000,10.113.10.47:21000,10.113.10.48:21000 --port  20000  --logpath  /data/mongodbtest/mongos/log/mongos.log --fork
  • 如果配置过host就用上面的命令,否则需要手动把计算机名替换成ip(下面的命令)
    结果如图:
    这里写图片描述

如果报这样的错:

这里写图片描述

2017-11-19T02:16:55.288+0800 E -        [mongosMain] error upgrading config database to v6 :: caused by :: all config servers must be reachable for initial config database creation :: caused by ::  node1:21000 (10.113.10.47) failed:10276 DBClientBase::findN: transport error: node1:21000 ns: admin.$cmd query: { getlasterror: 1, fsync: 1 } node2:21000 (10.113.10.48) failed:10276 DBClientBase::findN: transport error: node2:21000 ns: admin.$cmd query: { getlasterror: 1, fsync: 1 }

就说明是host没有配,主机找不到其他主机的位置,换成下面的语句就好:

P.S:这里有可能会出问题:
这里写图片描述

只看最后一句话:

2017-11-19T02:06:41.799+0800 E -        [mongosMain] error upgrading config database to v6 :: caused by :: DistributedClockSkewed clock skew of the cluster lk:21000,node1:21000,node2:21000 is too far out of bounds to allow distributed locking.

问题出在几台主机时间差太大,使用date -s+秒表可手动解决。

  • 之后任一台机器连接路由服务
./mongo --host lk --port 20000

如图所示:
这里写图片描述
只要出现了mongos>就说明基本配置成功了
- 之后在当前mongos中执行下面几条命令:

执行以下命令,添加分片到集群sh.addShard("shard1ReplSet/lk:22001,node1:22001,node2:22001")sh.addShard("shard2ReplSet/lk:22002,node1:22002,node2:22002") sh.addShard("shard3ReplSet/lk:22003,node1:22003,node2:22003")

如图所示:
这里写图片描述

  • 之后就可以进行测试了,这里mongos的命令格式与mongodb基本相同,我们主要来测试下分片成果:
  • 首先新建数据库mdb并分片:
sh.enableSharding("mdb")sh.shardCollection("mdb.Log",{id:1})use mdbshow dbs

结果如下图:
这里写图片描述

然后插入10w个数据:

mongos> for(var i=1;i<=100000;i++){... db.Log.save({id:i,"message":"message"+i});... }db.Log.stats();

结果如下:
这里写图片描述

主要看每个分片的count:

"shard1ReplSet" : {            "count" : 99991,}"shard2ReplSet" : {            "count" : 1,}"shard3ReplSet" : {            "count" : 8,}
  • 这个分了还不如不分,肯定是打开方式不对,于是做一下修改:
 db.Log.drop();//删掉上次插入的数据 sh.shardCollection("mdb.Log",{id:"hashed"}) { "collectionsharded" : "mdb.Log", "ok" : 1 }mongos> for(var i=1;i<=100000;i++){... db.Log.save({id:i,"message":"message"+i});... }db.Log.stats();

结果如图:
这里写图片描述

查看每个分片的count:

"shard1ReplSet" : {            "count" : 33755,}"shard2ReplSet" : {            "count" : 33143,}    "shard3ReplSet" : {            "count" : 33102,}

这里分片就正常了,修改在于把id为1改为了hash。
实验到这里环境算是搭成功了,当然可能会在有些地方报错,注意多查看log日志就好,网上相关解答不少。

原创粉丝点击