0. 迁移环境
Host A IP: 192.168.108.125
Host B IP: 192.168.108.124
下文所用 MongoDB 版本均为 2.0.7 ,操作系统为 Debian 6。
1. 热身
打开两台机器的防火墙 没开防火墙的同学这部分可以不用看了
在 Host A (数据源) 上执行如下命令
1 | iptables -A INPUT -s HostA/32 -p tcp -m tcp --dport 27017 -j ACCEPT |
在 Host B (迁移目标) 上执行如下命令
1 | iptables -A INPUT -s HostB/32 -p tcp -m tcp --dport 27017 -j ACCEPT |
为了安全,我的 MongoDB 是只绑定在本地环回接口上的,打开 /etc/mongodb.conf
,注释掉 bind_ip = 127.0.0.1
这行。
同时,在文件末尾加上replSet = rs0
以打开 Replication 功能。
1 | dbpath = /db/mongo |
现在,重启 Host A 和 Host B 的 MongoDB。
2. 配置 Replication
在 Host A 上运行 mongo
,输入以下命令
1 | config = {_id: 'rs0', members: [ |
稍等一会儿,系统会有下列提示
1 | rs.initiate(config) |
打开 Host B的 mongo
,我们可以看到有如下的提示
1 | MongoDB shell version: 2.0.7 |
输入 rs.status()
查看恢复状态
1 | RECOVERING> rs.status() |
依照数据量的大小可能需要传输一阵子,利用这个空闲我们把 Host A 上的网络服务迁移到 Host B 上
3. 迁移关联服务
在 MongoDB 中,从 Slave 上执行查询需要在查询前先执行 db.getMongo().setSlaveOk()
,否则会出现这样的提示:
RECOVERING> db.tasks.find(); error: { "$err" : "not master and slaveok=false", "code" : 13435 }
如果你的程序木有注意这一点,那么…赶紧给我改代码去!!!快去!!!
现在我们的 Web 应用程序已经复制到了 Host B 的硬盘里,并已经可以提供服务。
打开 Host A 的 nginx 的配置文件,在这里是 /etc/nginx/nginx.conf
。
将原有 server
部分均删除并替换为如下内容:
1 | upstream hostb { |
执行命令 /usr/local/nginx/sbin/nginx -s reload
重新载入 nginx 配置。
4. 移除 Replication
在 MongoDB 完成复制后, Host B 的提示符会变成:
1 | MongoDB shell version: 2.0.7 |
这时候我们将 Host B 变更为 Primary, 在 Host A 上执行如下命令:
1 | cfg = rs.conf() |
稍等一会儿, Host A 就会变更为 Secondary:
1 | Sat Aug 25 00:18:49 DBClientCursor::init call() failed |
现在我们可以关掉 Host A的 MongoDB。
打开 Host B 的 /etc/mongodb.conf
,去除 Host B 设置中的 replSet = rs0
:
1 | dbpath = /db/mongo |
重启 MongoDB,至此,本次迁移已经完成,等待 DNS解析生效 后,就可以把 Host A 下架了。