mongodb 主从 部署 切换

Mongodb一共有三种集群搭建的方式:
Replica Set(副本集)
Sharding(切片)
Master-Slaver(主从)【目前已不推荐使用了!!!】

其中,Sharding集群也是三种集群中最复杂的。
副本集比起主从可以实现自动故障转移!!非常实用!

mongoDB目前已不推荐使用主从模式,取而代之的是副本集模式。副本集其实一种互为主从的关系,可理解为主主。
副本集指将数据复制,多份保存,不同服务器保存同一份数据,在出现故障时自动切换。对应的是数据冗余、备份、镜像、读写分离、高可用性等关键词;
而分片则指为处理大量数据,将数据分开存储,不同服务器保存不同的数据,它们的数据总和即为整个数据集。追求的是高性能。

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

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

172.16.3.60 master centos6.5
172.16.3.61 slave centos6.5

一、安装
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()

5.主从切换

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

 

 

 

 

 

你可能感兴趣的:(mongo)