MongoDB 分片(sharding)+副本集(replSet)集群搭建

文章目录

  • MongoDB安装
    • Windows平台安装
      • 1、下载
      • 2、安装
      • 3、启动MongoDB服务
      • 4、进入MongoDB后台
    • Linux平台安装MongoDB
      • 1、下载
      • 2、安装
      • 3、创建数据库目录
      • 4、命令行中运行 MongoDB 服务
      • 5、MongoDB后台管理 Shell
      • 6、MongoDb web 用户界面
    • Mac OSX 平台安装 MongoDB
      • 1、下载
      • 2、 安装
      • 3、运行 MongoDB
  • MongDB集群部署
    • MongoDB集群相关介绍
    • 副本集搭建(replSet)
      • MongoDB复制原理
      • 副本集特征
      • MongoDB副本集设置
        • 实例
      • 副本集添加成员
        • 语法
        • 实例
    • 分片集群搭建(shard)
      • 分片
      • 为什么使用分片
      • MongoDB分片
      • 分片集群实例
        • 一、节点角色规划
        • 二、端口分配:
        • 三、安装MongoDB(所有节点)
        • 四、创建相关目录
        • 五、配置config server配置服务器(所有节点)
        • 六、配置分片副本集(所有节点)
        • 七、配置路由服务器 mongos(所有节点)
        • 八、启用分片
        • 九、测试
        • 十、启动 关闭
        • 十一、设置开机自启
      • 配置参数
      • 桌面截图
  • 常用指令
  • 常见错误及解决方法
  • 参考文献

MongoDB安装

Windows平台安装

1、下载

MongoDB 提供了可用于 32 位和 64 位系统的预编译二进制包,你可以从MongoDB官网下载安装

MongoDB 预编译二进制包下载地址:https://www.mongodb.com/download-center/community

MongoDB:https://fastdl.mongodb.org/win32/mongodb-win32-x86_64-2012plus-4.2.0-signed.msi
MongoDB 分片(sharding)+副本集(replSet)集群搭建_第1张图片

2、安装

根据你的系统下载 32 位或 64 位的 .msi 文件,下载后双击该文件,按操作提示安装即可。

安装过程中,你可以通过点击 “Custom(自定义)” 按钮来设置你的安装目录。
MongoDB 分片(sharding)+副本集(replSet)集群搭建_第2张图片MongoDB 分片(sharding)+副本集(replSet)集群搭建_第3张图片
下一步安装 “install mongoDB compass” 不勾选,否则可能要很长时间都一直在执行安装,MongoDB Compass 是一个图形界面管理工具,我们可以在后面自己到官网下载安装,下载地址:https://www.mongodb.com/download-center/compass。
MongoDB 分片(sharding)+副本集(replSet)集群搭建_第4张图片
如果安装过程中提示“Service ‘MongoDB Server…”,选择 Ignore,这是权限不够
MongoDB 分片(sharding)+副本集(replSet)集群搭建_第5张图片
如果出现上面的提示,则说明此时MongoDB服务未成功启动,打开CMD输入一下代码,"D:\mongoDB\data"是MongoDB数据库位置,需提前创建好

mongod --dbpath="D:\mongoDB\data"

3、启动MongoDB服务

启动MongoDB服务

net start MongoDB

关闭MongoDB服务

net stop MongoDB

4、进入MongoDB后台

如果你需要进入MongoDB后台管理,你需要先打开mongodb装目录的下的bin目录,然后执行mongo.exe文件,MongoDB Shell是MongoDB自带的交互式Javascript shell,用来对MongoDB进行操作和管理的交互式环境。或者在Path环境变量里面加入“MongoDB安装目录\bin”,就可以全局使用mongo相关的命令了

当你进入mongoDB后台后,它默认会链接到 test 文档(数据库):

> mongo
MongoDB shell version: 3.0.6
connecting to: test
……

由于它是一个JavaScript shell,您可以运行一些简单的算术运算:

> 2 + 2
4
>

db 命令用于查看当前操作的文档(数据库):

> db
test
>

插入一些简单的记录并查找它:

> db.user.insert({name:'magichuang'})
WriteResult({ "nInserted" : 1 })
> db.user.find()
{ "_id" : ObjectId("5604ff74a274a611b0c990aa"), "name" : "magichuang" }

Linux平台安装MongoDB

1、下载

MongoDB 提供了 linux 各发行版本 64 位的安装包,你可以在官网下载安装包。

下载地址:https://www.mongodb.com/download-center#community
MongoDB 分片(sharding)+副本集(replSet)集群搭建_第6张图片

2、安装

下载完安装包,并解压 tgz(以下演示的是 64 位 Linux上的安装) 。

# 下载
curl -O https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.0.9.tgz
# 解压
tar -zxvf mongodb-linux-x86_64-rhel70-4.0.9.tgz
# 将解压包拷贝到指定目录
mv mongodb-linux-x86_64-rhel70-4.0.9/ /usr/local/mongodb             

MongoDB 的可执行文件位于 bin 目录下,所以可以将其添加到 PATH 路径中(临时环境变量):

export PATH=/bin:$PATH

为你 MongoDB 的安装路径。如本文的 /usr/local/mongodb

也可以加入系统环境变量使其永久生效

# 如果/etc/bashrc文件不可编辑,需要修改为可编辑
chmod -v u+w /etc/bashrc
 
vim /etc/bashrc
 
# 在最后一行加上
export PATH=$PATH:/usr/local/mongodb/bin

3、创建数据库目录

MongoDB的数据存储在data目录的db目录下,但是这个目录在安装过程不会自动创建,所以你需要手动创建data目录,并在data目录中创建db目录。

以下实例中我们将data目录创建于根目录下(/)。

注意:/data/db 是 MongoDB 默认的启动的数据库路径(–dbpath)。

mkdir -p /data/db

4、命令行中运行 MongoDB 服务

你可以再命令行中执行mongo安装目录中的bin目录执行mongod命令来启动mongdb服务。

注意:如果你的数据库目录不是/data/db,可以通过 --dbpath 来指定。

$ ./mongod
2019-09-25T16:39:50.549+0800 I JOURNAL  [initandlisten] journal dir=/data/db/journal
2019-09-25T16:39:50.550+0800 I JOURNAL  [initandlisten] recover : no journal files present, no recovery needed
2019-09-25T16:39:50.869+0800 I JOURNAL  [initandlisten] preallocateIsFaster=true 3.16
2019-09-25T16:39:51.206+0800 I JOURNAL  [initandlisten] preallocateIsFaster=true 3.52
2019-09-25T16:39:52.775+0800 I JOURNAL  [initandlisten] preallocateIsFaster=true 7.7

5、MongoDB后台管理 Shell

如果你需要进入MongoDB后台管理,你需要先打开mongodb装目录的下的bin目录,然后执行mongo命令文件。

MongoDB Shell是MongoDB自带的交互式Javascript shell,用来对MongoDB进行操作和管理的交互式环境。

当你进入mongoDB后台后,它默认会链接到 test 文档(数据库):

$ cd /usr/local/mongodb/bin
$ ./mongo
MongoDB shell version: 3.0.6
connecting to: test
Welcome to the MongoDB shell.
……

由于它是一个JavaScript shell,您可以运行一些简单的算术运算:

> 2+2
4
> 3+6
9

现在让我们插入一些简单的数据,并对插入的数据进行检索:

> db.runoob.insert({x:10})
WriteResult({ "nInserted" : 1 })
> db.runoob.find()
{ "_id" : ObjectId("5604ff74a274a611b0c990aa"), "x" : 10 }
>

第一个命令将数字 10 插入到 runoob 集合的 x 字段中。

6、MongoDb web 用户界面

MongoDB 提供了简单的 HTTP 用户界面。 如果你想启用该功能,需要在启动的时候指定参数 --rest 。

注意:该功能只适用于 MongoDB 3.2 及之前的早期版本。

$ ./mongod --dbpath=/data/db --rest

MongoDB 的 Web 界面访问端口比服务的端口多1000。

如果你的MongoDB运行端口使用默认的27017,你可以在端口号为28017访问web用户界面,即地址为:http://localhost:28017。

MongoDB 分片(sharding)+副本集(replSet)集群搭建_第7张图片

Mac OSX 平台安装 MongoDB

MongoDB 提供了 OSX 平台上 64 位的安装包,你可以在官网下载安装包。

下载地址:https://www.mongodb.com/download-center#community
MongoDB 分片(sharding)+副本集(replSet)集群搭建_第8张图片

1、下载

接下来我们使用 curl 命令来下载安装:

# 进入 /usr/local
cd /usr/local

# 下载
sudo curl -O https://fastdl.mongodb.org/osx/mongodb-osx-ssl-x86_64-4.0.9.tgz

# 解压
sudo tar -zxvf mongodb-osx-ssl-x86_64-4.0.9.tgz

# 重命名为 mongodb 目录

sudo mv mongodb-osx-x86_64-4.0.9/ mongodb

安装完成后,我们可以把 MongoDB 的二进制命令文件目录(安装目录/bin)添加到 PATH 路径中:

export PATH=/usr/local/mongodb/bin:$PATH

2、 安装

此外你还可以使用 OSX 的 brew 来安装 mongodb:

sudo brew install mongodb

如果要安装支持 TLS/SSL 命令如下:

sudo brew install mongodb --with-openssl

安装最新开发版本:

sudo brew install mongodb --devel

3、运行 MongoDB

1、首先我们创建一个数据库存储目录 /data/db:

sudo mkdir -p /data/db

启动 mongodb,默认数据库目录即为 /data/db:

sudo mongod

# 如果没有创建全局路径 PATH,需要进入以下目录
cd /usr/local/mongodb/bin
sudo ./mongod

再打开一个终端进入执行以下命令:

$ cd /usr/local/mongodb/bin 
$ ./mongo
MongoDB shell version v4.0.9
connecting to: mongodb://127.0.0.1:27017/?gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("3c12bf4f-695c-48b2-b160-8420110ccdcf") }
MongoDB server version: 4.0.9
……
> 1 + 1
2

注意:如果你的数据库目录不是/data/db,可以通过 --dbpath 来指定。

sudo mongod --dbpath=/data/db 

MongDB集群部署

MongoDB集群相关介绍

集群背景:随着业务数据和并发量的增加,若只使用一台MongoDB服务器,存在着断电和数据风险的问题,故采用Mongodb复制集的方式,来提高项目的高可用、安全性等性能。MongoDB复制是将数据同步在多个服务器的过程。复制提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性, 并可以保证数据的安全性。复制还允许从硬件故障和服务中断中恢复数据。

集群模式:主从集群、副本集集群、分片集群

副本集搭建(replSet)

MongoDB复制原理

mongodb的复制至少需要两个节点。其中一个是主节点,负责处理客户端请求,其余的都是从节点,负责复制主节点上的数据。

mongodb各个节点常见的搭配方式为:一主一从、一主多从。

主节点记录在其上的所有操作oplog,从节点定期轮询主节点获取这些操作,然后对自己的数据副本执行这些操作,从而保证从节点的数据与主节点一致。

MongoDB复制结构图如下所示:
MongoDB 分片(sharding)+副本集(replSet)集群搭建_第9张图片
以上结构图中,客户端从主节点读取数据,在客户端写入数据到主节点时, 主节点与从节点进行数据交互保障数据的一致性。

副本集特征

  • N 个节点的集群
  • 任何节点可作为主节点
  • 所有写入操作都在主节点上
  • 自动故障转移
  • 自动恢复

MongoDB副本集设置

在本教程中我们使用同一个MongoDB来做MongoDB主从的实验, 操作步骤如下:

1、关闭正在运行的MongoDB服务器。

现在我们通过指定 --replSet 选项来启动mongoDB。–replSet 基本语法格式如下:

mongod --port "PORT" --dbpath "YOUR_DB_DATA_PATH" --replSet "REPLICA_SET_INSTANCE_NAME"

实例

mongod --dbpath="C:\data\shard1\data\set1 --logpath="C:\data\shard1\logs\set1.log" --port=27017 --shardsvr --replSet=shard1

以上实例会启动一个名为shard1的MongoDB实例,其端口号为27017。

启动后打开命令提示框并连接上mongoDB服务。

在Mongo客户端使用命令rs.initiate()来启动一个新的副本集。

我们可以使用rs.conf()来查看副本集的配置

查看副本集状态使用 rs.status() 命令

副本集添加成员

添加副本集的成员,我们需要使用多台服务器来启动mongo服务。进入Mongo客户端,并使用rs.add()方法来添加副本集的成员。

语法

rs.add() 命令基本语法格式如下:

>rs.add(HOST_NAME:PORT)

实例

假设你已经启动了一个名为mongod1.net,端口号为27017的Mongo服务。 在客户端命令窗口使用rs.add() 命令将其添加到副本集中,命令如下所示:

>rs.add("mongod1.net:27017")

MongoDB中你只能通过主节点将Mongo服务添加到副本集中, 判断当前运行的Mongo服务是否为主节点可以使用命令db.isMaster() 。

MongoDB的副本集与我们常见的主从有所不同,主从在主机宕机后所有服务将停止,而副本集在主机宕机后,副本会接管主节点成为主节点,不会出现宕机的情况。

分片集群搭建(shard)

分片

在Mongodb里面存在另一种集群,就是分片技术,可以满足MongoDB数据量大量增长的需求。

当MongoDB存储海量的数据时,一台机器可能不足以存储数据,也可能不足以提供可接受的读写吞吐量。这时,我们就可以通过在多台机器上分割数据,使得数据库系统能存储和处理更多的数据。

为什么使用分片

  • 复制所有的写入操作到主节点
  • 延迟的敏感数据会在主节点查询
  • 单个副本集限制在12个节点
  • 当请求量巨大时会出现内存不足。
  • 本地磁盘不足
  • 垂直扩展价格昂贵

MongoDB分片

MongoDB中使用分片集群架构图
MongoDB 分片(sharding)+副本集(replSet)集群搭建_第10张图片
上图中主要有如下所述三个主要组件:

  • shard: 每一个shard包括了切片数据的子集,也可以被部署为“副本集”
  • mongos: 作为一个“查询路由”,在客户端和shard cluster之间作为一个中间接口,类似于MySQL的一些中间proxy。可以通过mongo shell或者mongodb driver直连mongos
  • config server: 一个存储了sharded cluster的元数据和配置信息的server,同样也可以被部署为“副本集”

分片逻辑图

MongoDB 分片(sharding)+副本集(replSet)集群搭建_第11张图片

分片设计思想

分片为应对高吞吐量与大数据量提供了方法。使用分片减少了每个分片需要处理的请求数,因此,通过水平扩展,集群可以提高自己的存储容量和吞吐量。举例来说,当插入一条数据时,应用只需要访问存储这条数据的分片

使用分片减少了每个分片存储的数据。
例如,如果数据库1tb的数据集,并有4个分片,然后每个分片可能仅持有256 GB的数据。如果有40个分片,那么每个切分可能只有25GB的数据。

MongoDB 分片(sharding)+副本集(replSet)集群搭建_第12张图片
MongoDB 分片(sharding)+副本集(replSet)集群搭建_第13张图片

分片集群实例

一、节点角色规划

三台Centos7服务器,各节点角色规划如下:

192.168.46.209 192.168.46.45 192.168.46.90
mongos mongos mongos
config server config server config server
shard server1 主节点 shard server1 副节点 shard server1 仲裁
shard server2 仲裁 shard server2 主节点 shard server2 副节点
shard server3 副节点 shard server3 仲裁 shard server3 主节点

二、端口分配:

mongos:27017
config:30000
shard1:27001
shard2:27002
shard3:27003

三、安装MongoDB(所有节点)

1、下载并解压 tgz(以下演示的是 64 位 Linux上的安装) 。

# 下载
curl -O https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.0.9.tgz
# 解压
tar -zxvf mongodb-linux-x86_64-rhel70-4.0.9.tgz
# 将解压包拷贝到指定目录
mv mongodb-linux-x86_64-rhel70-4.0.9/ /usr/local/mongodb             

2、MongoDB 的可执行文件位于 bin 目录下,所以可以将其添加到 PATH 路径中(临时环境变量):

export PATH=/bin:$PATH

为你 MongoDB 的安装路径。如本文的 /usr/local/mongodb

也可以加入系统环境变量使其永久生效

# 如果/etc/bashrc文件不可编辑,需要修改为可编辑
chmod -v u+w /etc/bashrc
 
vim /etc/bashrc
 
# 在最后一行加上
export PATH=$PATH:/usr/local/mongodb/bin

四、创建相关目录

分别在每台机器建立conf、mongos、config、shard1、shard2、shard3六个目录,因为mongos不存储数据,只需要建立日志文件目录即可

mkdir -p /usr/local/mongodb/conf
mkdir -p /usr/local/mongodb/mongos/log
mkdir -p /usr/local/mongodb/config/{data,log}
mkdir -p /usr/local/mongodb/shard1/{data,log}
mkdir -p /usr/local/mongodb/shard2/{data,log}
mkdir -p /usr/local/mongodb/shard3/{data,log}

五、配置config server配置服务器(所有节点)

1、配置

vim /usr/local/mongodb/conf/config.conf
 
pidfilepath = /usr/local/mongodb/config/log/configsrv.pid
dbpath = /usr/local/mongodb/config/data
logpath = /usr/local/mongodb/config/log/congigsrv.log
logappend = true
bind_ip = 0.0.0.0
port = 30000
fork = true
configsvr = true
#副本集名称
replSet=configs

2、启动三台服务器的config server

mongod -f /usr/local/mongodb/conf/config.conf

3、登录任意一台配置服务器,初始化配置副本集

#连接
mongo --port 30000
 
#配置config变量,"_id" : "configs"应与配置文件中配置的replSet=configs一致,"members"中的"host"为三个节点的ip和port
config = {
    _id : "configs",
     members : [
         {_id : 0, host : "192.168.46.209:30000" },
         {_id : 1, host : "192.168.46.45:30000" },
         {_id : 2, host : "192.168.46.90:30000" }
     ]
 }
 
# 回车之后看到如下提示
{
	"_id" : "configs",
	"members" : [
		{
			"_id" : 0,
			"host" : "192.168.46.209:30000"
		},
		{
			"_id" : 1,
			"host" : "192.168.46.45:30000"
		},
		{
			"_id" : 2,
			"host" : "192.168.46.90:30000"
		}
	]
}
 
# 初始化副本集
rs.initiate(config)
 
# 看到如下提示说明配置成功
{
	"ok" : 1,
	"operationTime" : Timestamp(1534907024, 1),
	"$gleStats" : {
		"lastOpTime" : Timestamp(1534907024, 1),
		"electionId" : ObjectId("000000000000000000000000")
	},
	"$clusterTime" : {
		"clusterTime" : Timestamp(1534907024, 1),
		"signature" : {
			"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
			"keyId" : NumberLong(0)
		}
	}
}

六、配置分片副本集(所有节点)

1、设置第一个分片副本集(三个节点)

vim /usr/local/mongodb/conf/shard1.conf
 
pidfilepath = /usr/local/mongodb/shard1/log/shard1.pid
dbpath = /usr/local/mongodb/shard1/data
logpath = /usr/local/mongodb/shard1/log/shard1.log
logappend = true
bind_ip = 0.0.0.0
port = 27001
fork = true
#副本集名称
replSet=shard1
shardsvr = true
#设置最大连接数
maxConns=20000

启动三台服务器的shard1 server

mongod -f /usr/local/mongodb/conf/shard1.conf

登陆任意一台服务器的mongo(非仲裁节点服务器),初始化副本集

#连接
mongo --port 27001
 
#定义副本集配置,第三个节点的
"arbiterOnly":true 代表其为仲裁节点。
config = {
    _id : "shard1",
     members : [
         {_id : 0, host : "192.168.46.209:27001" },
         {_id : 1, host : "192.168.46.45:27001" },
         {_id : 2, host : "192.168.46.90:27001" , arbiterOnly: true }
     ]
 }
 
#回车之后提示如下信息
 {
	"_id" : "shard1",
	"members" : [
		{
			"_id" : 0,
			"host" : "192.168.46.209:27001"
		},
		{
			"_id" : 1,
			"host" : "192.168.46.45:27001"
		},
		{
			"_id" : 2,
			"host" : "192.168.46.90:27001",
			"arbiterOnly" : true
		}
	]
}
 
#初始化副本集配置
rs.initiate(config);

2、设置第二个分片副本集(三个节点)

vim /usr/local/mongodb/conf/shard2.conf
 
pidfilepath = /usr/local/mongodb/shard2/log/shard2.pid
dbpath = /usr/local/mongodb/shard2/data
logpath = /usr/local/mongodb/shard2/log/shard2.log
logappend = true
bind_ip = 0.0.0.0
port = 27002
fork = true
#副本集名称
replSet=shard2
shardsvr = true
#设置最大连接数
maxConns=20000

启动三台服务器的shard2 server

mongod -f /usr/local/mongodb/conf/shard2.conf

登陆任意一台服务器的mongo(非仲裁节点服务器),初始化副本集

mongo --port 27002
 
#定义副本集配置
config = {
    _id : "shard2",
     members : [
         {_id : 0, host : "192.168.46.209:27002"  , arbiterOnly: true },
         {_id : 1, host : "192.168.46.45:27002" },
         {_id : 2, host : "192.168.46.90:27002" }
     ]
 }
#初始化副本集配置
rs.initiate(config);

3、设置第三个分片副本集(三个节点)

vim /usr/local/mongodb/conf/shard3.conf
 
pidfilepath = /usr/local/mongodb/shard3/log/shard3.pid
dbpath = /usr/local/mongodb/shard3/data
logpath = /usr/local/mongodb/shard3/log/shard3.log
logappend = true
bind_ip = 0.0.0.0
port = 27003
fork = true
#副本集名称
replSet=shard3
shardsvr = true
#设置最大连接数
maxConns=20000

启动三台服务器的shard3 server

mongod -f /usr/local/mongodb/conf/shard3.conf

登陆任意一台服务器的mongo(非仲裁节点服务器),初始化副本集

mongo --port 27003
 
#定义副本集配置
config = {
    _id : "shard3",
     members : [
         {_id : 0, host : "192.168.46.209:27003" },
         {_id : 1, host : "192.168.46.45:27003" , arbiterOnly: true},
         {_id : 2, host : "192.168.46.90:27003" }
     ]
 }
 
#初始化副本集配置
rs.initiate(config);

七、配置路由服务器 mongos(所有节点)

vim /usr/local/mongodb/conf/mongos.conf
 
pidfilepath = /usr/local/mongodb/mongos/log/mongos.pid
logpath = /usr/local/mongodb/mongos/log/mongos.log
logappend = true
bind_ip = 0.0.0.0
port = 27017
fork = true
#监听的配置服务器,只能有1个或者3个 configs为配置服务器的副本集名字
configdb = configs/192.168.46.209:30000,192.168.46.45:30000,192.168.46.90:30000
#设置最大连接数
maxConns=20000

启动三台服务器的mongos server

mongos -f /usr/local/mongodb/conf/mongos.conf

八、启用分片

我们目前已经搭建了mongodb配置服务器、路由服务器,各个分片服务器,不过应用程序连接到mongos路由服务器并不能使用分片机制,还需要在程序里设置分片配置,让分片生效,登陆任意一台mongos

mongo --port 27017
 
#串联路由服务器与分片副本集
sh.addShard("shard1/192.168.46.209:27001,192.168.46.45:27001,192.168.46.90:27001")
sh.addShard("shard2/192.168.46.209:27002,192.168.46.45:27002,192.168.46.90:27002")
sh.addShard("shard3/192.168.46.209:27003,192.168.46.45:27003,192.168.46.90:27003")
 
#查看集群状态
sh.status()
 
#可看到如下所示信息
--- Sharding Status --- 
  sharding version: {
        "_id" : 1,
        "minCompatibleVersion" : 5,
        "currentVersion" : 6,
        "clusterId" : ObjectId("5d919fa03c8cfc9977d6a9e2")
  }
  shards:
        {  "_id" : "shard1",  "host" : "shard1/192.168.46.209:27001,192.168.46.45:27001",  "state" : 1 }
        {  "_id" : "shard2",  "host" : "shard2/192.168.46.45:27002,192.168.46.90:27002",  "state" : 1 }
        {  "_id" : "shard3",  "host" : "shard3/192.168.46.209:27003,192.168.46.90:27003",  "state" : 1 }
  active mongoses:
        "4.0.9" : 1
  autosplit:
        Currently enabled: yes
  balancer:
        Currently enabled:  yes
        Currently running:  no
        Failed balancer rounds in last 5 attempts:  0
        Migration Results for the last 24 hours: 
                No recent migrations
  databases:
        {  "_id" : "config",  "primary" : "config",  "partitioned" : true }

九、测试

目前配置服务、路由服务、分片服务、副本集服务都已经串联起来了,但我们的目的是希望插入数据,数据能够自动分片。登录任意一台mongos,准备让指定的数据库、指定的集合分片生效。

mongo 192.168.46.209:27017

#使用admin数据库
use admin

#指定test_db分片生效
db.runCommand( { enablesharding :"test_db"});

#回车之后可看到如下提示
{
	"ok" : 1,
	"$clusterTime" : {
		"clusterTime" : Timestamp(1534917663, 6),
		"signature" : {
			"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
			"keyId" : NumberLong(0)
		}
	},
	"operationTime" : Timestamp(1534917663, 6)
}

#指定数据库里需要分片的集合和片键
db.runCommand( { shardcollection : "test_db.table1",key : {id: "hashed"} } )

#回车之后看到如下提示
{
	"collectionsharded" : "test_db.table1",
	"collectionUUID" : UUID("19629078-d4d0-4fc7-a371-2d7c330f77b3"),
	"ok" : 1,
	"$clusterTime" : {
		"clusterTime" : Timestamp(1534917720, 14),
		"signature" : {
			"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
			"keyId" : NumberLong(0)
		}
	},
	"operationTime" : Timestamp(1534917720, 14)

我们设置test_db的table1表需要分片,根据id自动分片到shard1,shard2,shard3上面去。要这样设置是因为不是所有mongodb的数据库和表都需要分片!

查看测试结果

#使用test_db
use test_db

#插入10000条测试数据
for (var i = 1; i <= 10000; i++)db.table1.save({id:i,"test1":"testval1"});

#查看分片情况,可以看到1000条数据分布于三个片上
db.table1.stats();
或
sh.status()

分别查看shard1上的test_db数据库的table1集合条数,三台服务器分布还是比较均匀的

mongo 192.168.46.209:27001
use test_db
db.table1.find().count()

在这里插入图片描述

十、启动 关闭

mongodb的启动顺序是,先启动所有节点配置服务器,在启动所有节点的分片,最后启动所有节点的mongos

mongod -f /usr/local/mongodb/conf/config.conf

mongod -f /usr/local/mongodb/conf/shard1.conf
mongod -f /usr/local/mongodb/conf/shard2.conf
mongod -f /usr/local/mongodb/conf/shard3.conf

mongos -f /usr/local/mongodb/conf/mongos.conf

关闭时,直接killall杀掉所有进程即可

killall mongod
killall mongos

十一、设置开机自启

cd /etc/systemd/system

分别为config、shard1、shard2、shard3、mongos编写service文件,如下

vim mongo-config.service
 
[Unit]
Description=mongo-config
 
[Service]
user=root
group=root
Type=forking
ExecStart=/usr/local/mongodb/bin/mongod -f /usr/local/mongodb/conf/config.conf
TimeoutStopSec=0
Restart=always
RestartSec=15s
TimeoutStartSec=30s
#ExecStop=/usr/local/mongodb/bin/mongod -f /usr/local/mongodb/conf/config.conf --shutdown
 
[Install]
WantedBy=multi-user.target
Alias=mongoc
vim mongo-shard1.service
 
[Unit]
Description=mongo-shard1
Requires=mongo-config.service
After=mongo-config.service
 
[Service]
user=root
group=root
Type=forking
ExecStart=/usr/local/mongodb/bin/mongod -f /usr/local/mongodb/conf/shard1.conf
TimeoutStopSec=0
Restart=always
RestartSec=15s
TimeoutStartSec=30s
#ExecStop=/usr/local/mongodb/bin/mongod -f /usr/local/mongodb/conf/shard1.conf --shutdown
 
[Install]
WantedBy=multi-user.target
Alias=mongosh1
vim mongo-shard2.service
 
[Unit]
Description=mongo-shard2
Requires=mongo-shard1.service
After=mongo-shard1.service
 
[Service]
user=root
group=root
Type=forking
ExecStart=/usr/local/mongodb/bin/mongod -f /usr/local/mongodb/conf/shard2.conf
TimeoutStopSec=0
Restart=always
RestartSec=15s
TimeoutStartSec=30s
#ExecStop=/usr/local/mongodb/bin/mongod -f /usr/local/mongodb/conf/shard2.conf --shutdown
 
[Install]
WantedBy=multi-user.target
Alias=mongosh2
vim mongo-shard3.service
 
[Unit]
Description=mongo-shard3
Requires=mongo-shard2.service
After=mongo-shard2.service
 
[Service]
user=root
group=root
Type=forking
ExecStart=/usr/local/mongodb/bin/mongod -f /usr/local/mongodb/conf/shard3.conf
TimeoutStopSec=0
Restart=always
RestartSec=15s
TimeoutStartSec=30s
#ExecStop=/usr/local/mongodb/bin/mongod -f /usr/local/mongodb/conf/shard3.conf --shutdown
 
[Install]
WantedBy=multi-user.target
Alias=mongosh3
vim mongos.service
 
[Unit]
Description=mongos
Requires=mongo-shard3.service
After=mongo-shard3.service
 
[Service]
user=root
group=root
Type=forking
ExecStart=/usr/local/mongodb/bin/mongos -f /usr/local/mongodb/conf/mongos.conf
TimeoutStopSec=0
Restart=always
RestartSec=15s
TimeoutStartSec=30s
#ExecStop=/usr/local/mongodb/bin/mongos -f /usr/local/mongodb/conf/mongos.conf
 
[Install]
WantedBy=multi-user.target

添加文件权限,设置开机自启

chmod +x mongos.service

systemctl daemon-reload

systemctl enable mongo-config.service
systemctl enable mongo-shard1.service
systemctl enable mongo-shard2.service
systemctl enable mongo-shard3.service
systemctl enable mongos.service

注意!使用systemctl的方式设置开机自启,因此种方式的先天限制,我们mongo设置的最大连接数并不能按照我们设置的20000来生效,会发现按照系统默认1024的80%生效,即819,解决此方法我们可以修改系统配置文件即可,修改这个配置文件需要重启系统才能生效!

vim /etc/systemd/system.conf

打开或者添加如下两行配置即可

DefaultLimitCORE=infinity
DefaultLimitNOFILE=64000

配置参数

--quiet # 安静输出
--port arg # 指定服务端口号,默认端口27017
--bind_ip arg # 绑定服务IP,若绑定127.0.0.1,则只能本机访问,不指定默认本地所有IP
--logpath arg # 指定MongoDB日志文件,注意是指定文件不是目录
--logappend # 使用追加的方式写日志
--priority # Primary节点优先级,越高优先级越高
--shardsvr # shard服务实例
--configsvr # MongoDB需要1或3个configsver实例
--pidfilepath arg # PID File 的完整路径,如果没有设置,则没有PID文件
--keyFile arg # 集群的私钥的完整路径,只对于Replica Set 架构有效
--unixSocketPrefix arg # UNIX域套接字替代目录,(默认为 /tmp)
--fork # 以守护进程的方式运行MongoDB,创建服务器进程
--auth # 启用验证
--cpu # 定期显示CPU的CPU利用率和iowait
--dbpath arg # 指定数据库路径
--diaglog arg # diaglog选项 0=off 1=W 2=R 3=both 7=W+some reads
--directoryperdb # 设置每个数据库将被保存在一个单独的目录
--journal # 启用日志选项,MongoDB的数据操作将会写入到journal文件夹的文件里
--journalOptions arg # 启用日志诊断选项
--ipv6 # 启用IPv6选项
--jsonp # 允许JSONP形式通过HTTP访问(有安全影响)
--maxConns arg # 最大同时连接数 默认2000
--noauth # 不启用验证
--nohttpinterface # 关闭http接口,默认关闭27018端口访问
--noprealloc # 禁用数据文件预分配(往往影响性能)
--noscripting # 禁用脚本引擎
--notablescan # 不允许表扫描
--nounixsocket # 禁用Unix套接字监听
--nssize arg (=16) # 设置信数据库.ns文件大小(MB)
--objcheck # 在收到客户数据,检查的有效性,
--profile arg # 档案参数 0=off 1=slow, 2=all
--quota # 限制每个数据库的文件数,设置默认为8
--quotaFiles arg # number of files allower per db, requires --quota
--rest # 开启简单的rest API
--repair # 修复所有数据库run repair on all dbs
--repairpath arg # 修复库生成的文件的目录,默认为目录名称dbpath
--slowms arg (=100) # value of slow for profile and console log
--smallfiles # 使用较小的默认文件
--syncdelay arg (=60) # 数据写入磁盘的时间秒数(0=never,不推荐)
--sysinfo # 打印一些诊断系统信息
--upgrade # 如果需要升级数据库 * Replicaton 参数

桌面截图

MongoDB 分片(sharding)+副本集(replSet)集群搭建_第14张图片

常用指令

# 查询所有数据库列表:
show dbs 
# 切换数据库
use 数据库名
# 查看数据库的状态
db.stats()
# 查看当前数据库下有哪些表
show collections
# 查看表的记录条数
db.table.find().count()
# 查看表的大小
db.表名.dataSize()
# 删除表
db.表名.drop()
# 删除当前的数据库
db.dropDatabase()
# 改变节点优先级,过修改priority的值来实现,priority的值设的越大,就优先成为主)
conf = rs.conf()
conf.members[3].priority = 3
rs.reconfig(conf)

常见错误及解决方法

MongoDB启动服务出现“服务没有响应控制功能”错误

在命令行敲出如下代码后再启动服务出“服务没有响应控制功能”

mongod --dbpath "C:\MongoDB\data\db" --logpath "C:\MongoDB\data\log\mongo.log" --install --serviceName "MongoDB"

参考文献

MongoDB 分片(sharding)+副本集(replSet)集群搭建

解决 Win10 安装 MongoDB 4.0 无法启动服务的问题

菜鸟教程-MongoDB教程

MongoDB 复制集节点增加移除及节点属性配置

MongoDB分片实战

mongodb副本集高可用架构

MongoDB副本集(一主两从)读写分离、故障转移功能环境部署记录

MongoDB开启用户密码访问

你可能感兴趣的:(数据库)