我们的一个已投产项目的高可用数据库实战 - mongo 副本集的搭建具体过程
主库进行写操作,两台从库进行读操作(至于某次读操作到底路由给了哪台,仲裁决定)。实现了读写分离。这还不止,假设主库宕掉,还能实现不须要用户干预的情况下。将主库自己主动切换到另外两台从库中的某一台,真正实现了 db 的高可用。
1. 背景
1.1 环境
- CPU核数:4
- 内存配置:8G
- 带宽:100MB
- 磁盘:系统盘 40G,数据盘 180G
- 操作系统版本号:Ubuntu 14.04 64位
1.2 系统部署结构图
2. MongoDB 副本集环境搭建
2.1 安装包下载
最新 MongoDB 安装包下载地址:
https://www.mongodb.org/downloads#production
选择适合我们操作系统的版本号下载。最新版本号是 mongodb-linux-x86_64-ubuntu1404-3.2.1.tgz,大小 74MB。
2.2 MongoDB 的安装和设置环境变量
解压到当前文件夹:
$ ):
$ ):
$ ):
$ ):
$
2.4.4 生产库、生产用户的创建
先把原来启动的实例依次关闭,顺序是两个 slave 节点、主节点、仲裁节点:
rs1:SECONDARY>
rs1:SECONDARY>
rs1:PRIMARY>
rs1:SECONDARY>
rs1:PRIMARY> ,
"state" : 8,
"stateStr" : "(not reachable/healthy)",
"uptime" : 0,
"optime" : {
"ts" : Timestamp(0, 0),
"t" : NumberLong(-1)
},
"optimeDate" : ISODate("1970-01-01T00:00:00Z"),
"lastHeartbeat" : ISODate("2016-02-27T03:00:27.031Z"),
"lastHeartbeatRecv" : ISODate("2016-02-27T02:43:57.294Z"
),
"pingMs" : NumberLong(0),
"lastHeartbeatMessage" : "Connection refused",
"configVersion" : -1
},
{
"_id" : 1,
"name" : "somehost:27018",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 2070279,
"optime" : {
"ts" : Timestamp(1456542007, 2),
"t" : NumberLong(3)
},
"optimeDate" : ISODate("2016-02-27T03:00:07Z"),
"lastHeartbeat" : ISODate("2016-02-27T03:00:26.860Z"),
"lastHeartbeatRecv" : ISODate("2016-02-27T03:00:27.287Z"
),
"pingMs" : NumberLong(0),
"syncingTo" : "somehost:27019",
"configVersion" : 4
},
{
"_id" : 2,
"name" : "somehost:27019",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 2070280,
"optime" : {
"ts" : Timestamp(1456542007, 2),
"t" : NumberLong(3)
},
"optimeDate" : ISODate("2016-02-27T03:00:07Z"),
"electionTime" : Timestamp(1456541048, 1),
"electionDate" : ISODate("2016-02-27T02:44:08Z"),
"configVersion" : 4,
"self" : true
},
{
"_id" : 3,
"name" : "somehost:30000",
"health" : 1,
"state" : 7,
"stateStr" : "ARBITER",
"uptime" : 2070226,
"lastHeartbeat" : ISODate("2016-02-27T03:00:26.859Z"),
"lastHeartbeatRecv" : ISODate("2016-02-27T03:00:25.360Z"
),
"pingMs" : NumberLong(0),
"configVersion" : 4
}
],
"ok" : 1
}
原来的端口号为 27017 的主节点健康标记已为 0(不可用)。
查看仲裁日志:
2016-02-27T10:44:02.924+0800 I ASIO [ReplicationExecutor] dropping unhealthy pooled connection to somehost:27017
2016-02-27T10:44:02.924+0800 I ASIO [ReplicationExecutor] after drop, pool was empty, going to spawn some connections
2016-02-27T10:44:02.924+0800 I REPL [ReplicationExecutor] Error in heartbeat request to somehost:27017; HostUnreachable Connection refused
可见尽管仲裁已经放弃了对 27017 的连接,但还是会一直给 27017 发心跳包以待其恢复正常后继续使用。
为了验证这个我们再将 27017 重新启动:
$ ,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 57,
"optime" : {
"ts" : Timestamp(1456542907, 4),
"t" : NumberLong(3)
},
"optimeDate" : ISODate("2016-02-27T03:15:07Z"),
"lastHeartbeat" : ISODate("2016-02-27T03:16:57.609Z"),
"lastHeartbeatRecv" : ISODate("2016-02-27T03:16:59.124Z"
),
"pingMs" : NumberLong(0),
"syncingTo" : "somehost:27019",
"configVersion" : 4
},
{
"_id" : 1,
"name" : "somehost:27018",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 2071270,
"optime" : {
"ts" : Timestamp(1456542907, 4),
"t" : NumberLong(3)
},
"optimeDate" : ISODate("2016-02-27T03:15:07Z"),
"lastHeartbeat" : ISODate("2016-02-27T03:16:59.207Z"),
"lastHeartbeatRecv" : ISODate("2016-02-27T03:16:57.656Z"
),
"pingMs" : NumberLong(0),
"syncingTo" : "somehost:27019",
"configVersion" : 4
},
{
"_id" : 2,
"name" : "somehost:27019",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 2071271,
"optime" : {
"ts" : Timestamp(1456542907, 4),
"t" : NumberLong(3)
},
"optimeDate" : ISODate("2016-02-27T03:15:07Z"),
"electionTime" : Timestamp(1456541048, 1),
"electionDate" : ISODate("2016-02-27T02:44:08Z"),
"configVersion" : 4,
"self" : true
},
{
"_id" : 3,
"name" : "somehost:30000",
"health" : 1,
"state" : 7,
"stateStr" : "ARBITER",
"uptime" : 2071217,
"lastHeartbeat" : ISODate("2016-02-27T03:16:59.205Z"),
"lastHeartbeatRecv" : ISODate("2016-02-27T03:16:55.506Z"
),
"pingMs" : NumberLong(0),
"configVersion" : 4
}
],
"ok" : 1
}
可见 27017 节点已恢复正常,并作为 slave 节点进行服务。仲裁的日志也说明了这个:
2016-02-27T11:16:03.721+0800 I ASIO [NetworkInterfaceASIO-Replication-0] Successfully connected to somehost:27017
2016-02-27T11:16:03.722+0800 I REPL [ReplicationExecutor] Member somehost:27017 is now in state SECONDARY
slave 节点的故障及恢复基本相似与此。
我们的一个已投产项目的高可用数据库实战 - mongo 副本集的搭建具体过程的更多相关文章
- 高可用Hadoop平台-HBase集群搭建
1.概述 今天补充一篇HBase集群的搭建,这个是高可用系列遗漏的一篇博客,今天抽时间补上,今天给大家介绍的主要内容目录如下所示: 基础软件的准备 HBase介绍 HBase集群搭建 单点问题验证 截 ...
- 使用 Sealos 在 3 分钟内快速部署一个生产级别的 Kubernetes 高可用集群
本文首发于:微信公众号「运维之美」,公众号 ID:Hi-Linux. 「运维之美」是一个有情怀.有态度,专注于 Linux 运维相关技术文章分享的公众号.公众号致力于为广大运维工作者分享各类技术文章和 ...
- 高性能Linux服务器 第11章 构建高可用的LVS负载均衡集群
高性能Linux服务器 第11章 构建高可用的LVS负载均衡集群 libnet软件包<-依赖-heartbeat(包含ldirectord插件(需要perl-MailTools的rpm包)) l ...
- 高可用,多路冗余GFS2集群文件系统搭建详解
高可用,多路冗余GFS2集群文件系统搭建详解 2014.06 标签:GFS2 multipath 集群文件系统 cmirror 实验拓扑图: 实验原理: 实验目的:通过RHCS集群套件搭建GFS2集群 ...
- LVS + Keepalived 实现高可用、负载均衡 Web 集群
简介: LVS 是 Linux Virtual Server 的简写,Linux 虚拟服务器的意思,是一个虚拟的服务器集群系统,此项目由章文嵩博士于 1998 年 5 月成立,是中国最早出现的自由软件 ...
- MySQL高可用MHA实战
MySQL高可用架构MHA介绍 简介: MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司youshimaton(现就职 ...
- kubernetes二进制高可用部署实战
环境: 192.168.30.20 VIP(虚拟) 192.168.30.21 master1 192.168.30.22 master2 192.168.30.23 node1 192.168.30 ...
- 使用kubeadm搭建高可用k8s v1.16.3集群
目录 1.部署环境说明 2.集群架构及部署准备工作 2.1.集群架构说明 2.2.修改hosts及hostname 2.3.其他准备 3.部署keepalived 3.1.安装 3.2.配置 3.3. ...
- 使用Nginx+Keepalived组建高可用负载平衡Web server集群
一,首先说明一下网络拓扑结构: 1,Nginx 反向代理Server(HA): ①Nginx master:192.168.1.157 ②Nginx backup:192.168.1. ...
随机推荐
- Offer收割_4
1.水题 2.BFS宽搜(使用优先队列priority_queue) 4.题意:给数组a.要求重排列数组,使得数组中的任意相邻的两个元素不同.如果存在多个方案,那么选择字典序最小的方案. 如果不能满 ...
- go语言Notepad++简易开发环境搭建(windows)
1.下载安装go语言:https://golang.org/dl/选择对应的平台,建议使用msi安装包,这个会帮你配置好环境变量(也许需要重启)对应的环境变量有: GOROOT - C:\Go\PAT ...
- MVC系列学习(一)-新语法
本篇内容: 1.自动属性 2.隐式类型 3.对象初始化器和集合初始化器 4.匿名类型 5.扩展方法 6.Lambda表达式 1.自动属性 使用: class Student { public stri ...
- 【PostgreSQL-9.6.3】分区表
PostgreSQL中的分区表是通过表继承来实现的(表继承博客http://www.cnblogs.com/NextAction/p/7366607.html).创建分区表的步骤如下: (1)创建“父 ...
- easyui 使用笔记
http://www.easyui.info/archives/1435.html datagrid 服务端分页 服务端分页,高效,快捷!强力推荐! easyui的datagrid服务端分页,通过设置 ...
- CAD绘制一个半径标注(com接口VB语言)
主要用到函数说明: _DMxDrawX::DrawDimRadial 绘制一个半径标注.详细说明如下: 参数 说明 DOUBLE dCenterX 被标注的曲线的中点X值 DOUBLE dCenter ...
- Linux cat 命令
cat命令是linux下的一个文本输出命令,通常是用于观看某个文件的内容的:cat主要有三大功能:1.一次显示整个文件.$ cat filename2.从键盘创建一个文件.$ cat > ...
- 通过javascript在iframe中加载html
在spring mvc中,虽然有时候,在控制器中设置返回值是json对象,但在拦截器出现错误的时候,仍然可能返回html(根据设置的不同),如果要展示这些html,最好把他们放入iframe中,以防这 ...
- Luogu P1892 [BOI2003]团伙
P1892 [BOI2003]团伙 题目描述 1920年的芝加哥,出现了一群强盗.如果两个强盗遇上了,那么他们要么是朋友,要么是敌人.而且有一点是肯定的,就是: 我朋友的朋友是我的朋友: 我敌人的敌人 ...
- Win32中 DLL、Lib 库的创建机器使用
Windows 下 的静态库和动态库 一.静态函数库(Lib) 1. 静态函数库的制作(C/C++) —— 打开新建项目,然后选中Win32项目,接着在创建项目中选择 Lib,再接着将函数.实现功能的 ...