欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

MongoDB分片集群部署详解

程序员文章站 2022-04-15 09:33:13
 一、环境说明 1、我们prod环境mongodb的集群架构是做的分片集群的部署,但是目前我们没有分片,即所有数据都在一个分片上,后期如果数量大,需要分配,集群...

 一、环境说明

1、我们prod环境mongodb的集群架构是做的分片集群的部署,但是目前我们没有分片,即所有数据都在一个分片上,后期如果数量大,需要分配,集群随时可以分片,对业务方透明

2、各个角色的部署情况

角色 ip 端口 复制集名称
mongos 172.21.244.101,172.21.244.102,172.21.244.94 27000
config server 172.21.244.101,172.21.244.102,172.21.244.94 27100 repl_configsvr
存储节点(shard) 172.21.244.101,172.21.244.102,172.21.244.94 27101 shard1

3、mongodb版本

mongos> db.version()
4.0.4-62-g7e345a7

二、基础信息准备

0、系统优化

echo "never" >/sys/kernel/mm/transparent_hugepage/enabled
echo "never" >/sys/kernel/mm/transparent_hugepage/defrag

1、下载mongodb二进制文件

cd /chj/app
wget ops.chehejia.com:9090/pkg/chj_mongodb_4.0.4.tar.gz
tar -zxvf chj_mongodb_4.0.4.tar.gz

2、相关目录建立

#建立base目录
mkdir /chj/data/mongodb/chj_db
#把mongodb二进制文件移动到base目录下的bin文件夹
mv chj_mongodb_4.0.4/bin /chj/data/mongodb/chj_db/bin
#建立认证文件目录
mkdir /chj/data/mongodb/chj_db/auth
#建立配置文件目录
mkdir /chj/data/mongodb/chj_db/conf
#建立config server的data和日志目录
mkdir /chj/data/mongodb/chj_db/config/data -p
mkdir /chj/data/mongodb/chj_db/config/log
#建立mongos的日志目录
mkdir /chj/data/mongodb/chj_db/mongos/log -p
#建立数据节点data和日志目录 
mkdir /chj/data/mongodb/chj_db/shard1/data -p
mkdir /chj/data/mongodb/chj_db/shard1/log

3、相关配置文件编写

a、mongos的配置文件编写

vim /chj/data/mongodb/chj_db/conf/mongos.conf
systemlog:
 destination: file
 logappend: true
 path: /chj/data/mongodb/chj_db/mongos/log/mongos.log

processmanagement:
 fork: true # fork and run in background
 pidfilepath: /chj/data/mongodb/chj_db/mongos/log/mongos.pid # location of pidfile
 timezoneinfo: /usr/share/zoneinfo

net:
 port: 27000
 bindipall: true
 maxincomingconnections: 1000
 unixdomainsocket:
  enabled: true
  pathprefix: /chj/data/mongodb/chj_db/mongos/log
  filepermissions: 0700

security:
 keyfile: /chj/data/mongodb/chj_db/auth/keyfile.key
# authorization: enabled

#replication:

sharding:
 configdb: repl_configsvr/172.21.244.101:27100,172.21.244.102:27100,172.21.244.94:27100

b、config server的配置文件编写

vim /chj/data/mongodb/chj_db/conf/config.conf
systemlog:
 destination: file
 logappend: true
 path: /chj/data/mongodb/chj_db/config/log/congigsrv.log

storage:
 dbpath: /chj/data/mongodb/chj_db/config/data
 journal:
  enabled: true
 wiredtiger:
  engineconfig:
   directoryforindexes: true

processmanagement:
 fork: true # fork and run in background
 pidfilepath: /chj/data/mongodb/chj_db/config/log/configsrv.pid # location of pidfile
 timezoneinfo: /usr/share/zoneinfo

net:
 port: 27100
 bindip: 0.0.0.0 # enter 0.0.0.0,:: to bind to all ipv4 and ipv6 addresses or, alternatively, use the net.bindipall setting.
 #bindipall: true
 maxincomingconnections: 1000
 unixdomainsocket:
  enabled: true
  pathprefix: /chj/data/mongodb/chj_db/config/data
  filepermissions: 0700

security:
 keyfile: /chj/data/mongodb/chj_db/auth/keyfile.key
 authorization: enabled

replication:
 replsetname: repl_configsvr
sharding:
 clusterrole: configsvr

c、存储节点的配置文件编写

vim /chj/data/mongodb/chj_db/conf/shard1.conf
systemlog:
 destination: file
 logappend: true
 path: /chj/data/mongodb/chj_db/shard1/log/shard1.log

storage:
 dbpath: /chj/data/mongodb/chj_db/shard1/data
 journal:
  enabled: true
 wiredtiger:
  engineconfig:
   directoryforindexes: true

processmanagement:
 fork: true # fork and run in background
 pidfilepath: /chj/data/mongodb/chj_db/shard1/log/shard1.pid # location of pidfile
 timezoneinfo: /usr/share/zoneinfo

net:
 port: 27101
 bindip: 0.0.0.0 # enter 0.0.0.0,:: to bind to all ipv4 and ipv6 addresses or, alternatively, use the net.bindipall setting.
 #bindipall: true
 maxincomingconnections: 1000
 unixdomainsocket:
  enabled: true
  pathprefix: /chj/data/mongodb/chj_db/shard1/data
  filepermissions: 0700

security:
 keyfile: /chj/data/mongodb/chj_db/auth/keyfile.key
 authorization: enabled

replication:
 replsetname: shard1
sharding:
 clusterrole: shardsvr

4、生产key认证文件

echo "chj123456" >/chj/data/mongodb/chj_db/auth/keyfile.key
#设置文件的权限为400,不然服务无法启动
chmod 400 /chj/data/mongodb/chj_db/auth/keyfile.key

三、集群初始化

1、启动 config server 服务

/chj/data/mongodb/chj_db/bin/mongod -f /chj/data/mongodb/chj_db/conf/config.conf

2、初始化config server集群

#登录其中一个config server节点
/chj/data/mongodb/chj_db/bin/mongo --port 27100
#配置集群
config = { _id:"repl_configsvr",members:[ {_id:0,host:"172.21.244.101:27100"}, {_id:1,host:"172.21.244.102:27100"}, {_id:2,host:"172.21.244.94:27100"}] }
#初始化集群
rs.initiate(config)
ps:
结果输出如下,说明集群初始化成功,可以通过rs.status()命令查看集群状态
{
    "ok" : 1,
    "$glestats" : {
        "lastoptime" : timestamp(1557538260, 1),
        "electionid" : objectid("000000000000000000000000")
    },
    "lastcommittedoptime" : timestamp(0, 0)
}

3、启动存储节点服务

/chj/data/mongodb/chj_db/bin/mongod -f /chj/data/mongodb/chj_db/conf/shard1.conf

4、初始化存储集群

#登录你希望是主节点的服务器
/chj/data/mongodb/chj_db/bin/mongo --port 27101
#配置集群
config = { _id:"shard1",members:[ {_id:0,host:"172.21.244.101:27101"}, {_id:1,host:"172.21.244.102:27101"},{_id:2,host:"172.21.244.94:27101",arbiteronly:true}] }
#初始化集群
rs.initiate(config)
ps:
结果输出如下,说明集群初始化成功,可以通过rs.status()命令查看集群状态
{ "ok" : 1 }

5、添加存储集群的管理账号

登录主节点

/chj/data/mongodb/chj_db/bin/mongo --port 27101
use admin
db.createuser(
{
user: "root",
pwd: "123456",
roles: [ { role: "root", db: "admin" } ]
}
)

6、启动mongos 服务

/chj/data/mongodb/chj_db/bin/mongos -f /chj/data/mongodb/chj_db/conf/mongos.conf

7、添加config server的管理账号

登录任意一个mongos节点

/chj/data/mongodb/chj_db/bin/mongo --port 27000
use admin
db.createuser(
{
user: "root",
pwd: "123456",
roles: [ { role: "root", db: "admin" } ]
}
)

8、把存储节点添加到mongos

登录任意一个mongos节点(如果是在上一步的窗口,需要退出重新登录)

/chj/data/mongodb/chj_db/bin/mongo --port 27000
use admin
db.auth('root','123456')
#添加分片
sh.addshard('shard1/172.21.244.101:27101,172.21.244.102:27101,172.21.244.94:27101')
#查看分片状态
sh.status()

四、交付业务方

1、建立应用账号

登录任意一个mongos节点
/chj/data/mongodb/chj_db/bin/mongo --port 27000
use admin
db.auth('root','123456')
#切到业务数据库
use chj_db
#建立读写账号
db.createuser(
{
  user: "chj_db_rw",
  pwd: "123456",
  roles: [
   { role: "readwrite", db: "chj_db" },
   { role: "dbowner", db: "chj_db" }
  ]
}
)
#建立只读账号(根据业务需求确认是否需要)
db.createuser(
{
user: "chj_db_r",
pwd: "123456",
roles: [ { role: "read", db: "chj_db" } ]
}
)

2、交付开发人员信息

连接地址:172.21.244.101:27000,172.21.244.102:27000,172.21.244.94:27000
库名:chj_db
账号:chj_db_rw
密码:123456

五、数据库启用分片

如果后期业务量大,需要开启分片,配置如下

#指定需要分片的数据库
mongos> sh.enablesharding("chj_db") 
{
    "ok" : 1,
    "operationtime" : timestamp(1557546835, 3),
    "$clustertime" : {
        "clustertime" : timestamp(1557546835, 3),
        "signature" : {
            "hash" : bindata(0,"bkrrr8kxrr9j9udrdc/hurhld38="),
            "keyid" : numberlong("6689575940508352541")
        }
    }
}
#在chj_db数据库和users集合中创建了name和age为升序的片键
mongos> sh.shardcollection("chj_db.users",{name:1,age:1}) 
{
    "collectionsharded" : "chj_db.users",
    "collectionuuid" : uuid("59c0b99f-efff-4132-b489-f6c7e3d98f42"),
    "ok" : 1,
    "operationtime" : timestamp(1557546861, 12),
    "$clustertime" : {
        "clustertime" : timestamp(1557546861, 12),
        "signature" : {
            "hash" : bindata(0,"ubb1a/yodnmxwg5eahgnlckvzug="),
            "keyid" : numberlong("6689575940508352541")
        }
    }
}
#查看分片情况
mongos> sh.status() 
--- sharding status ---
 sharding version: {
    "_id" : 1,
    "mincompatibleversion" : 5,
    "currentversion" : 6,
    "clusterid" : objectid("5cd625e0da695346d740f749")
 }
 shards:
    { "_id" : "shard1", "host" : "shard1/172.21.244.101:27101,172.21.244.102:27101", "state" : 1 }
 active mongoses:
    "4.0.4-62-g7e345a7" : 3
 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" : "chj_db", "primary" : "shard1", "partitioned" : true, "version" : { "uuid" : uuid("82088bc7-7b98-4033-843d-7058d8d959f6"), "lastmod" : 1 } }
        chj_db.users
            shard key: { "name" : 1, "age" : 1 }
            unique: false
            balancing: true
            chunks:
                shard1 1
            { "name" : { "$minkey" : 1 }, "age" : { "$minkey" : 1 } } -->> { "name" : { "$maxkey" : 1 }, "age" : { "$maxkey" : 1 } } on : shard1 timestamp(1, 0)
    { "_id" : "config", "primary" : "config", "partitioned" : true }
        config.system.sessions
            shard key: { "_id" : 1 }
            unique: false
            balancing: true
            chunks:
                shard1 1
            { "_id" : { "$minkey" : 1 } } -->> { "_id" : { "$maxkey" : 1 } } on : shard1 timestamp(1, 0)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。