Mongo分片集群部署

1           部署结构

1.1   集群结构

典型的三分片Mongo集群以下图所示,包含三类组件:查询路由、配置服务器、分片。其中查询路由为mongos进程,配置服务器和分片都是mongod进程。配置服务器和分片都采起副本集(replica set)来确保可用性和健壮性,每一个副本集最少包含三个节点。查询路由都是单实例运行,没有副本集机制,可根据须要增长实例数量,也能够在外部添加负载均衡。html

 

 

         上图中每一个方框仅表明功能集合,不表明物理位置。实际部署时,为了不单点故障,同一个副本集中的成员,应该部署在不一样主机上。好比分片1的三个mongod进程应该运行在三台不一样的主机上。linux

 

1.2   部署方案

 

                    副本集方案1(一主二从)mongodb

 

                副本集方案2(一主一从一仲裁)shell

如上图所示,三成员的副本集方案有两种:一主二从、一主一从一仲裁。数据库

对于方案1来讲,每一个成员都是数据节点,应该各自独占一台主机,这样三分片集群至少须要9台服务器(配置服务器和查询路由能够复用主机),以后每追加一个分片须要增长3台主机。具体部署状况以下图所示(同颜色的为一组,查询路由为MS,配置服务器为CS*):centos

        

 

对于方案2来讲,有两个成员是数据节点,两外一个是投票节点(仲裁者),这样三分片集群只须要6台服务器(配置服务器和查询路由依旧复用主机,仲裁者与另外一分片的数据节点部署在一台主机),以后每追加一个分片须要增长2台主机。具体部署状况以下图所示(同颜色的为一组,*a表示仲裁者,如Aa、Ba):bash

 

 

         能够看出,分片副本集采起一主一从一仲裁方案,更加节省机器资源。结合Mongo分片集群一期部署所能使用的服务器数量为6台,选择第二种部署方案。服务器

2           部署步骤

  1. 安装MongoDB:在全部主机上安装MongoDB
  2. 搭建分片集群:肯定各组件节点分布,搭建分片集群
  3. 数据库初始化:建立须要的分片数据库和分片集合,并添加索引
  4. 数据迁移:将生产环境中的Mongo副本集的数据迁移到分片集群中
  5. 应用迁移:将相关应用从副本集迁移到分片集群

上述步骤的具体操做见后续章节网络

 

 

3           安装MongoDB

操做系统为: 64位CentOS 7负载均衡

Mongo版本:linux-x86_64-rhel70-3.4.5

注意:全部主机安装的MongoDB版本应当一致。

3.1   检查安装环境

  1. 肯定NUMA已关闭

执行grep -i numa /var/log/dmesg,若是输出结果为:No NUMA configuration found,说明NUMA已禁用,不然经过BIOS将其关闭,或者使用numactl来启动mongod进程(安装方法见3.3)。

 

  1. 肯定kernel版本不低于2.6.36

执行uname -r,查看返回的版本号

 

  1. 肯定glibc版本不低于2.13

执行ldd --version(version前面两个减号),查看返回的版本号

 

  1. 肯定ulimit配置

执行ulimit -a,查看当前设置,官方推荐配置以下:

-f (file size): unlimited

-t (cpu time): unlimited

-v (virtual memory): unlimited

-n (open files): 64000

-m (memory size): unlimited

-u (processes/threads): 64000

         主要须要确认的是最大文件数(-n),最大进程数(-u),调整方法以下:

  1. 将最大文件数(-n)修改成64000

编辑/etc/security/limits.conf,写入如下两行

* soft nofile 64000

* hard nofile 64000

b.  将最大进程数(-u)修改成64000

         编辑/etc/security/limits.d/20-nproc.conf,写入如下两行

*          soft    nproc     64000

*          hard    nproc     64000

         配置完成后,从新打开终端确认是否生效。

 

  1. 文件系统采起XFS

执行df -iT,确认主要分区为xfs。

 

 

 

  1. 禁用Transparent Huge Pages

执行如下命令查看状态:

cat /sys/kernel/mm/transparent_hugepage/enabled

cat /sys/kernel/mm/transparent_hugepage/defrag

输出信息中方括号选中的为当前状态,若是为never表示禁用

 

 

 

若是不是never,经过执行如下命令禁用:

echo never > /sys/kernel/mm/transparent_hugepage/enabled

echo never > /sys/kernel/mm/transparent_hugepage/defrag

         上面的操做在系统重启后失效,能够经过设置开机禁用,执行crontab -e添加如下内容:

@reboot echo never > /sys/kernel/mm/transparent_hugepage/enabled

@reboot echo never > /sys/kernel/mm/transparent_hugepage/defrag

 

  1. 数据库文件目录所在存储卷关闭atime

执行cat /etc/fstab,查看内容,一般以下所示:

 

 

         注意每行的第三个配置,默认为defaults,修改准备存放库文件目录的卷,在defaults后面添加“,noatime,nodiratime”,例如放在/home目录下:

 

 

 

  1. 禁用SELinux

执行sestatus查看状态,若是为disabled,或者permissive模式说明已禁用:

 

 

         若是未禁用,能够执行setenforce 0来临时禁用。

         想要永久禁用,须要修改/etc/selinux/config,将SELINUX修改成disabled或者permissive,须要重启系统生效。

         若是不想关闭SELinux,能够用如下命令放行Mongo(运行在默认端口27017上):

semanage port -a -t mongod_port_t -p tcp 27017

 

  1. 关闭防火墙

执行service firewall status查看防火墙状态,若是为inactive说明已关闭:

 

         若是未关闭,执行service firewalld stop。

3.2   安装Mongo

  1. 下载安装包

访问官网https://www.mongodb.com/download-center,下载对应版本安装包(.tgz)

 

  1. 将安装包拷贝服务器上,例如/tmp目录下

 

  1. 打开终端进入安装包所在目录(/tmp),将其解压,会在目录下生成mongodb-***的目录

tar zxf mongodb-linux-x86_64-rhel70-3.4.5.tgz

 

  1. 将解压后的目录拷贝到安装路径(例如/opt/mongodb),执行命令:

mv mongodb-linux-x86_64-rhel70-3.4.5 /opt/mongodb

 

  1. 在环境变量PATH中添加二进制文件路径

MongoDB的二进制文件在Mongo安装路径的bin/目录下。能够经过修改PATH变量。

编辑shell的rc文件:

vi ~/.bashrc

在最后添加下面这行:

export PATH=/opt/mongodb/bin:$PATH

         注意:此环境变量与仅对当前用户有效。

 

  1. 验证安装成功

从新打开中断,输入命令:

mongo --version

         若是显示如下信息,说明安装成功。

 

 

3.3   安装numactl

对于启用了NUMA的主机,若是没法经过BIOS关闭,能够安装numactl工具。

  1. 下载rpm安装包

https://centos.pkgs.org/7/centos-x86_64/numactl-2.0.9-6.el7_2.x86_64.rpm.html

  1. 将安装包拷贝到须要运行Mongo的主机上,而后执行命令

rpm -ivh numactl-2.0.9-6.el7_2.x86_64.rpm

         显示如下信息说明安装成功。

 

 

3.4   安装bwm-ng

bwm-ng是监控网络带宽和磁盘IO的工具。它的官网是:http://www.gropp.org/,当前最新下载地址为:https://www.gropp.org/bwm-ng/bwm-ng-0.6.1.tar.gz,安装步骤以下:

  1. 下载安装包
  2. 将安装包拷贝到主机上(例如拷贝到/tmp/目录下)
  3. 将安装包解压:

tar zxvf bwm-ng-0.6.tar.gz

  1. 进入解压后的目录并编译安装:

cd bwm-ng-0.6.1

./configure && make && make install

  1. 检查是否安装成功,执行:

bwm-ng

         正常会显示相似以下信息:

 

 

经常使用监控命令:

  1. 监控网络带宽

bwm-ng -u bits -d

bwm-ng -u bytes -d

 

  1. 监控磁盘IO

bwm-ng -u bytes -i disk

 

4           搭建分片集群

注意:分片集群中全部实例的Mongo版本应当一致。

4.1   分片集群规划

4.1.1  节点分配

以三分片集群为例,它包含15个进程节点,3个路由(mongos)、1个配置服务器副本集(3个mongod组成)、3个分片副本集(每一个由3个mongod组成)。由于实际环境有6台主机(140-145),因此每一个主机上须要运行不止一个进程。

对资源消耗比较大的是分片中的数据节点(主节点或从节点),每台主机上最好只运行一个数据节点,这样就只能有6个数据节点,平摊到每一个分片有2个数据节点,因此每一个分片采起1主(primary)1从(secondary)1仲裁(arbiter)的结构。

14二、14三、144服务器依次部署分片一、分片二、分片3的主节点;14五、140、141服务器依次部署分片一、分片二、分片3的从节点。除了这六个节点,剩余3个路由节点、3个配置服务器节点和分片1-3的仲裁节点。

考虑到路由须要和配置服务器通讯,因此路由和配置服务器两两部署在一块儿;另外路由与分片主节点通讯也较多,因此就在每一个分片主节点所在服务器上部署1个路由节点和1个配置服务器节点。这样142服务器上有分片1的主节点、1个路由节点、1个配置服务器节点;143服务器上有分片2的主节点、1个路由节点、1个配置服务器节点;144服务器上有分片三、1个路由节点、1个配置服务器节点。

至此还剩分片1-3的仲裁节点没有分配。考虑主机资源的均衡,将它们部署到从节点服务器上。同时为了不单点故障(一个分片里同时挂掉两个节点),每一个仲裁节点不放在相同分片的从节点主机上。这样145服务器上有分片1的从节点、分片3的仲裁节点;140服务器上有分片2的从节点、分片1个仲裁节点;142服务器上有分片3的从节点、分片2的仲裁节点。

这样三分片集群节点在6台服务器上的分配状况以下:

序号

主机

组件

1

10.20.50.142

配置服务器-primary

分片1-primary

路由

2

10.20.50.143

配置服务器-secondary

分片2-primary

路由

3

10.20.50.144

配置服务器-secondary

分片3-primary

路由

4

10.20.50.145

分片1-secondary

分片3- arbiter

5

10.20.50.140

分片2-secondary

分片1- arbiter

6

10.20.50.141

分片3-secondary

分片2- arbiter

 

4.1.2  端口、路径和磁盘规划

  1. 端口规划

根据上一节的节点分配,每台服务器上运行不止一个节点,而每一个节点都须要占用端口,因此须要对端口进行规划。

由于MongoDB的默认端口是27017,每台主机能够有一个实例使用该端口,考虑到集群搭建过程当中的便利性(不须要指定端口),因此将27017端口分配给每台主机上的数据节点(分片的主节点或从节点)。14五、140、141主机上还有的仲裁节点,分配相同的28017端口。14二、14三、144主机上还有配置服务器节点和路由节点,也考虑根据类型分别分配相同端口,配置服务器分配28018端口,路由分配29017端口。

         至此端口分配完成

序号

主机

组件

1

10.20.50.142

分片1-primary(27017)

配置服务器-primary(28017)

路由(29017)

2

10.20.50.143

分片2-primary(27017)

配置服务器-secondary(28017)

路由(29017)

3

10.20.50.144

分片3-primary(27017)

配置服务器-secondary(28017)

路由(29017)

4

10.20.50.145

分片1-secondary(27017)

分片3- arbiter(28017)

5

10.20.50.140

分片2-secondary(27017)

分片1- arbiter(28017)

6

10.20.50.141

分片3-secondary(27017)

分片2- arbiter(28017)

        

  1. 路径和磁盘规划

         每一个节点实际是mongod或mongos进程,须要有本身的运行目录,因此须要对运行目录的路径进行规划。出于方便考虑,将每台主机的多个节点运行目录放在同一个根路径下,而后根路径下各自占使用一个子目录,子目录以节点用途命名(例如路由的运行目录为router、配置服务器的运行目录为confsrv、分片1-3的运行目录为shard1/shard2/shard3)

至于运行根目录,考虑到数据节点须要使用大量磁盘资源,因此应该选择磁盘容量最大的分区。例如,若是全部磁盘划分在根分区下(/),运行根目录就选择/var/mongodb/(var目录通常用来存储运行数据,如数据库文件等),若是磁盘主要划分在home分区(/home),下就选择/home/var/mongodb/。

以全部磁盘划分在根分区为例,配置服务器的运行目录为/var/mongodb/confsrv/,路由的运行目录为/var/mongodb/router/,分片的运行目录为/var/mongodb/shard1/、/var/mongodb/shard2/、/var/mongodb/shard3/。每一个节点的配置文件、日志文件、PID文件都输出到运行目录中。另外除了路由节点以外,其他节点都须要存储数据,因此都在运行目录下建立dbpath文件夹做为数据目录。

         至此各个节点的运行路径就划分完成,以下表所示:

序号

组件

IP

运行目录

数据目录

1

配置服务器

primary

10.20.50.142

/var/mongodb/confsrv/

/var/mongodb/confsrv/dbpath/

2

配置服务器

secondary

10.20.50.143

/var/mongodb/confsrv/

/var/mongodb/confsrv/dbpath/

3

配置服务器

secondary

10.20.50.144

/var/mongodb/confsrv/

/var/mongodb/confsrv/dbpath/

4

分片1

primary

10.20.50.142

/var/mongodb/shard1/

/var/mongodb/shard1/dbpath/

5

分片1

secondary

10.20.50.145

/var/mongodb/shard1/

/var/mongodb/shard1/dbpath/

6

分片1

arbiter

10.20.50.140

/var/mongodb/shard1/

/var/mongodb/shard1/dbpath/

7

分片2

primary

10.20.50.143

/var/mongodb/shard2/

/var/mongodb/shard2/dbpath/

8

分片2

secondary

10.20.50.140

/var/mongodb/shard2/

/var/mongodb/shard2/dbpath/

9

分片2

arbiter

10.20.50.141

/var/mongodb/shard2/

/var/mongodb/shard2/dbpath/

10

分片3

primary

10.20.50.144

/var/mongodb/shard3/

/var/mongodb/shard3/dbpath/

11

分片3

secondary

10.20.50.141

/var/mongodb/shard3/

/var/mongodb/shard3/dbpath/

12

分片3

arbiter

10.20.50.145

/var/mongodb/shard3/

/var/mongodb/shard3/dbpath/

13

路由

10.20.50.142

/var/mongodb/router/

14

路由

10.20.50.143

/var/mongodb/router/

15

路由

10.20.50.144

/var/mongodb/router/

 

 

4.1.3  集群规划清单

根据前两节的分析,对集群中各组件的最终规划以下:

序号

组件

IP

Port

副本集名称

进程

运行目录

1

配置服务器

primary

10.20.50.142

28017

confsrv

mongod

/var/mongodb/confsrv/

2

配置服务器

secondary

10.20.50.143

28017

confsrv

mongod

/var/mongodb/confsrv/

3

配置服务器

secondary

10.20.50.144

28017

confsrv

mongod

/var/mongodb/confsrv/

4

分片1

primary

10.20.50.142

27017

shard1

mongod

/var/mongodb/shard1/

5

分片1

secondary

10.20.50.145

27017

shard1

mongod

/var/mongodb/shard1/

6

分片1

arbiter

10.20.50.140

28017

shard1

mongod

/var/mongodb/shard1/

7

分片2

primary

10.20.50.143

27017

shard2

mongod

/var/mongodb/shard2/

8

分片2

secondary

10.20.50.140

27017

shard2

mongod

/var/mongodb/shard2/

9

分片2

arbiter

10.20.50.141

28017

shard2

mongod

/var/mongodb/shard2/

10

分片3

primary

10.20.50.144

27017

shard3

mongod

/var/mongodb/shard3/

11

分片3

secondary

10.20.50.141

27017

shard3

mongod

/var/mongodb/shard3/

12

分片3

arbiter

10.20.50.145

28017

shard3

mongod

/var/mongodb/shard3/

13

路由

10.20.50.142

29017

mongos

/var/mongodb/router/

14

路由

10.20.50.143

29017

mongos

/var/mongodb/router/

15

路由

10.20.50.144

29017

mongos

/var/mongodb/router/

 

         各台主机上部署的组件清单以下:

序号

主机

组件

1

10.20.50.142

配置服务器-primary(28017)

分片1-primary(27017)

路由(29017)

2

10.20.50.143

配置服务器-secondary(28017)

分片2-primary(27017)

路由(29017)

3

10.20.50.144

配置服务器-secondary(28017)

分片3-primary(27017)

路由(29017)

4

10.20.50.145

分片1-secondary(27017)

分片3- arbiter(28017)

5

10.20.50.140

分片2-secondary(27017)

分片1- arbiter(28017)

6

10.20.50.141

分片3-secondary(27017)

分片2- arbiter(28017)

         组件规划肯定后,下面就进入搭建集群的实操阶段。

4.2   建立配置服务器

  1. 建立运行目录

在14二、14三、144服务器上建立运行目录(应该放磁盘容量最大的卷中),例如:

mkdir -p /var/mongodb/confsrv/dbpath/

 

  1. 建立配置文件

在运行目录(/var/mongodb/confsrv/)中建立配置文件mongod-cs.cnf,内容以下:

sharding:

  clusterRole: configsvr

replication:

  replSetName: confsrv

  oplogSizeMB: 10240

systemLog:

   destination: file

   path: /var/mongodb/confsrv/mongod-cs.log

   logAppend: true

net:

   port: 28017

storage:

   dbPath: /var/mongodb/confsrv/dbpath/

   directoryPerDB: true

processManagement:

   fork: true

   pidFilePath: /var/mongodb/confsrv/mongod-cs.pid

         其中依次设置了:集群角色(configsrv)、副本集名称(confsrv)、操做日志大小、日志设置、端口(28017)、存储设置、后台运行(fork)、PID文件路径。

         更多配置见:https://docs.mongodb.com/manual/reference/configuration-options/

 注意:配置中全部冒号后面必须增长空格

 

  1. 启动mongod实例

mongod --config /var/mongodb/confsrv/mongod-cs.cnf

         注意:若是运行在启用了NUMA的主机上,使用numactl来启动:

numactl --interleave=all mongod --config /var/mongodb/confsrv/mongod-cs.cnf

启动以后,根据配置,日志文件、pid文件会写入/var/mongodb/confsrv/,数据会写入/var/mongodb/confsrv/dbpath/。

 

注意:确保在三个配置服务器节点上(14二、14三、144)均完成上述步骤。

 

  1. 链接并初始化

在142上使用mongo shell链接mongod实例,执行:

mongo --port 28017

         在mongo shell中初始化副本集(注意_id要与配置文件中的replSetName一致,host中为主机IP或可解析域名+端口),执行:

rs.initiate(

  {

         _id: "confsrv",

         configsvr: true,

         members: [

           { _id : 0, host : "10.20.50.142:28017" },

           { _id : 1, host : "10.20.50.143:28017" },

           { _id : 2, host : "10.20.50.144:28017" }

          

         ]

  }

)

         若是操做完成,会返回成功的提示信息({"ok" : 1.0}),不然会给出错误信息。

这样一主二从的配置服务器副本集就搭建完成。

 

查看副本集配置,执行:

rs.conf()

         查看副本集状态,执行:

rs.status()

 

  1. 添加副本集成员(可选)

若是还要追加副本集成员,经过mongo shell链接配置服务器副本集主节点实例,而后执行:

rs.add("<host>:<port>")

         其中<host>、<port>替换为相应节点的主机名(ip或域名)和端口

         详细操做能够参考:https://docs.mongodb.com/manual/tutorial/expand-replica-set/

 

注:配置完成后优先确认网络通畅,防火墙关闭或端口不被屏蔽,若是中间有操做错误,可使用以下命令进行从新配置:

conf = {

         _id: "confsrv",

         configsvr: true,

         members: [

           { _id : 0, host : "10.20.50.140:28017" },

           { _id : 1, host : "10.20.50.141:28017" },

           { _id : 2, host : "10.20.50.142:28017" }

          

         ]

  }

回车

rs.initiate(conf,{force:true})  //已经运行的系统此命令不建议使用

 

 

4.3   建立分片

  1. 建立运行目录

以分片1为例,在142服务器上建立运行目录(应该放在磁盘容量最大的卷中),例如:

mkdir -p /var/mongodb/shard1/dbpath/

 

  1. 建立配置文件

在运行目录(/var/mongodb/shard1/)中建立配置文件mongod- sh.cnf,内容以下:

sharding:

  clusterRole: shardsvr

replication:

  replSetName: shard1

  oplogSizeMB: 10240

systemLog:

   destination: file

   path: /var/mongodb/shard1/mongod-sh.log

   logAppend: true

net:

   port: 27017

storage:

   dbPath: /var/mongodb/shard1/dbpath/

   directoryPerDB: true

processManagement:

   fork: true

   pidFilePath: /var/mongodb/shard1/mongod-sh.pid

         其中依次设置了:集群角色(shardsvr)、副本集名称(shard1)、操做日志大小、日志设置、端口(27017)、存储设置、后台运行(fork)、PID文件路径。

         更多配置见:https://docs.mongodb.com/manual/reference/configuration-options/

 

  1. 启动mongod实例

mongod --config /var/mongodb/shard1/mongod-sh.cnf

注意:若是运行在启用了NUMA的主机上,使用numactl来启动:

numactl --interleave=all mongod --config /var/mongodb/shard1/mongod-sh.cnf

         启动以后,根据配置,日志文件、pid文件会写入/var/mongodb/shard1/,数据会写入/var/mongodb/shard1/dbpath/。

 

在145服务器上完成以上步骤,在140服务器也完成以上步骤(注意:根据规划,须要将配置文件中的端口改成28017)

 

  1. 链接并初始化

在142上使用mongo shell链接mongod实例,执行:

mongo --port 27017 或者 mongo

         在mongo shell中初始化副本集(注意:_id要与配置文件中的replSetName一致,host中为主机IP或可解析域名+端口),执行:

rs.initiate(

  {

         _id: "shard1",

         members: [

           { _id : 0, host : "10.20.50.142", priority: 10 },

           { _id : 1, host : "10.20.50.145", priority:5 }

          

         ]

  }

)

         primary节点和secondary节点就加入分片副本集了,还须要添加arbiter节点,执行:

rs.addArb("10.20.50.140:28017")

         这样一主一从一仲裁的分片集群就搭建完成。

 

查看副本集配置,执行:

rs.conf()

         查看副本集状态,执行:

rs.status()

 

  1. 添加副本集成员(可选)

若是还要追加副本集成员,经过mongo shell链接配置服务器副本集主节点实例,而后执行:

rs.add("<host>:<port>")

         其中<host>、<port>替换为相应节点的主机名(ip或域名)和端口

         详细操做能够参考:https://docs.mongodb.com/manual/tutorial/expand-replica-set/

 

  1. 按照1-5步,分别建立分片2副本集(14三、140、141)和分片3副本集(14四、14一、145)

分片二、分片3的配置以下,仅仅是replSetName和运行目录不一样:

sharding:

  clusterRole: shardsvr

replication:

  replSetName: shard2

  oplogSizeMB: 10240

systemLog:

   destination: file

   path: /var/mongodb/shard2/mongod-sh.log

   logAppend: true

net:

   port: 27017

storage:

   dbPath: /var/mongodb/shard2/dbpath/

   directoryPerDB: true

processManagement:

   fork: true

   pidFilePath: /var/mongodb/shard2/mongod-sh.pid

 

sharding:

  clusterRole: shardsvr

replication:

  replSetName: shard3

  oplogSizeMB: 10240

systemLog:

   destination: file

   path: /var/mongodb/shard3/mongod-sh.log

   logAppend: true

net:

   port: 27017

storage:

   dbPath: /var/mongodb/shard3/dbpath/

   directoryPerDB: true

processManagement:

   fork: true

   pidFilePath: /var/mongodb/shard3/mongod-sh.pid

         另外,在执行步骤4进行初始化时,注意对应修改_id和host。

 

4.4   建立查询路由

  1. 建立运行目录

在142服务器上建立运行目录(应该放在磁盘容量最大的卷中),例如:

mkdir -p /var/mongodb/router/

 

  1. 建立配置文件

在运行目录(/var/mongodb/router/)中建立配置文件mongos.cnf,内容以下:

sharding:

  configDB: confsrv/10.20.50.142:28017,10.20.50.143:28017,10.20.50.144:28017

systemLog:

   destination: file

   path: /var/mongodb/router/mongos.log

   logAppend: true

net:

   port: 29017

processManagement:

   fork: true

   pidFilePath: /var/mongodb/router/mongos.pid

其中依次设置了:配置服务器(configDB)、系统日志、端口(29017)、后台运行(fork)、PID文件路径。

        

  1. 启动mongos实例(注意:这里是mongos,而上面都是mongod)

mongos --config /var/mongodb/router/mongos.cnf

         启动以后,根据配置,日志文件、pid文件会写入/var/mongodb/router/

 

  1. 在14三、144上重复上述步骤

 

注意:当路由(mongos)成为性能瓶颈时,能够多配置几个。

 

4.5   添加分片

在142上(14三、144也行)使用mongo shell链接mongos实例,执行:

mongo --port 29017

而后将上面建立的三个分片依次添加进来,执行:

sh.addShard( "shard1/10.20.50.142:27017")

sh.addShard( "shard2/10.20.50.143:27017")

sh.addShard( "shard3/10.20.50.144:27017")

         操做完成后,能够查看分片集群状态,执行:

sh.status()

         会发现每一个分片除了添加的主节点外,从节点也自动加入了,后续分片副本集若是发生变化(增删节点)也会自动识别出来。

shards:

         {  "_id" : "shard1",  "host" : "shard1/10.20.50.142:27017,10.20.50.145:27017",  "state" : 1 }

         {  "_id" : "shard2",  "host" : "shard2/10.20.50.143:27017,10.20.50.140:27017",  "state" : 1 }

         {  "_id" : "shard3",  "host" : "shard3/10.20.50.144:27017,10.20.50.141:27017",  "state" : 1 }

 

4.6   设置开机启动

经过crontab将分片集群各组件设置为开机启动,以142主机为例,具体操做以下:

  1. 编辑crontab,执行:

crontab -e

 

  1. 在打开的crontab文件中末尾追加如下内容:

@reboot /opt/mongodb/bin/mongod --config /var/mongodb/confsrv/mongod-cs.cnf

@reboot /opt/mongodb/bin/mongod --config /var/mongodb/shard1/mongod-sh.cnf

@reboot /opt/mongodb/bin/mongos --config /var/mongodb/router/mongos.cnf

 

对于14三、14四、14五、140、141五台主机,crontab添加的内容以下(根据组件规划):

@reboot /opt/mongodb/bin/mongod --config /var/mongodb/confsrv/mongod-cs.cnf

@reboot /opt/mongodb/bin/mongod --config /var/mongodb/shard2/mongod-sh.cnf

@reboot /opt/mongodb/bin/mongos --config /var/mongodb/router/mongos.cnf

 

@reboot /opt/mongodb/bin/mongod --config /var/mongodb/confsrv/mongod-cs.cnf

@reboot /opt/mongodb/bin/mongod --config /var/mongodb/shard3/mongod-sh.cnf

@reboot /opt/mongodb/bin/mongos --config /var/mongodb/router/mongos.cnf

 

@reboot /opt/mongodb/bin/mongod --config /var/mongodb/shard1/mongod-sh.cnf

@reboot /opt/mongodb/bin/mongod --config /var/mongodb/shard3/mongod-sh.cnf

 

@reboot /opt/mongodb/bin/mongod --config /var/mongodb/shard2/mongod-sh.cnf

@reboot /opt/mongodb/bin/mongod --config /var/mongodb/shard1/mongod-sh.cnf

 

@reboot /opt/mongodb/bin/mongod --config /var/mongodb/shard3/mongod-sh.cnf

@reboot /opt/mongodb/bin/mongod --config /var/mongodb/shard2/mongod-sh.cnf

 

5           数据库初始化

根据目前需求,过人过车数据存放在o2m数据库中。相关集合以下表所示:

序号

集合名称

所存数据

1

passPerson1

客运站过人

2

passPerson2

火车站过人

3

passPerson3

机场过人

4

passPerson4

检查站过人

5

passPerson5

酒店过人

6

passPerson7

二手车交易过人

7

passPerson99

社会化过人

8

visitorPerson

访客机过人

9

vehicle

检查站过车

         其中客运站过人、火车站过人、机场过人、检查站过人须要进行分片处理,因此先o2m数据库启用分片,而后再将上述四个集合分片。

 

  1. 链接到mongos,执行:

mongo --host 10.20.50.142 --port 29017

 

2. 对o2m数据库启用分片,执行:

sh.enableSharding("o2m")

 

3. 将相关集合分片(这里采起stationNo+passTime的组合片键),执行:

sh.shardCollection("o2m.passPerson1", { stationNo:1, passTime:1 } )

sh.shardCollection("o2m.passPerson2", { stationNo:1, passTime:1 } )

sh.shardCollection("o2m.passPerson3", { stationNo:1, passTime:1 } )

sh.shardCollection("o2m.passPerson4", { stationNo:1, passTime:1 } )

         注:片键后面的方向只能是升序(即1)

 

4. 查询分片集合的数据分布状况(例如passPerson1),执行:

db.passPerson1.stats()

         返回结果的shards节点中包含有各分片状况:

 

  1. 添加索引

db.passPerson1.createIndex( { passTime:1, stationNo:1, nationCode:1, genderCode:1, cardNoPrefix6:1 } )

db.passPerson1.createIndex( { cardNo:1 } )

 

注:由于o2m数据库已经启用分片,其中未分片的集合会存储在某个单一分片上,以后某个集合须要分片,参考步骤3执行便可。

6           数据迁移

  1. 导出原始数据

例如,从原副本集(运行在27017端口)中导出o2m数据库,执行:

mongodump --host 10.20.50.135 --db o2m -o /tmp/mongodump/

         数据会导出到/tmp/mongodump/下的o2m目录中

  1. 导入分片集群

数据导入须要经过mongos,使用-h参数指定mongos实例的IP和端口,使用-d参数指定数据库,试用-c参数指定集合,例如导入火车站过人数据,执行:

mongorestore -h 10.20.50.140:29017 -d o2m -c passPerson2 /tmp/mongodump/test/railwayPerson.bson

         导入过程当中,会显示进度信息。

 

7           应用迁移

分片集群对于客户端应用来讲是透明的,客户端应用只需将分片集群视为单个mongod实例,全部客户端请求都链接分片集群中的路由(mongos)。

应用只需将原有Mongo配置指向路由便可(例如10.20.50.140:29017),若是想要使用多个路由,能够将多个路由地址用逗号链接,相似副本集的配置(192.168.30.139:29017,192.168.30.141:29017,192.168.30.145:29017)

相关文章
相关标签/搜索