版权声明:感谢您阅读我的文章,转载注明出处哦~~ https://blog.csdn.net/haoding205/article/details/82253048
昊鼎王五:linux(centos7)如何七分钟搭建mongodb集群服务器?
1.基础知识:
1.1前提:
本文基于:《昊鼎王五:linux(centos7)如何三分钟搭建mongodb单机服务器?》
https://blog.csdn.net/haoding205/article/details/82225769
1.2什么是mongodb集群?
是实现mongodb服务器高可用的方案
分别有:
mongos,数据库集群请求的入口,所有的请求都通过mongos进行协调,不需要在应用程序添加一个路由选择器,mongos自己就是一个请求分发中心,
它负责把对应的数据请求请求转发到对应的shard服务器上。在生产环境通常有多mongos作为请求的入口,防止其中一个挂掉所有的mongodb请求都没有办法操作。
config server,顾名思义为配置服务器,存储所有数据库元信息(路由、分片)的配置。mongos本身没有物理存储分片服务器和数据路由信息,
只是缓存在内存里,配置服务器则实际存储这些数据。mongos第一次启动或者关掉重启就会从 config server 加载配置信息,
以后如果配置服务器信息变化会通知到所有的 mongos 更新自己的状态,这样 mongos 就能继续准确路由。
在生产环境通常有多个 config server 配置服务器,因为它存储了分片路由的元数据,这个可不能丢失!就算挂掉其中一台,只要还有存货, mongodb集群就不会挂掉。
shard,这就是传说中的分片了。上面提到一个机器就算能力再大也有天花板,就像军队打仗一样,一个人再厉害喝血瓶也拼不过对方的一个师。
俗话说三个臭皮匠顶个诸葛亮,这个时候团队的力量就凸显出来了。在互联网也是这样,一台普通的机器做不了的多台机器来做,如下图:
1.3mongodb分布式应用原理
MongoDB集群包括一定数量的mongod(分片存储数据)、config server(配置节点)、mongos(路由处理)、clients(客户端)、arbiter(仲裁节点:为了选举某个分片存储数据节点那台为主节点)。
1、shards:一个shard为一组mongod,通常一组为两台或多台,主从或互为主从,这一组mongod中的数据时相同的。据分割按有序分割方式,每个分片上的数据为某一范围的数据块,故可支持指定分片的范围查询,这同google的BigTable 类似。数据块有指定的最大容,一旦某个数据块的容量增长到最大容量时,这个数据块会切分成为两块;当分片的数据过多时,数据块将被迁移到系统的其他分片中。另外,新的分片加入时,数据块也会迁移。
2、config server:存储集群的信息,包括分片和块数据信息。主要存储块数据信息,每个config server上都有一份所有块数据信息的拷贝,以保证每config server上的数据的一致性。
3、mongos:可以有多个,相当于一个控制中心,负责路由和协调操作,使得集群像一个整体的系统。mongos可以运行在任何一台服务器上,有些选择放shards服务器上,也有放在client 服务器上的。mongos启动时需要从config servers上获取基本信息,然后接受client端的请求,路由到shards服务器,然后整理返回的结果发回给client服务器。
4、shard key:为了分割数据集,需要制定分片key的格式,类似于用于索引的key格式,通常由一个或多个字段组成以分发数据,比如:
{ name : 1 }
{ _id : 1 }
{ lastname : 1, firstname : 1 }
{ tag : 1, timestamp : -1 }
mongoDB的分片为有序存储(1为升序,-1为降序),shard key相邻的数据通常会存在同一台服务(数据块)上。
1.4如何搭建mongodb集群?
最小化的mongodb集群至少3台机器,高可用集群建议用5台,分别拟定如下:
A:192.168.1.101 #第一台机器,设置:mongo_shard服务端口是27018,mongo_config配置端口是20000,mongos路由端口是30000
B:192.168.1.102 #第二台机器,设置:mongo_shard服务端口是27018,mongo_config配置端口是20000,mongos路由端口是30000
C:192.168.1.103 #第三台机器,设置:mongo_shard服务端口是27018,mongo_config配置端口是20000,mongos路由端口是30000
D:192.168.1.104 #第四台机器,设置:mongo_shard服务端口是27018,mongo_config配置端口是20000
E:192.168.1.105 #第五台机器,设置:mongo_shard服务端口是27018,mongo_config配置端口是20000
具体请见详细搭建步骤
架构图如下:
2.搭建mongodb集群的步骤:
2.1.获取包并解压
cd /hd205/service/mongodbwork
ll mongodb-linux-x86_64-rhel70-3.0.6.tgz
tar xf mongodb-linux-x86_64-rhel70-3.0.6.tgz
mv mongodb-linux-x86_64-rhel70-3.0.6 mongodb #注:上述命令在五台机器上都执行
2.2.创建所需要的目录:
2.2.1.创建数据存放目录
mkdir -p /hd205/service/mongodbwork/data/{shard11,shard21,shard31,config} #第一台机器执行
mkdir -p /hd205/service/mongodbwork/data/{shard12,shard22,shard32,config} #第二台机器执行
mkdir -p /hd205/service/mongodbwork/data/{shard13,shard23,shard33,config} #第三台机器执行
mkdir -p /hd205/service/mongodbwork/data/{shard14,shard24,shard34,config} #第四台机器执行
mkdir -p /hd205/service/mongodbwork/data/{shard15,shard25,shard35,config} #第五台机器执行
2.2.2.创建公共存放目录:
mkdir -p /hd205/service/mongodbwork/{log,pid} #五台机器都执行 , log是日志目录存放地,pid是进程ID存放地
3.副本集、主从、分片、集群核心参数配置步骤:
3.1.清除旧的进程
ps -ef | grep mongo | awk '{print $2}' | xargs kill -2
3.2.拷贝配置文件到指定目录
执行如下命令:
cd /tmp/;
cp mongo_shard1.conf /etc/mongo_shard1.conf
cp mongo_shard2.conf /etc/mongo_shard2.conf
cp mongo_shard3.conf /etc/mongo_shard3.conf
cp mongo_config.conf /etc/mongo_config.conf
cp mongo_mongos.conf /etc/mongo_mongos.conf #注:上述命令在五台机器上都执行
每台机器mongo_shard?.conf内容略有不同,试举一例,如下图:
内容有什么不同呢?请见下图:
注:读者可参照上述图片的参数编辑所需的配置文件,也可以找博主获取到mongo_shard1.conf、mongo_shard2.conf、mongo_shard3.conf、mongo_config.conf、mongo_mongos.conf文件
3.3.核心配置
3.3.1.第一步: 启动分片进程
SET分片(3个shard,每个shard放在5个IP上面,所以总共是15个小分片)
在每台机器执行如下命令,以机器1片区为例:
机器1片区
/hd205/service/mongodbwork/mongodb/bin/mongod -f /etc/mongo_shard1.conf #每台机器都执行,下同
/hd205/service/mongodbwork/mongodb/bin/mongod -f /etc/mongo_shard2.conf
/hd205/service/mongodbwork/mongodb/bin/mongod -f /etc/mongo_shard3.conf
此时,每台机器上面有3个mongodb进程了,如下图:
3.3.2.第二步:设置副本集
3.3.2.1.启动config server进程
/hd205/service/mongodbwork/mongodb/bin/mongod -f /etc/mongo_config.conf #确保每台机器都执行,并且启动成功
3.3.2.2.配置副本集
设定shard1使用27017端口,shard2使用27018端口,shard3使用27019端口,然后以27018端口为例子:
./mongo -port 27018
config = {_id:'shard2',
members:[ {_id:0,host:'192.168.1.101:27018',priority:9},
{_id:1,host:'192.168.1.102:27018',priority:7},
{_id:2,host:'192.168.1.103:27018',priority:5},
{_id:3,host:'192.168.1.104:27018',priority:3},
{_id:4,host:'192.168.1.105:27018',priority:1},
]}
rs.initiate(config);
备注:27018端口与27017、27019是并列关系,没有先后关系,所以参照如上配置完成即可,此处略。
#priority 代表“优先级”,该数字越大的,权重越大,优先级越高。#
3.3.2.3.查看配置的副本集
./mongo -port 27018
MongoDB shell version: 3.0.6
connecting to: 127.0.0.1:27018/test
shard2:PRIMARY> use admin
switched to db admin
shard2:PRIMARY> show dbs;
admin 0.078GB
local 26.065GB
shard2:PRIMARY> rs.status();
{
"set" : "shard2",
"date" : ISODate("2018-05-16T09:43:16.934Z"),
"myState" : 1,
"members" : [
{
"_id" : 0,
"name" : "192.168.1.101:27018",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 785,
"optime" : Timestamp(1526460755, 1),
"optimeDate" : ISODate("2018-05-16T08:52:35Z"),
"electionTime" : Timestamp(1526463021, 1),
"electionDate" : ISODate("2018-05-16T09:30:21Z"),
"configVersion" : 1,
"self" : true
},
{
"_id" : 1,
"name" : "192.168.1.102:27018",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 779,
"optime" : Timestamp(1526460755, 1),
"optimeDate" : ISODate("2018-05-16T08:52:35Z"),
"lastHeartbeat" : ISODate("2018-05-16T09:43:16.513Z"),
"lastHeartbeatRecv" : ISODate("2018-05-16T09:43:16.512Z"),
"pingMs" : 0,
"configVersion" : 1
},
{
"_id" : 2,
"name" : "192.168.1.103:27018",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 775,
"optime" : Timestamp(1526460755, 1),
"optimeDate" : ISODate("2018-05-16T08:52:35Z"),
"lastHeartbeat" : ISODate("2018-05-16T09:43:16.480Z"),
"lastHeartbeatRecv" : ISODate("2018-05-16T09:43:15.393Z"),
"pingMs" : 1,
"configVersion" : 1
},
{
"_id" : 3,
"name" : "192.168.1.104:27018",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 771,
"optime" : Timestamp(1526460755, 1),
"optimeDate" : ISODate("2018-05-16T08:52:35Z"),
"lastHeartbeat" : ISODate("2018-05-16T09:43:16.491Z"),
"lastHeartbeatRecv" : ISODate("2018-05-16T09:43:15.031Z"),
"pingMs" : 0,
"configVersion" : 1
},
{
"_id" : 4,
"name" : "192.168.1.105:27018",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 769,
"optime" : Timestamp(1526460755, 1),
"optimeDate" : ISODate("2018-05-16T08:52:35Z"),
"lastHeartbeat" : ISODate("2018-05-16T09:43:16.434Z"),
"lastHeartbeatRecv" : ISODate("2018-05-16T09:43:15.203Z"),
"pingMs" : 0,
"configVersion" : 1
}
],
"ok" : 1
}
shard2:PRIMARY>
同样的方式,也可以查看27017、27019为端口的副本集,此处不在敷述。
此时,“复制集”设置完成。
3.3.3.第三步:配置路由
3.3.3.1.启动路由进程
命令:
/hd205/service/mongodbwork/mongodb/bin/mongos -f /etc/mongo_mongos.conf
3.3.3.2.路由配置里面添加分片信息
./bin/mongo -port 30000
mongos> db.runCommand({addshard:"shard1/192.168.1.101:27017,192.168.1.102:27017,192.168.1.103:27017,192.168.1.104:27017,192.168.1.105:27017", name:"s1", maxsize:20480});
mongos> db.runCommand({addshard:"shard2/192.168.1.101:27018,192.168.1.102:27018,192.168.1.103:27018,192.168.1.104:27018,192.168.1.105:27018", name:"s2", maxsize:20480});
mongos> db.runCommand({addshard:"shard3/192.168.1.101:27019,192.168.1.102:27019,192.168.1.103:27019,192.168.1.104:27019,192.168.1.105:27019", name:"s3", maxsize:20480});
#把分片加入集群,让mongos进程知道哪些机器是需要加入分片的#
3.3.3.3.验证并查看分片信息
验证上一步操作的结果正确性,可使用下列命令查看
./bin/mongo -port 30000
mongos> show dbs
admin (empty)
config 0.016GB
mongos> use config
switched to db config
mongos> db.shards.find() ----查看分片的情况:
{ "_id" : "s1", "host" : "shard1/192.168.1.101:27017,192.168.1.102:27017,192.168.1.103:27017,192.168.1.104:27017,192.168.1.105:27017" }
{ "_id" : "s2", "host" : "shard2/192.168.1.101:27018,192.168.1.102:27018,192.168.1.103:27018,192.168.1.104:27018,192.168.1.105:27018" }
{ "_id" : "s3", "host" : "shard3/192.168.1.101:27019,192.168.1.102:27019,192.168.1.103:27019,192.168.1.104:27019,192.168.1.105:27019" }
mongos>
3.3.3.4.制定分片规则
mongos> db.runCommand({"shardcollection":"dbname.tablename","key":{"primaryKey":1}})
{ "ok" : 0, "errmsg" : "sharding not enabled for db" }
3.3.3.5.激活分片设置
mongos> db.runCommand({"enablesharding":"dbname"})
{ "ok" : 1 }
OK到这里已经成功配置了分片。
ps:在没有确定好分片的键值key的情况下,可以暂时不执行“3.3.3.4”和“3.3.3.5”,因为分片键值key的创建与创建索引一样要慎重,如何做到真正做到提升读写效率而不是随便创建,这是一个需要认真处理的事务。
4.验证集群
4.1.查看集群分片整体状况:
./bin/mongo -port 30000
mongos> db.printShardingStatus()
--- Sharding Status ---
sharding version: {
"_id" : 1,
"minCompatibleVersion" : 5,
"currentVersion" : 6,
"clusterId" : ObjectId("5afbd5e93e4d3546l27319k7e9c8e90858d3e")
}
shards:
{ "_id" : "s1", "host" : "shard1/192.168.1.101:27017,192.168.1.102:27017,192.168.1.103:27017,192.168.1.104:27017,192.168.1.105:27017" }
{ "_id" : "s2", "host" : "shard2/192.168.1.101:27018,192.168.1.102:27018,192.168.1.103:27018,192.168.1.104:27018,192.168.1.105:27018" }
{ "_id" : "s3", "host" : "shard3/192.168.1.101:27019,192.168.1.102:27019,192.168.1.103:27019,192.168.1.104:27019,192.168.1.105:27019" }
balancer:
Currently enabled: yes
Currently running: no
Failed balancer rounds in last 5 attempts: 0
Migration Results for the last 24 hours:
No recent migrations
databases:
{ "_id" : "admin", "partitioned" : false, "primary" : "config" }
{ "_id" : "haoding1", "partitioned" : false, "primary" : "s1" }
{ "_id" : "haoding2", "partitioned" : false, "primary" : "s2" }
{ "_id" : "haoding3", "partitioned" : true, "primary" : "s3" }
{ "_id" : "haoding4", "partitioned" : false, "primary" : "s3" }
mongos>
4.2.验证分片的数据库自动迁移:
db.runCommand({enablesharding:'haoding3'})
printShardingStatus()
db.runCommand({shardcollection:'haoding3.auto_increment_id', key:{_id:1}, unique : true})
db.runCommand({shardcollection:'haoding3.c1', key:{_id:1}, unique : true})
for (var i = 1; i <= 100; i++)db.c1.save({id:i,value1:"1234567890",value2:"1234567890",value3:"1234567890",value4:"1234567890"}) #构造大批量数据#
db.c1.stats()
db.createCollection("cap_coll", {capped:true, size:100000, max:100});
db.mycoll.validate();
4.5.其他管理命令
show dbs
use admin
show collections
db.serverStatus()
db.shutdownServer()
exit;
5.索引相关
db.product_data.ensureIndex({data_id: 1}, {unique: true,dropDups: true}); #创建索引
db.product_data.dropIndexes(); #删除索引
好了,聪明如你,知道了linux(centos7)如何七分钟搭建mongodb集群服务器,是不是很欢喜 ^_^
还有其他问题的可以在评论区留言或者扫码加博主获取资源或者提问。