我们的 mongo 副本集有三台 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 副本集的搭建具体过程的更多相关文章

  1. 高可用Hadoop平台-HBase集群搭建

    1.概述 今天补充一篇HBase集群的搭建,这个是高可用系列遗漏的一篇博客,今天抽时间补上,今天给大家介绍的主要内容目录如下所示: 基础软件的准备 HBase介绍 HBase集群搭建 单点问题验证 截 ...

  2. 使用 Sealos 在 3 分钟内快速部署一个生产级别的 Kubernetes 高可用集群

    本文首发于:微信公众号「运维之美」,公众号 ID:Hi-Linux. 「运维之美」是一个有情怀.有态度,专注于 Linux 运维相关技术文章分享的公众号.公众号致力于为广大运维工作者分享各类技术文章和 ...

  3. 高性能Linux服务器 第11章 构建高可用的LVS负载均衡集群

    高性能Linux服务器 第11章 构建高可用的LVS负载均衡集群 libnet软件包<-依赖-heartbeat(包含ldirectord插件(需要perl-MailTools的rpm包)) l ...

  4. 高可用,多路冗余GFS2集群文件系统搭建详解

    高可用,多路冗余GFS2集群文件系统搭建详解 2014.06 标签:GFS2 multipath 集群文件系统 cmirror 实验拓扑图: 实验原理: 实验目的:通过RHCS集群套件搭建GFS2集群 ...

  5. LVS + Keepalived 实现高可用、负载均衡 Web 集群

    简介: LVS 是 Linux Virtual Server 的简写,Linux 虚拟服务器的意思,是一个虚拟的服务器集群系统,此项目由章文嵩博士于 1998 年 5 月成立,是中国最早出现的自由软件 ...

  6. MySQL高可用MHA实战

    MySQL高可用架构MHA介绍 简介: MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司youshimaton(现就职 ...

  7. kubernetes二进制高可用部署实战

    环境: 192.168.30.20 VIP(虚拟) 192.168.30.21 master1 192.168.30.22 master2 192.168.30.23 node1 192.168.30 ...

  8. 使用kubeadm搭建高可用k8s v1.16.3集群

    目录 1.部署环境说明 2.集群架构及部署准备工作 2.1.集群架构说明 2.2.修改hosts及hostname 2.3.其他准备 3.部署keepalived 3.1.安装 3.2.配置 3.3. ...

  9. 使用Nginx+Keepalived组建高可用负载平衡Web server集群

    一,首先说明一下网络拓扑结构: 1,Nginx 反向代理Server(HA):     ①Nginx master:192.168.1.157     ②Nginx backup:192.168.1. ...

随机推荐

  1. Servlet到Servlet的请求转发与重定向的区别

    Servlet跳转到另一个Servlet中: request.getRequestDispatcher().forward();代表默认的是post方法,即在被跳转的Servlet的doPost()方 ...

  2. 【Spring】AOP

    AOP 编程允许你把遍布应用各处的功能分离出来形成可重用的组件,将安全.事务和日志关注点与你的核心业务逻辑相分离. 面向切面编程往往被定义为促使应用程序分离关注点的一项技术.系统由许多不同组件组成,每 ...

  3. 前端-Node.js思维导图笔记

    看不清的朋友右键保存或者新窗口打开哦!喜欢我可以关注我,还有更多前端思维导图笔记

  4. 解决Android弹出软键盘导致的问题

    一.当Activity启动后EditText直接获取了焦点,此时软键盘会自动弹出,这种体验并不是很好,因此要做的Activity启动不自动弹出软键盘,只需要在Manifest中对应的Activity添 ...

  5. 图解TCP/IP笔记(2)——数据链路

    [转载请注明]https://www.cnblogs.com/igoslly/p/9396066.html ——终端节点之间的包传递 MAC寻址(物理寻址).介质共享.非公有网络.分组交换.环路检测. ...

  6. CSS——样式初始化

    腾讯: body,ol,ul,h1,h2,h3,h4,h5,h6,p,th,td,dl,dd,form,fieldset,legend,input,textarea,select{margin:0;p ...

  7. SQL基本操作——JOIN多表联查

    基本概念 join :用于根据两个或多个表中的列之间的关系,从这些表中查询数据. join和key:有时为了得到完整的结果,我们需要从两个或更多的表中获取结果.我们就需要执行 join.数据库中的表可 ...

  8. python2升级成python3

    系统环境centos 6.5原python版本2.6.6目标python版本3.5.11.下载python3.5wget --no-check-certificate  http://www.pyth ...

  9. 易买网之smartupload实现文件上传

    经过俩个星期的奋斗,易买网项目完工.在之前,实现图片的上传,走过许多弯路,原来是好多基础的知识忘记了,没把smartupload文件包添加组件jar包至WEB-INF/lib包中,在此特别重视,做下文 ...

  10. 实例分割:MaskXRCnn 与Visual Genome数据集

    一.VG数据集 机器学习领域的突破突然让计算机获得了以未曾有的高精度识别图像中物体的能力--几乎达到了让人惊恐的程度.现在的问题是机器是否还能更上层楼,学会理解这些图片中所发生的事件. Visual ...