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

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
在这里插入图片描述

2、安装

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

安装过程中,你可以通过点击 “Custom(自定义)” 按钮来设置你的安装目录。
在这里插入图片描述在这里插入图片描述
下一步安装 “install mongoDB compass” 不勾选,否则可能要很长时间都一直在执行安装,MongoDB Compass 是一个图形界面管理工具,我们可以在后面自己到官网下载安装,下载地址:https://www.mongodb.com/download-center/compass。
在这里插入图片描述
如果安装过程中提示“Service ‘MongoDB Server…”,选择 Ignore,这是权限不够
在这里插入图片描述
如果出现上面的提示,则说明此时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
在这里插入图片描述

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=<mongodb-install-directory>/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。

在这里插入图片描述

Mac OSX 平台安装 MongoDB

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

下载地址:https://www.mongodb.com/download-center#community
在这里插入图片描述

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复制结构图如下所示:
在这里插入图片描述
以上结构图中,客户端从主节点读取数据,在客户端写入数据到主节点时, 主节点与从节点进行数据交互保障数据的一致性。

副本集特征

  • 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中使用分片集群架构图
在这里插入图片描述
上图中主要有如下所述三个主要组件:

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

分片逻辑图

在这里插入图片描述

分片设计思想

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

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

在这里插入图片描述
在这里插入图片描述

分片集群实例

一、节点角色规划

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

192.168.46.209192.168.46.45192.168.46.90
mongosmongosmongos
config serverconfig serverconfig 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=<mongodb-install-directory>/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 参数

桌面截图

在这里插入图片描述

常用指令

# 查询所有数据库列表:
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开启用户密码访问

posted @ 2019-09-25 10:50  jee-cai  阅读(202)  评论(0编辑  收藏  举报