当前位置: 首页 > news >正文

MongoDB高可用架构:Replica Sets+Sharding

MongoDB的sharding解决了海量存储和动态扩容的问题。但是遇到单点故障就显得无能为力了。MongoDB的副本集可以很好的解决单点故障的问题。所以就有了Sharding+Replica Sets的高可用架构了。

 

架构图如上所述

环境配置如下:

1:Shard服务器:使用Replica Sets确保每个数据节点的数据都有备份,自动容灾转移,自动恢复的能力。

2:Config服务器:使用3个配置服务器确保元数据完整性。

3:路由进程:使用3个路由进程实现平衡,提高客户端接入的性能。

4:6个分片进程:Shard A_1、Shard A_2、Shard A_3组成一个副本集Shard A。Shard B_1、Shard B_2

、Shard B_3组成另外一个副本集 Shard B。

ServerIP进程以及端口

Server A

192.168.91.128

Mongod Shard A_1:27017

Mongod Shard B_1:27018

Mongod config:30000

Mongos:40000

Server B

192.168.91.129

Mongod Shard A_2:27017

Mongod Shard B_2:27018

Mongod config:30000

Mongos:40000

Server C

192.168.91.130

Mongod Shard A_3:27017

Mongod Shard B_3:27018

Mongod config:30000

Mongos:40000

1:在Server A上启动mongod Shard A_1

[root@localhost mongodb]# ./bin/mongod --shardsvr --replSet shard1 --port 27017 --dbpath ./data/servera --logpath ./log/loga/sharda1 --fork
about to fork child process, waiting until server is ready for connections.
forked process: 4838
child process started successfully, parent exiting

  

在Server B上启动mongod Shard A_2

[root@localhost mongodb]# ./bin/mongod --shardsvr --replSet shard1 --port 27017 --dbpath ./data/servera --logpath ./log/loga/shardb1 --fork
about to fork child process, waiting until server is ready for connections.
forked process: 4540
child process started successfully, parent exiting

在Server C上启动mongod Shard A_3

[root@localhost mongodb]# ./bin/mongod --shardsvr --replSet shard1 --port 27017 --dbpath ./data/servera --logpath ./log/loga/shardc1 --fork
about to fork child process, waiting until server is ready for connections.
forked process: 4505
child process started successfully, parent exiting

  

在3台服务器的任意一台上执行

[root@localhost mongodb]# ./bin/mongo 
MongoDB shell version: 2.6.9
connecting to: test

> config={_id:"shard1",members:[
...  {_id:0,host:"192.168.91.128:27017"},
...  {_id:1,host:"192.168.91.129:27017"},
...  {_id:2,host:"192.168.91.130:27017"}
... ]}
{
	"_id" : "shard1",
	"members" : [
		{
			"_id" : 0,
			"host" : "192.168.91.128:27017"
		},
		{
			"_id" : 1,
			"host" : "192.168.91.129:27017"
		},
		{
			"_id" : 2,
			"host" : "192.168.91.130:27017"
		}
	]
}

> rs.initiate(config)
{
	"info" : "Config now saved locally.  Should come online in about a minute.",
	"ok" : 1
}

  

 

2:在Server A上启动mongod Shard B_1

[root@localhost mongodb]# ./bin/mongod --shardsvr --replSet shard2 --port 27018 --dbpath ./data/serverb --logpath ./log/logb/shardb1 --fork
about to fork child process, waiting until server is ready for connections.
forked process: 5150
child process started successfully, parent exiting

在Server B上启动mongod Shard B_2

[root@localhost mongodb]# ./bin/mongod --shardsvr --replSet shard2 --port 27018 --dbpath ./data/serverb --logpath ./log/logb/shardb2 --fork
about to fork child process, waiting until server is ready for connections.
forked process: 4861
child process started successfully, parent exiting

在Server C上启动mongod Shard B_3

[root@localhost mongodb]# ./bin/mongod --shardsvr --replSet shard2 --port 27018 --dbpath ./data/serverb --logpath ./log/logb/shardb3 --fork
about to fork child process, waiting until server is ready for connections.
forked process: 4800
child process started successfully, parent exiting

  

[root@localhost mongodb]# ./bin/mongo --port 27018
MongoDB shell version: 2.6.9
connecting to: 127.0.0.1:27018/test
> config={_id:"shard2",members:[
... ...  {_id:0,host:"192.168.91.128:27018"},
... ...  {_id:1,host:"192.168.91.129:27018"},
... ...  {_id:2,host:"192.168.91.130:27018"}
... ... ]}
{
	"_id" : "shard2",
	"members" : [
		{
			"_id" : 0,
			"host" : "192.168.91.128:27018"
		},
		{
			"_id" : 1,
			"host" : "192.168.91.129:27018"
		},
		{
			"_id" : 2,
			"host" : "192.168.91.130:27018"
		}
	]
}
> rs.initiate(config)
{
	"info" : "Config now saved locally.  Should come online in about a minute.",
	"ok" : 1
}

注意:

到这里可以检查A、B、C上的相应的监听服务是否正常?

[root@localhost mongodb]# netstat -nat | grep 2701

  

副本集至此配置完毕。

3:分别在3台服务器上配置Config Server

在Server A上执行:

[root@localhost mongodb]# ./bin/mongod --port 30000 --dbpath ./data --logpath ./log/configlog --fork
about to fork child process, waiting until server is ready for connections.
forked process: 5430
child process started successfully, parent exiting

在Server B上执行:

[root@localhost mongodb]# ./bin/mongod --port 30000 --dbpath ./data --logpath ./log/configlog --fork
about to fork child process, waiting until server is ready for connections.
forked process: 5120
child process started successfully, parent exiting

在Server C上执行:

[root@localhost mongodb]# ./bin/mongod --port 30000 --dbpath ./data --logpath ./log/configlog --fork
about to fork child process, waiting until server is ready for connections.
forked process: 5056
child process started successfully, parent exiting

  

4:配置Route Process

 

在Server A上执行:

[root@localhost mongodb]# ./bin/mongos --configdb 192.168.91.128:30000,192.168.91.129:30000,192.168.91.130:30000 --port 40000 --logpath ./log/route.log --chunkSize 1 --fork
about to fork child process, waiting until server is ready for connections.
forked process: 5596
child process started successfully, parent exiting

 

chunkSize :指定chunk的大小,默认为200M。为了方便测试指定为1M。意思是当这个分片中插入的数据大于1M时候开始数据转移。

 

5:配置分片的表和片键

[root@localhost mongodb]# ./bin/mongo --port 40000
MongoDB shell version: 2.6.9
connecting to: 127.0.0.1:40000/test
mongos> use admin
switched to db admin
mongos> db.runCommand({addshard:"shard1/192.168.91.128:27017,192.168.91.129:27017,192.168.91.130:27017})
2015-05-06T00:38:37.360-0700 SyntaxError: Unexpected token ILLEGAL
mongos> db.runCommand({addshard:"shard1/192.168.91.128:27017,192.168.91.129:27017,192.168.91.130:27017"})
{ "shardAdded" : "shard1", "ok" : 1 }
mongos> db.runCommand({addshard:"shard2/192.168.91.128:27018,192.168.91.129:27018,192.168.91.130:27018"})
{ "shardAdded" : "shard2", "ok" : 1 }

  

mongos> db.person.insert({"uid":1,"uname":"gechong","tel":"158"})
WriteResult({ "nInserted" : 1 })
mongos> db.runCommand({enablesharding:"person"})
{ "ok" : 1 }
mongos> db.runCommand({shardcollection:"person.per",key:{_id:1}})
{ "collectionsharded" : "person.per", "ok" : 1 }

使用person库的per集合来做分片。片键是_id.

至此整个架构已经部署完毕。

 

相关文章:

  • 实验二 Java面向对象程序设计
  • Linq之求和,平均值,最大值,最小值
  • Android 中文API (70) —— BluetoothDevice[蓝牙]
  • 动态数组排序实例
  • Nginx 反向代理、负载均衡与动静分离
  • [裴礼文数学分析中的典型问题与方法习题参考解答]4.4.9
  • 贪心 URAL 1303 Minimal Coverage
  • 使用JS或jQuery模拟鼠标点击a标签事件代码
  • 创建activiti工作流所需23张表
  • Spring Userservice-用户登录,登录数据库密码存储以及防止暴力破解
  • 复习之webview(观看张荣超视频)
  • Android6 Socket通信
  • 给列表项目添加动画
  • R(1)Mac OS 下安装R语言开发环境
  • PHP自动加载__autoload的工作机制
  • 08.Android之View事件问题
  • CSS盒模型深入
  • ES6 ...操作符
  • Javascript编码规范
  • JavaWeb(学习笔记二)
  • PHP 的 SAPI 是个什么东西
  • QQ浏览器x5内核的兼容性问题
  • react-core-image-upload 一款轻量级图片上传裁剪插件
  • spring boot 整合mybatis 无法输出sql的问题
  • 技术胖1-4季视频复习— (看视频笔记)
  • 简单实现一个textarea自适应高度
  • %@ page import=%的用法
  • (20050108)又读《平凡的世界》
  • (4)事件处理——(7)简单事件(Simple events)
  • (android 地图实战开发)3 在地图上显示当前位置和自定义银行位置
  • (二)换源+apt-get基础配置+搜狗拼音
  • (分布式缓存)Redis哨兵
  • (力扣)循环队列的实现与详解(C语言)
  • (每日持续更新)jdk api之FileReader基础、应用、实战
  • (十五)使用Nexus创建Maven私服
  • (四)汇编语言——简单程序
  • (五)大数据实战——使用模板虚拟机实现hadoop集群虚拟机克隆及网络相关配置
  • (转)mysql使用Navicat 导出和导入数据库
  • * CIL library *(* CIL module *) : error LNK2005: _DllMain@12 already defined in mfcs120u.lib(dllmodu
  • .net 打包工具_pyinstaller打包的exe太大?你需要站在巨人的肩膀上-VC++才是王道
  • .Net中ListT 泛型转成DataTable、DataSet
  • @serverendpoint注解_SpringBoot 使用WebSocket打造在线聊天室(基于注解)
  • [ 环境搭建篇 ] 安装 java 环境并配置环境变量(附 JDK1.8 安装包)
  • [AIGC] SQL中的数据添加和操作:数据类型介绍
  • [android] 天气app布局练习
  • [BZOJ1178][Apio2009]CONVENTION会议中心
  • [C++]指针与结构体
  • [Deepin 15] 编译安装 MySQL-5.6.35
  • [GYCTF2020]Ez_Express
  • [iOS]-网络请求总结
  • [javaSE] GUI(Action事件)
  • [Java基础]—JDBC
  • [LeetCode]—Permutations 求全排列
  • [LeetCode]—Permutations II 求全排列(有重复值)
  • [PyTorch][chapter 63][强化学习-QLearning]