使用Rails+mongoid构建并连接MongoDB的副本集
MongoDB的副本集
前提
-
- AWS EC2 AmazonLinux
- mongoDB 2.6
我想在mongoDB上创建复制集,这非常简单,所以我记录下了操作步骤。这次我选择了使用3台服务器进行配置。我在AWS上使用了3个EC2实例,其中包括一个主服务器、一个从服务器和一个仲裁服务器。
仲裁者(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: