什么是副本集:

  • 是一组维护相同数据集的mongod进程
  • 提供冗余,自动故障转移和高可用性
  • 提供读取可伸缩性
  • 内部概念或多或少与MySQL的概念相似
    • PRIMARY概念与MySQL复制中的MASTER大致相同
    • SECONDARY概念与MySQL复制中的SLAVE大致相同。
    • 数据复制是异步的,就像在MySQL中一样。我们不确定辅助设备是否与主设备保持同步。但是在MongoDB中,我们可以在写操作上定义“写问题”来定义需要什么类型的确认。例如,我们可以定义一个写入需要确认是否至少有一个辅助节点已经应用了该文档,或者我们甚至可以要求所有辅助节点都需要是最新的。
    • 在读取oplog的节点之间复制数据,这是一个包含修改和插入文档的特殊上限集合。这个概念类似于MySQL binlog,但它们的工作方式不同。oplog的一个特点是它内部的每个操作都是幂等的。这意味着即使应用一次或多次,oplog操作也会产生相同的结果。例如,您不能删除两次。如果您再次应用相同的删除操作,那将是一个无操作。插入和更新也是如此。
    • 由于oplog是数据库中的集合,我们可以轻松地查询它。oplog的内容是在系统的每个集合上插入或更新的文档。由于oplog是一个上限集合,因此它具有固定且可配置的大小。因此,oplog的大小也表示我们过去可以为事件花多长时间。作为一个粗略的例子:如果我们的数据库每天总共1GB插入,更新或删除文档,拥有3GB的oplog意味着我们可以存储或多或少三天的事件。

副本集的工作原理

下图显示了应用程序查询三节点副本集的典型环境。

在正常操作期间,副本集只有一个节点作为PRIMARY而所有其他节点都是SECONDARY。PRIMARY成员是唯一接收写入的成员。它更新其本地集合和文档以及oplog。然后,oplog事件通过复制通道发送到所有SECONDARY节点。每个SECONDARY节点在本地和异步上应用对本地数据和oplog的相同修改。

下图在内部显示了副本集的工作原理。每个节点都连接到所有其他节点,并且有一个心跳机制来ping任何其他节点。心跳具有用于ping节点的可配置时间,默认值为10秒。

如果所有节点都响应心跳确认,则群集继续工作。如果其中一个节点崩溃,例如PRIMARY(最坏的情况),则发生涉及剩余节点的选举

当SECONDARY在配置的超时后没有收到对心跳的响应时,它会要求进行选举。仍然存活的节点投票支持新的PRIMARY。选举阶段通常不需要很长时间,选举算法足够复杂,让他们选择最佳的次要成为新的主要。让我们说这是次要的,与死亡的初级主要是最新的。

除了主要崩溃之外,还有一些节点要求进行选举的情况:将节点添加到副本集时,在“启动副本集”期间或在某些维护活动期间。这种选举不是本文的目的。

副本集在选举成功完成之前无法处理写入操作,但如果将此类查询配置为在辅助节点上运行,则可以继续提供读取查询(稍后我们将对此进行讨论)。选举正确完成后,群集将恢复正常操作。

要正常工作,副本集需要具有奇数个成员。在网络分裂的情况下,只有奇数个成员确保我们在其中一个子集中拥有大多数投票。在具有大多数节点的子集中选择新的PRIMARY。

因此,三个是副本集的最小节点数,以确保高可用性。

仲裁节点

由于每个节点都需要拥有完整的数据副本,因此如果您拥有庞大的数据库,则需要提供至少三台具有大量磁盘,内存和CPU资源的计算机。这可能很昂贵。

幸运的是,您可以将其中一个节点配置为Arbiter,这是一个不复制数据的特殊成员。它是空的,但它可以在选举期间投票。

使用仲裁节点是维持奇数成员的一个很好的解决方案,而不需要花费很多钱来使第三个节点像其他节点一样强大。仲裁节点不能被选为新主节点,因为它没有数据。

环境

ip 主机名 系统
172.18.11.142 nodejs1 Centos 7.6
172.18.11.143 nodejs2 Centos 7.6
172.18.11.144 nodejs3 Centos 7.6

安装

  1. # 下载安装包并安装
  2. mkdir -p /opt/mongodb/
  3. cat <<EOF > /opt/mongodb/mongodb_down.sh
  4. cd /opt/mongodb/
  5. wget https://www.percona.com/downloads/percona-server-mongodb-LATEST/percona-server-mongodb-4.0.9-4/binary/redhat/7/x86_64/percona-server-mongodb-shell-4.0.9-4.el7.x86_64.rpm
  6. wget https://www.percona.com/downloads/percona-server-mongodb-LATEST/percona-server-mongodb-4.0.9-4/binary/redhat/7/x86_64/percona-server-mongodb-mongos-4.0.9-4.el7.x86_64.rpm
  7. wget https://www.percona.com/downloads/percona-server-mongodb-LATEST/percona-server-mongodb-4.0.9-4/binary/redhat/7/x86_64/percona-server-mongodb-tools-4.0.9-4.el7.x86_64.rpm
  8. wget https://www.percona.com/downloads/percona-server-mongodb-LATEST/percona-server-mongodb-4.0.9-4/binary/redhat/7/x86_64/percona-server-mongodb-server-4.0.9-4.el7.x86_64.rpm
  9. wget https://www.percona.com/downloads/percona-server-mongodb-LATEST/percona-server-mongodb-4.0.9-4/binary/redhat/7/x86_64/percona-server-mongodb-4.0.9-4.el7.x86_64.rpm
  10. EOF
  11. bash -x /opt/mongodb/mongodb_down.sh
  12. yum localinstall /opt/mongodb/*.rpm -y
  13. systemctl enable mongod

主机名

  1. cat <<EOF >> /etc/hosts
  2. 192.168.0.249 k8s-m1
  3. 192.168.0.250 k8s-n1
  4. 192.168.0.251 k8s-n2
  5. EOF

配置文件

  1. cat <<EOF > /etc/mongod.conf
  2. storage:
  3. dbPath: /var/lib/mongo
  4. journal:
  5. enabled: true
  6. systemLog:
  7. destination: file
  8. logAppend: true
  9. path: /var/log/mongo/mongod.log
  10. processManagement:
  11. fork: true
  12. pidFilePath: /var/run/mongod.pid
  13. net:
  14. port: 27017
  15. bindIp: 0.0.0.0
  16. EOF

启动

  1. systemctl start mongod

副本集的名称

副本集的名称这里使用 rs-smy,将副本集名称放置于每一台主机的 /etc/mongod.conf

  1. replication:
  2. replSetName: "rs-smy"

重启所有服务器

  1. systemctl restart mongod

初始化集群

随便连接到一个节点,发出 rs.initiate() 让副本集直到有哪些成员

  1. rs.initiate( {
  2. _id: "rs-smy",
  3. members: [
  4. { _id: 0, host: "172.18.11.142:27017" },
  5. { _id: 1, host: "172.18.11.143:27017" },
  6. { _id: 2, host: "172.18.11.144:27017" }
  7. ] })

发出命令后,MongoDB使用默认配置启动复制过程。选择PRIMARY节点,现在将创建的所有文档将在SECONDARY节点上异步复制。

我们可以通过查看mongo shell提示符来验证复制是否正常。一旦副本集启动并运行,提示应该在PRIMARY节点上如下:

  1. rs-smy:PRIMARY>

在SECONDARY节点上这样:

  1. rs-test:SECONDARY>

一些有用的命令

有几个命令可以调查并在副本集上执行一些管理任务。这里有几个。

要调查副本集配置,您可以在任何节点上发出rs.conf()

  1. rs-smy:SECONDARY> rs.conf()
  2. {
  3. "_id" : "rs-smy",
  4. "version" : 1,
  5. "protocolVersion" : NumberLong(1),
  6. "writeConcernMajorityJournalDefault" : true,
  7. "members" : [
  8. {
  9. "_id" : 0,
  10. "host" : "172.18.11.142:27017",
  11. "arbiterOnly" : false,
  12. "buildIndexes" : true,
  13. "hidden" : false,
  14. "priority" : 1,
  15. "tags" : {
  16. },
  17. "slaveDelay" : NumberLong(0),
  18. "votes" : 1
  19. },
  20. {
  21. "_id" : 1,
  22. "host" : "172.18.11.143:27017",
  23. "arbiterOnly" : false,
  24. "buildIndexes" : true,
  25. "hidden" : false,
  26. "priority" : 1,
  27. "tags" : {
  28. },
  29. "slaveDelay" : NumberLong(0),
  30. "votes" : 1
  31. },
  32. {
  33. "_id" : 2,
  34. "host" : "172.18.11.144:27017",
  35. "arbiterOnly" : false,
  36. "buildIndexes" : true,
  37. "hidden" : false,
  38. "priority" : 1,
  39. "tags" : {
  40. },
  41. "slaveDelay" : NumberLong(0),
  42. "votes" : 1
  43. }
  44. ],
  45. "settings" : {
  46. "chainingAllowed" : true,
  47. "heartbeatIntervalMillis" : 2000,
  48. "heartbeatTimeoutSecs" : 10,
  49. "electionTimeoutMillis" : 10000,
  50. "catchUpTimeoutMillis" : -1,
  51. "catchUpTakeoverDelayMillis" : 30000,
  52. "getLastErrorModes" : {
  53. },
  54. "getLastErrorDefaults" : {
  55. "w" : 1,
  56. "wtimeout" : 0
  57. },
  58. "replicaSetId" : ObjectId("5ce54845de4f73c1e97ea042")
  59. }
  60. }

我们可以看到有关已配置节点的信息,无论是仲裁还是隐藏,优先级以及有关心跳过程的其他详细信息。

要调查副本集状态,您可以在任何节点上发出rs.status()

  1. s-smy:SECONDARY> rs.status()
  2. {
  3. "set" : "rs-smy",
  4. "date" : ISODate("2019-05-23T10:12:44.663Z"),
  5. "myState" : 2,
  6. "term" : NumberLong(7),
  7. "syncingTo" : "172.18.11.144:27017",
  8. "syncSourceHost" : "172.18.11.144:27017",
  9. "syncSourceId" : 2,
  10. "heartbeatIntervalMillis" : NumberLong(2000),
  11. "optimes" : {
  12. "lastCommittedOpTime" : {
  13. "ts" : Timestamp(1558606360, 1),
  14. "t" : NumberLong(7)
  15. },
  16. "readConcernMajorityOpTime" : {
  17. "ts" : Timestamp(1558606360, 1),
  18. "t" : NumberLong(7)
  19. },
  20. "appliedOpTime" : {
  21. "ts" : Timestamp(1558606360, 1),
  22. "t" : NumberLong(7)
  23. },
  24. "durableOpTime" : {
  25. "ts" : Timestamp(1558606360, 1),
  26. "t" : NumberLong(7)
  27. }
  28. },
  29. "lastStableCheckpointTimestamp" : Timestamp(1558606350, 1),
  30. "members" : [
  31. {
  32. "_id" : 0,
  33. "name" : "172.18.11.142:27017",
  34. "health" : 1,
  35. "state" : 2,
  36. "stateStr" : "SECONDARY",
  37. "uptime" : 24733,
  38. "optime" : {
  39. "ts" : Timestamp(1558606360, 1),
  40. "t" : NumberLong(7)
  41. },
  42. "optimeDate" : ISODate("2019-05-23T10:12:40Z"),
  43. "syncingTo" : "172.18.11.144:27017",
  44. "syncSourceHost" : "172.18.11.144:27017",
  45. "syncSourceId" : 2,
  46. "infoMessage" : "",
  47. "configVersion" : 1,
  48. "self" : true,
  49. "lastHeartbeatMessage" : ""
  50. },
  51. {
  52. "_id" : 1,
  53. "name" : "172.18.11.143:27017",
  54. "health" : 1,
  55. "state" : 2,
  56. "stateStr" : "SECONDARY",
  57. "uptime" : 24523,
  58. "optime" : {
  59. "ts" : Timestamp(1558606360, 1),
  60. "t" : NumberLong(7)
  61. },
  62. "optimeDurable" : {
  63. "ts" : Timestamp(1558606360, 1),
  64. "t" : NumberLong(7)
  65. },
  66. "optimeDate" : ISODate("2019-05-23T10:12:40Z"),
  67. "optimeDurableDate" : ISODate("2019-05-23T10:12:40Z"),
  68. "lastHeartbeat" : ISODate("2019-05-23T10:12:44.463Z"),
  69. "lastHeartbeatRecv" : ISODate("2019-05-23T10:12:44.448Z"),
  70. "pingMs" : NumberLong(0),
  71. "lastHeartbeatMessage" : "",
  72. "syncingTo" : "172.18.11.144:27017",
  73. "syncSourceHost" : "172.18.11.144:27017",
  74. "syncSourceId" : 2,
  75. "infoMessage" : "",
  76. "configVersion" : 1
  77. },
  78. {
  79. "_id" : 2,
  80. "name" : "172.18.11.144:27017",
  81. "health" : 1,
  82. "state" : 1,
  83. "stateStr" : "PRIMARY",
  84. "uptime" : 24519,
  85. "optime" : {
  86. "ts" : Timestamp(1558606360, 1),
  87. "t" : NumberLong(7)
  88. },
  89. "optimeDurable" : {
  90. "ts" : Timestamp(1558606360, 1),
  91. "t" : NumberLong(7)
  92. },
  93. "optimeDate" : ISODate("2019-05-23T10:12:40Z"),
  94. "optimeDurableDate" : ISODate("2019-05-23T10:12:40Z"),
  95. "lastHeartbeat" : ISODate("2019-05-23T10:12:44.464Z"),
  96. "lastHeartbeatRecv" : ISODate("2019-05-23T10:12:44.433Z"),
  97. "pingMs" : NumberLong(0),
  98. "lastHeartbeatMessage" : "",
  99. "syncingTo" : "",
  100. "syncSourceHost" : "",
  101. "syncSourceId" : -1,
  102. "infoMessage" : "",
  103. "electionTime" : Timestamp(1558594808, 1),
  104. "electionDate" : ISODate("2019-05-23T07:00:08Z"),
  105. "configVersion" : 1
  106. }
  107. ],
  108. "ok" : 1,
  109. "operationTime" : Timestamp(1558606360, 1),
  110. "$clusterTime" : {
  111. "clusterTime" : Timestamp(1558606360, 1),
  112. "signature" : {
  113. "hash" : BinData(0,"eo6zfAdAzzCTw/rQj+OWbd7Vots="),
  114. "keyId" : NumberLong("6693835933885661186")
  115. }
  116. }
  117. }

可以看到哪个是PRIMARY,哪个是SECONDARY

测试复制

连接到PRIMARY节点并创建例子:

  1. rs-smy:PRIMARY> use test
  2. switched to db test
  3. rs-test:PRIMARY> db.foo.insert( {name:"Bruce", surname:"Dickinson"} )
  4. WriteResult({ "nInserted" : 1 })
  5. rs-smy:PRIMARY> db.foo.find().pretty()
  6. {
  7. "_id" : ObjectId("5ae05ac27e6680071caf94b7")
  8. "name" : "Bruce"
  9. "surname" : "Dickinson"
  10. }

然后连接到SECONDARY节点并查找相同的文档。

请记住,您无法连接到SECONDARY节点以读取数据。默认情况下,只允许在PRIMARY上进行读写操作。因此,如果要读取SECONDARY节点上的数据,首先需要发出rs.slaveOK()命令。如果您不这样做,您将收到错误。

  1. rs-test:SECONDARY> rs.slaveOK()
  2. rs-test:SECONDARY> show collections
  3. local
  4. <strong>foo</strong>
  5. rs-test:SECONDARY> db.foo.find().pretty()
  6. {
  7. "_id" : ObjectId("5ae05ac27e6680071caf94b7")
  8. "name" : "Bruce"
  9. "surname" : "Dickinson"
  10. }

SECONDARY节点已经复制了集合foo和插入文档的创建。

Percona MongoDB 4 搭建副本集的更多相关文章

  1. MongoDB集群搭建-副本集

    MongoDB集群搭建-副本集 概念性的知识,可以参考本人博客地址: 一.Master-Slave方案: 主从: 二.Replica Set方案: 副本集: 步骤:(只要按步骤操作,100%成功) 1 ...

  2. MongoDB 搭建副本集

    副本集(Replica Set)是一组MongoDB实例组成的集群,由一个主(Primary)服务器和多个备份(Secondary)服务器构成.通过Replication,将数据的更新由Primary ...

  3. MongoDB主从复制和副本集

    MongoDB有主从复制和副本集两种主从复制模式,主从复制最大的问题就是无法自动故障转移,MongoDB副本集解决了主从模式无法自动故障转义的特点,因此是复制的首选.对于简单的主从复制无法自动故障转移 ...

  4. MongoDB-3.4搭建副本集

    搭建副本集 1:首先创建3台虚拟机作为配置环境 IP1:192.168.101.175 IP2:192.168.101.176 IP3:192.168.101.177 2.下载MongoDB 3.4版 ...

  5. 【六】MongoDB管理之副本集

    一.复制介绍 所谓的复制就是在多个主机之间同步数据的过程. 1.数据冗余及可用性 复制技术提供数据冗余及可用性,在不同的数据库服务器上使用多个数据副本,复制技术防止单个数据库服务器出现数据故障而出现数 ...

  6. MongoDB 复制(副本集)学习

    MongoDB 复制(副本集)学习 replication set复制集,复制集,多台服务器维护相同的数据副本,提高服务器的可用性.MongoDB复制是将数据同步在多个服务器的过程.复制提供了数据的冗 ...

  7. mongodb 4.0副本集搭建

    近期有同学问mongodb副本集难不难部署,我的回答是不难,很快,几分钟搞定,比mysql MHA简单的不止一点半点. 那么到底如何部署呢?请看下文. 1.  准备工作 1.1 下载软件 选择版本并下 ...

  8. mongodb安装及副本集搭建

    mongodb下载地址:https://www.mongodb.com/dr/fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel62-3.2.7.tg ...

  9. MongoDB 副本集搭建 & 副本集扩容

    副本集的搭建 创建多实例目录 [root@redis03 ~]# mkdir /server/mongodb/2801{7,8,9}/{conf,logs,pid,data} -p 编辑多实例配置文件 ...

随机推荐

  1. Data - 大数据分析学习之路

    一.大数据分析的五个基本方面 可视化分析 大数据分析的使用者有大数据分析专家,同时还有普通用户,但是他们二者对于大数据分析最基本的要求就是可视化分析,因为可视化分析能够直观的呈现大数据特点,同时能够非 ...

  2. C# Redis 缓存应用 主要代码及版本选择

    /// <summary> /// RedisManager类主要是创建链接池管理对象的 /// </summary> public class RedisManager { ...

  3. Docker 面试题

    Docker 面试题 Docker? Docker是一个容器化平台,它以容器的形式将您的应用程序及其所有依赖项打包在一起,以确保您的应用程序在任何环境中无缝运行. CI(持续集成)服务器的功能是什么? ...

  4. Linux系统封装成iso文件

    #安装所需软件包yum -y install createrepo mkisofs anaconda-runtime 根据root下的install.log文件,得到安装的软件包awk '/Insta ...

  5. Mac下Supervisor进程监控管理工具的安装与配置

    Supervisor是一个类 unix 操作系统下的进程监控管理工具. Supervisor是由 Python 写成,可用 Python 的包安装管理工具 pip(Python Package Ind ...

  6. windows下,给golang编译的exe添加一个图标

    通过go build生成的exe文件,通常是一个默认的图标,发给别人的时候,总觉得像病毒,下面我们来给他加一个好看的图标,让他看起来正经一些. 1.找到一个喜欢的图片. 2.通过工具或是在线工具生成. ...

  7. SGI STL源码stl_vector.h分析

    前言 vector 是最常用的 C++ 容器,其动态扩容的特性是普通数组不具备的,这大大增加了编程的灵活性.虽然平时用 vector 很多,也能基本理解其原理,但无法从深层次理解.直到研读了 vect ...

  8. 【3.3】mysql中的Federated存储引擎,远程表,相当于sql server的linked server

    MySQL中针对不同的功能需求提供了不同的存储引擎.所谓的存储引擎也就是MySQL下特定接口的具体实现. FEDERATED是其中一个专门针对远程数据库的实现.一般情况下在本地数据库中建表会在数据库目 ...

  9. hdu 4471 区间条件统计 区间 不超过 x 的元素的个数

    题目传送门//res tp hdu 目的 对长度为n的区间,m次询问,每次提供一个区间两端点与一个值x,求区间内不超过x的元素个数 n 1e5 m 1e5 ai [1,1e9] (i∈[1,n]) 多 ...

  10. 【问题】【编程环境】fatal error: security/pam_appl.h

    [问题] 今天在docker中基于centos镜像的容器编译gogs遇到错误 似乎缺少库文件 [解决] yum -y install pam-devel