MongoDB ReplSet + Sharding 分片集群,主从同步配置

MongoDB是由C++语言编写一个基于分布式文件存储的数据库,旨在为WEB应用提供可扩展的高性能数据存储解决方案, 支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引,MogoDB的主要特点就是 高性能、易部署、易使用,存储数据非常方便,以下来说明一下MongoDB的分片chunk集群部署。
    Mongodb Sharding Cluster 的构建需要三种角色
       1. Shard Server:mongod 实例,用于存储实际的数据块 
       2.  Config Server: mongod 实例,存储了整个 Cluster Metadata,其中包括 chunk 信息
       3.  Route  Server: mongos 实例,前端路由,应用程序访问由此进入,调度具体的shard分配,使得整个集群得以透明化
       环境配置:
       Server1: 192.168.231.129    
       Server2: 192.168.231.130
       Server3: 192.168.231.131
       首先配置 shard1 集群,登录 Server1:
       创建数据目录:mkdir -p /data/mongodb/shard1_1  
       启动shard1分片实例:cd /$mongopath/bin   
       ./mongod --shardsvr --replSet shard1 --port 27017 --dbpath /data/shard1_1 --oplogSize 100 --logpath /data/mongodb/shard1_1/shard1_1.log --logappend --fork (logappend 表示日志写入为追加的方式,不会覆盖之前已写入的日志内容,fork表示后台运行)
       登录Server2
       创建数据目录:mkdir -p /data/mongodb/shard1_2
       启动shard1分片实例:cd /$mongopath/bin   
       ./mongod --shardsvr --replSet shard1 --port 27017 --dbpath /data/shard1_2 --oplogSize 100 --logpath /data/mongodb/shard1_2/shard1_2.log --logappend --fork   
       登录Server3
       创建数据目录:mkdir -p /data/mongodb/shard1_3
       启动shard1分片实例:cd /$mongopath/bin   
       ./mongod --shardsvr --replSet shard1 --port 27017 --dbpath /data/shard1_3 --oplogSize 100 --
logpath /data/mongodb/shard1_3/shard1_3.log --logappend --fork 
       在确定三台上的27017端口都起来之后,连接其中任意一台mongo,初始化replication set
       ./mongo --port 27017  执行
> config={_id:'shard1',members:[{_id:0,host:'192.168.231.129:27017'},{ _id:1,host:'192.168.231.130:27017' },{ _id:2,host:'192.168.231.131:27017' }]}
{
        "_id" : "shard1",
        "members" : [
                {
                        "_id" : 0,
                        "host" : " 192.168.231.129:27017 "
                },
                {
                        "_id" : 1,
                        "host" : " 192.168.231.130:27017 "
                },
                {
                        "_id" : 2,
                        "host" : " 192.168.231.131:27017 "
                }
        ]
}
> rs.initiate(config)
{
        "info" : "Config now saved locally.  Should come online in about a minute.",
        "ok" : 1
}
添加完成后,执行 rs.initiate(config); 初始化replca set内容
这里,我们就完成了shard1的配置,下面来配置shard2的信息
       登录 Server1:
       创建数据目录:mkdir -p /data/mongodb/shard2_1  
       启动shard1分片实例:cd /$mongopath/bin   
       ./mongod --shardsvr --replSet shard2 --port 27018 --dbpath /data/shard2_1 --oplogSize 100 --logpath /data/mongodb/shard2_1/shard2_1.log --logappend --fork (logappend 表示日志写入为追加的方式,不会覆盖之前已写入的日志内容,fork表示后台运行)
       登录Server2
       创建数据目录:mkdir -p /data/mongodb/shard2_2
       启动shard1分片实例:cd /$mongopath/bin   
       ./mongod --shardsvr --replSet shard2 --port 27018 --dbpath /data/shard2_2 --oplogSize 100 --logpath /data/mongodb/shard2_2/shard2_2.log --logappend --fork   
       登录Server3
       创建数据目录:mkdir -p /data/mongodb/shard2_3
       启动shard1分片实例:cd /$mongopath/bin   
       ./mongod --shardsvr --replSet shard2 --port 27018 --dbpath /data/shard2_3 --oplogSize 100 --
logpath /data/mongodb/shard2_3/shard2_3.log --logappend --fork 
       在确定三台上的27018端口都起来之后,连接其中任意一台mongo,初始化replication set
       ./mongo --port 27018  执行
> config={_id:'shard2',members:[{_id:0,host:'192.168.231.129:27018'},{ _id:1,host:'192.168.231.130:27018' },{ _id:2,host:'192.168.231.131:27018' }]}
{
        "_id" : "shard2",
        "members" : [
                {
                        "_id" : 0,
                        "host" : " 192.168.231.129:27018 "
                },
                {
                        "_id" : 1,
                        "host" : " 192.168.231.130:27018 "
                },
                {
                        "_id" : 2,
                        "host" : " 192.168.231.131:27018 "
                }
        ]
}
> rs.initiate(config)
{
        "info" : "Config now saved locally.  Should come online in about a minute.",
        "ok" : 1
}

至此,三台shard已经配置完成,下面配置config server
在三台机器上分别执行:

mkdir -p /data/mongodb/config
./mongod –configsvr –dbpath /data/mongodb/config –port 20000 –logpath  /data/mongodb/config/config.log –logappend –fork

配置router server:

在三台server上分别执行:

./mongos –configdb 192.168.231.129:20000,192.168.231.130:20000,192.168.231.131:20000 –port 30000 –chunkSize 5 –logpath /data/mongodb/mongos.log --logappend --fork (chunkSize 指定分片的大小,可以视情况而定)

Configuring the Shard Cluster

连接到其中一个mongos进程,并切换到admin数据库做以下配置
1. 连接到mongs,并切换到admin

./mongo 192.168.231.129:30000/admin

2. 加入shards

db.runCommand( { addshard : “shard1/192.168.231.129:27017, 192.168.231.130:27017,192.168.231..131:27017″,name:”s1″} ); (名字可以随意指定,如果不指定,则默认为shard1)

db.runCommand( { addshard : “shard2/ 192.168.231.129:27018, 192.168.231.130:27018, 192.168.231.131:27018″,name:”s2″} ); 

每一次点击确定之后,出现{ "shardAdded" : "shard1", "ok" : 1 } 提示,表示添加成功了。

这个时候,可以用 db.runCommand( { listshards : 1 } ) 命令查看分片的情况 , 如果出现两个分片,则代表配置成功了。

激活数据库分片: db.runCommand( { enablesharding : “<dbname>” } );

例:我们用test测试库分别激活其数据库及集合的分片

db.runCommand({ enablesharding:"test" })
db.runCommand({ shardcollection: "test.users", key: { _id:1 }})

use test;  我们插入一些数据进行一下测试:

for(var i=1;i<=20000;i++) db.users.insert({id:i,name:"xiaoxiao",tel:"123456"});

插入完毕之后,运行db.users.stats() 查看分片结果:

mongos> db.users.stats()

{

        "sharded" : true,

        "flags" : 1,

        "ns" : "test.users",

        "count" : 22000,

        "numExtents" : 10,

        "size" : 1632028,

        "storageSize" : 5586944,

        "totalIndexSize" : 735840,

        "indexSizes" : {

                "_id_" : 735840

        },

        "avgObjSize" : 74.18309090909091,

        "nindexes" : 1,

        "nchunks" : 3,

        "shards" : {

                "shard1" : {

                        "ns" : "test.users",

                        "count" : 8128,

                        "size" : 577744,

                        "avgObjSize" : 71.08070866141732,

                        "storageSize" : 2793472,

                        "numExtents" : 5,

                        "nindexes" : 1,

                        "lastExtentSize" : 2097152,

                        "paddingFactor" : 1,

                        "flags" : 1,

                        "totalIndexSize" : 277984,

                        "indexSizes" : {

                                "_id_" : 277984

                        },

                        "ok" : 1

                },

                "shard2" : {

                        "ns" : "test.users",

                        "count" : 13872,

                        "size" : 1054284,

                        "avgObjSize" : 76.00086505190312,

                        "storageSize" : 2793472,

                        "numExtents" : 5,

                        "nindexes" : 1,

                        "lastExtentSize" : 2097152,

                        "paddingFactor" : 1,

                        "flags" : 1,

                        "totalIndexSize" : 457856,

                        "indexSizes" : {

                                "_id_" : 457856

                        },

                        "ok" : 1

                }

        },

        "ok" : 1

}

以上结果表示,分片已经成功了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值