Linux科技

MongoDB分片集群搭建

2019-03-13  本文已影响3人  Miracle001

架构图

准备

centos7 1804
网络NAT+仅主机
3台主机
192.168.25.11--3个config server、1个shard、1个router
192.168.25.12--1个shard、1个router
192.168.25.13 --1个shard

/etc/hosts
192.168.25.11 node1.fgq.com node1
192.168.25.12 node2.fgq.com node2
192.168.25.13 node3.fgq.com node3
192.168.25.14 node4.fgq.com node4
192.168.25.15 node5.fgq.com node5

下载mongodb包
https://www.mongodb.com/download-center/community
mongodb-linux-x86_64-rhel70-4.0.6.tgz

注:config server 使用复制集不用有arbiter节点。3.4版本以后config必须为复制集
注:在做分片的时候,要避免Shard在同一台主机上,这样就没办法实现分片

3个节点都操作,以node1为例

# 创建目录
[root@node1 ~]# mkdir -p /fgq/{base-env,data/mongodb/{conf,data,logs,socket}}
[root@node1 ~]# cd /fgq/base-env/
[root@node1 base-env]# rz  上传mongodb包
[root@node1 base-env]# tar zxf mongodb-linux-x86_64-rhel70-4.0.6.tgz 
[root@node1 base-env]# ln -s mongodb-linux-x86_64-rhel70-4.0.6 mongodb
# 环境变量
[root@node1 base-env]# vim /etc/profile.d/mongodb.sh 
export PATH=$PATH:/fgq/base-env/mongodb/bin
[root@node1 base-env]# source /etc/profile.d/mongodb.sh
# 添加用户
[root@node1 base-env]# useradd mongod;echo 123456|passwd --stdin mongod

shard集群配置

node1
[root@node1 base-env]# cd ../data/mongodb/conf/
[root@node1 conf]# vim mongod.conf
systemLog:
  destination: file
  path: /fgq/data/mongodb/logs/mongod.log
  logAppend: true
storage:
  journal:
    enabled: true
  dbPath: /fgq/data/mongodb/data/mongod
  directoryPerDB: true
  #engine: wiredTiger
  wiredTiger:
    engineConfig:
      # cacheSizeGB: 1
      directoryForIndexes: true
    collectionConfig:
      blockCompressor: zlib
    indexConfig:
      prefixCompression: true
processManagement:
  fork: true
  pidFilePath: /fgq/data/mongodb/socket/mongod.pid
net:
#  port:   默认端口27018
  bindIp: 192.168.25.11
replication:
  oplogSizeMB: 50
  replSetName: rs1
sharding:
  clusterRole: shardsvr
# 创建shard存储目录
[root@node1 ~]# mkdir /fgq/data/mongodb/data/mongod
# 启动
[root@node1 ~]# mongod -f /fgq/data/mongodb/conf/mongod.conf
about to fork child process, waiting until server is ready for connections.
forked process: 1384
child process started successfully, parent exiting
[root@node1 ~]# netstat -ntlup |grep mongod
tcp        0      0 192.168.25.11:27018     0.0.0.0:*               LISTEN      1384/mongod 

把配置文件复制到其他节点上
[root@node1 conf]# scp mongod.conf node2:/fgq/data/mongodb/conf/
[root@node1 conf]# scp mongod.conf node3:/fgq/data/mongodb/conf/


node2
[root@node2 ~]# vim /fgq/data/mongodb/conf/mongod.conf
  把bindIp改为192.168.25.12即可
  bindIp: 192.168.25.12
[root@node2 ~]# mkdir /fgq/data/mongodb/data/mongod
[root@node2 ~]# mongod -f /fgq/data/mongodb/conf/mongod.conf
about to fork child process, waiting until server is ready for connections.
forked process: 4929
child process started successfully, parent exiting
[root@node2 ~]# netstat -ntlup |grep mongod
tcp        0      0 192.168.25.12:27018     0.0.0.0:*               LISTEN      4929/mongod


node3
[root@node3 ~]# vim /fgq/data/mongodb/conf/mongod.conf
  把bindIp改为192.168.25.13即可
  bindIp: 192.168.25.13
[root@node3 ~]# mkdir /fgq/data/mongodb/data/mongod
[root@node3 ~]# mongod -f /fgq/data/mongodb/conf/mongod.conf 
about to fork child process, waiting until server is ready for connections.
forked process: 1472
child process started successfully, parent exiting
[root@node3 ~]# netstat -ntlup |grep mongod
tcp        0      0 192.168.25.13:27018     0.0.0.0:*               LISTEN      1472/mongod

配置复制集
[root@node1 ~]# mongo --host 192.168.25.11 --port 27018
> config = {_id: 'rs1', members: [{_id: 0, host: '192.168.25.11:27018'},{_id: 1, host: '192.168.25.12:27018'},{_id: 2, host: '192.168.25.13:27018'}]}
{
    "_id" : "rs1",
    "members" : [
        {
            "_id" : 0,
            "host" : "192.168.25.11:27018"
        },
        {
            "_id" : 1,
            "host" : "192.168.25.12:27018"
        },
        {
            "_id" : 2,
            "host" : "192.168.25.13:27018"
        }
    ]
}
> rs.initiate(config)
{
    "ok" : 1,
    "operationTime" : Timestamp(1552382083, 1),
    "$clusterTime" : {
        "clusterTime" : Timestamp(1552382083, 1),
        "signature" : {
            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
            "keyId" : NumberLong(0)
        }
    }
}
rs1:SECONDARY>   再次回车就变成了主节点
rs1:PRIMARY>
现在只配置一个shard集群,按理说应该配置2个shard集群

config集群配置(仅node1)

node1
[root@node1 ~]# cd /fgq/data/mongodb/conf/
[root@node1 conf]# vim mongosvr-20000.conf
systemLog:
 destination: file
###日志存储位置
 path: /fgq/data/mongodb/logs/mongosvr-20000.log
 logAppend: true
storage:
##journal配置
 journal:
  enabled: true
##数据文件存储位置
 dbPath: /fgq/data/mongodb/data/mongosvr-20000
##是否一个库一个文件夹
 directoryPerDB: true
##数据引擎
# engine: wiredTiger
##WT引擎配置
 wiredTiger:
  engineConfig:
##WT最大使用cache(根据服务器实际情况调节)
   cacheSizeGB: 1
##是否将索引也按数据库名单独存储
   directoryForIndexes: true
##表压缩配置
  collectionConfig:
   blockCompressor: zlib
##索引配置
  indexConfig:
   prefixCompression: true
processManagement:
 fork: true  # fork and run in background
 pidFilePath: /fgq/data/mongodb/socket/mongosvr-20000.pid
##端口配置
net:
 port: 20000
 bindIp: 192.168.25.11
replication:
 oplogSizeMB: 50
 replSetName: configReplSet
sharding:
 clusterRole: configsvr
[root@node1 conf]# cp mongosvr-20000.conf mongosvr-21000.conf 
[root@node1 conf]# cp mongosvr-20000.conf mongosvr-22000.conf
[root@node1 conf]# vim mongosvr-21000.conf
:%s/20000/21000/g
[root@node1 conf]# vim mongosvr-22000.conf
:%s/20000/22000/g
# 创建数据文件存储目录
[root@node1 conf]# mkdir /fgq/data/mongodb/data/{mongosvr-20000,mongosvr-21000,mongosvr-22000}

# 启动config server集群
[root@node1 ~]# mongod -f /fgq/data/mongodb/conf/mongosvr-20000.conf 
about to fork child process, waiting until server is ready for connections.
forked process: 1601
child process started successfully, parent exiting
[root@node1 ~]# mongod -f /fgq/data/mongodb/conf/mongosvr-21000.conf 
about to fork child process, waiting until server is ready for connections.
forked process: 1642
child process started successfully, parent exiting
[root@node1 ~]# mongod -f /fgq/data/mongodb/conf/mongosvr-22000.conf 
about to fork child process, waiting until server is ready for connections.
forked process: 1680
child process started successfully, parent exiting
[root@node1 ~]# ss -ntlup|grep mongod
tcp    LISTEN     0      128    192.168.25.11:20000                 *:*                   users:(("mongod",pid=1601,fd=11))
tcp    LISTEN     0      128    192.168.25.11:21000                 *:*                   users:(("mongod",pid=1642,fd=11))
tcp    LISTEN     0      128    192.168.25.11:27018                 *:*                   users:(("mongod",pid=1384,fd=11))
tcp    LISTEN     0      128    192.168.25.11:22000                 *:*                   users:(("mongod",pid=1680,fd=11))

# 配置config server复制集
[root@node1 ~]# mongo --host 192.168.25.11 --port 20000 admin
# 配置复制集信息
> config = {_id: 'configReplSet', members: [{_id: 0, host: '192.168.25.11:20000'},{_id: 1, host: '192.168.25.11:21000'},{_id: 2, host: '192.168.25.11:22000'}]}
{
    "_id" : "configReplSet",
    "members" : [
        {
            "_id" : 0,
            "host" : "192.168.25.11:20000"
        },
        {
            "_id" : 1,
            "host" : "192.168.25.11:21000"
        },
        {
            "_id" : 2,
            "host" : "192.168.25.11:22000"
        }
    ]
}
# 初始化配置
> rs.initiate(config)
{
    "ok" : 1,
    "operationTime" : Timestamp(1552383358, 1),
    "$gleStats" : {
        "lastOpTime" : Timestamp(1552383358, 1),
        "electionId" : ObjectId("000000000000000000000000")
    },
    "lastCommittedOpTime" : Timestamp(0, 0),
    "$clusterTime" : {
        "clusterTime" : Timestamp(1552383358, 1),
        "signature" : {
            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
            "keyId" : NumberLong(0)
        }
    }
}
configReplSet:SECONDARY> 一会就变成主节点了
configReplSet:PRIMARY>

mongos节点配置(node1、node2)

默认端口27017
node1
[root@node1 ~]# cd /fgq/data/mongodb/conf/
[root@node1 conf]# vim mongos.conf
systemLog:
 destination: file
###日志存储位置
 path: /fgq/data/mongodb/logs/mongos.log
 logAppend: true
processManagement:
 fork: true  # fork and run in background
 pidFilePath: /fgq/data/mongodb/socket/mongos.pid
##端口配置
net:
# port: 
 bindIp: 192.168.25.11

## 将confige server 添加到路由
sharding:
 configDB: configReplSet/192.168.25.11:20000,192.168.25.11:21000,192.168.25.11:22000
# 启动mongos
[root@node1 ~]# mongos -f /fgq/data/mongodb/conf/mongos.conf 
about to fork child process, waiting until server is ready for connections.
forked process: 4452
child process started successfully, parent exiting
[root@node1 ~]# ss -ntlup|grep mongos
tcp    LISTEN     0      128    192.168.25.11:27017                 *:*                   users:(("mongos",pid=4452,fd=10))



node2
[root@node2 ~]# cd /fgq/data/mongodb/conf/
[root@node2 conf]# vim mongos.conf 
systemLog:
 destination: file
###日志存储位置
 path: /fgq/data/mongodb/logs/mongos.log
 logAppend: true
processManagement:
 fork: true  # fork and run in background
 pidFilePath: /fgq/data/mongodb/socket/mongos.pid
##端口配置
net:
# port: 
 bindIp: 192.168.25.12

## 将confige server 添加到路由
sharding:
 configDB: configReplSet/192.168.25.11:20000,192.168.25.11:21000,192.168.25.11:22000
# 启动mongos
[root@node2 ~]# mongos -f /fgq/data/mongodb/conf/mongos.conf
about to fork child process, waiting until server is ready for connections.
forked process: 5121
child process started successfully, parent exiting
[root@node2 ~]# ss -ntlup|grep mongos
tcp    LISTEN     0      128    192.168.25.12:27017                 *:*                   users:(("mongos",pid=5121,fd=10))
# 登陆到mongos
[root@node1 ~]# mongo --host 192.168.25.11
mongos> sh.status()
--- Sharding Status --- 
  sharding version: {
    "_id" : 1,
    "minCompatibleVersion" : 5,
    "currentVersion" : 6,
    "clusterId" : ObjectId("5c877d8a1cb917fff631a208")
  }
  shards:  ## 目前还没有节点加入到分片中
  active mongoses:
  autosplit:
        Currently enabled: yes
  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" : "config",  "primary" : "config",  "partitioned" : true }

# 添加分片节点
mongos> sh.addShard("rs1/192.168.25.11:27018,192.168.25.12:27018,192.168.25.13:27018")
{
    "shardAdded" : "rs1",
    "ok" : 1,
    "operationTime" : Timestamp(1552385323, 4),
    "$clusterTime" : {
        "clusterTime" : Timestamp(1552385323, 4),
        "signature" : {
            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
            "keyId" : NumberLong(0)
        }
    }
}


mongos> sh.status()
--- Sharding Status --- 
  sharding version: {
    "_id" : 1,
    "minCompatibleVersion" : 5,
    "currentVersion" : 6,
    "clusterId" : ObjectId("5c877d8a1cb917fff631a208")
  }
  shards:  # 添加的一个Shard集群
        {  "_id" : "rs1",  "host" : "rs1/192.168.25.11:27018,192.168.25.12:27018,192.168.25.13:27018",  "state" : 1 }
  active mongoses:
        "4.0.6" : 2
  autosplit:
        Currently enabled: yes
  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" : "config",  "primary" : "config",  "partitioned" : true }

sh.enableSharding("testdb")
    指明在哪个数据库上启用shard功能
    一个库内并非所有的collection都需要启用shard
mongos> sh.enableSharding("testdb")
{
    "ok" : 1,
    "operationTime" : Timestamp(1552385817, 7),
    "$clusterTime" : {
        "clusterTime" : Timestamp(1552385817, 7),
        "signature" : {
            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
            "keyId" : NumberLong(0)
        }
    }
}
mongos> sh.status()
--- Sharding Status --- 
  sharding version: {
    "_id" : 1,
    "minCompatibleVersion" : 5,
    "currentVersion" : 6,
    "clusterId" : ObjectId("5c877d8a1cb917fff631a208")
  }
  shards:
        {  "_id" : "rs1",  "host" : "rs1/192.168.25.11:27018,192.168.25.12:27018,192.168.25.13:27018",  "state" : 1 }
  active mongoses:
        "4.0.6" : 2
  autosplit:
        Currently enabled: yes
  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" : "config",  "primary" : "config",  "partitioned" : true }
                config.system.sessions
                        shard key: { "_id" : 1 }
                        unique: false
                        balancing: true
                        chunks:
                                rs1 1
                        { "_id" : { "$minKey" : 1 } } -->> { "_id" : { "$maxKey" : 1 } } on : rs1 Timestamp(1, 0) 
        {  "_id" : "testdb",  "primary" : "rs1",  "partitioned" : true,  "version" : {  "uuid" : UUID("7e85f1cf-953a-43a0-8b01-dcee0a67923d"),  "lastMod" : 1 } }


基于年龄做分片
sh.shardCollection("testdb.students",{"age":1})
    指明哪个数据库的collection做shard--testdb.students
    指明对哪个collection的哪个字段做索引--age:1  升序排列
    还可以指明unique唯一
mongos> sh.shardCollection("testdb.students",{"age":1})
{
    "collectionsharded" : "testdb.students",
    "collectionUUID" : UUID("8182737b-054e-48ce-b0df-9a9bb76d35e7"),
    "ok" : 1,
    "operationTime" : Timestamp(1552385979, 14),
    "$clusterTime" : {
        "clusterTime" : Timestamp(1552385979, 14),
        "signature" : {
            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
            "keyId" : NumberLong(0)
        }
    }
}


mongos> sh.status()
--- Sharding Status --- 
  sharding version: {
    "_id" : 1,
    "minCompatibleVersion" : 5,
    "currentVersion" : 6,
    "clusterId" : ObjectId("5c877d8a1cb917fff631a208")
  }
  shards:
        {  "_id" : "rs1",  "host" : "rs1/192.168.25.11:27018,192.168.25.12:27018,192.168.25.13:27018",  "state" : 1 }
  active mongoses:
        "4.0.6" : 2
  autosplit:
        Currently enabled: yes
  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" : "config",  "primary" : "config",  "partitioned" : true }
                config.system.sessions
                        shard key: { "_id" : 1 }
                        unique: false
                        balancing: true
                        chunks:
                                rs1 1
                        { "_id" : { "$minKey" : 1 } } -->> { "_id" : { "$maxKey" : 1 } } on : rs1 Timestamp(1, 0) 
        {  "_id" : "testdb",  "primary" : "rs1",  "partitioned" : true,  "version" : {  "uuid" : UUID("7e85f1cf-953a-43a0-8b01-dcee0a67923d"),  "lastMod" : 1 } }
                testdb.students
                        shard key: { "age" : 1 }
                        unique: false
                        balancing: true
                        chunks:
                                rs1 1
                        { "age" : { "$minKey" : 1 } } -->> { "age" : { "$maxKey" : 1 } } on : rs1 Timestamp(1, 0) 


mongos> use testdb
switched to db testdb
mongos> for (i=1;i<=100000;i++) db.students.insert({name:"student"+i,age:(i%120),class:"class"+(i%10),address:"#25 Lianyun Road,Zhengzhou,China"})
数据插入过程中,再开一个窗口

[root@node1 ~]# mongo --host 192.168.25.11
mongos> use testdb
switched to db testdb
mongos> db.students.find().count()
17013
mongos> sh.status()
--- Sharding Status --- 
  sharding version: {
    "_id" : 1,
    "minCompatibleVersion" : 5,
    "currentVersion" : 6,
    "clusterId" : ObjectId("5c877d8a1cb917fff631a208")
  }
  shards:
        {  "_id" : "rs1",  "host" : "rs1/192.168.25.11:27018,192.168.25.12:27018,192.168.25.13:27018",  "state" : 1 }
  active mongoses:
        "4.0.6" : 2
  autosplit:
        Currently enabled: yes
  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" : "config",  "primary" : "config",  "partitioned" : true }
                config.system.sessions
                        shard key: { "_id" : 1 }
                        unique: false
                        balancing: true
                        chunks:
                                rs1 1
                        { "_id" : { "$minKey" : 1 } } -->> { "_id" : { "$maxKey" : 1 } } on : rs1 Timestamp(1, 0) 
        {  "_id" : "testdb",  "primary" : "rs1",  "partitioned" : true,  "version" : {  "uuid" : UUID("7e85f1cf-953a-43a0-8b01-dcee0a67923d"),  "lastMod" : 1 } }
                testdb.students
                        shard key: { "age" : 1 }
                        unique: false
                        balancing: true
                        chunks:
                                rs1 1
                        { "age" : { "$minKey" : 1 } } -->> { "age" : { "$maxKey" : 1 } } on : rs1 Timestamp(1, 0) 

数据生成后,还是这个样子,郁闷?????
mongos> sh.status()
--- Sharding Status --- 
  sharding version: {
    "_id" : 1,
    "minCompatibleVersion" : 5,
    "currentVersion" : 6,
    "clusterId" : ObjectId("5c877d8a1cb917fff631a208")
  }
  shards:
        {  "_id" : "rs1",  "host" : "rs1/192.168.25.11:27018,192.168.25.12:27018,192.168.25.13:27018",  "state" : 1 }
  active mongoses:
        "4.0.6" : 2
  autosplit:
        Currently enabled: yes
  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" : "config",  "primary" : "config",  "partitioned" : true }
                config.system.sessions
                        shard key: { "_id" : 1 }
                        unique: false
                        balancing: true
                        chunks:
                                rs1 1
                        { "_id" : { "$minKey" : 1 } } -->> { "_id" : { "$maxKey" : 1 } } on : rs1 Timestamp(1, 0) 
        {  "_id" : "testdb",  "primary" : "rs1",  "partitioned" : true,  "version" : {  "uuid" : UUID("7e85f1cf-953a-43a0-8b01-dcee0a67923d"),  "lastMod" : 1 } }
                testdb.students
                        shard key: { "age" : 1 }
                        unique: false
                        balancing: true
                        chunks:
                                rs1 1
                        { "age" : { "$minKey" : 1 } } -->> { "age" : { "$maxKey" : 1 } } on : rs1 Timestamp(1, 0)


此时登录到shard的集群rs1上
[root@node1 ~]# mongo --host 192.168.25.11 --port 27018
rs1:PRIMARY> use testdb
switched to db testdb
rs1:PRIMARY> db.students.find().count()
100000
数据存储到这里了


# 列出shard集群中所有的shard
mongos> use admin
switched to db admin
mongos> db.runCommand('listshards')
{
    "shards" : [
        {
            "_id" : "rs1",
            "host" : "rs1/192.168.25.11:27018,192.168.25.12:27018,192.168.25.13:27018",
            "state" : 1
        }
    ],
    "ok" : 1,
    "operationTime" : Timestamp(1552386594, 1),
    "$clusterTime" : {
        "clusterTime" : Timestamp(1552386594, 1),
        "signature" : {
            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
            "keyId" : NumberLong(0)
        }
    }
}
db.printShardingstatus()    功能等于sh.status()

mongos> sh.isBalancerRunning()
false
数据均衡时才会运行,此时数据是均衡的,所以没有运行,无需管它,强大的自我管理功能
mongos> sh.getBalancerState()
true
是否启用了均衡器

sh.setBalancerState()   是否让它自动均衡 false--不自动均衡
    对整个业务业务影响不大的时候,是可以关掉自动均衡的
sh.moveChunk()  移动chunk到其他shard上,config server会自动更新节点元数据,影响全局的,不到万不得已不要操作


注意:
此处上面搭建的集群中,有shard做了集群,其实只需要config server 做集群即可,shard集群可以不做

不做shard集群的分片搭建

## 架构
mongos  路由  一般是2个--高可用,此处是1个
config server 一般是3个
shard1  一般是3个,此处1个
shard2  一般是3个,此处1个
冗余  备份集群

192.168.25.11--3个config server、1个router(mongos)、1个shard
192.168.25.12--1个shard
2个节点都操作,以node1为例
[root@node1 ~]# mkdir -p /fgq/{base-env,data/mongodb/{conf,data,logs,socket}}
[root@node1 ~]# cd /fgq/base-env/
[root@node1 base-env]# rz  上传包 mongodb-linux-x86_64-rhel70-4.0.6.tgz
[root@node1 base-env]# tar zxf mongodb-linux-x86_64-rhel70-4.0.6.tgz
[root@node1 base-env]# ln -s mongodb-linux-x86_64-rhel70-4.0.6 mongodb
[root@node1 base-env]# vim /etc/profile.d/mongodb.sh
export PATH=$PATH:/fgq/base-env/mongodb/bin
[root@node1 base-env]# source /etc/profile.d/mongodb.sh
[root@node1 base-env]# mongo -h

node1操作
# config集群配置(仅node1)
[root@node1 ~]# cd /fgq/data/mongodb/conf/
[root@node1 conf]# vim mongosvr-20000.conf
systemLog:
 destination: file
###日志存储位置
 path: /fgq/data/mongodb/logs/mongosvr-20000.log
 logAppend: true
storage:
##journal配置
 journal:
  enabled: true
##数据文件存储位置
 dbPath: /fgq/data/mongodb/data/mongosvr-20000
##是否一个库一个文件夹
 directoryPerDB: true
##数据引擎
# engine: wiredTiger
##WT引擎配置
 wiredTiger:
  engineConfig:
##WT最大使用cache(根据服务器实际情况调节)
   cacheSizeGB: 1
##是否将索引也按数据库名单独存储
   directoryForIndexes: true
##表压缩配置
  collectionConfig:
   blockCompressor: zlib
##索引配置
  indexConfig:
   prefixCompression: true
processManagement:
 fork: true  # fork and run in background
 pidFilePath: /fgq/data/mongodb/socket/mongosvr-20000.pid
##端口配置
net:
 port: 20000
 bindIp: 192.168.25.11
replication:
 oplogSizeMB: 50
 replSetName: configReplSet
sharding:
 clusterRole: configsvr
[root@node1 conf]# cp mongosvr-20000.conf mongosvr-21000.conf 
[root@node1 conf]# cp mongosvr-20000.conf mongosvr-22000.conf
[root@node1 conf]# vim mongosvr-22000.conf
:%s/20000/22000/g 
[root@node1 conf]# vim mongosvr-21000.conf
:%s/20000/21000/g 

# 创建数据文件存储目录
[root@node1 conf]# cd /fgq/data/mongodb/data/
[root@node1 data]# mkdir mongosvr-20000
[root@node1 data]# mkdir mongosvr-21000
[root@node1 data]# mkdir mongosvr-22000

# 启动config server集群
[root@node1 ~]# mongod -f /fgq/data/mongodb/conf/mongosvr-20000.conf 
about to fork child process, waiting until server is ready for connections.
forked process: 1390
child process started successfully, parent exiting
[root@node1 ~]# mongod -f /fgq/data/mongodb/conf/mongosvr-21000.conf 
about to fork child process, waiting until server is ready for connections.
forked process: 1428
child process started successfully, parent exiting
[root@node1 ~]# mongod -f /fgq/data/mongodb/conf/mongosvr-22000.conf 
about to fork child process, waiting until server is ready for connections.
forked process: 1466
child process started successfully, parent exiting
[root@node1 ~]# ss -ntlup|grep mongo
tcp    LISTEN     0      128    192.168.25.11:20000                 *:*                   users:(("mongod",pid=1390,fd=11))
tcp    LISTEN     0      128    192.168.25.11:21000                 *:*                   users:(("mongod",pid=1428,fd=11))
tcp    LISTEN     0      128    192.168.25.11:22000                 *:*                   users:(("mongod",pid=1466,fd=11))

[root@node1 ~]# mongo --host 192.168.25.11 --port 20000 admin
# 配置config server复制集
> config = {_id: 'configReplSet', members: [{_id: 0, host: '192.168.25.11:20000'},{_id: 1, host: '192.168.25.11:21000'},{_id: 2, host: '192.168.25.11:22000'}]}
{
    "_id" : "configReplSet",
    "members" : [
        {
            "_id" : 0,
            "host" : "192.168.25.11:20000"
        },
        {
            "_id" : 1,
            "host" : "192.168.25.11:21000"
        },
        {
            "_id" : 2,
            "host" : "192.168.25.11:22000"
        }
    ]
}
# 初始化配置
> rs.initiate(config)
{
    "ok" : 1,
    "operationTime" : Timestamp(1552448175, 1),
    "$gleStats" : {
        "lastOpTime" : Timestamp(1552448175, 1),
        "electionId" : ObjectId("000000000000000000000000")
    },
    "lastCommittedOpTime" : Timestamp(0, 0),
    "$clusterTime" : {
        "clusterTime" : Timestamp(1552448175, 1),
        "signature" : {
            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
            "keyId" : NumberLong(0)
        }
    }
}
configReplSet:SECONDARY> 
configReplSet:PRIMARY> rs.status()
{
    "set" : "configReplSet",
    "date" : ISODate("2019-03-13T03:36:31.371Z"),
    "myState" : 1,
    "term" : NumberLong(1),
    "syncingTo" : "",
    "syncSourceHost" : "",
    "syncSourceId" : -1,
    "configsvr" : true,
    "heartbeatIntervalMillis" : NumberLong(2000),
    "optimes" : {
        "lastCommittedOpTime" : {
            "ts" : Timestamp(1552448188, 3),
            "t" : NumberLong(1)
        },
        "readConcernMajorityOpTime" : {
            "ts" : Timestamp(1552448188, 3),
            "t" : NumberLong(1)
        },
        "appliedOpTime" : {
            "ts" : Timestamp(1552448188, 3),
            "t" : NumberLong(1)
        },
        "durableOpTime" : {
            "ts" : Timestamp(1552448188, 3),
            "t" : NumberLong(1)
        }
    },
    "lastStableCheckpointTimestamp" : Timestamp(1552448187, 1),
    "members" : [
        {
            "_id" : 0,
            "name" : "192.168.25.11:20000",
            "health" : 1,
            "state" : 1,
            "stateStr" : "PRIMARY",
            "uptime" : 187,
            "optime" : {
                "ts" : Timestamp(1552448188, 3),
                "t" : NumberLong(1)
            },
            "optimeDate" : ISODate("2019-03-13T03:36:28Z"),
            "syncingTo" : "",
            "syncSourceHost" : "",
            "syncSourceId" : -1,
            "infoMessage" : "could not find member to sync from",
            "electionTime" : Timestamp(1552448185, 1),
            "electionDate" : ISODate("2019-03-13T03:36:25Z"),
            "configVersion" : 1,
            "self" : true,
            "lastHeartbeatMessage" : ""
        },
        {
            "_id" : 1,
            "name" : "192.168.25.11:21000",
            "health" : 1,
            "state" : 2,
            "stateStr" : "SECONDARY",
            "uptime" : 16,
            "optime" : {
                "ts" : Timestamp(1552448188, 3),
                "t" : NumberLong(1)
            },
            "optimeDurable" : {
                "ts" : Timestamp(1552448188, 3),
                "t" : NumberLong(1)
            },
            "optimeDate" : ISODate("2019-03-13T03:36:28Z"),
            "optimeDurableDate" : ISODate("2019-03-13T03:36:28Z"),
            "lastHeartbeat" : ISODate("2019-03-13T03:36:29.918Z"),
            "lastHeartbeatRecv" : ISODate("2019-03-13T03:36:30.525Z"),
            "pingMs" : NumberLong(0),
            "lastHeartbeatMessage" : "",
            "syncingTo" : "192.168.25.11:20000",
            "syncSourceHost" : "192.168.25.11:20000",
            "syncSourceId" : 0,
            "infoMessage" : "",
            "configVersion" : 1
        },
        {
            "_id" : 2,
            "name" : "192.168.25.11:22000",
            "health" : 1,
            "state" : 2,
            "stateStr" : "SECONDARY",
            "uptime" : 16,
            "optime" : {
                "ts" : Timestamp(1552448188, 3),
                "t" : NumberLong(1)
            },
            "optimeDurable" : {
                "ts" : Timestamp(1552448188, 3),
                "t" : NumberLong(1)
            },
            "optimeDate" : ISODate("2019-03-13T03:36:28Z"),
            "optimeDurableDate" : ISODate("2019-03-13T03:36:28Z"),
            "lastHeartbeat" : ISODate("2019-03-13T03:36:29.907Z"),
            "lastHeartbeatRecv" : ISODate("2019-03-13T03:36:30.494Z"),
            "pingMs" : NumberLong(0),
            "lastHeartbeatMessage" : "",
            "syncingTo" : "192.168.25.11:20000",
            "syncSourceHost" : "192.168.25.11:20000",
            "syncSourceId" : 0,
            "infoMessage" : "",
            "configVersion" : 1
        }
    ],
    "ok" : 1,
    "operationTime" : Timestamp(1552448188, 3),
    "$gleStats" : {
        "lastOpTime" : Timestamp(1552448175, 1),
        "electionId" : ObjectId("7fffffff0000000000000001")
    },
    "lastCommittedOpTime" : Timestamp(1552448188, 3),
    "$clusterTime" : {
        "clusterTime" : Timestamp(1552448188, 3),
        "signature" : {
            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
            "keyId" : NumberLong(0)
        }
    }
}
# node1的shard配置
[root@node1 ~]# vim /fgq/data/mongodb/conf/mongod.conf
systemLog:
  destination: file
  path: /fgq/data/mongodb/logs/mongod.log
  logAppend: true
storage:
  journal:
    enabled: true
  dbPath: /fgq/data/mongodb/data/mongod
  directoryPerDB: true
  #engine: wiredTiger
  wiredTiger:
    engineConfig:
      # cacheSizeGB: 1
      directoryForIndexes: true
    collectionConfig:
      blockCompressor: zlib
    indexConfig:
      prefixCompression: true
processManagement:
  fork: true
  pidFilePath: /fgq/data/mongodb/socket/mongod.pid
net:
  port:   40000
  bindIp: 192.168.25.11
#replication:
#  oplogSizeMB: 50
#  replSetName: rs1
sharding:
  clusterRole: shardsvr

[root@node1 ~]# mkdir /fgq/data/mongodb/data/mongod
[root@node1 ~]# mongod -f /fgq/data/mongodb/conf/mongod.conf 
about to fork child process, waiting until server is ready for connections.
forked process: 1689
child process started successfully, parent exiting
[root@node1 ~]# ss -ntlup|grep mongo
tcp    LISTEN     0      128    192.168.25.11:40000                 *:*                   users:(("mongod",pid=1689,fd=11))
tcp    LISTEN     0      128    192.168.25.11:20000                 *:*                   users:(("mongod",pid=1390,fd=11))
tcp    LISTEN     0      128    192.168.25.11:21000                 *:*                   users:(("mongod",pid=1428,fd=11))
tcp    LISTEN     0      128    192.168.25.11:22000                 *:*                   users:(("mongod",pid=1466,fd=11))
[root@node1 ~]# scp /fgq/data/mongodb/conf/mongod.conf node2:/fgq/data/mongodb/conf/


# node1的mongos配置
[root@node1 ~]# vim /fgq/data/mongodb/conf/mongos.conf
systemLog:
 destination: file
###日志存储位置
 path: /fgq/data/mongodb/logs/mongos.log
 logAppend: true
processManagement:
 fork: true  # fork and run in background
 pidFilePath: /fgq/data/mongodb/socket/mongos.pid
##端口配置
net:
 port: 30000
 bindIp: 192.168.25.11

## 将confige server 添加到路由
sharding:
 configDB: configReplSet/192.168.25.11:20000,192.168.25.11:21000,192.168.25.11:22000

[root@node1 ~]# mongos -f /fgq/data/mongodb/conf/mongos.conf 
about to fork child process, waiting until server is ready for connections.
forked process: 1728
child process started successfully, parent exiting
[root@node1 ~]# ss -ntlup|grep mongo
tcp    LISTEN     0      128    192.168.25.11:40000                 *:*                   users:(("mongod",pid=1689,fd=11))
tcp    LISTEN     0      128    192.168.25.11:20000                 *:*                   users:(("mongod",pid=1390,fd=11))
tcp    LISTEN     0      128    192.168.25.11:21000                 *:*                   users:(("mongod",pid=1428,fd=11))
tcp    LISTEN     0      128    192.168.25.11:30000                 *:*                   users:(("mongos",pid=1728,fd=10))
tcp    LISTEN     0      128    192.168.25.11:22000                 *:*                   users:(("mongod",pid=1466,fd=11))

# 连接mongos
[root@node1 ~]# mongo --host 192.168.25.11 --port 30000
mongos> help
mongos> sh.help()
mongos> sh.status()
--- Sharding Status --- 
  sharding version: {
    "_id" : 1,
    "minCompatibleVersion" : 5,
    "currentVersion" : 6,
    "clusterId" : ObjectId("5c887abb5ed79590bf60002c")
  }
  shards:  # 没有节点加入到分片中
  active mongoses:
  autosplit:
        Currently enabled: yes
  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" : "config",  "primary" : "config",  "partitioned" : true }

# 添加分片节点
mongos> sh.addShard("192.168.25.11:40000")
{
    "shardAdded" : "shard0000",
    "ok" : 1,
    "operationTime" : Timestamp(1552448682, 4),
    "$clusterTime" : {
        "clusterTime" : Timestamp(1552448682, 4),
        "signature" : {
            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
            "keyId" : NumberLong(0)
        }
    }
}
mongos> sh.addShard("192.168.25.12:40000")
{
    "shardAdded" : "shard0001",
    "ok" : 1,
    "operationTime" : Timestamp(1552448689, 2),
    "$clusterTime" : {
        "clusterTime" : Timestamp(1552448689, 2),
        "signature" : {
            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
            "keyId" : NumberLong(0)
        }
    }
}
mongos> sh.status()
--- Sharding Status --- 
  sharding version: {
    "_id" : 1,
    "minCompatibleVersion" : 5,
    "currentVersion" : 6,
    "clusterId" : ObjectId("5c887abb5ed79590bf60002c")
  }
  shards:  # 成功添加节点到分片中
        {  "_id" : "shard0000",  "host" : "192.168.25.11:40000",  "state" : 1 }
        {  "_id" : "shard0001",  "host" : "192.168.25.12:40000",  "state" : 1 }
  active mongoses:
        "4.0.6" : 1
  autosplit:
        Currently enabled: yes
  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" : "config",  "primary" : "config",  "partitioned" : true }


sh.enableSharding("testdb")
    指明在哪个数据库上启用shard功能
    一个库内并非所有的collection都需要启用shard
sh.status()  
    查看databases,此处是支持shard的数据库有哪些,config是默认的
mongos> sh.enableSharding("testdb")
{
    "ok" : 1,
    "operationTime" : Timestamp(1552448725, 6),
    "$clusterTime" : {
        "clusterTime" : Timestamp(1552448725, 6),
        "signature" : {
            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
            "keyId" : NumberLong(0)
        }
    }
}
mongos> sh.status()
--- Sharding Status --- 
  sharding version: {
    "_id" : 1,
    "minCompatibleVersion" : 5,
    "currentVersion" : 6,
    "clusterId" : ObjectId("5c887abb5ed79590bf60002c")
  }
  shards:
        {  "_id" : "shard0000",  "host" : "192.168.25.11:40000",  "state" : 1 }
        {  "_id" : "shard0001",  "host" : "192.168.25.12:40000",  "state" : 1 }
  active mongoses:
        "4.0.6" : 1
  autosplit:
        Currently enabled: yes
  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" : "config",  "primary" : "config",  "partitioned" : true }
        {  "_id" : "testdb",  "primary" : "shard0000",  "partitioned" : true,  "version" : {  "uuid" : UUID("47a9fc65-adcf-48f0-8eb8-a67bfd7be796"),  "lastMod" : 1 } }


基于年龄做分片
sh.shardCollection("testdb.students",{"age":1})
    指明哪个数据库的collection做shard--testdb.students
    指明对哪个collection的哪个字段做索引--age:1  升序排列
    还可以指明unique唯一
mongos> sh.shardCollection("testdb.students",{"age":1})
{
    "collectionsharded" : "testdb.students",
    "collectionUUID" : UUID("71b9d628-312f-4536-b6a1-08305f7d9080"),
    "ok" : 1,
    "operationTime" : Timestamp(1552448788, 9),
    "$clusterTime" : {
        "clusterTime" : Timestamp(1552448788, 9),
        "signature" : {
            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
            "keyId" : NumberLong(0)
        }
    }
}
mongos> sh.status()
--- Sharding Status --- 
  sharding version: {
    "_id" : 1,
    "minCompatibleVersion" : 5,
    "currentVersion" : 6,
    "clusterId" : ObjectId("5c887abb5ed79590bf60002c")
  }
  shards:
        {  "_id" : "shard0000",  "host" : "192.168.25.11:40000",  "state" : 1 }
        {  "_id" : "shard0001",  "host" : "192.168.25.12:40000",  "state" : 1 }
  active mongoses:
        "4.0.6" : 1
  autosplit:
        Currently enabled: yes
  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" : "config",  "primary" : "config",  "partitioned" : true }
        {  "_id" : "testdb",  "primary" : "shard0000",  "partitioned" : true,  "version" : {  "uuid" : UUID("47a9fc65-adcf-48f0-8eb8-a67bfd7be796"),  "lastMod" : 1 } }
                testdb.students
                        shard key: { "age" : 1 }
                        unique: false
                        balancing: true
                        chunks:
                                shard0000   1
                        { "age" : { "$minKey" : 1 } } -->> { "age" : { "$maxKey" : 1 } } on : shard0000 Timestamp(1, 0) 

mongos> use testdb
switched to db testdb
数据插入过程中,再开一个窗口,查看是否均衡
mongos> for (i=1;i<=100000;i++) db.students.insert({name:"student"+i,age:(i%120),class:"class"+(i%10),address:"#25 Lianyun Road,Zhengzhou,China"})
WriteResult({ "nInserted" : 1 })

[root@node1 ~]# mongo --host 192.168.25.11 --port 30000
mongos> use testdb
switched to db testdb
mongos> db.students.find().count()
35289
mongos> sh.status()
--- Sharding Status --- 
  sharding version: {
    "_id" : 1,
    "minCompatibleVersion" : 5,
    "currentVersion" : 6,
    "clusterId" : ObjectId("5c887abb5ed79590bf60002c")
  }
  shards:
        {  "_id" : "shard0000",  "host" : "192.168.25.11:40000",  "state" : 1 }
        {  "_id" : "shard0001",  "host" : "192.168.25.12:40000",  "state" : 1 }
  active mongoses:
        "4.0.6" : 1
  autosplit:
        Currently enabled: yes
  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" : "config",  "primary" : "config",  "partitioned" : true }
        {  "_id" : "testdb",  "primary" : "shard0000",  "partitioned" : true,  "version" : {  "uuid" : UUID("47a9fc65-adcf-48f0-8eb8-a67bfd7be796"),  "lastMod" : 1 } }
                testdb.students
                        shard key: { "age" : 1 }
                        unique: false
                        balancing: true
                        chunks:
                                shard0000   1
                        { "age" : { "$minKey" : 1 } } -->> { "age" : { "$maxKey" : 1 } } on : shard0000 Timestamp(1, 0) 

sh.status()  会出现下面这种情况,但是实际上并没有出现,具体原因待查
    chunks 
        shard0000  1  1个分片-->1个-->2个
        shard0001  2  2个分片-->过一会变为3个分片--2个
    age  1-->>119   1-->>45
    age  119-->>    45-->>119
                    119-->>
    正在进行chunk均衡操作
过一会再查看一下,chunk就均衡了,100000数据都生成了


数据全部生成后,sh.status() 结果和第一次执行的不同之处在于databases的"config"
mongos> sh.status()
--- Sharding Status --- 
  sharding version: {
    "_id" : 1,
    "minCompatibleVersion" : 5,
    "currentVersion" : 6,
    "clusterId" : ObjectId("5c887abb5ed79590bf60002c")
  }
  shards:
        {  "_id" : "shard0000",  "host" : "192.168.25.11:40000",  "state" : 1 }
        {  "_id" : "shard0001",  "host" : "192.168.25.12:40000",  "state" : 1 }
  active mongoses:
        "4.0.6" : 1
  autosplit:
        Currently enabled: yes
  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" : "config",  "primary" : "config",  "partitioned" : true }
                config.system.sessions
                        shard key: { "_id" : 1 }
                        unique: false
                        balancing: true
                        chunks:
                                shard0000   1
                        { "_id" : { "$minKey" : 1 } } -->> { "_id" : { "$maxKey" : 1 } } on : shard0000 Timestamp(1, 0) 
        {  "_id" : "testdb",  "primary" : "shard0000",  "partitioned" : true,  "version" : {  "uuid" : UUID("47a9fc65-adcf-48f0-8eb8-a67bfd7be796"),  "lastMod" : 1 } }
                testdb.students
                        shard key: { "age" : 1 }
                        unique: false
                        balancing: true
                        chunks:
                                shard0000   1
                        { "age" : { "$minKey" : 1 } } -->> { "age" : { "$maxKey" : 1 } } on : shard0000 Timestamp(1, 0) 

use admin 
db.runCommand("listShards")  列出shard集群中所有的shard
此处就是admin,所以不用切换admin
mongos> db.runCommand('listshards')
{
    "shards" : [
        {
            "_id" : "shard0000",
            "host" : "192.168.25.11:40000",
            "state" : 1
        },
        {
            "_id" : "shard0001",
            "host" : "192.168.25.12:40000",
            "state" : 1
        }
    ],
    "ok" : 1,
    "operationTime" : Timestamp(1552448995, 1),
    "$clusterTime" : {
        "clusterTime" : Timestamp(1552448995, 1),
        "signature" : {
            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
            "keyId" : NumberLong(0)
        }
    }
}
mongos> sh.isBalancerRunning()
false
数据均衡时才会运行,此时数据是均衡的,所以没有运行,无需管它,强大的自我管理功能
mongos> sh.getBalancerState()
true
是否启用了均衡器

sh.setBalancerState()   
    是否让它自动均衡 false--不自动均衡
    对整个业务业务影响不大的时候,是可以关掉自动均衡的
sh.moveChunk()  
    移动chunk到其他shard上,config server会自动更新节点元数据,影响全局的,不到万不得已不要操作

db.printShardingstatus()    功能等于sh.status()

mongodb的框架
上一篇下一篇

猜你喜欢

热点阅读