1、MongoDB简介
MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。
2、MongoDB架构
3、架构搭好了,安装软件!
3.1、MongoDB集群节点分布
192.168.253.100 mongodb01 192.168.253.101 mongodb02 192.168.253.102 mongodb03
3.2、分别在每台机器上建立mongodb分片对应测试文件夹。
#存放mongodb数据文件 mkdir -p /home/csvctest/servers/mongodbtest #进入mongodb文件夹 cd /home/csvctest/servers/mongodbtest
3.3、下载mongodb的安装程序包
wget http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-2.4.8.tgz #解压下载的压缩包 tar -zxvf mongodb-linux-x86_64-2.4.8.tgz
3.4、分别在每台机器建立mongos 、config 、 shard1 、shard2、shard3 五个目录。因为mongos不存储数据,只需要建立日志文件目录即可。
#建立mongos目录 mkdir -p /home/csvctest/servers/mongodbtest/mongos/log #建立config server 数据文件存放目录 mkdir -p /home/csvctest/servers/mongodbtest/config/data #建立config server 日志文件存放目录 mkdir -p /home/csvctest/servers/mongodbtest/config/log #建立shard1 数据文件存放目录 mkdir -p /home/csvctest/servers/mongodbtest/shard1/data #建立shard1 日志文件存放目录 mkdir -p /home/csvctest/servers/mongodbtest/shard1/log #建立shard2 数据文件存放目录 mkdir -p /home/csvctest/servers/mongodbtest/shard2/data #建立shard2 日志文件存放目录 mkdir -p /home/csvctest/servers/mongodbtest/shard2/log #建立shard3 数据文件存放目录 mkdir -p /home/csvctest/servers/mongodbtest/shard3/data #建立shard3 日志文件存放目录 mkdir -p /home/csvctest/servers/mongodbtest/shard3/log
3.5、规划5个组件对应的端口号,由于一个机器需要同时部署 mongos、config server 、shard1、shard2、shard3,所以需要用端口进行区分。
mongos : 20000 config server : 21000 shard1 : 22001 shard2 : 22002 shard3 : 22003.
3.6、在每一台服务器分别启动配置服务器。
# 在每一台服务器分别启动配置服务器 /home/csvctest/servers/mongodbtest/mongodb-linux-x86_64-3.4.18/bin/mongod --configsvr --replSet cfgReplSet --dbpath config/data --port 21000 --logpath config/log/config.log --fork # 配置config server为replica set。 # 连接到任意一台config server: mongodb-linux-x86_64-3.4.18/bin/mongo --host 192.168.253.100 --port 21000 rs.initiate({_id:"cfgReplSet",configsvr:true,members:[{_id:0,host:"192.168.253.100:21000"},{_id:1,host:"192.168.253.101:21000"},{_id:2,host:"192.168.253.102:21000"}]})
3.7、在每一台服务器分别启动mongos服务器。
/home/csvctest/servers/mongodbtest/mongodb-linux-x86_64-3.4.18/bin/mongos --configdb cfgReplSet/192.168.253.100:21000,192.168.253.101:21000,192.168.253.102:21000 --port 20000 --logpath mongos/log/mongos.log --fork
3.8、配置各个分片的副本集。
# 在每个机器里分别设置分片1服务器及副本集shard1 /home/csvctest/servers/mongodbtest/mongodb-linux-x86_64-3.4.18/bin/mongod --shardsvr --replSet shard1ReplSet --port 22001 --dbpath shard1/data --logpath shard1/log/shard1.log --fork --nojournal --oplogSize 10 # 为了快速启动并节约测试环境存储空间,这里加上 nojournal 是为了关闭日志信息,在我们的测试环境不需要初始化这么大的redo日志。同样设置 oplogsize是为了降低 local 文件的大小,oplog是一个固定长度的 capped collection,它存在于”local”数据库中,用于记录Replica Sets操作日志。注意,这里的设置是为了测试! # 在每个机器里分别设置分片2服务器及副本集shard2 /home/csvctest/servers/mongodbtest/mongodb-linux-x86_64-3.4.18/bin/mongod --shardsvr --replSet shard2ReplSet --port 22002 --dbpath shard2/data --logpath shard2/log/shard2.log --fork --nojournal --oplogSize 10 # 在每个机器里分别设置分片3服务器及副本集shard3 /home/csvctest/servers/mongodbtest/mongodb-linux-x86_64-3.4.18/bin/mongod --shardsvr --replSet shard3ReplSet --port 22003 --dbpath shard3/data --logpath shard3/log/shard3.log --fork --nojournal --oplogSize 10 # 任意登陆一个机器,比如登陆192.168.253.100,连接mongodb # 设置第一个分片副本集 mongodb-linux-x86_64-3.4.18/bin/mongo 192.168.253.100:22001 # 使用admin数据库 use admin #定义副本集配置 config = { _id:"shard1ReplSet", members:[ {_id:0,host:"192.168.253.100:22001"}, {_id:1,host:"192.168.253.101:22001"}, {_id:2,host:"192.168.253.102:22001",arbiterOnly:true} ] } # 初始化副本集配置 rs.initiate(config); # 设置第二个分片副本集 mongodb-linux-x86_64-3.4.18/bin/mongo 192.168.253.100:22002 # 使用admin数据库 use admin # 定义副本集配置 config = { _id:"shard2ReplSet", members:[ {_id:0,host:"192.168.253.100:22002",arbiterOnly:true}, {_id:1,host:"192.168.253.101:22002"}, {_id:2,host:"192.168.253.102:22002"} ] } # 初始化副本集配置 rs.initiate(config); # 设置第三个分片副本集 mongodb-linux-x86_64-3.4.18/bin/mongo 192.168.253.102:22003 # 使用admin数据库 use admin # 定义副本集配置 config = { _id:"shard3ReplSet", members:[ {_id:0,host:"192.168.253.102:22003"}, {_id:1,host:"192.168.253.101:22003",arbiterOnly:true}, {_id:2,host:"192.168.253.100:22003"} ] } # 初始化副本集配置 rs.initiate(config);
3.9、目前搭建了mongodb配置服务器、路由服务器,各个分片服务器,不过应用程序连接到 mongos 路由服务器并不能使用分片机制,还需要在程序里设置分片配置,让分片生效。
# 连接到mongos mongodb-linux-x86_64-3.4.18/bin/mongo 192.168.253.100:20000 # 使用admin数据库 use admin # 串联路由服务器与分配副本集1 db.runCommand( { addshard : "shard1ReplSet/192.168.253.100:22001,192.168.253.101:22001,192.168.253.102:22001"}); # 如里shard是单台服务器,用 db.runCommand( { addshard : “[: ]” } )这样的命令加入,如果shard是副本集,用db.runCommand( { addshard : “replicaSetName/[:port][,serverhostname2[:port],…]” });这样的格式表示 。 # 串联路由服务器与分配副本集2 db.runCommand( { addshard : "shard2ReplSet/192.168.253.100:22002,192.168.253.101:22002,192.168.253.102:22002"}); # 串联路由服务器与分配副本集3 db.runCommand( { addshard : "shard3ReplSet/192.168.253.100:22003,192.168.253.101:22003,192.168.253.102:22003"}); # 查看分片服务器的配置 db.runCommand( { listshards : 1 } );
3.10、目前配置服务、路由服务、分片服务、副本集服务都已经串联起来了,但我们的目的是希望插入数据,数据能够自动分片,就差那么一点点,一点点。。。
连接在mongos上,准备让指定的数据库、指定的集合分片生效。# 指定testdb分片生效 db.runCommand( { enablesharding :"testdb"}); # 指定数据库里需要分片的集合和片键 db.runCommand( { shardcollection : "testdb.table1",key : {id: "hashed" } } ) # 我们设置testdb的 table1 表需要分片,根据 id 自动分片到 shard1 ,shard2,shard3 上面去。要这样设置是因为不是所有mongodb 的数据库和表 都需要分片!
3.11、测试分片配置结果。
# 连接mongos服务器 mongodb-linux-x86_64-3.4.18/bin/mongo 192.168.253.100:20000 # 使用testdb use testdb; # 插入测试数据 for (var i = 1; i <= 1000; i++) db.table1.save({id:i,"test1":"testval1"}); # 查看分片情况如下,部分无关信息省掉了 db.table1.stats(); { "sharded" : true, "ns" : "testdb.table1", "count" : 100000, "numExtents" : 13, "size" : 5600000, "storageSize" : 22372352, "totalIndexSize" : 6213760, "indexSizes" : { "_id_" : 3335808, "id_1" : 2877952 }, "avgObjSize" : 56, "nindexes" : 2, "nchunks" : 3, "shards" : { "shard1" : { "ns" : "testdb.table1", "count" : 42183, "size" : 0, ... "ok" : 1 }, "shard2" : { "ns" : "testdb.table1", "count" : 38937, "size" : 2180472, ... "ok" : 1 }, "shard3" : { "ns" : "testdb.table1", "count" :18880, "size" : 3419528, ... "ok" : 1 } }, "ok" : 1 } # 可以看到数据分到3个分片,各自分片数量为: shard1 “count” : 42183,shard2 “count” : 38937,shard3 “count” : 18880。已经成功了!不过分的好像不是很均匀,所以这个分片还是很有讲究的,后续再深入讨论。
文章转自:搭建高可用mongodb集群(一)—— 分片
文章转自:搭建高可用mongodb集群(二)—— 分片
文章转自:搭建高可用mongodb集群(三)—— 分片
文章转自:搭建高可用mongodb集群(四)—— 分片
每一个成功的背后都有无数个无人知晓的黑夜。
因为
夜晚,是超越对手的最佳时机。
===================== 码农1024 =====================#蔺光岭#
还不快抢沙发