热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

MongoDB数据库集群分片

Mongodb集群分片一、简介1、MongoDB是一个高性能,开源,无模式的文档型数据库,是当前NoSQL数据库产品中最热门的一种。它在许多场景下可用于替代传统的关系型数据库或键/值存储方式,MongoDB使用C++开发。2、MongoDB是一个介于关系数据库和非关系数据

Mongodb集群分片

一、简介

1、 MongoDB 是一个高性能,开源,无模式的文档型数据库,是当前NoSQL 数据库产品中最热门的一种。它在许多场景下可用于替代传统的关系型数据库或键/值存储方式,MongoDB使用C++开发。

2、 MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json 的bjson 格式,因此可以存储比较复杂的数据类型。MongoDB 最大的特点是他支持的查询语言非    常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查    询的绝大部分功能,而且还支持对数据建立索引。它是一个面向集合的,模式自由的文   档型数据库。

二、部署介绍与部署目的

1、本次部署是在一台服务器上实现,下面用分组来表示,如果在多台上部署只需要修 改ip和端口就可以。

2、部署主要实现的功能是实现分片、复制集,主备可以在宕机之后自动切换,实现高 可用。

分组

服务端口号

第一组

mongod shard1_1:27017

mongod shard1_1:27018

mongod shard1_3:27019

mongod config:20000

mongs:30000

第二组

mongod shard2_1:27020

mongod shard2_2:27021

mongod shard2_3:27022

mongod config:20010

mongs:30010

第三组

mongod shard3_1:27023

mongod shard3_2:27024

mongod shard3_3:27025

mongod config:20020

mongs:30020

三、安装部署

1、创建第一组数据库储存路径

# mkdir -p /data/shard1_1

# mkdir -p /data/shard1_2

# mkdir -p /data/shard1_3

# mkdir -p /data/config

2、开启mongod进程,指定端口、路径、声明这是一个集群的分片、副本集名称;

# ./mongod --shardsvr --replSet shard1 --port 27017 --dbpath /data/shard1_1 --logpath /data/mongodb.log --logappend --fork

# ./mongod --shardsvr --replSet shard1 --port 27018 --dbpath /data/shard1_2 --logpath /data/mongodb.log --logappend --fork

# ./mongod --shardsvr --replSet shard1 --port 27019 --dbpath /data/shard1_3 --logpath /data/mongodb.log --logappend --fork

3、 创建第二组数据储存路径

# mkdir -p /data/shard2_1

# mkdir -p /data/shard2_2

# mkdir -p /data/shard2_3

# mkdir -p /data/config_1

4、开启mongod进程,指定端口、路径、声明这是一个集群的分片、副本集名称;

# ./mongod --shardsvr --replSet shard2 --port 27020 --dbpath /data/shard2_1 --logpath /data/mongodb.log --logappend --fork

# ./mongod --shardsvr --replSet shard2 --port 27021 --dbpath /data/shard2_2 --logpath /data/mongodb.log --logappend --fork

# ./mongod --shardsvr --replSet shard2 --port 27022 --dbpath /data/shard2_3 --logpath /data/mongodb.log --logappend ?fork

5、 创建第二组数据储存路径

# mkdir -p /data/shard3_1

# mkdir -p /data/shard3_2

# mkdir -p /data/shard3_3

# mkdir -p /data/config_2

6、 开启mongod进程,指定端口、路径、声明这是一个集群的分片、副本集名称;

# ./mongod --shardsvr --replSet shard3 --port 27023 --dbpath /data/shard3_1 --logpath /data/mongodb.log --logappend --fork

# ./mongod --shardsvr --replSet shard3 --port 27024 --dbpath /data/shard3_2 --logpath /data/mongodb.log --logappend --fork

# ./mongod --shardsvr --replSet shard3 --port 27025 --dbpath /data/shard3_3 --logpath /data/mongodb.log --logappend --fork

7、第一组;进入数据库定义config server组;

[root@test1 bin]# ./mongo --port 27017 MongoDB shell version: 2.0.0

connecting to: 127.0.0.1:27017/test

> cOnfig= {_id: 'shard1', members: [

... ... {_id: 0, host: '127.0.0.1:27017'},

... ... {_id: 1, host: '127.0.0.1:27018'},

... ... {_id: 2, host: '127.0.0.1:27019'}]

... ... };

{

        "_id" : "shard1",

        "members" : [

{

"_id" : 0,

"host" : "127.0.0.1:27017"

},

{

                        "_id" : 1,

"host" : "127.0.0.1:27018"

},

{

"_id" : 2,

"host" : "127.0.0.1:27019"

}

        ]

}

> rs.initiate(config)

{

        "info" : "Config now saved locally. Should come online in about a minute.",

        "ok" : 1

}

8、第二组;进入数据库定义config server组;

[root@test1 bin]# ./mongo --port 27020

MongoDB shell version: 2.0.0

connecting to: 127.0.0.1:27020/test

> cOnfig= {_id: 'shard2', members: [

... ... ... {_id: 0, host: '127.0.0.1:27020'},

... ... ... {_id: 1, host: '127.0.0.1:27021'},

... ... ... {_id: 2, host: '127.0.0.1:27022'}]

... ... ... };

{

        "_id" : "shard2",

        "members" : [

{

                        "_id" : 0,

"host" : "127.0.0.1:27020"

},

{

"_id" : 1,

"host" : "127.0.0.1:27021"

},

{

       "_id" : 2,

"host" : "127.0.0.1:27022"

}

        ]

}

> rs.initiate(config)

{

        "info" : "Config now saved locally. Should come online in about a minute.",

        "ok" : 1

}

9、第三组;进入数据库定义config server组;

[root@test1 bin]# ./mongo --port 27025

MongoDB shell version: 2.0.0

connecting to: 127.0.0.1:27025/test

> cOnfig= {_id: 'shard3', members: [

... ... ... {_id: 0, host: '127.0.0.1:27023'},

... ... ... {_id: 1, host: '127.0.0.1:27024'},

... ... ... {_id: 2, host: '127.0.0.1:27025'}]

... ... ... };

{

        "_id" : "shard3",

        "members" : [

{

"_id" : 0,

"host" : "127.0.0.1:27023"

},

{

       "_id" : 1,

"host" : "127.0.0.1:27024"

},

{

"_id" : 2,

"host" : "127.0.0.1:27025"

}

        ]

}

> rs.initiate(config)

{

        "info" : "Config now saved locally. Should come online in about a minute.",

        "ok" : 1

}

10、第一组;声明一个集群的config server,指定端口号;开启mongos进程,启动route server,指定数据分块大小;

# ./mongod --configsvr --dbpath /data/config --port 20000 --logpath /data/config.log --logappend --fork

# ./mongos --configdb 127.0.0.1:20000,127.0.0.1:20010,127.0.0.1:20020 --port 30000 --chunkSize 1 --logpath /data/mongos.log --logappend ?fork

11、第二组;声明一个集群的config server,指定端口号;开启mongos进程,启动route server,指定数据分块大小;

# ./mongod --configsvr --dbpath /data/config_1 --port 20010 --logpath /data/config.log --logappend --fork

# ./mongos --configdb 127.0.0.1:20000,127.0.0.1:20010,127.0.0.1:20020 --port 30010 --chunkSize 1 --logpath /data/mongos.log --logappend ?fork

12、第三组;声明一个集群的config server,指定端口号;开启mongos进程,启动route server,指定数据分块大小;

# ./mongod --configsvr --dbpath /data/config_2 --port 20020 --logpath /data/config.log --logappend --fork

# ./mongos --configdb 127.0.0.1:20000,127.0.0.1:20010,127.0.0.1:20020 --port 30020 --chunkSize 1 --logpath /data/mongos.log --logappend ?fork

13、添加shard server;设置分片储存数据库;设置分片的集合名称,且必须指定Shard Key,系统会自动创建索引;

[root@test1 bin]# ./mongo --port 30000

MongoDB shell version: 2.0.0

connecting to: 127.0.0.1:30000/test

mongos> use admin

switched to db admin

mongos> db.runCommand({addshard:"shard1/127.0.0.1:27017,127.0.0.1:27018,127.0.0.1:27019"});

{ "shardAdded" : "shard1", "ok" : 1 }

mongos> db.runCommand({addshard:"shard2/127.0.0.1:27020,127.0.0.1:27021,127.0.0.1:27022"});

{ "shardAdded" : "shard2", "ok" : 1 }

mongos> db.runCommand({addshard:"shard3/127.0.0.1:27023,127.0.0.1:27024,127.0.0.1:27025"});

{ "shardAdded" : "shard3", "ok" : 1 }

mongos> db.runCommand({ enablesharding:"test" })

{ "ok" : 1 }

mongos> db.runCommand({ shardcollection: "test.users", key: { _id:1 }})

{ "collectionsharded" : "test.users", "ok" : 1 }

mongos>

------------------------------测试-----------------------

1、随便连接到其中一台上的 mongos 进程(这里是30000、30010、30020三个端口)#

2、进入test库中

3、添加数据

4、查看数据库状态

5、以下可以看出数据分别放在了不同的3组中

6、查看数据库存放的目录可以看出每个数据库组都有数据

[root@test1 bin]# ./mongo --port 30010

MongoDB shell version: 2.0.0

connecting to: 127.0.0.1:30010/test

mongos> use test

switched to db test

mongos> for (var i = 1; i <= 500000; i++) db.users.insert({age:i,name:"qinshou",addr:"Beijing",country:"China"})

mongos> db.users.stats()

{

        "sharded" : true,

        "flags" : 1,

        "ns" : "test.users",

        "count" : 200000,

        "numExtents" : 17,

        "size" : 15200076,

        "storageSize" : 25157632,

        "totalIndexSize" : 6532624,

        "indexSizes" : {

                "_id_" : 6532624

        },

        "avgObjSize" : 76.00038,

        "nindexes" : 1,

        "nchunks" : 15,

        "shards" : {

"shard1" : {

"ns" : "test.users",

"count" : 82398,

                        "size" : 6262280,

"avgObjSize" : 76.00038835894075,

"storageSize" : 11182080,

"numExtents" : 6,

"nindexes" : 1,

"lastExtentSize" : 8388608,

"paddingFactor" : 1,

"flags" : 1,

"totalIndexSize" : 2689904,

"indexSizes" : {

"_id_" : 2689904

                        },

"ok" : 1

},

"shard2" : {

"ns" : "test.users",

"count" : 15780,

"size" : 1199292,

"avgObjSize" : 76.00076045627377,

"storageSize" : 2793472,

"numExtents" : 5,

"nindexes" : 1,

"lastExtentSize" : 2097152,

"paddingFactor" : 1,

"flags" : 1,

"totalIndexSize" : 523264,

"indexSizes" : {

"_id_" : 523264

},

"ok" : 1

},

"shard3" : {

"ns" : "test.users",

"count" : 101822,

"size" : 7738504,

"avgObjSize" : 76.000314273929,

"storageSize" : 11182080,

"numExtents" : 6,

"nindexes" : 1,

"lastExtentSize" : 8388608,

"paddingFactor" : 1,

"flags" : 1,

"totalIndexSize" : 3319456,

"indexSizes" : {

"_id_" : 3319456

},

"ok" : 1

}

        },

        "ok" : 1

}

mongos>

[root@test1 data]# ll

total 1076

drwxr-xr-x 4 root root   4096 Jul 11 10:31 config

drwxr-xr-x 4 root root   4096 Jul 11 10:31 config_1

drwxr-xr-x 4 root root   4096 Jul 11 10:31 config_2

-rw-r--r-- 1 root root 653298 Jul 11 11:22 config.log

drwxr-xr-x 3 root root   4096 Oct 9 2011 db

-rw-r--r-- 1 root root 154454 Jul 11 11:22 mongodb.log

-rw-r--r-- 1 root root 236269 Jul 11 11:22 mongos.log

drwxr-xr-x 4 root root   4096 Jul 11 10:42 shard1_1

drwxr-xr-x 3 root root   4096 Jul 11 10:40 shard1_2

drwxr-xr-x 4 root root   4096 Jul 11 10:42 shard2_1

drwxr-xr-x 3 root root   4096 Jul 11 10:42 shard2_2

drwxr-xr-x 4 root root   4096 Jul 11 10:42 shard3_1

drwxr-xr-x 3 root root   4096 Jul 11 10:42 shard3_2

到此!搭建完成!!!有疑问请参考《mongodb实践》《mongodb手册》


推荐阅读
  • MongoDB核心概念详解
    本文介绍了NoSQL数据库的概念及其应用场景,重点解析了MongoDB的基本特性、数据结构以及常用操作。MongoDB是一个高性能、高可用且易于扩展的文档数据库系统。 ... [详细]
  • 本文深入探讨了分布式文件系统的核心概念及其在现代数据存储解决方案中的应用,特别是针对大规模数据处理的需求。文章不仅介绍了多种流行的分布式文件系统和NoSQL数据库,还提供了选择合适系统的指导原则。 ... [详细]
  • 本文探讨了在通过 API 端点调用时,使用猫鼬(Mongoose)的 findOne 方法总是返回 null 的问题,并提供了详细的解决方案和建议。 ... [详细]
  • 基于Node.js、Express、MongoDB和Socket.io的实时聊天应用开发
    本文详细介绍了使用Node.js、Express、MongoDB和Socket.io构建的实时聊天应用程序。涵盖项目结构、技术栈选择及关键依赖项的配置。 ... [详细]
  • 利用 Jest 和 Supertest 实现接口测试的全面指南
    本文深入探讨了如何使用 Jest 和 Supertest 进行接口测试,通过实际案例详细解析了测试环境的搭建、测试用例的编写以及异步测试的处理方法。 ... [详细]
  • 58同城的Elasticsearch应用与平台构建实践
    本文由58同城高级架构师于伯伟分享,由陈树昌编辑整理,内容源自DataFunTalk。文章探讨了Elasticsearch作为分布式搜索和分析引擎的应用,特别是在58同城的实施案例,包括集群优化、典型应用实例及自动化平台建设等方面。 ... [详细]
  • 近期参与了一个旨在提高在线平台大规模查询响应速度的项目,预计处理的数据量为2-3亿条,数据库并发量约为每秒1500次,未来可能增至3000次。通过对比Redis和MongoDB,最终选择了MongoDB,因其具备优秀的横向扩展性和GridFS支持下的Map/Reduce功能。 ... [详细]
  • 本文详细介绍了如何构建MongoDB的ReplSet复制集群,包括环境准备、配置文件设置以及初始化复制集群的具体步骤。 ... [详细]
  • 开发笔记:Mongodb副本集集群搭建 ... [详细]
  • 本文档旨在为初学者提供MongoDB的基础知识介绍,包括其作为文档型数据库的特点、基本概念以及如何通过命令行界面(CLI)执行基本的操作。 ... [详细]
  • Redis:缓存与内存数据库详解
    本文介绍了数据库的基本分类,重点探讨了关系型与非关系型数据库的区别,并详细解析了Redis作为非关系型数据库的特点、工作模式、优点及持久化机制。 ... [详细]
  • Python 数据可视化实战指南
    本文详细介绍如何使用 Python 进行数据可视化,涵盖从环境搭建到具体实例的全过程。 ... [详细]
  • 在CentOS 7环境中安装配置Redis及使用Redis Desktop Manager连接时的注意事项与技巧
    在 CentOS 7 环境中安装和配置 Redis 时,需要注意一些关键步骤和最佳实践。本文详细介绍了从安装 Redis 到配置其基本参数的全过程,并提供了使用 Redis Desktop Manager 连接 Redis 服务器的技巧和注意事项。此外,还探讨了如何优化性能和确保数据安全,帮助用户在生产环境中高效地管理和使用 Redis。 ... [详细]
  • 本文深入探讨了NoSQL数据库的四大主要类型:键值对存储、文档存储、列式存储和图数据库。NoSQL(Not Only SQL)是指一系列非关系型数据库系统,它们不依赖于固定模式的数据存储方式,能够灵活处理大规模、高并发的数据需求。键值对存储适用于简单的数据结构;文档存储支持复杂的数据对象;列式存储优化了大数据量的读写性能;而图数据库则擅长处理复杂的关系网络。每种类型的NoSQL数据库都有其独特的优势和应用场景,本文将详细分析它们的特点及应用实例。 ... [详细]
  • 本文深入探讨了Linux系统中网卡绑定(bonding)的七种工作模式。网卡绑定技术通过将多个物理网卡组合成一个逻辑网卡,实现网络冗余、带宽聚合和负载均衡,在生产环境中广泛应用。文章详细介绍了每种模式的特点、适用场景及配置方法。 ... [详细]
author-avatar
小二上酒
拿起键盘就是撸~~
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有