基于分片和复制集的三节点mongodb集群

基于分片和复制集的三节点mongodb集群_第1张图片
使用mongo的自动分片和复制集的功能搭建mongodb三节点集群,每个节点都运行三个分片服务器进程,一个路由服务器和配置服务器,该架构集群可以实现容错性,正常情况下客户端连接路由服务器,路由服务器没有主次之分,连接哪一台服务器的路由服务器都可以,路由服务器根据配置服务器找到相应分片服务器组成的复制集的主节点,如果是查询操作主节点就把任务发放给从库,如果是写操作就会把数据写在主节点的主库,并及时更新从库的内容从而达到数据的一致性。如果出现主节点宕机或者主节点不可达,mongodb复制集的自动故障转移在这时就发挥了作用,仲裁者选举从节点为主节点,这一过程对客户端来说是透明的,客户端依旧可以获得想要的数据。使用jsp技术搭建web系统连接数据库实现查询的功能。

 (a)配置环境
centos5.7.i586
mongodb-linux-i686-3.0.12.tgz

(b)配置脚本
#分别在每台机器建立mongos 、config 、 shard1 、shard2、shard3 五个目录。
因为mongos不存储数据,只需要建立日志文件目录即可。
划5个组件对应的端口号,由于一个机器需要同时部署 mongos、config server 、shard1、shard2、shard3,所以需要用端口进行区分。
这个端口可以自由定义,在本文 mongos为 20000, config server 为 21000, shard1为 22001 , shard2为22002, shard3为22003.
#创建目录
mkdir shard1data
mkdir configdata
mkdir shard1data
mkdir shard2data
mkdir shard3data
#在每一台服务器分别启动配置服务器
mongod --configsvr --dbpath configdata --port 21000 --logpath  ./log/config.log  --logappend  --fork

在每一台服务器分别启动mongos服务器。
mongos --configdb 192.168.169.100:21000,192.168.169.101:21000,192.168.169.102:21000  --port 27020  --logpath  ./log/mongos.log  --logappend  --fork

配置各个分片的副本集。
#在每个机器里分别设置分片1服务器及副本集shard1
mongod --shardsvr --replSet shard1 --port 22001 --dbpath shard1data  --logpath  ./log/shard1.log  --logappend  --fork 

#在每个机器里分别设置分片2服务器及副本集shard2
 mongod --shardsvr --replSet shard2 --port 22002 --dbpath shard2data  --logpath log/shard2.log --logappend --fork

#在每个机器里分别设置分片3服务器及副本集shard3 
mongod --shardsvr --replSet shard3 --port 22003 --dbpath shard3data  --logpath log/shard3.log  --logappend --fork 

任意登陆一个机器,比如登陆192.168.0.136,连接mongodb
#设置第一个分片副本集
mongo  127.0.0.1:22001
#使用admin数据库
use admin
#定义副本集配置
config = { _id:"shard1", members:[
                     {_id:0,host:"192.168.169.100:22001"},
                     {_id:1,host:"192.168.169.101:22001"},
                     {_id:2,host:"192.168.169.102:22001",arbiterOnly:true}
                ]
         }


#初始化副本集配置
rs.initiate(config);

#设置第二个分片副本集
mongo  127.0.0.1:22002
#使用admin数据库
use admin

#定义副本集配置
config = { _id:"shard2", members:[
                     {_id:0,host:"192.168.169.100:22002"},
                     {_id:1,host:"192.168.169.101:22002"},
                     {_id:2,host:"192.168.169.102:22002",arbiterOnly:true}
                ]
         }

#初始化副本集配置
rs.initiate(config);

#设置第三个分片副本集
mongo    127.0.0.1:22003

#使用admin数据库
use admin

#定义副本集配置
config = { _id:"shard3", members:[
                     {_id:0,host:"192.168.169.100:22003"},
                     {_id:1,host:"192.168.169.101:22003"},
                     {_id:2,host:"192.168.169.102:22003",arbiterOnly:true}
                ]
         }
始化副本集配置
rs.initiate(config);

目前搭建了mongodb配置服务器、路由服务器,各个分片服务器,不过应用程序连接到 mongos 路由服务器并不能使用分片机制,还需要在程序里设置分片配置,让分片生效。

#连接到mongos
mongo  127.0.0.1:20000

#使用admin数据库
user  admin

#串联路由服务器与分配副本集1
db.runCommand( { addshard : "shard1/192.168.169.100:22001,192.168.169.101:22001,192.168.169.102:22001"});
#串联路由服务器与分配副本集2
db.runCommand( { addshard : "shard2/192.168.169.100:22002,192.168.169.101:22002,192.168.169.102:22002"});
#串联路由服务器与分配副本集3
db.runCommand( { addshard : "shard3/192.168.169.100:22003,192.168.169.101:22003,192.168.169.102:22003"});
#查看分片服务器的配置
db.runCommand( { listshards : 1 } );

目前配置服务、路由服务、分片服务、副本集服务都已经串联起来了,但我们的目的是希望插入数据,数据能够自动分片,就差那么一点点,一点点。。。

连接在mongos上,准备让指定的数据库、指定的集合分片生效。

#指定nyist分片生效
sh.enableSharding("nyist")

#指定数据库里需要分片的集合和片键
sh.shardCollection("nyist.weather",{nian:1})

我们设置testdb的 table1 表需要分片,根据 id 自动分片到 shard1 ,shard2,shard3 上面去。要这样设置是因为不是所有mongodb 的数据库和表 都需要分片! 

db.weather.stats();

你可能感兴趣的:(mongodb)