我在尝试使用MongoDB的副本集时的笔记
试验MongoDB的副本集时的备忘录
通过将多个数据库进程进行集群化,可以确保在机器宕机时具备冗余性以应对紧急情况。这就是所谓的故障转移。
所以,这个很容易。mongo万岁。node万岁。JavaScript万岁。
机器会使用最近的这个链接(http://qiita.com/items/4ea61f8ba0470ec3d5be)进行尝试。这次只需要关注图中下半部分的橙色区域,与路由器和虚拟IP部分无关。
复制机清单
起初计划是3台电脑,但我们决定先用下面两台本地局域网内的电脑开始组装。之后会再增加一台。
192.168.1.11
192.168.1.12
192.168.1.13 (后来添加)
给每台机器安装npm。
sudo apt-get install mongodb
npm install mongoose@2.7.3
为了确保,版本是这样的。在mongoose的v3中,目前mongoose.connectSet变成了undefined,所以…。
※请参考下面的评论添加
添加备注 2016/10/03 如果使用mongoose@4.4.20的话
npm ls mongodb
└─┬ mongoose@2.7.3
└── mongodb@1.1.2
mongod -version
db version v2.0.4, pdfile version 4.5
Mon Aug 27 14:08:38 git version: nogitversion
暂时在局域网内使用两台电脑组建
首先,我们将192.168.1.11设为主服务器,192.168.1.12设为备用服务器…
我在每台电脑上都创建了相同的“db”和“log”目录,并尝试启动了mongod。
使用journal选项,将rest选项设置为可用,尝试使用端口27020。fork选项用于将进程变为守护进程。dbpath和logpath选项的用途可以直接从字面上理解。
mkdir -p ./mongodb/db1
mkdir -p ./mongodb/db1-log
mongod --rest --journal --replSet myset --port 27020 --dbpath ./mongodb/db1 --fork --logpath ./mongodb/db1-log/db.log --logappend
以下也是相同的内容
mkdir -p ./mongodb/db1
mkdir -p ./mongodb/db1-log
mongod --rest --journal --replSet myset --port 27020 --dbpath ./mongodb/db1 --fork --logpath ./mongodb/db1-log/db.log --logappend
设置
接下来,稍作休息后,将其设置为192.168.1.11。
mongo 192.168.1.11:27020
>config = {_id: 'myset', members: [
{_id: 0, host: '192.168.1.11:27020'},
{_id: 1, host: '192.168.1.12:27020'}
]
}
>rs.initiate(config);
已经完成了!
具体而言,对话会是这样的感觉。
hoge@192.168.1.11:~$ mongo 192.168.1.11:27020
MongoDB shell version: 2.0.4
connecting to: localhost:27020/test
> config = {_id: 'myset', members: [
... {_id: 0, host: '192.168.1.11:27020'},
... {_id: 1, host: '192.168.1.12:27020'}
... ]
... }
{
"_id" : "myset",
"members" : [
{
"_id" : 0,
"host" : "192.168.1.11:27020"
},
{
"_id" : 1,
"host" : "192.168.1.12:27020"
}
]
}
> rs.initiate(config);
{
"info" : "Config now saved locally. Should come online in about a minute.",
"ok" : 1
}
你动了吗?
hoge@192.168.1.11:~$ ps ax | grep mongo
854 ? Ssl 10:27 /usr/bin/mongod --config /etc/mongodb.conf
11481 pts/0 Sl+ 0:00 mongod --rest --journal --replSet myset --port 27020 --dbpath ./mongodb/db1
16254 pts/1 S+ 0:00 grep --color=auto mongo
hoge@192.168.1.12:~/usiku$ ps ax | grep mongo
26490 pts/4 Sl+ 0:00 mongod --rest --journal --replSet myset --port 27020 --dbpath ./mongodb/db1
26796 pts/2 S+ 0:00 grep --color=auto mongo
就是这个样子。顺便说一下,在这里,对每台机器的访问会显示主服务器和备用服务器提示。
hoge@192.168.1.11:~$ mongo 192.168.1.11:27020
MongoDB shell version: 2.0.4
connecting to: 192.168.1.11:27020/test
PRIMARY>
hoge@192.168.1.12:~$ mongo 192.168.1.12:27020
MongoDB shell version: 2.0.4
connecting to: 192.168.1.12:27020/test
SECONDARY>
exitで終了 helpでヘルプ
出了問題
当在三台机器上进行试验时,如果将PRIMARY杀掉,自动地会有SECONDARY中的一台顶替为PRIMARY并继续正常运行,就好像什么都没有发生一样…
即使在这个2台的配置中将PRIMARY杀掉,SECONDARY也不会晋升为PRIMARY。
这种配置下的投票系统在故障切换时无法确定谁应晋升为PRIMARY。(参考:http://www.mongodb.org/display/DOCS/Replica+Sets+-+Voting)
所以,如果明天有时间的话,我打算按照最初的计划再添加一台rs。
顺便提一句,如果再次给消除杀机的机器施加以下咒语的话…
mongod --rest --journal --replSet myset --port 27020 --dbpath ./mongodb/db1 --fork --logpath ./mongodb/db1-log/db.log --logappend
重新连接后,当在mongo localhost:27020上进行确认时,可以发现它已被降级为SECONDARY,而在此期间,那台一直努力工作的机器现在升级为PRIMARY。
努力就会得到认可。
尝试将arbiter机器作为第三台加入
将承担类似于192.168.1.11或12的副本的机器添加到rs.add方法中。
所以,日后如果需要的话可以随时添加多台。
然而,本次只需要通过rs.addArb方法添加一个名为arbiter的类型为辅助的机器来帮助判断在障碍发生时应该将哪台机器设为PRIMARY。
首先,192.168.1.13的命令行操作是相同的(尽管路径和日志目录名稍作修改以便更易理解)。
mkdir -p ./mongodb/db1-arbiter
mongod --rest --journal --replSet myset --port 27020 --dbpath ./mongodb/db1-arbiter --fork --logpath ./mongodb/db1-arbiter/db.log --logappend
所以,这种方法是从主机端发出的。添加为仲裁者,因此键入rs.addArb(‘192.168.1.13:27020’)。
hoge@192.168.1.11:~$ mongo 192.168.1.11:27020
MongoDB shell version: 2.0.4
connecting to: 192.168.1.11:27020/test
PRIMARY> rs.addArb('192.168.1.13:27020')
打开rs.status()并等待几秒钟至几十秒钟后,您可以查看已更改的内容。
您可以通过HTML查看信息。
当您访问 http://192.168.1.11:28020,即可访问到增加了1000的27020端口并以HTML形式显示的信息。
使用猫鼬
通常情况下,连接的方法如下,但是…
var piyodb = mongoose.createConnection('mongodb://localhost/piyo');
我們可以這樣使用。
//レプリカリスト
var ReplicaSets = ''
+ 'mongodb://192.168.1.11:27020/piyo,'
+ 'mongodb://192.168.1.12:27020/piyo,'
+ 'mongodb://192.168.1.13:27020/piyo,' //追加
// DB接続
var piyodb = mongoose.connectSet(ReplicaSets);
相关
摩擦的复制集合和多个WebSocket服务器的故障转移备注
http://qiita.com/toshirot/items/a555179e95990ca89bf7
请参考
复制集命令
http://www.mongodb.org/display/DOCS/Replica+Set+Commands
关于MongoDB的副本集概述:
http://d.hatena.ne.jp/ryopeko/20101005/1286262922
介绍MongoDB的复制和备份功能:
MongoDB的副本集:
http://d.hatena.ne.jp/rougeref/20110727
MongoDB的新功能:关于日志记录的详细信息
http://www.mongodb.org/display/DOCS/Journaling
使用MongoDB的REST接口。
链接:http://d.hatena.ne.jp/shokai/20110723/1311370610
链接:http://www.mongodb.org/display/DOCS/Http+Interface
配置MongoDB的复制集
http://inet-lab.naist.jp/mongodb-replica-set/