高可用性的mongo集群搭建
mongoDB安装
参照:https://docs.mongodb.com/manual/tutorial/install-mongodb-on-red-hat/
配置yum管理包
- 在路径/etc/yum.repos.d/下创建文件mongodb-org-3.4.repo
1
2
3
4
5
6[mongodb-org-3.4]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.4/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-3.4.asc - 安装mongo
1
yum install -y mongodb-org
- mongo相关操作
- 创建用户
1
2
3
4mongo
use admin //切换到admin数据库
db.createUser({user:"root",pwd:"123456",roles:["root"]}) //创建用户
db.auth("root","123456") //验证用户创建是否成功
高可用性的mongo集群
参照:http://www.lanceyan.com/tech/arch/mongodb_shard1.html
三台服务器分配
按表格分别在各服务器进行目录创建:
- 192.168.1.91
| 服务 | 端口 | 日志路径 | 数据路径 |
|---|---|---|---|
| mongos | 20001 | mkdir -p /data/mongodbtest/mongos/log | – |
| Config server | 21001 | mkdir -p /data/mongodbtest/config/log | mkdir -p /data/mongodbtest/config/data |
| Shard server1主节点 | 22001 | mkdir -p /data/mongodbtest/shard1/log | mkdir -p /data/mongodbtest/shard1/data |
| Shard server2副本 | 22002 | mkdir -p /data/mongodbtest/shard2/log | mkdir -p /data/mongodbtest/shard2/data |
| Shard server3仲裁 | 22003 | mkdir -p /data/mongodbtest/shard3/log | mkdir -p /data/mongodbtest/shard3/data |
- 192.168.1.92
| 服务 | 端口 | 日志路径 | 数据路径 |
|---|---|---|---|
| mongos | 20001 | mkdir -p /data/mongodbtest/mongos/log | – |
| Config server | 21001 | mkdir -p /data/mongodbtest/config/log | mkdir -p /data/mongodbtest/config/data |
| Shard server1仲裁 | 22001 | mkdir -p /data/mongodbtest/shard1/log | mkdir -p /data/mongodbtest/shard1/data |
| Shard server2主节点 | 22002 | mkdir -p /data/mongodbtest/shard2/log | mkdir -p /data/mongodbtest/shard2/data |
| Shard server3副本 | 22003 | mkdir -p /data/mongodbtest/shard3/log | mkdir -p /data/mongodbtest/shard3/data |
- 192.168.1.93
| 服务 | 端口 | 日志路径 | 数据路径 |
|---|---|---|---|
| mongos | 20001 | mkdir -p /data/mongodbtest/mongos/log | – |
| Config server | 21001 | mkdir -p /data/mongodbtest/config/log | mkdir -p /data/mongodbtest/config/data |
| Shard server1副本 | 22001 | mkdir -p /data/mongodbtest/shard1/log | mkdir -p /data/mongodbtest/shard1/data |
| Shard server2仲裁 | 22002 | mkdir -p /data/mongodbtest/shard2/log | mkdir -p /data/mongodbtest/shard2/data |
| Shard server3主节点 | 22003 | mkdir -p /data/mongodbtest/shard3/log | mkdir -p /data/mongodbtest/shard3/data |
启动Config server
启动Config server
- 分别配置三台config服务的配置文件,分别在对应config server的conf目录下(/data/mongodbtest/config/conf/)创建mongo_config.conf文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14storage:
dbPath: /data/mongodbtest/config/data
indexBuildRetry: true
systemLog:
destination: file
path: /data/mongodbtest/config/log/config.log
net:
port: 21001
sharding:
clusterRole: configsvr
replication:
replSetName: docdetection
processManagement:
fork: true - 通过配置文件分别启动config配置服务
1
mongod --config /data/mongodbtest/config/conf/mongo_config.conf
- 分别配置三台config服务的配置文件,分别在对应config server的conf目录下(/data/mongodbtest/config/conf/)创建mongo_config.conf文件
初始化config复本集
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22/usr/bin/mongo 127.0.0.1:21001 #使用admin数据库
use admin #定义副本集配置
config ={_id:'docdetection',members:[
{_id:0,host:'192.168.1.91:21001',priority:3},
{_id:1,host:'192.168.1.92:21001',priority:2},
{_id:2,host:'192.168.1.93:21001',priority:1}
]
} #初始化副本集配置
rs.initiate(config); #初始化结束(注意关闭各服务器防火墙)
{ "ok" : 1 } #查看状态
rs.status()启动Shard server(分片服务)
启动各分片服务
分别到各服务器上各shard的conf目录下建文件mongo_config.conf。eg:192.168.1.91
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47# shard1
storage:
dbPath: /data/mongodbtest/shard1/data
indexBuildRetry: true
systemLog:
destination: file
path: /data/mongodbtest/shard1/log/shard1.log
net:
port: 22001
sharding:
clusterRole: shardsvr
replication:
replSetName: shard1
processManagement:
fork: true # shard2
storage:
dbPath: /data/mongodbtest/shard2/data
indexBuildRetry: true
systemLog:
destination: file
path: /data/mongodbtest/shard2/log/shard2.log
net:
port: 22002
sharding:
clusterRole: shardsvr
replication:
replSetName: shard2
processManagement:
fork: true # shard3
storage:
dbPath: /data/mongodbtest/shard3/data
indexBuildRetry: true
systemLog:
destination: file
path: /data/mongodbtest/shard3/log/shard3.log
net:
port: 22003
sharding:
clusterRole: shardsvr
replication:
replSetName: shard3
processManagement:
fork: true通过配置文件分别启动shard分片服务(3*3=9个)
1
2
3mongod --config /data/mongodbtest/shard1/conf/mongo_config.conf
mongod --config /data/mongodbtest/shard2/conf/mongo_config.conf
mongod --config /data/mongodbtest/shard3/conf/mongo_config.conf
初始化各分片服务器副本集
- 设置第一个分片副本集:shard1(保证各副本已启动)注:priority 的值决定主(值大)从关系;arbiterOnly 指定仲裁节点
大专栏 高可用性的mongo集群搭建">
1
2
3
4
5
6
7
8
9
10
11
12
13#设置第一个分片副本集,登录其中一个分片服务器
/usr/bin/mongo 127.0.0.1:22001
#使用admin数据库
use admin
#定义副本集配置
config = { _id:"shard1", members:[
{_id:0,host:"192.168.1.91:22001",priority:2},
{_id:1,host:"192.168.1.92:22001",arbiterOnly:true},
{_id:2,host:"192.168.1.93:22001",priority:1}
]
}
#初始化副本集配置
rs.initiate(config); - 设置第二个分片副本集:shard2
1
2
3
4
5
6
7
8
9
10
11
12
13#设置第二个分片副本集,登录其中一个分片服务器
/usr/bin/mongo 127.0.0.1:22002
#使用admin数据库
use admin
#定义副本集配置
config = { _id:"shard2", members:[
{_id:0,host:"192.168.1.91:22002",priority:1},
{_id:1,host:"192.168.1.92:22002",priority:2},
{_id:2,host:"192.168.1.93:22002",arbiterOnly:true}
]
}
#初始化副本集配置
rs.initiate(config); - 设置第三个分片副本集:shard3
1
2
3
4
5
6
7
8
9
10
11
12
13#设置第三个分片副本集,登录其中一个分片服务器
/usr/bin/mongo 127.0.0.1:22003
#使用admin数据库
use admin
#定义副本集配置
config = { _id:"shard3", members:[
{_id:0,host:"192.168.1.91:22003",arbiterOnly:true},
{_id:1,host:"192.168.1.92:22003",priority:1},
{_id:2,host:"192.168.1.93:22003",priority:2}
]
}
#初始化副本集配置
rs.initiate(config);启动mongos路由服务
- 设置第一个分片副本集:shard1(保证各副本已启动)注:priority 的值决定主(值大)从关系;arbiterOnly 指定仲裁节点
- 配置mongos服务的配置文件,对应的conf目录下创建mongo_config.conf文件
1
2
3
4
5
6
7
8
9systemLog:
destination: file
path: /data/mongodbtest/mongos/log/mongos.log
net:
port: 20001
sharding:
configDB: docdetection/192.168.1.91:21001,192.168.1.92:21001,192.168.1.93:21001
processManagement:
fork: true - 通过配置文件分别启动config配置服务
1
mongos --config /data/mongodbtest/mongos/conf/mongo_config.conf
整合配置、路由、分片服务器
整合配置服务器、路由服务器,各个分片服务器
- 整合配置、路由、分片服务器
- 目前搭建了mongodb配置服务器、路由服务器,各个分片服务器,不过应用程序连接到 mongos 路由服务器并不能使用分片机制,还需要在程序里设置分片配置,让分片生效。分别连接三个mongos,添加分片副本集。
1
2
3
4
5
6
7
8
9
10
11
12
13
14#设置分片配置,登录mongos路由服务器
/usr/bin/mongo 127.0.0.1:20001 #使用admin数据库
use admin #串联路由服务器与分片副本集1
sh.addShard("shard1/192.168.1.91:22001,192.168.1.92:22001,192.168.1.93:22001") #串联路由服务器与分片副本集2
sh.addShard("shard2/192.168.1.91:22002,192.168.1.92:22002,192.168.1.93:22002") #串联路由服务器与分片副本集3
sh.addShard("shard3/192.168.1.91:22003,192.168.1.92:22003,192.168.1.93:22003")
- 目前搭建了mongodb配置服务器、路由服务器,各个分片服务器,不过应用程序连接到 mongos 路由服务器并不能使用分片机制,还需要在程序里设置分片配置,让分片生效。分别连接三个mongos,添加分片副本集。
- 添加创建用户
- 集群管理员账号(mongos和配置服务器的集群管理员用户是可以通用的)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15#以下是创建集群管理员用户步骤(连接其中一台Mongos服务上执行即可)
#登录mongos路由服务器
/usr/bin/mongo 127.0.0.1:20001
#使用admin数据库
use admin
#创建账号及指定权限
db.createUser({
user: "adminRoot",
pwd: "adminbear",
roles: [
{ role: "root", db: "admin" },
{ role: "clusterAdmin", db: "admin" },
{ role: "userAdmin", db: "admin" }
]
}); - 数据库用户
1
2
3
4
5
6
7
8
9
10
11
12#登录mongos路由服务器
/usr/bin/mongo 127.0.0.1:20001
#以下是为数据库名mongoTest,创建数据库用户
use mongoTest;
db.createUser({
user: "mongoTestUser",
pwd: "bear",
roles: [
{ role: "readWrite", db: " mongoTest" }
]
}
);目前配置服务、路由服务、分片服务、副本集服务都已经串联起来了,但我们的目的是希望插入数据,数据能够自动分片。连接在mongos上,准备让指定的数据库、指定的集合分片生效。
- 集群管理员账号(mongos和配置服务器的集群管理员用户是可以通用的)
- 创建数据库,让指定数据库分片生效
- 建库、表、指定应用分片的库
1
2
3
4
5
6
7
8
9
10
11
12
13#登录mongos路由服务器
/usr/bin/mongo 127.0.0.1:20001
#创建或者使用mongoTest数据库
use mongoTest;
#创建mongoTest数据库中的集合
db.createCollection("table1") #新建集合:table1
·
·
·
#切换到admin数据库
use admin
#指定testdb分片生效,mongoTest为数据库名称
db.runCommand( { enablesharding :"mongoTest"}); - 指定分片的表。两种分片方式: Hashed Shard Key与Ranged Shard Key
- Hashed Shard Key:它采用字段的索引哈希值作为 shard key 的取值,这样做可以保证数据的均匀分布。在 mongos 和各个 shard 集群之间存在一个哈希值计算方法,所有的数据在迁移时都是根据这个方法来计算数据应当被迁移到什么地方。当 mongos 接收到一条语句时,通常他会把这条语句广播到所有的 shard 上去执行。
- Ranged Shard Key: 根据 shard key 的取值,它把数据切分成连续的几个区间。取值相近的纪录会放进同一个 shard 服务器。好处是查询连续取值纪录时,查询效率可以得到保证。当数据库查询语句发送到 mongos 中时,mongos 会很快的找到目标 shard,而且不需要将语句发送到所有的 shard 上,一般只需要少量的 shard 就可以完成查询操作。缺点是不能保证数据的平均分配,在数据插入和修改时会产生比较严重的性能瓶颈
1
2
3#指定数据库里需要分片的集合和片键,table1为mongoTest数据库中集合名称
db.runCommand({shardcollection:"mongoTest.table1",key:{"ZZJGDM": "hashed"}}) //Hashed Shard Key
db.runCommand({shardcollection:"mongoTest.table1",key:{_id:1}})// Ranged Shard Key
- 建库、表、指定应用分片的库
高可用性的mongo集群搭建的更多相关文章
- Mongo集群搭建
1.集群角色及架构 在搭建集群之前,需要首先了解几个概念:路由,分片.副本集.配置服务器等 mongos,数据库集群请求的入口,所有的请求都通过mongos进行协调,不需要在应用程序添加一个路由选择器 ...
- 搭建高可用mongo集群3.4版本
搭建高可用mongo集群3.4版本 说在开始之前:在搭建这个环境之前,已经有了一个师兄搭好的环境,虽然一样很棒,但是没有经过自己的手出来的东西,还是不属于自己,所以摸索着自己搭建一个吧,好巧不巧的是, ...
- Kafka 0.9+Zookeeper3.4.6集群搭建、配置,新Client API的使用要点,高可用性测试,以及各种坑 (转载)
Kafka 0.9版本对java client的api做出了较大调整,本文主要总结了Kafka 0.9在集群搭建.高可用性.新API方面的相关过程和细节,以及本人在安装调试过程中踩出的各种坑. 关于K ...
- 基于Hadoop 2.2.0的高可用性集群搭建步骤(64位)
内容概要: CentSO_64bit集群搭建, hadoop2.2(64位)编译,安装,配置以及测试步骤 新版亮点: 基于yarn计算框架和高可用性DFS的第一个稳定版本. 注1:官网只提供32位re ...
- mongo 集群(副本)搭建过程记录
最近搭建mongo集群,回忆总结,作以记录.整个过程主要参考以下两篇文章,但是过程并不顺利,有些问题需要记录.https://www.cnblogs.com/dba-devops/p/7130710. ...
- MongoDB高可用集群搭建(主从、分片、路由、安全验证)
目录 一.环境准备 1.部署图 2.模块介绍 3.服务器准备 二.环境变量 1.准备三台集群 2.安装解压 3.配置环境变量 三.集群搭建 1.新建配置目录 2.修改配置文件 3.分发其他节点 4.批 ...
- windows下mongodb集群搭建
本文介绍在windows环境下如何搭建一个高可用性的mongodb集群.系统环境为win7,mongodb版本为3.6.3. 本文采用的是分片+副本集的方式搭建集群,将分别介绍如何使用副本集和分片来提 ...
- MongoDB 3.4 高可用集群搭建(二)replica set 副本集
转自:http://www.lanceyan.com/tech/mongodb/mongodb_repset1.html 在上一篇文章<MongoDB 3.4 高可用集群搭建(一):主从模式&g ...
- Mongodb集群搭建的三种方式
转自:http://blog.csdn.net/luonanqin/article/details/8497860 MongoDB是时下流行的NoSql数据库,它的存储方式是文档式存储,并不是Key- ...
随机推荐
- 监听配置问题,SID与Service_Name区别
监听配置问题,SID与Service_Name区别 1.数据库实例名SID 概念:数据库实例名用于和操作系统进行联系的标识,是数据库和操作系统之间的交互用的书数据库实例名.实例名也被写入参数文件中,该 ...
- 使用Dom4j生成xml文件(utf-8编码)
xml文件内容: <?xml version="1.0" encoding="UTF-8"?> <result> <code> ...
- Flux转Mono next()
import java.util.LinkedHashMap; import java.util.Map; import java.util.NoSuchElementException; impor ...
- php的执行流程
源代码(人认识)->字节码(解释器认识)->机器码(硬件认识)来看下PHP的执行流程,假设有个a.php文件,不启用opacache的流程如下:a.php->经过zend编译-> ...
- UVA 10269 Super Mario,最短路+动态规划
这个题目我昨晚看到的,没什么思路,因为马里奥有boot加速器,只要中间没有城堡,即可不耗时间和脚力,瞬间移动不超过L距离,遇见城堡就要停下来,当然不能该使用超过K次...我纠结了很久,最终觉得还是只能 ...
- 操作实践,IDEA自定义toString()方法模板
声明:迁移自本人CSDN博客https://blog.csdn.net/u013365635 Java POJO在日志中常会用于打印,经常会将POJO的内容全部或部分打印出来,所以POJO类的toSt ...
- MyBatis从入门到精通(第2章):MyBatis XML方式的基本用法【insert用法、update用法、delete用法】
2.4 insert 用法 2.4.1 简单的 insert方法 在接口 UserMapper.java 中添加如下方法. /** * 新增用户 * @param sysUser * @retur ...
- Codeforces Round #621 (Div. 1 + Div. 2)D dij(思维)
题:https://codeforces.com/contest/1307/problem/D 题意:给定无向图,n为点,m为边.在给个k,为特殊点的数目,题目要求在这些特殊点上连一条边,让新图最短路 ...
- win10环境下pyinstaller打包pytorch遇到的问题及解决方案
pytorch-python源码生成windows的应用程序(.exe),报错OSError: could not get source code Failed to execute script h ...
- BZOJ4059[Cerc2012]Non-boring sequences(扫描线/分治)
这题正解应该是扫描线,就是发现DP的区间在两个维度都为连续段,于是可以直接扫描线.但不幸的是,扫描线常数过大,无法通过本题. 考虑分治.对于分治区间[l,r],可以记录pre和nxt表示其前/后一次出 ...