阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

MongoDB3.6之Replica Set初步体验

153次阅读
没有评论

共计 5466 个字符,预计需要花费 14 分钟才能阅读完成。

Replica Set 在国内叫做副本集,简单来说就是一份数据在多个地方存储。

        1. 为什么要用副本集,什么时候使用副本集?

    有人说一份数据在多个地方存储占用了大量的额外空间,是一种浪费。

这个说法不能说对也不能说不对,要从不同的角度考虑。如果公司的业务量很少,数据不多,一台服务器就可以搞定,那就不需要将一份数据存储在多个地方。随着公司的发展壮大,业务量越来越多,数据也越来越多,这时就需要考虑使用分布式集群的方式来解决了,将数据分散在不同的服务器中。此时仍可以不使用副本,通过将数据分散在不同的服务器中来分散各服务器的压力也可以跟上公司目前的业务量。如果公司规模进一步扩大,用户量越来越多,有可能很多客户要访问同一份资源,此时就有可能造成存放该资源的服务器压力过大。副本的必要性就显现出来了。

        2. 使用副本集有什么好处?

          副本集提供了容错性,高可用性。当然容灾备份,读写分离等也使用到了副本。

        3.MongoDB Replica Set 集群介绍

        先上一个典型的 Replica Set 图:

MongoDB3.6 之 Replica Set 初步体验

        为方便介绍,以下简称 rs 集群

        (1).rs 集群是由多个 Mongod 实例节点组成,其中只有一个节点是 primary, 其它节点是 secondary,还有一个是可有可无的仲裁节点。当集群有偶数个节点时,通过会添加一个仲裁节点,如果集群有奇数个节点时,就不需要使用仲裁节点了。仲裁节点不存储数据,只用于投票选举出哪个节点是 primary,而且仲裁节点不要求有专门的服务器,但不能运行在已经安装了 primary 或 secondary 节点的服务器上,可以运行在应用或监控服务器上(之前看到有人说仲裁节点除了投票外,还可以在 primary 节点失效后,在 secondary 节点中再选举出一个 primary,这是不对的,仲裁节点的作用仅仅是有一票之权)。

        (2).primary 用于接收 client 的读和写请求,并记录操作日志,secondary 用于从 primary 处异步同步 primary 的操作日志,并更新自己的数据集。通常情况下 secondary 不能响应 client 的读操作,以免读取脏数据。但 rs 集群有多个数据中心时,client 可以请求读取 secondary 数据,当 primay 在北京的服务器上,其中一个 Secondary 在重庆,重庆的用户在读取数据时,考虑到地理位置和网速的关系,可选择只读 primary,primary 优先,只读 secondary,secondary 优先和读取最近 (nearest) 节点的数据。

        (3). 当 primary 不能访问时,剩下的 secondary 节点中会再选出一个 primary 节点。

      4.RS 集群部署示例

        (1). 有三台服务器,由于是奇数服务器,所以不选择仲裁节点。

MongoDB3.6 之 Replica Set 初步体验

        (2). 下载 MongodDB 手动安装版(我下载的是 Linux 64 位版本),并解压到一个目录下,将解压的文件夹名字改成 mongoDB, 进入 mongoDB 目录,新建一个配置文件 mongod.conf

#mongod.conf
# 数据保存路径
dbpath=mongodb/data/mongod
                           
# 日志保存路径
logpath=mongodb/log/mongod.log
logappend=true
                       
# 后台运行保存的进程 pid
pidfilepath=/home/yanggy/mongodb/mongod.pid 
# 每个数据库一个目录
directoryperdb=true

#replica set 的名字
replSet=testrs

# 绑定 IP 与 Host
bind_ip=server1
port=27001

# 日志文件大小
oplogSize=100

# 后台运行
fork=true

# 不提前加载数据到内存
noprealloc=true

    将此配置文件复制到其它服务器中,修改绑定的 IP 即可,并手动在各服务器建立相应的数据和日志目录。

    (3). 在各服务器启动 mongod 实例

mongod -f mongodb/mongod.conf     

(4). 使用 mongo 连接其中一台服务器

mongo –host server1 –port 27001   

(5). 初始化 rs 集群

> cfg = {_id:”testrs”,members:[{_id:0,host:”server1:27001″,priority:3},
{_id:1,host:”server2:27001″,priority:2},
{_id:2,host:”server3:27001″,priority:1}]}
输出:
{
        “_id” : “testrs”,
        “members” : [
                {
                        “_id” : 0,
                        “host” : “server1:27001”,
                        “priority” : 3
                },
                {
                        “_id” : 1,
                        “host” : “server2:27001”,
                        “priority” : 2
                },
                {
                        “_id” : 2,
                        “host” : “server3:27001”,
                        “priority” : 1
                }
        ]
}

>rs.initiate(cfg)
输出:
{
        “ok” : 1,
        “operationTime” : Timestamp(1521190572, 1),
        “$clusterTime” : {
                “clusterTime” : Timestamp(1521190572, 1),
                “signature” : {
                        “hash” : BinData(0,”AAAAAAAAAAAAAAAAAAAAAAAAAAA=”),
                        “keyId” : NumberLong(0)
                }
        }
}

>rs.status()

输出:
{
        “set” : “testrs”,
        “date” : ISODate(“2018-03-16T08:56:23.948Z”),
        “myState” : 1,
        “term” : NumberLong(1),
        “heartbeatIntervalMillis” : NumberLong(2000),
        “optimes” : {
                “lastCommittedOpTime” : {
                        “ts” : Timestamp(0, 0),
                        “t” : NumberLong(-1)
                },
                “appliedOpTime” : {
                        “ts” : Timestamp(1521190572, 1),
                        “t” : NumberLong(-1)
                },
                “durableOpTime” : {
                        “ts” : Timestamp(1521190572, 1),
                        “t” : NumberLong(-1)
                }
        },
        “members” : [
                {
                        “_id” : 0,
                        “name” : “server1:27001”,
                        “health” : 1,
                        “state” : 1,
                        “stateStr” : “PRIMARY”,
                        “uptime” : 220,
                        “optime” : {
                                “ts” : Timestamp(1521190572, 1),
                                “t” : NumberLong(-1)
                        },
                        “optimeDate” : ISODate(“2018-03-16T08:56:12Z”),
                        “infoMessage” : “could not find member to sync from”,
                        “electionTime” : Timestamp(1521190582, 1),
                        “electionDate” : ISODate(“2018-03-16T08:56:22Z”),
                        “configVersion” : 1,
                        “self” : true
                },
                {
                        “_id” : 1,
                        “name” : “server2:27001”,
                        “health” : 1,
                        “state” : 2,
                        “stateStr” : “SECONDARY”,
                        “uptime” : 11,
                        “optime” : {
                                “ts” : Timestamp(1521190572, 1),
                                “t” : NumberLong(-1)
                        },
                        “optimeDurable” : {
                                “ts” : Timestamp(1521190572, 1),
                                “t” : NumberLong(-1)
                        },
                        “optimeDate” : ISODate(“2018-03-16T08:56:12Z”),
                        “optimeDurableDate” : ISODate(“2018-03-16T08:56:12Z”),
                        “lastHeartbeat” : ISODate(“2018-03-16T08:56:22.733Z”),
                        “lastHeartbeatRecv” : ISODate(“2018-03-16T08:56:19.659Z”),
                        “pingMs” : NumberLong(0),
                        “configVersion” : 1
                },
                {
                        “_id” : 2,
                        “name” : “server3:27001”,
                        “health” : 1,
                        “state” : 2,
                        “stateStr” : “SECONDARY”,
                        “uptime” : 11,
                        “optime” : {
                                “ts” : Timestamp(1521190572, 1),
                                “t” : NumberLong(-1)
                        },
                        “optimeDurable” : {
                                “ts” : Timestamp(1521190572, 1),
                                “t” : NumberLong(-1)
                        },
                        “optimeDate” : ISODate(“2018-03-16T08:56:12Z”),
                        “optimeDurableDate” : ISODate(“2018-03-16T08:56:12Z”),
                        “lastHeartbeat” : ISODate(“2018-03-16T08:56:22.733Z”),
                        “lastHeartbeatRecv” : ISODate(“2018-03-16T08:56:19.641Z”),
                        “pingMs” : NumberLong(0),
                        “configVersion” : 1
                }
        ],
        “ok” : 1,
        “operationTime” : Timestamp(1521190572, 1),
        “$clusterTime” : {
                “clusterTime” : Timestamp(1521190582, 1),
                “signature” : {
                        “hash” : BinData(0,”AAAAAAAAAAAAAAAAAAAAAAAAAAA=”),
                        “keyId” : NumberLong(0)
                }
        }
}

可以看到 priority 值越大的节点越有可能成为 primary。

好了,相信大家对 Replica Set 已经有了初步体验和认识,如果上文中有什么表述的不准备或者错误的地方,欢迎指出,大家共同探讨进步。

正文完
星哥说事-微信公众号
post-qrcode
 
星锅
版权声明:本站原创文章,由 星锅 2022-01-22发表,共计5466字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中