mongodb主从部署切换

Mongodb一共有三种集群搭建的方式:

Replica Set(副本集)

Sharding(切片)

Master-Slaver(主从)【目前已不推荐使用了!!!】

其中,Sharding集群也是三种集群中最复杂的。

副本集比起主从可以实现自动故障转移!!非常实用!

mongoDB目前已不推荐使用主从模式,取而代之的是副本集模式。副本集其实一种互为主从的关系,可理解为主主。

副本集指将数据复制,多份保存,不同服务器保存同一份数据,在出现故障时自动切换。对应的是数据冗余、备份、镜像、读写分离、高可用性等关键词;

而分片则指为处理大量数据,将数据分开存储,不同服务器保存不同的数据,它们的数据总和即为整个数据集。追求的是高性能。

在生产环境中,通常是这两种技术结合使用,分片+副本集。

本文只介绍主从模式,因为所用环境不是很重要,且机器有限,其他两种请参考:https://www.cnblogs.com/nulige/p/7613721.html


mongodb主从部署切换

一、安装

1.下载:

官网下载地址:http://www.mongodb.org/downloads

centos6.x,使用3.4版本,如下为3.4.17,否则会报glibc版本低,libc.so.6: version 'GLIBC_2.14' not found

wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel62-3.4.17.tgz

centos7.x,直接使用最新版的4.x版本即可,如下为4.0.3

wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.0.3.tgz

2.安装:【主从都一样】

mv mongodb-linux-xxx.tgz /usr/local/src/

cd /usr/local/src/

tar -zvxf mongodb-linux-xxx.tgz

mv mongodb-linux-xxx /usr/local/mongodb

cd /usr/local/mongodb

mkdir data log

# 启动,并查看是否正常启动

nohup /usr/local/mongodb/bin/mongod --dbpath=/usr/local/mongodb/data/ --logpath=/usr/local/mongodb/log/mongo.log &

ps -ef|grep mongo

netstat -tunlp|grep mongo

# 设置环境变量

vim /etc/profile

MONGODB_HOME=/usr/local/mongodb

PATH=$PATH:$MONGODB_HOME/bin/

export PATH

source /etc/profile

# 编写启动脚本

#!/bin/bash

# mongod Start up the MongoDB server daemon

# source function library

. /etc/rc.d/init.d/functions

# start command

CMD=/usr/local/mongodb/bin/mongod

# config path

INITFILE=/usr/local/mongodb/mongodb.conf

start()

{

# & start background

$CMD -f $INITFILE &

echo "MongoDB is running background..."

}

stop()

{

pkill mongod

echo "MongoDB is stopped."

}

status()

{

command=`ps -ef |grep mongo|grep -vE "grep|status"`

#echo $command

if [ "$command" == "" ]

then

echo -e "\\033[31m mongodb is stopped\\033[0m"

else

echo -e "\\033[36m mongodb is started\\033[0m"

fi

}

case "$1" in

start)

start

;;

stop)

stop

;;

status)

status

;;

*)

echo $"Usage: $0 {start|stop|status}"

esac

# 添加执行权限

chmod 755 /etc/init.d/mongodb

# 配置文件

cat /usr/local/mongodb/mongodb.conf

port=27017

bind_ip = 172.16.3.60 #注意:此处为本机IP,slave需改为 172.16.3.61

dbpath=/usr/local/mongodb/data

logpath=/usr/local/mongodb/log/mongo.log

logappend=true

journal = true

fork = true

master = true # master

slave = true # slave

source = 172.16.3.61:27017 #注意:此处为主库地址+端口,slave需改为 172.16.3.60:27017

autoresync = true # 从库自动同步主库


3.运行测试

将master的配置mongodb.conf中最后4行注释,并启动

# /etc/init.d/mongodb start 或者 service mongodb start

# mongo 172.16.3.60:27017 # 本机IP:port

>show dbs # 查看全部数据库

slave也如此测试一下,保证主从mongodb能正常运行

4.master-slave部署

将主从上的mongodb关闭

# /etc/init.d/mongodb stop 或者 service mongodb stop

并查看是否真的关闭,保证都关闭

# /etc/init.d/mongodb status 或者 service mongodb status

master:将配置mongodb.conf中最后3行注释,并启动

slave:将配置mongodb.conf中master = true注释,并启动

5.主从数据同步测试

master:

# mongo 172.16.3.60:27017

> show dbs 显示当前所有的数据库

> use master_slave 切换到master_slave,若无此库会自动创建

> show collections 显示当前数据库下的所有集合,也就相当于mysql中的表

# 在persons表中插入数据wang0-4

> function add(){var i = 5;for(;i<10;i++){db.persons.insert({"name":"wang"+i})}}

> add()

> db.persons.find() 查看persons表,将会看到如下结果

{ "_id" : ObjectId("593278699a9e2e9f37ac4dbb"), "name" : "wang0" }

{ "_id" : ObjectId("593278699a9e2e9f37ac4dbc"), "name" : "wang1" }

{ "_id" : ObjectId("593278699a9e2e9f37ac4dbd"), "name" : "wang2" }

{ "_id" : ObjectId("593278699a9e2e9f37ac4dbe"), "name" : "wang3" }

{ "_id" : ObjectId("593278699a9e2e9f37ac4dbf"), "name" : "wang4" }

slave:

# mongo 172.16.3.61:27017

> show dbs 将会看到已经存在 master_slave 库

# 会报错,"errmsg" : "not master and slaveOk=false",通过下面命令解决

> rs.slaveOk();


> use master_slave 切换到master_slave,若无此库会自动创建

> show collections 显示当前数据库下的所有集合,也就相当于mysql中的表

> db.persons.find() 查看persons表,将会看到如下结果

{ "_id" : ObjectId("593278699a9e2e9f37ac4dbb"), "name" : "wang0" }

{ "_id" : ObjectId("593278699a9e2e9f37ac4dbc"), "name" : "wang1" }

{ "_id" : ObjectId("593278699a9e2e9f37ac4dbd"), "name" : "wang2" }

{ "_id" : ObjectId("593278699a9e2e9f37ac4dbe"), "name" : "wang3" }

{ "_id" : ObjectId("593278699a9e2e9f37ac4dbf"), "name" : "wang4" }

# 在persons表中插入数据wang5-10,查看即可发现从库无法写入,表数据未添加

> function add(){var i = 5;for(;i<10;i++){db.persons.insert({"name":"wang"+i})}}

> add()

> db.persons.find()

二.主从切换

1) 60挂,61变主,然后slave继续接收数据的读写,60起来变为从,并从61同步数据,需手动切换【或者编写脚本检测,进行自动切换】

60:关闭momgodb,/etc/init.d/mongodb stop

61:关闭mongodb,将配置mongodb.conf中最后三行注释,master = true取消注释,并启动

60:将配置mongodb.conf中master =true 注释,最后三行开启,并启动

61:

# mongo 172.16.3.61:27017

> use master_slave

# 在persons表中插入数据wang5-10,查看可发现从库可以写入了

> function add(){var i = 5;for(;i<10;i++){db.persons.insert({"name":"wang"+i})}}

> add()

> db.persons.find() 查看persons表,将会看到如下结果

{ "_id" : ObjectId("593278699a9e2e9f37ac4dbb"), "name" : "wang0" }

{ "_id" : ObjectId("593278699a9e2e9f37ac4dbc"), "name" : "wang1" }

{ "_id" : ObjectId("593278699a9e2e9f37ac4dbd"), "name" : "wang2" }

{ "_id" : ObjectId("593278699a9e2e9f37ac4dbe"), "name" : "wang3" }

{ "_id" : ObjectId("593278699a9e2e9f37ac4dbf"), "name" : "wang4" }

{ "_id" : ObjectId("593278699a9e2e9f37ac4dc0"), "name" : "wang5" }

{ "_id" : ObjectId("593278699a9e2e9f37ac4dc1"), "name" : "wang6" }

{ "_id" : ObjectId("593278699a9e2e9f37ac4dc2"), "name" : "wang7" }

{ "_id" : ObjectId("593278699a9e2e9f37ac4dc3"), "name" : "wang8" }

{ "_id" : ObjectId("593278699a9e2e9f37ac4dc4"), "name" : "wang9" }

60:验证,将也会成功看到来自数据更新了

2)60恢复成为主,61继续作为从 【如按照上述运行一段时间,61挂了又切回原来的主从的情况】

操作如 1)

注意:主从切换的时候,相关的数据库调用配置,需改变,或者其加入到dns中,到时只需更改dns而无需修改配置、代码等

mongodb.test.com A 172.16.3.60

改为

mongodb.test.com A 172.16.3.61

另有一种备份方式:只需将data下的数据复制到备机上即可

参考链接:http://www.cnblogs.com/kevingrace/p/5752382.html


分享到:


相關文章: