搭建高可用MongoDB集群

MongoDB 2018-06-16

1、MongoDB简介

  MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。
  MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。

2、MongoDB架构

MongoDB架构1

MongoDB架构2

3、架构搭好了,安装软件!

  • 3.1、MongoDB集群节点分布

    192.168.253.100 mongodb01
    192.168.253.101 mongodb02
    192.168.253.102 mongodb03
  • 3.2、分别在每台机器上建立mongodb分片对应测试文件夹。

    #存放mongodb数据文件
    mkdir -p /home/csvctest/servers/mongodbtest
    #进入mongodb文件夹
    cd  /home/csvctest/servers/mongodbtest
  • 3.3、下载mongodb的安装程序包

    wget http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-2.4.8.tgz
    #解压下载的压缩包
    tar -zxvf mongodb-linux-x86_64-2.4.8.tgz
  • 3.4、分别在每台机器建立mongos 、config 、 shard1 、shard2、shard3 五个目录。因为mongos不存储数据,只需要建立日志文件目录即可。

    #建立mongos目录
    mkdir -p /home/csvctest/servers/mongodbtest/mongos/log
    
    #建立config server 数据文件存放目录
    mkdir -p /home/csvctest/servers/mongodbtest/config/data
    
    #建立config server 日志文件存放目录
    mkdir -p /home/csvctest/servers/mongodbtest/config/log
    
    #建立shard1 数据文件存放目录
    mkdir -p /home/csvctest/servers/mongodbtest/shard1/data
    
    #建立shard1 日志文件存放目录
    mkdir -p /home/csvctest/servers/mongodbtest/shard1/log
    
    #建立shard2 数据文件存放目录
    mkdir -p /home/csvctest/servers/mongodbtest/shard2/data
    
    #建立shard2 日志文件存放目录
    mkdir -p /home/csvctest/servers/mongodbtest/shard2/log
    
    #建立shard3 数据文件存放目录
    mkdir -p /home/csvctest/servers/mongodbtest/shard3/data
    
    #建立shard3 日志文件存放目录
    mkdir -p /home/csvctest/servers/mongodbtest/shard3/log
  • 3.5、规划5个组件对应的端口号,由于一个机器需要同时部署 mongos、config server 、shard1、shard2、shard3,所以需要用端口进行区分。

    mongos : 20000
    config server : 21000
    shard1 : 22001
    shard2 : 22002
    shard3 : 22003.
  • 3.6、在每一台服务器分别启动配置服务器。

    # 在每一台服务器分别启动配置服务器
    /home/csvctest/servers/mongodbtest/mongodb-linux-x86_64-3.4.18/bin/mongod --configsvr --replSet cfgReplSet  --dbpath config/data --port 21000 --logpath config/log/config.log --fork
    
    # 配置config server为replica set。
    # 连接到任意一台config server:
    mongodb-linux-x86_64-3.4.18/bin/mongo --host 192.168.253.100 --port 21000
    
    rs.initiate({_id:"cfgReplSet",configsvr:true,members:[{_id:0,host:"192.168.253.100:21000"},{_id:1,host:"192.168.253.101:21000"},{_id:2,host:"192.168.253.102:21000"}]})
  • 3.7、在每一台服务器分别启动mongos服务器。

    /home/csvctest/servers/mongodbtest/mongodb-linux-x86_64-3.4.18/bin/mongos  --configdb cfgReplSet/192.168.253.100:21000,192.168.253.101:21000,192.168.253.102:21000  --port 20000   --logpath  mongos/log/mongos.log --fork
  • 3.8、配置各个分片的副本集。

    # 在每个机器里分别设置分片1服务器及副本集shard1
    /home/csvctest/servers/mongodbtest/mongodb-linux-x86_64-3.4.18/bin/mongod --shardsvr --replSet shard1ReplSet --port 22001 --dbpath shard1/data  --logpath shard1/log/shard1.log --fork --nojournal  --oplogSize 10
    
    # 为了快速启动并节约测试环境存储空间,这里加上 nojournal 是为了关闭日志信息,在我们的测试环境不需要初始化这么大的redo日志。同样设置 oplogsize是为了降低 local 文件的大小,oplog是一个固定长度的 capped collection,它存在于”local”数据库中,用于记录Replica Sets操作日志。注意,这里的设置是为了测试!
    
    # 在每个机器里分别设置分片2服务器及副本集shard2
    /home/csvctest/servers/mongodbtest/mongodb-linux-x86_64-3.4.18/bin/mongod --shardsvr --replSet shard2ReplSet --port 22002 --dbpath shard2/data  --logpath shard2/log/shard2.log --fork --nojournal  --oplogSize 10
    
    # 在每个机器里分别设置分片3服务器及副本集shard3
    /home/csvctest/servers/mongodbtest/mongodb-linux-x86_64-3.4.18/bin/mongod --shardsvr --replSet shard3ReplSet --port 22003 --dbpath shard3/data  --logpath shard3/log/shard3.log --fork --nojournal  --oplogSize 10
    
    # 任意登陆一个机器,比如登陆192.168.253.100,连接mongodb
    
    # 设置第一个分片副本集
    mongodb-linux-x86_64-3.4.18/bin/mongo  192.168.253.100:22001
    
    # 使用admin数据库
    use admin
    
    #定义副本集配置
    config = { _id:"shard1ReplSet", members:[
                        {_id:0,host:"192.168.253.100:22001"},
                        {_id:1,host:"192.168.253.101:22001"},
                        {_id:2,host:"192.168.253.102:22001",arbiterOnly:true}
                   ]
            }
    
    # 初始化副本集配置
    rs.initiate(config);
    
    # 设置第二个分片副本集
    mongodb-linux-x86_64-3.4.18/bin/mongo  192.168.253.100:22002
    
    # 使用admin数据库
    use admin
    
    # 定义副本集配置
    config = { _id:"shard2ReplSet", members:[
                        {_id:0,host:"192.168.253.100:22002",arbiterOnly:true},
                        {_id:1,host:"192.168.253.101:22002"},
                        {_id:2,host:"192.168.253.102:22002"}
                   ]
            }
    
    # 初始化副本集配置
    rs.initiate(config);
    
    # 设置第三个分片副本集
    mongodb-linux-x86_64-3.4.18/bin/mongo  192.168.253.102:22003
    
    # 使用admin数据库
    use admin
    
    # 定义副本集配置
    config = { _id:"shard3ReplSet", members:[
                        {_id:0,host:"192.168.253.102:22003"},
                        {_id:1,host:"192.168.253.101:22003",arbiterOnly:true},
                        {_id:2,host:"192.168.253.100:22003"}
                   ]
            }
    
    # 初始化副本集配置
    rs.initiate(config);
  • 3.9、目前搭建了mongodb配置服务器、路由服务器,各个分片服务器,不过应用程序连接到 mongos 路由服务器并不能使用分片机制,还需要在程序里设置分片配置,让分片生效。

    # 连接到mongos
    mongodb-linux-x86_64-3.4.18/bin/mongo  192.168.253.100:20000
    
    # 使用admin数据库
    use  admin
    
    # 串联路由服务器与分配副本集1
    db.runCommand( { addshard : "shard1ReplSet/192.168.253.100:22001,192.168.253.101:22001,192.168.253.102:22001"});
    
    # 如里shard是单台服务器,用 db.runCommand( { addshard : “[: ]” } )这样的命令加入,如果shard是副本集,用db.runCommand( { addshard : “replicaSetName/[:port][,serverhostname2[:port],…]” });这样的格式表示 。
    
    # 串联路由服务器与分配副本集2
    db.runCommand( { addshard : "shard2ReplSet/192.168.253.100:22002,192.168.253.101:22002,192.168.253.102:22002"});
    
    # 串联路由服务器与分配副本集3
    db.runCommand( { addshard : "shard3ReplSet/192.168.253.100:22003,192.168.253.101:22003,192.168.253.102:22003"});
    
    # 查看分片服务器的配置
    db.runCommand( { listshards : 1 } );
  • 3.10、目前配置服务、路由服务、分片服务、副本集服务都已经串联起来了,但我们的目的是希望插入数据,数据能够自动分片,就差那么一点点,一点点。。。
    连接在mongos上,准备让指定的数据库、指定的集合分片生效。

    # 指定testdb分片生效
    db.runCommand( { enablesharding :"testdb"});
    
    # 指定数据库里需要分片的集合和片键
    db.runCommand( { shardcollection : "testdb.table1",key : {id: "hashed" } } )
    # 我们设置testdb的 table1 表需要分片,根据 id 自动分片到 shard1 ,shard2,shard3 上面去。要这样设置是因为不是所有mongodb 的数据库和表 都需要分片!
    
  • 3.11、测试分片配置结果。

    # 连接mongos服务器
    mongodb-linux-x86_64-3.4.18/bin/mongo  192.168.253.100:20000
    
    # 使用testdb
    use  testdb;
    
    # 插入测试数据
    for (var i = 1; i <= 1000; i++) db.table1.save({id:i,"test1":"testval1"});
    
    # 查看分片情况如下,部分无关信息省掉了
    db.table1.stats();
    
    {
           "sharded" : true,
           "ns" : "testdb.table1",
           "count" : 100000,
           "numExtents" : 13,
           "size" : 5600000,
           "storageSize" : 22372352,
           "totalIndexSize" : 6213760,
           "indexSizes" : {
                   "_id_" : 3335808,
                   "id_1" : 2877952
           },
           "avgObjSize" : 56,
           "nindexes" : 2,
           "nchunks" : 3,
           "shards" : {
                   "shard1" : {
                           "ns" : "testdb.table1",
                           "count" : 42183,
                           "size" : 0,
                           ...
                           "ok" : 1
                   },
                   "shard2" : {
                           "ns" : "testdb.table1",
                           "count" : 38937,
                           "size" : 2180472,
                           ...
                           "ok" : 1
                   },
                   "shard3" : {
                           "ns" : "testdb.table1",
                           "count" :18880,
                           "size" : 3419528,
                           ...
                           "ok" : 1
                   }
           },
           "ok" : 1
    }
    # 可以看到数据分到3个分片,各自分片数量为: shard1 “count” : 42183,shard2 “count” : 38937,shard3 “count” : 18880。已经成功了!不过分的好像不是很均匀,所以这个分片还是很有讲究的,后续再深入讨论。

文章转自:搭建高可用mongodb集群(一)—— 分片

文章转自:搭建高可用mongodb集群(二)—— 分片

文章转自:搭建高可用mongodb集群(三)—— 分片

文章转自:搭建高可用mongodb集群(四)—— 分片


每一个成功的背后都有无数个无人知晓的黑夜。

因为

夜晚,是超越对手的最佳时机。

===================== 码农1024 =====================#蔺光岭#


本文由 蔺光岭 创作,采用 知识共享署名 4.0,可自由转载、引用,但需署名作者且注明文章出处。

还不快抢沙发

添加新评论