<commit_before>---
layout:     post
title:      搭建mongodb数据库集群
subtitle:   分片技术搭建分布式数据库
date:       2017-10-14
author:     QC
header-img: img/timg6.jpg
catalog: true
tags:
    - mongodb
---
### 使用mongodb搭建分布式数据库

### 1.简介

在mongodb里面存在另一种集群，就是分片技术，跟sql server的表分区类似，我们知道当数据量达到T级别的时候，我们的磁盘、内存就吃不消了，针对这样的场景我们该如何面对？这就需要我们使用多台机器搭建分布式数据库，这时候就会用到mongodb里面的分片技术。

### 2.分片技术

mongodb采用将集合拆分，然后将拆分的数据均摊到几个分片上的一种解决方案。
![](https://raw.githubusercontent.com/Los-GTI/Los-GTI.github.io/master/img/分片技术.png)

##### 2.1 原理解释

###### 2.1.1 人脸

代表客户端，客户端肯定说，你数据库分片不分片跟我没关系，我叫你干啥就干啥，没什么好商量的。

###### 2.1.2 mongos

首先我们要了解”片键“的概念，也就是说拆分集合的依据是什么？按照什么键值进行拆分集合....好了，mongos就是一个路由服务器，它会根据管理员设置的“片键”将数据分摊到自己管理的mongod集群，数据和片的对应关系以及相应的配置信息保存在"config服务器"上。

###### 2.1.3 mongod

一个普通的数据库实例，如果不分片的话，我们会直接连上mongod。

### 3.实战

> mongodb版本为2.6，其他版本可能会出现一些问题。

我们的目标是在两台主机上搭建一个mongodb数据库集群，在主机A上准备2个mongod程序，在主机B上准备一个mongod程序，然后利用主机A的mongos去启动主机B上的mongod程序，最后进行一下测试。

###### 3.1在主机A上准备两个mongod程序

这里我以多个文件夹的形式，当然你也可以在均摊在不同磁盘上

![](https://raw.githubusercontent.com/Los-GTI/Los-GTI.github.io/master/img/分片.png)



###### 3.2 开启主机A的config服务器

　先前也说了，mongos要把mongod之间的配置放到config服务器里面，理所当然首先开启它，我这里就建立2222端口。

> 从现在开始所有开启的服务都不要关闭，也就是所有开启的cmd命令框都不要关闭

![](https://raw.githubusercontent.com/Los-GTI/Los-GTI.github.io/master/img/开启config服务.png)



###### 3.3开启mongos服务器

这里要注意的是我们开启的是mongos，不是mongod，同时指定下config服务器，这里我就开启F盘上的mongodb，端口3333。

![](https://raw.githubusercontent.com/Los-GTI/Los-GTI.github.io/master/img/开启mongos.png)

###### 3.4 启动mongod服务器

对分片来说，也就是要添加片了，这里开启F盘的mongotest1、mongotest2文件夹的mongodb，端口为4444和5555。

![](https://raw.githubusercontent.com/Los-GTI/Los-GTI.github.io/master/img/mongotest1开启.png)

![](https://raw.githubusercontent.com/Los-GTI/Los-GTI.github.io/master/img/开启mongotest2.png)

###### 3.5 服务配置

> 最后还差一定配置我们就可以完成主机A的分片。

###### 3.5.1 

 先前图中也可以看到，我们client直接跟mongos打交道，也就说明我们要连接mongos服务器，然后将4444，5555的mongod交给mongos,添加分片也就是addshard()。

![](https://raw.githubusercontent.com/Los-GTI/Los-GTI.github.io/master/img/addshard.png)

> 这里要注意的是，在addshard中，我们也可以添加副本集，这样能达到更高的稳定性。

###### 3.5.2

分片已经集群了，但是mongos不知道该如何切分数据，也就是我们先前所说的片键，在mongodb中设置片键要做两步

开启数据库分片功能，命令很简单 enablesharding(),这里我就开启test数据库。

指定集合中分片的片键，这里我就指定为person.name字段。

![](https://raw.githubusercontent.com/Los-GTI/Los-GTI.github.io/master/img/片键.png)

###### 3.5.3 查看效果

好了，至此我们在主机A上的分片操作全部结束，接下来我们通过mongos向mongodb插入10w记录，然后通过printShardingStatus命令查看mongodb的数据分片情况。

![](https://raw.githubusercontent.com/Los-GTI/Los-GTI.github.io/master/img/查看效果.png)

 这里主要看三点信息：

 ① shards：我们清楚的看到已经别分为两个片了，shard0000和shard0001。

 ② databases：这里有个partitioned字段表示是否分区，这里清楚的看到test已经分区。

③ chunks：这个很有意思，我们发现集合被砍成四段：无穷小 —— jack0，jack0 ——jack999，jack999——无穷大。分区情况为：2：1，从后面的 on shardXXXX也能看得出。

###### 4两台主机搭建

同样的方法在主机B上进行分片操作，分片结束之后将主机A与主机B进行通信，然后利用主机A的mongos去操作主机B上的分片。因为我这边没有同时开启主机B的服务，所以截图暂时不放上来。

具体操作为：主机Aping 主机B的IP地址。

利用主机A的mongos操作主机B的分片。

>摁钉,author <NAME> 
<commit_msg>Update 2017-10-14-搭建mongodb数据集群.md<commit_after>---
layout:     post
title:      搭建mongodb数据库集群
subtitle:   分片技术搭建分布式数据库
date:       2017-10-14
author:     Los-GTI
header-img: img/timg6.jpg
catalog: true
tags:
    - mongodb
---
### 使用mongodb搭建分布式数据库

### 1.简介

在mongodb里面存在另一种集群，就是分片技术，跟sql server的表分区类似，我们知道当数据量达到T级别的时候，我们的磁盘、内存就吃不消了，针对这样的场景我们该如何面对？这就需要我们使用多台机器搭建分布式数据库，这时候就会用到mongodb里面的分片技术。

### 2.分片技术

mongodb采用将集合拆分，然后将拆分的数据均摊到几个分片上的一种解决方案。
![](https://raw.githubusercontent.com/Los-GTI/Los-GTI.github.io/master/img/分片技术.png)

##### 2.1 原理解释

###### 2.1.1 人脸

代表客户端，客户端肯定说，你数据库分片不分片跟我没关系，我叫你干啥就干啥，没什么好商量的。

###### 2.1.2 mongos

首先我们要了解”片键“的概念，也就是说拆分集合的依据是什么？按照什么键值进行拆分集合....好了，mongos就是一个路由服务器，它会根据管理员设置的“片键”将数据分摊到自己管理的mongod集群，数据和片的对应关系以及相应的配置信息保存在"config服务器"上。

###### 2.1.3 mongod

一个普通的数据库实例，如果不分片的话，我们会直接连上mongod。

### 3.实战

> mongodb版本为2.6，其他版本可能会出现一些问题。

我们的目标是在两台主机上搭建一个mongodb数据库集群，在主机A上准备2个mongod程序，在主机B上准备一个mongod程序，然后利用主机A的mongos去启动主机B上的mongod程序，最后进行一下测试。

###### 3.1在主机A上准备两个mongod程序

这里我以多个文件夹的形式，当然你也可以在均摊在不同磁盘上

![](https://raw.githubusercontent.com/Los-GTI/Los-GTI.github.io/master/img/分片.png)



###### 3.2 开启主机A的config服务器

　先前也说了，mongos要把mongod之间的配置放到config服务器里面，理所当然首先开启它，我这里就建立2222端口。

> 从现在开始所有开启的服务都不要关闭，也就是所有开启的cmd命令框都不要关闭

![](https://raw.githubusercontent.com/Los-GTI/Los-GTI.github.io/master/img/开启config服务.png)



###### 3.3开启mongos服务器

这里要注意的是我们开启的是mongos，不是mongod，同时指定下config服务器，这里我就开启F盘上的mongodb，端口3333。

![](https://raw.githubusercontent.com/Los-GTI/Los-GTI.github.io/master/img/开启mongos.png)

###### 3.4 启动mongod服务器

对分片来说，也就是要添加片了，这里开启F盘的mongotest1、mongotest2文件夹的mongodb，端口为4444和5555。

![](https://raw.githubusercontent.com/Los-GTI/Los-GTI.github.io/master/img/mongotest1开启.png)

![](https://raw.githubusercontent.com/Los-GTI/Los-GTI.github.io/master/img/开启mongotest2.png)

###### 3.5 服务配置

> 最后还差一定配置我们就可以完成主机A的分片。

###### 3.5.1 

 先前图中也可以看到，我们client直接跟mongos打交道，也就说明我们要连接mongos服务器，然后将4444，5555的mongod交给mongos,添加分片也就是addshard()。

![](https://raw.githubusercontent.com/Los-GTI/Los-GTI.github.io/master/img/addshard.png)

> 这里要注意的是，在addshard中，我们也可以添加副本集，这样能达到更高的稳定性。

###### 3.5.2

分片已经集群了，但是mongos不知道该如何切分数据，也就是我们先前所说的片键，在mongodb中设置片键要做两步

开启数据库分片功能，命令很简单 enablesharding(),这里我就开启test数据库。

指定集合中分片的片键，这里我就指定为person.name字段。

![](https://raw.githubusercontent.com/Los-GTI/Los-GTI.github.io/master/img/片键.png)

###### 3.5.3 查看效果

好了，至此我们在主机A上的分片操作全部结束，接下来我们通过mongos向mongodb插入10w记录，然后通过printShardingStatus命令查看mongodb的数据分片情况。

![](https://raw.githubusercontent.com/Los-GTI/Los-GTI.github.io/master/img/查看效果.png)

 这里主要看三点信息：

 ① shards：我们清楚的看到已经别分为两个片了，shard0000和shard0001。

 ② databases：这里有个partitioned字段表示是否分区，这里清楚的看到test已经分区。

③ chunks：这个很有意思，我们发现集合被砍成四段：无穷小 —— jack0，jack0 ——jack999，jack999——无穷大。分区情况为：2：1，从后面的 on shardXXXX也能看得出。

###### 4两台主机搭建

同样的方法在主机B上进行分片操作，分片结束之后将主机A与主机B进行通信，然后利用主机A的mongos去操作主机B上的分片。因为我这边没有同时开启主机B的服务，所以截图暂时不放上来。

具体操作为：主机Aping 主机B的IP地址。

利用主机A的mongos操作主机B的分片。

>摁钉,author chong Los-GTI

{'fraction_non_alphanumeric': 0.15035799522673032, 'fraction_numerical': 0.03341288782816229, 'mean_word_length': 6.9498644986449865, 'pattern_counts': {'":': 0, '<': 4, '<?xml version=': 0, '>': 14, 'https://': 18, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '4883513', 'n_tokens_mistral': 4083, 'n_tokens_neox': 4279, 'n_words': 182}