前段时间公司开发新项目,数据量比较大,读写操作比较频繁,需要用到高效存储、高可扩展性和高可用性的数据库,根据网上介绍和自己理解部署mongodb集群,有不对的地方请多多指教。
mongodb集群分为三种:主从模式、副本集、分片模式;
主从模式:一台主服务器、多个从服务器 ;整体来看就是数据库的备份,防止主服务器坏掉数据丢失;
副本集:至少三台电脑,一台主服务器、一台从服务器、一台仲裁点;仲裁点不存储数据,主要作用是在主服务器挂掉后,在从服务器中选出主服务器。
分片:基本思想就是将集合切成小块,这些块分散到若干片里,每个片只负责总数据的一部分,最后通过一个均衡器来对各个分片进行均衡(数据迁移)。通过一个名为mongos的路由进程进行操作,mongos知道数据和片的对应关系(通过配置服务器)。
下面介绍的主要是副本集+分片集群模式,用的mongodb版本是2.4.8的,至少需要3台电脑,如果用的3.4版本的mongobd至少用5台电脑。
一、准备工作
准备三台电脑 ip 地址 172.16.4.221、172.16.4.222、172.16.4.223
1.下载mongodb-2.4.8安装包
wget http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-2.4.8.tgz
2.移动文件夹
mv mongodb-linux-x86_64-2.4.8.tgz /usr/mongodb-linux-x86_64-2.4.8.tgz
3.解压
tar xvzf mongodb-linux-x86_64-2.4.8.tgz
上面三步下载、移动、解压可以在本地下载解压后拷入centos服务器中,三台电脑都需要拷入mongodb
二、基本操作
2.1 建立日志文件目录
分别在每台机器建立mongos 、config 、 shard1 、shard2、shard3 五个目录;因为mongos不存储数据,只需要建立日志文件目录即可
文件夹也可以在本地创建后拷入每台电脑中
2.2确定端口号
(1)规划5个组件对应的端口号,由于一个机器需要同时部署 mongos、config server 、shard1、shard2、shard3,所以需要用端口进行区分。
(2)这个端口可以自由定义,在本文 mongos为 20000, config server 为 21000, shard1为 22001 , shard2为22002, shard3为22003
2.3启动和配置服务
配置服务前请给mongodb文件夹权限 sudo chmod -R 777 /home/mongodb
2.3.1在每一台服务器分别启动配置服务器
/home/mongodb-linux/bin/mongod --configsvr --dbpath /home/mongodb/config/data --port 21000 --logpath /home/mongodb/config/log/config.log --fork
2.3.2在每一台服务器分别启动mongos服务器
/home/mongodb-linux/bin/mongos --configdb 172.16.4.221:21000,172.16.4.222:21000,172.16.4.223:21000 --port 20000 --logpath /home/mongodb/mongos/log/mongos.log --fork
2.4配置各个分片的副本集
在每个机器里分别设置分片服务器和副本集(每台电脑都要运行下面三步);
2.4.1shard1
/home/mongodb-linux/bin/mongod --shardsvr --replSet shard1 --port 22001 --dbpath /home/mongodb/shard1/data --logpath /home/mongodb/shard1/log/shard1.log --fork --nojournal --oplogSize 100
2.4.2shard2
/home/mongodb-linux/bin/mongod --shardsvr --replSet shard2 --port 22002 --dbpath /home/mongodb/shard2/data --logpath /home/mongodb/shard2/log/shard2.log --fork --nojournal --oplogSize 100
2.4.3shard3
/home/mongodb-linux/bin/mongod --shardsvr --replSet shard3 --port 22003 --dbpath /home/mongodb/shard3/data --logpath /home/mongodb/shard3/log/shard3.log --fork --nojournal --oplogSize 100
2.5连接mongodb
(1)任意登陆一个机器,比如登陆172.16.4.221,连接mongodb
(2)设置分片副本集
/home/mongodb-linux/bin/mongo 127.0.0.1:22001
2.5.1设置第一个分片副本集
使用admin数据库
use admin
定义副本集配置
config = { _id:“shard1”, members:[
{_id:0,host:“172.16.4.221:22001”},
{_id:1,host:“172.16.4.222:22001”},
{_id:2,host:“172.16.4.223:22001”,arbiterOnly:true}
]
}
初始化副本集配置
rs.initiate(config);
成功效果图
2.5.2设置第二个分片副本集
登陆172.16.4.222,打开终端,输入如下命令:
/home/mongodb-linux/bin/mongo 127.0.0.1:22002
使用admin数据库
use admin
定义副本集配置
config = { _id:“shard2”, members:[
{_id:0,host:“172.16.4.221:22002”},
{_id:1,host:“172.16.4.223:22002”},
{_id:2,host:“172.16.4.222:22002”,arbiterOnly:true}
]
}
初始化副本集配置
rs.initiate(config);
成功效果图
2.5.3设置第三个分片副本集
登陆172.16.4.223,打开终端,输入如下命令:
/home/mongodb-linux/bin/mongo 127.0.0.1:22003
使用admin数据库
use admin
定义副本集配置
config = { _id:“shard3”, members:[
{_id:0,host:“172.16.4.223:22003”},
{_id:1,host:“172.16.4.222:22003”},
{_id:2,host:“172.16.4.221:22003”,arbiterOnly:true}
]
}
初始化副本集配置
rs.initiate(config);
成功效果图
目前搭建了mongodb配置服务器、路由服务器,各个分片服务器,不过应用程序连接到 mongos 路由服务器并不能使用分片机制,还需要在程序里设置分片配置,让分片生效;
2.6设置分片配置
2.6.1连接到mongos
如果不能连接,删除电脑中的mongod.lock文件,对服务器进行重启;然后重启服务。
/home/mongodb-linux/bin/mongo 127.0.0.1:20000
使用admin数据库
use admin
1、串联路由服务器与分配副本集1
db.runCommand({addshard:“shard1/172.16.4.221:22001,172.16.4.222:22001,172.16.4.223:22001”});
2、串联路由服务器与分配副本集2
db.runCommand({addshard:“shard2/172.16.4.221:22002,172.16.4.222:22002,172.16.4.223:22002”});
3、串联路由服务器与分配副本集3
db.runCommand({addshard:“shard3/172.16.4.221:22003,172.16.4.222:22003,172.16.4.223:22003”});
2.6.2查看分片服务器的配置
db.runCommand( { listshards : 1 } );
内容输出
{
“shards” : [
{
“_id” : “shard1”,
“host” : “shard1/172.16.4.221:22001,172.16.4.222:22001”
},
{
“_id” : “shard2”,
“host” : “shard2/172.16.4.221:22002,172.16.4.223:22002”
},
{
“_id” : “shard3”,
“host” : “shard3/172.16.4.222:22003,172.16.4.223:22003”
}
],
“ok” : 1
}
目前配置服务、路由服务、分片服务、副本集服务都已经串联起来了,但我们的目的是希望插入数据,数据能够自动分片;
2.7分片生效
连接在mongos上,准备让指定的数据库、指定的集合分片生效;
2.7.1指定testdb分片生效
db.runCommand({enablesharding:“db_file”});
2.7.2指定数据库里需要分片的集合和片键
db.runCommand({shardcollection:“data.table1”,key:{_id:1}})
db.runCommand({shardcollection:“data.fs.files”,key:{_id:1}})
我们设置testdb的 table1 表需要分片,根据 id 自动分片到 shard1 ,shard2,shard3 上面去。要这样设置是因为不是所有mongodb 的数据库和表都需要分片!
2.8测试分片配置结果
2.8.1连接mongos服务器
需重新打开终端输入如下命令:
/home/mongodb-linux/bin/mongo 127.0.0.1:20000
使用testdb
use testdb;
2.8.2插入测试数据
for (var i = 1; i <= 100000; i++){db.fs.files.save({id:i,“test1”:“testval1”})};
2.8.3查看分片情况如下,部分无关信息省掉了
db.table1.stats();
三、重启服务
当服务器遇到关机后需要对服务器进行重启;
3.1删除服务器遗留的mongodb.lock文件
3.2在每一台服务器分别启动配置服务器
/home/mongodb-linux-x86_64-2.4.8/bin/mongod --configsvr --dbpath /home/mongodb/config/data --port 21000 --logpath /home/mongodb/config/log/config.log --fork
3.3在每一台服务器分别启动mongos服务器
/home/mongodb-linux-x86_64-2.4.8/bin/mongos --configdb 172.16.4.221:21000,172.16.4.222:21000,172.16.4.223:21000 --port 20000 --logpath /home/mongodb/mongos/log/mongos.log –fork
3.4激活分片副本集shard1
/home/mongodb-linux-x86_64-2.4.8/bin/mongod --shardsvr --replSet shard1 --port 22001 --dbpath /home/mongodb/shard1/data --logpath /home/mongodb/shard1/log/shard1.log --fork --nojournal --oplogSize 10
3.5激活分片副本集shard2
/home/mongodb-linux-x86_64-2.4.8/bin/mongod --shardsvr --replSet shard2 --port 22002 --dbpath /home/mongodb/shard2/data --logpath /home/mongodb/shard2/log/shard2.log --fork --nojournal --oplogSize 10
3.6激活分片副本集shard3
/home/mongodb-linux-x86_64-2.4.8/bin/mongod --shardsvr --replSet shard3 --port 22003 --dbpath /home/mongodb/shard3/data --logpath /home/mongodb/shard3/log/shard3.log --fork --nojournal --oplogSize 10