首页 > 编程知识 正文

搭建高可用mongodb集群,mongodb集群部署

时间:2023-05-06 07:12:40 阅读:152329 作者:1008

瓷砖化的目的

数据量和吞吐量高的数据库APP应用给单机性能带来很大的压力,大的查询量会占用单个CPU,大的数据量会给单个存储带来很大的压力,最终会耗尽系统内存而造成压力的磁盘I

为了解决这些问题,有两种基本方法:纵向扩展和分片。

分片提供了应对高吞吐量和大数据量的方法。

由于使用分片减少了每个分片需要处理的请求数,所以通过水平扩展,集群可以提高自己的存储容量和吞吐量。

例如,如果要插入数据,则APP应用程序只需访问存储此数据的片

使用分片减少了存储在每个分片中的数据。

例如,如果一个数据库包含1TB的数据,并且有4个片,则每个片只需要存储256GB的数据;如果数据库包含40个片,则每个片只需要存储25GB的数据

数据分区

MongoDB中的数据片以集合为基本单位,集合中的数据通过片键分为多个部分。

芯片密钥

对收藏进行切片时,必须选择切片密钥。 shard key是包含在所有记录中并要索引的单个字段或复合字段。 MongoDB用照片键将数据划分为不同的数据块,并将数据块均匀分布在所有片上。 要使用照片键分割数据块,MongoDB可以使用基于范围的切片方法或基于世界的安静切片方法。 有关详细信息,请参见切片密钥

基于范围的分片

对于基于范围的分片,MongoDB根据照片键的范围将数据分成不同的部分。 假设有一个数字平铺键:设想从负的无限到正的无限的直线,每个平铺键的值在一条直线上画一个点。 MongoDB将这条直线分成更短、不重叠的碎片,称为数据块,每个数据块包含一个分片键范围内的数据。

在使用切片密钥划分范围的系统中,具有“接近”切片密钥的文档很可能存储在同一个数据块中,因此也存储在同一个切片中。

基于宁静世界的瓷砖

对于基于安静世界的片,MongoDB计算一个场的安静的世界值,使用该安静的世界值创建数据块

在使用安静的世界平铺的系统中,具有“接近”平铺密钥的文档很可能不存储在同一个数据块中,从而提高数据的可分离性。

引入集群

平铺和" localhost "地址

如果使用" localhost "或127.0.0.1作为主机标识符,例如在使用addShard命令时使用host参数或--configdb `作为启动参数,则无论在哪个位置“localhost”和“` 127 `混合存在时

启动配置服务器

配置服务器是保存集群元信息的mongod实例。 - -使用--configsvr将mongod指定为配置服务器,并将群集的完整元信息保存在每个配置服务器上。

在生产环境中,需要部署三台配置服务器以确保正常运行时间和数据安全。 在测试环境中,三台配置服务器可以在一台服务器上运行。

为三个配置服务器创建数据目录。 缺省情况下,配置服务器将数据文件保存在/data/configdb目录中。 还可以指定保存数据文件的位置。 用简单的命令创建数据目录:

mkdir /data/configdb

启动三台配置服务器,每个服务器使用以下命令启动:

mongod---config SVR---dbpath---port

配置服务器的默认端口是27019。 也可以自己指定。 以下示例使用默认端口和默认数据目录启动配置服务器

mongod---- config SVR---- dbpath/data/configd B--- port 27019

评论

初始化sharded cluster时,所有配置服务器都必须正常运行并且可以访问。

启动mongos实例

mongos实例是轻量级服务,不需要数据目录。 可以在部署了其他服务的系统(如APP应用程序服务器或运行mongod的计算机)上运行mongos。program:mongos默认在27017端口上运行。

启动mongos时,必须指定三台配置服务器的域名。 可以在配置文件或启动命令参数中指定。

TIP

To avoid downtime, giveeachconfigserveralogicaldnsname (unrelatedtotheserver’sphysicalorvirtualhostname ).withoutlogicaldname移动设备owneverymongodandmongosinstanceintheshardedcluster。

使用以下语法启动mongos实例:

Mongos----configdb

示例:使用以下配置服务器在缺省端口上启动mongos:

cfg0.example.net

cfg1.e

xample.net

cfg2.example.net

你需要使用以下命令:

mongos --configdb cfg0.example.net:27019,cfg1.example.net:27019,cfg2.example.net:27019

每个mongos必须使用configDB按照相同的顺序指定配置服务器列表.

如果你启动一个mongos时,指定的配置服务器列表与其他mongos中指定的不同,mongos会返回配置服务器字符串错误错误并退出启动.

向集群中添加分片

一个shard可以是一个单独的:program:mongod或者一个replica set.在生产环境中,每个分片都应该是一个复制集.参见部署复制集将每个分片部署为复制集.

使用以下命令,从mongo终端连接到mongos.

mongo --host --port

示例:如果mongos部署在mongos0.example.net``的``27017端口上,使用以下命令进行连接:

mongo --host mongos0.example.net --port 27017

正如下面的示例,使用sh.addShard()在集群中添加分片.每次使用sh.addShard()添加一个分片.如果分片是复制集,需要指定复制集的名字与一个成员名字.在生产环境中,所有分片都应该是复制集.

可选配置

You can instead use theaddSharddatabase command, which lets you specify a name and maximum size for the shard. If you do not specify these, MongoDB automatically assigns a name and maximum size. To use the database command, seeaddShard.

以下是使用sh.addShard()添加分片的例子:

假设一个分片使用了复制集,复制集名字为rs1,有一个运行在mongodb0.example.net且端口为27017的成员,使用以下命令添加这个分片:

sh.addShard( "rs1/mongodb0.example.net:27017" )

在 2.0.3 版更改.

在2.0.3之前的版本,你必须指定复制集中所有的成员,示例:

sh.addShard( "rs1/mongodb0.example.net:27017,mongodb1.example.net:27017,mongodb2.example.net:27017" )

添加运行在mongodb0.example.net端口为27017的单机mongod分片,需要执行以下命令:

sh.addShard( "mongodb0.example.net:27017" )

注解

将数据块迁移到新的分片需要花费一些时间.

为集群开启分片

在对集合进行分片之前,必须开启数据库的分片.对数据库开启分片不会导致数据的重新分配,但这是对这个数据库中集合进行分片的前提.

一旦为数据库开启了分片,MongoDB就会为这个数据库指定一个primary shard,所有未分片的数据都会存储在这个分片上.

使用以下命令,从mongo终端连接到mongos.

mongo --host --port

使用sh.enableSharding()需要指定要开启分片的数据库的名字,语法如下:

sh.enableSharding("")

你也可以使用enableSharding命令对数据库开启分片,语法如下:

db.runCommand( { enableSharding: } )

对集合开启分片

分片以集合为基本单位.

首先选择一个shard key,所选择的片键会影响集群的效率.参见选择片键的注意事项.获得注意事项.

如果集合中已经包含有数据,需要使用ensureIndex()在片键上创建索引.如果集合是空的,MongoDB会在sh.shardCollection()过程中自动创建索引.

sh.shardCollection(".", shard-key-pattern)

将.字符串换成你数据库的ns,由数据库的全名,一个点(即.),和集合的全名组成,shard-key-pattern换成你的片键,名字为创建索引时指定的名字.

示例

The following sequence of commands shards four collections:

sh.shardCollection("records.people", { "zipcode": 1, "name": 1 } )

sh.shardCollection("people.addresses", { "state": 1, "_id": 1 } )

sh.shardCollection("assets.chairs", { "type": 1, "_id": 1 } )

sh.shardCollection("events.alerts", { "_id": "hashed" } )

按照顺序操作分片:

records数据库中的people集合使用{"zipcode":1,"name":1}片键开启分片.

这个集合使用zipcode字段重新分配数据.如果很多文档都有相同的zipcode值,chunk会按照name的值进行分裂.

people数据库中的addresses集合使用片键{"state":1,"_id":1}.

这个片键使用state字段重新分配数据.如果很多文档都有相同的state值,chunk会按照_id的值进行分裂.

assets数据库中的chairs集合使用{"type":1,"_id":1}做片键.

这个片键使用type字段重新分配数据.如果很多文档都有相同的type值,chunk会按照_id的值进行分裂.

events数据库中的alerts集合使用{"_id":"hashed"}做片键.

2.4 新版功能.

这个片键使用_id的散列值重新分配数据.MongoDB为散列索引计算_id的值,可以保证集群中数据的均衡.

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。