使用Rails+mongoid构建并连接MongoDB的副本集

MongoDB的副本集

前提

    • AWS EC2 AmazonLinux

 

    mongoDB 2.6

我想在mongoDB上创建复制集,这非常简单,所以我记录下了操作步骤。这次我选择了使用3台服务器进行配置。我在AWS上使用了3个EC2实例,其中包括一个主服务器、一个从服务器和一个仲裁服务器。

Untitled (1).png

仲裁者(Arbiter)是

当副本集的主服务器由于故障无法进行通信时,仲裁服务器的任务就是决定将哪个数据库作为主数据库。仲裁服务器本身不存储数据,只拥有投票权。因此,服务器规格可以较低。本次配置为EC2的t2.micro。

安装并启动MongoDB。

如果涉及AWS AmazonLinux的软件包,按照官方手册的说明进行操作。

[mongodb-org-2.6]
name=MongoDB 2.6 Repository
baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64/
gpgcheck=0
enabled=1
$ sudo yum install -y mongodb-org
$ sudo service mongod start
$ sudo chkconfig mongod on
    参照 http://docs.mongodb.org/manual/tutorial/install-mongodb-on-red-hat/

复制品的设置

为了能够连接MongoDB服务器,请进行设置。值得注意的是,为了防止来自WAN的访问,需要在MongoDB的EC2实例本身上进行AWS VPC的安全配置。如果分配了全局IP,则需要小心,因为它可以轻易地进行连接。

另外,指定副本集的名称。在这次中,我们将所有三台设备的副本集名称设置为相同的。

$ sudo vi /etc/mongod.conf
bind_ip=127.0.0.1 
↓
# コメントアウト
# bind_ip=127.0.0.1 

# レプリカセットの名前を追加(全mongoDB共通にする)
replSet=hogeRepl

设置主要、次要和仲裁员

在任何合适的MongoDB数据库中登录并写入以下设置。

> config = {_id: 'hogeRepl',
    members: [
      {_id: 0, host: '172.31.100.10:27017'},
      {_id: 1, host: '172.31.100.11:27017'},
      {_id: 2, host: '172.31.100.12:27017', arbiterOnly: true},
    ]
  }

> rs.initiate(config)

只需这样,复制套装的设置就完成了。

确认复制品

确认当前复制品套装的状况。

> rs.status()
{
    "set" : "hogeRepl",
    "date" : ISODate("2015-04-08T00:17:48Z"),
    "myState" : 1,
    "members" : [
        {
            "_id" : 0,
            "name" : "172.31.100.10:27017",
            "health" : 1,
            "state" : 1,
            "stateStr" : "PRIMARY",
            "uptime" : 1631128,
            "optime" : Timestamp(1428452138, 2),
            "optimeDate" : ISODate("2015-04-08T00:15:38Z"),
            "electionTime" : Timestamp(1426821293, 1),
            "electionDate" : ISODate("2015-03-20T03:14:53Z"),
            "self" : true
        },
        {
            "_id" : 1,
            "name" : "172.31.100.11:27017",
            "health" : 1,
            "state" : 2,
            "stateStr" : "SECONDARY",
            "uptime" : 1630985,
            "optime" : Timestamp(1428452138, 2),
            "optimeDate" : ISODate("2015-04-08T00:15:38Z"),
            "lastHeartbeat" : ISODate("2015-04-08T00:17:47Z"),
            "lastHeartbeatRecv" : ISODate("2015-04-08T00:17:47Z"),
            "pingMs" : 0,
            "syncingTo" : "172.31.100.10:27017"
        },
        {
            "_id" : 2,
            "name" : "172.31.100.12:27017",
            "health" : 1,
            "state" : 7,
            "stateStr" : "ARBITER",
            "uptime" : 1630983,
            "lastHeartbeat" : ISODate("2015-04-08T00:17:48Z"),
            "lastHeartbeatRecv" : ISODate("2015-04-08T00:17:48Z"),
            "pingMs" : 0
        }
    ],
    "ok" : 1
}

从次要来源查看数据

为了确认数据在次要MongoDB上同步,尝试在次要数据库上执行查询时,会出现以下类型的错误。

error: { "$err" : "not master and slaveOk=false", "code" : 13435 }
> db.getMongo().setSlaveOk()
# もしくは
> rs.slaveOk()
# 元に戻すには
> db.getMongo().slaveOk = false

只要设定好这一点,避免在运用过程中错误地在次要数据库中执行更新操作,可以仅允许从主数据库发出查询。

Mongoid的配置

mongoid的配置非常简单,只需要列举主要和次要的主机名,并且将读取设置为从主要主机读取。

production:
  sessions:
    default:
      database: hoge
      hosts:
        - prd-mongo1.hoge.vpc:27017
        - prd-mongo2.hoge.vpc:27017
      options:
        max_retries: 30
        retry_interval: 1
        read: primary
  options:
广告
将在 10 秒后关闭
bannerAds