[TOC]
## 1.环境信息
| 服务器1 | 服务器2 | 服务器3 |
| --- | --- | ---|
| 192.168.86.131 | 192.168.86.132 | 192.168.86.133 |
| 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 主节点 |
## 2.端口分配
mongos:20000
config:21000
shard1:27001
shard2:27002
shard3:27003
## 3.下载安装mongodb
```
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-amazon-4.0.9.tgz
tar -xzvf mongodb-linux-x86_64-amazon-4.0.9.tgz -C /usr/local/
```
## 4.建立软连接并配置path
```
cd /usr/local/
ln -s /usr/local/mongodb-linux-x86_64-amazon-4.0.9 /usr/local/mongodb
```
编辑/etc/profile
```
export MONGODB_HOME=/usr/local/mongodb
export PATH=$MONGODB_HOME/bin:$PATH
```
```
source /etc/profile
```
## 5.创建日志和数据目录
```
mkdir -p /usr/local/mongodb/conf \
mkdir -p /usr/local/mongodb/mongos/log \
mkdir -p /usr/local/mongodb/config/data \
mkdir -p /usr/local/mongodb/config/log \
mkdir -p /usr/local/mongodb/shard1/data \
mkdir -p /usr/local/mongodb/shard1/log \
mkdir -p /usr/local/mongodb/shard2/data \
mkdir -p /usr/local/mongodb/shard2/log \
mkdir -p /usr/local/mongodb/shard3/data \
mkdir -p /usr/local/mongodb/shard3/log
```
## 6.config server 配置服务器
**mongodb3.4版本之后要求配置服务器也创建副本集,不然集群搭建不成功。**
```
vi /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/configsrv.log
logappend = true
bind_ip = 0.0.0.0
port = 21000
fork = true
#declare this is a config db of a cluster;
configsvr = true
#副本集名称
replSet = configs
#设置最大连接数
maxConns = 20000
```
启动三台服务器的config server
```
mongod -f /usr/local/mongodb/conf/config.conf
```
登录任意一台配置服务器,初始化配置副本集
```
#连接MongoDB
mongo --port 21000
```
配置config变量
```
config = {
_id : "configs",
members : [
{ _id : 0, host : "192.168.86.131:21000" },
{ _id : 1, host : "192.168.86.132:21000" },
{ _id : 2, host : "192.168.86.133:21000" }
]
}
```
初始化副本集
```
rs.initiate(config)
```
其中`"_id" : "configs"`应与配置文件中replication.replSetName一致,"members"中的"host"为三个节点的ip和port
响应内容如下
```
config = {
_id : "configs",
members: [
{ _id : 0, host : "192.168.86.131:21000" },
{ _id : 1, host : "192.168.86.132:21000" },
{ _id : 2, host : "192.168.86.133:21000" }
]
}
{
"_id" : "configs",
"members" : [
{
"_id" : 0,
"host" : "192.168.86.131:21000"
},
{
"_id" : 1,
"host" : "192.168.86.132:21000"
},
{
"_id" : 2,
"host" : "192.168.86.133:21000"
},
]
}
> rs.initiate(config);
{
"ok" : 1,
"operationTime" : Timestamp(1517369899, 1),
"$gleStats" : {
"lastOpTime" : Timestamp(1517369899, 1),
"electionId" : ObjectId("000000000000000000000000")
},
"$clusterTime" : {
"clusterTime" : Timestamp(1517369899, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
configs:SECONDARY>
```
## 7.配置分片服务器
### 7.1.设置第一个分片服务器
三台服务器都需要配置
```
vi /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
#declare this is a shard db of a cluster;
shardsvr = true
#设置最大连接数
maxConns = 20000
```
启动三台服务器的shard1 server
```
mongod -f /usr/local/mongodb/conf/shard1.conf
```
登录任意一台服务器,初始化副本集(除了192.168.86.133),**因为仲裁服务器没有访问权限,会初始化失败。**
连接mongodb
```
mongo --port 27001
```
```
# 使用admin数据库,定义副本集配置
> use admin
> config = {
_id : "shard1",
members : [
{_id : 0, host : "192.168.86.131:27001" },
{_id : 1, host : "192.168.86.132:27001" },
{_id : 2, host : "192.168.86.133:27001" , arbiterOnly: true }
]
}
#初始化副本集配置
rs.initiate(config)
```
响应内容如下
```
> use admin
switched to db admin
> config = {
... _id : "shard1",
... members : [
... {_id : 0, host : "192.168.86.131:27001" },
... {_id : 1, host : "192.168.86.132:27001" },
... {_id : 2, host : "192.168.86.133:27001" , arbiterOnly: true }
... ]
... }
{
"_id" : "shard1",
"members" : [
{
"_id" : 0,
"host" : "192.168.86.131:27001"
},
{
"_id" : 1,
"host" : "192.168.86.132:27001"
},
{
"_id" : 2,
"host" : "192.168.86.133:27001",
"arbiterOnly" : true
}
]
}
> rs.initiate(config)
{ "ok" : 1 }
```
### 7.2.设置第二和第三个分片服务器
第二、第三个服务器配置过程同上,只需将配置文件中的服务器名称改为shard2、shard3,将端口改为27002,27003即可,仲裁服务器分别选择第二个和第三个。
## 8.配置路由服务器 mongos
### 8.1.配置并初始化
三台服务器都需要操作
先启动配置服务器和分片服务器,后启动路由实例
```
vi /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 = 20000
fork = true
#监听的配置服务器,只能有1个或者3个 configs为配置服务器的副本集名字
configdb = configs/192.168.86.131:21000,192.168.86.132:21000,192.168.86.133:21000
#设置最大连接数
maxConns = 20000
```
启动三台服务器的mongos server
```
mongos -f /usr/local/mongodb/conf/mongos.conf
```
### 8.2.串联路由服务器
目前搭建了mongodb配置服务器、路由服务器,各个分片服务器,不过应用程序连接到mongos路由服务器并不能使用分片机制,还需要在程序里设置分片配置,让分片生效。
登录任意一台mongos
```
mongo --port 20000
# 使用admin数据库
use admin
# 串联路由服务器与分配副本集
sh.addShard("shard1/192.168.86.131:27001,192.168.86.132:27001,192.168.86.123:27001");
sh.addShard("shard2/192.168.86.131:27002,192.168.86.132:27002,192.168.86.133:27002");
sh.addShard("shard3/192.168.86.131:27003,192.168.86.132:27003,192.168.86.133:27003");
# 查看集群状态
sh.status()
# 响应内容如下
mongos> sh.status()
--- Sharding Status ---
sharding version: {
"_id" : 1,
"minCompatibleVersion" : 5,
"currentVersion" : 6,
"clusterId" : ObjectId("5a713a37d56e076f3eb47acf")
}
shards:
{ "_id" : "shard1", "host" : "shard1/192.168.86.131:27001,192.168.86.132:27001", "state" : 1 }
{ "_id" : "shard2", "host" : "shard2/192.168.86.132:27002,192.168.86.133:27002", "state" : 1 }
{ "_id" : "shard3", "host" : "shard3/192.168.86.131:27003,192.168.86.133:27003", "state" : 1 }
active mongoses:
"4.0.9" : 3
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>
```
## 9.启用集合分片
目前配置服务、路由服务、分片服务、副本集服务都已经串联起来了,但我们的目的是希望插入数据,数据能够自动分片。连接在mongos上,准备让指定的数据库、指定的集合分片生效。
登录任意一台mongos
```
mongo --port 20000
# 使用admin数据库
use admin
```
指定testdb分片生效,如下图:
![](https://img.kancloud.cn/9e/f0/9ef0f96f4680f4f62c064e255b7d427a_382x130.png)
指定数据库里需要分片的集合和片键,哈希id分片(注意:分片的字段数据应该是变化的,不然分片不成功),如下图:
![](https://img.kancloud.cn/2a/0b/2a0b7fe47fd894ee517e0e19d2509bd2_638x152.png)
```
#切换到testdb数据库
use testdb;
# 插入测试数据
for(i=1;i<=100000;i++){db.table1.insert({"id":i,"name":"sunlei"+i})};
# 查看总条数
db.table1.aggregate([{$group : {_id : "$name", total : {$sum : 1}}}])
# 查看分片情况
db.table1.stats()
```
结论:数据基本均匀
- Golang
- 基础知识
- 基本数据类型
- 运算符
- 变量&常量
- 流程控制
- 数组
- 切片
- string操作
- Map及实现原理
- Go其他
- CLI命令
- Golang内置类型和函数
- init函数和main函数
- 网络编程
- 互联网协议
- socket编程
- 单元测试
- 并发编程
- channel
- 优雅地关闭channel
- Mutex
- GMP原理与调度
- Go Web
- HTTP Server
- gin框架
- 快速入门
- HTML渲染
- JSONP
- Multipart/Urlencoded绑定
- PureJSON
- gin路由
- beego框架
- Bee工具安装
- 配置模块
- Web模块
- 路由
- 数据操作
- Go操作Mysql数据库
- Go操作redis
- mongo-driver
- sqlx库
- 操作etcd
- msgpack
- 网络爬虫
- 获取页面
- 标准库
- IO操作
- 文件操作
- fmt
- 格式化输出
- flag
- log
- time
- strconv
- template
- os
- sync.Mutex
- Context
- 第三方库
- zap库
- viper
- validator参数校验
- GORM
- 基础
- CRUD接口
- INI
- GoFrame
- 快速开始
- 微服务
- go-kit
- gRPC
- Protocol Buffers 语法指南
- go-zero
- 相关名词解释
- 数据结构和算法
- 基础知识
- 链表
- Golang GUI
- fyne基础
- 显示时间
- RabbitMQ-Go
- centos7 安装rabbitmq-server
- RabbitMQ介绍
- 工作队列
- Go设计模式
- 设计模式的分类
- 简单工厂模式
- golang自举编译
- 了解sync.Once
- 知识碎片
- 常见问题
- 开源项目
- Anaconda
- 介绍、使用教程
- Python
- Python基础知识
- Python之禅
- 变量和类型
- 流程控制
- Python运维
- Python内置工具
- 命令行工具
- 包管理工具pip
- 小爬虫笔记
- I/O操作
- requests库
- requests基本使用
- BeautifulSoup库
- BeautifulSoup基本使用
- Scrapy框架
- 数据可视化
- Django
- Django起步
- OpenCV
- OpenCV入门
- 前端
- HTML
- CSS
- CSS权重计算
- Javascript
- 基础
- JS基础知识
- 监听事件
- 字符串操作
- 数组操作
- 输入输出
- 定时器
- 样式操作
- 获取url参数
- Typescript
- Pick 与 Omit TS内置类型
- Vue.js
- Vue.js介绍
- Vue.js基础
- Vue指令
- v-model
- v-for
- 指令修饰符
- Q&A
- 命令
- Vue3
- node.js
- node.js基础
- npm遇到的问题
- 相关工具安装
- nvm使用教程
- 工程化webpack
- Linux
- Linux基础
- 符号链接
- Shell
- 脚本执行方式
- 数据的输入输出
- 脚本执行中的问题
- tcpdump
- 正则表达式
- Elasticsearch
- Docker
- Docker的基础概念与操作
- Docker 安装
- 容器技术原理
- Docker核心概念
- Docker基本操作
- 镜像相关操作
- 容器相关操作
- 镜像加速器
- Dockerfile
- COPY复制文件
- Docker所遇问题
- ansible
- ansible入门
- k8s
- 安装工具
- kubectl
- Git
- gitlab
- gitlab备份与恢复
- gitlab基本使用
- git使用
- git常用命令
- git提交问题
- git提交规范
- 数据库
- MySQL
- MySQL介绍
- mariadb安装
- 主主复制
- 数据库问题集结
- 开启binlog
- MySQL常用命令
- SQL总结
- MySQL性能优化系列
- 第一章 初始化安装和简单安全加固
- MySQL配置模板
- Redis
- Redis简单使用
- Redis常见问题
- Redis集群
- Redis Cluster概述
- 数据分布
- 搭建集群
- MongoDB
- mongodb分片
- MongoDB分片集群设置密码验证
- TiDB
- 单机模拟部署生产环境集群
- 服务器
- CentOS
- 配置阿里云的yum源和epel源
- centos7 实现NFS文件共享
- rsync
- centos7 源码编译rsync
- rsync实现文件同步
- 添加删除swap分区
- 清除buff/cache
- 配置ntp时间同步
- centos7安装pip
- centos7虚拟机启动报xfs错误
- centos7常用命令
- centos7安装mysql
- centos7安装python3.x
- centos7升级gcc、g++
- centos7安装nginx
- centos7部署Nexus
- centos7离线安装python3
- centos7.6编译mariadb10.5.22
- CentOS8
- 银河麒麟V4
- nginx编译
- 银河麒麟V10_x86
- 安装VNC
- 单用户模式
- UOS
- 配置本地apt源
- apt安装vnc-server
- UOS单用户模式
- UOS创建自启动脚本
- 源码编译
- oniguruma编译
- Proxmox VE
- PVE基本使用
- PVE故障
- KVM
- KVM相关命令
- 银河麒麟V10_x86安装kvm
- UOS_arm64安装kvm
- yum、rpm、apt
- dpkg、apt-get、yum和rpm的区别
- rpm打包
- yum相关问题
- 内建银河麒麟的apt源
- 其他软件
- JuiceFS
- nacos
- 常见命令
- 硬盘分区
- Linux常见问题
- 其他
- Cloc代码统计工具
- onlyoffice 在线文档编辑
- onlyoffice添加中文字体
- 遇到的问题
- 网络通信协议
- 部署相关记录
- Vmware workstation虚拟机迁移到PVE指南
- 小操作