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