Mongodb集群模式部署

EMQX 企业版技术支持发表于:2022年03月03日 11:44:55更新于:2022年03月03日 16:54:49

一、目标机器

  1. 操作系统:Centos7.0

  2. 服务器分配

    image.png

二、依赖安装

三、下载安装包mongodb

进入mongodb官网下载页面:https://www.mongodb.com/try/download,选择自己需要的版本:

image.png

四、部署mongodb

  1. 解压并重命名(在一台上面操作)

    将安装包解压到/usr/local目录下,并更改为mongodb

    tar -xvf mongodb-linux-x86_64-rhel70-5.0.3.tgz -C /usr/local/

    cd /usr/local

    mv mongodb-linux-x86_64-rhel70-5.0.3 mongodb

    image.png

  2. 新建相关目录(在一台上面操作)

    进入/usr/local/mongodb,新建目录

    mkdir keymkdir -p route/{data,pid,log}
    mkdir -p config/{data,pid,logs}
    mkdir -p shard1/{data,pid,log}
    mkdir -p shard2/{data,pid,log}
    mkdir -p shard3/{data,pid,log}

    image.png

  3. 配置文件

    配置服务器:config/config.conf

    vi /usr/local/mongodb/config/config.conf
    指定数据目录,默认是/data/db/。每个mongod进程都需要独立的目录
    启动mongod时就会在数据目录中创建mongod.lock文件,防止其他mongod进程使用该数据目录
    dbpath=/usr/local/mongodb/config/data 
    日志文件存放目录
    logpath=/usr/local/mongodb/config/logs/config.log 
    进程存放目录
    pidfilepath=/usr/local/mongodb/config/pid/config.pid 
    一个数据库一个文件夹
    directoryperdb=true 
    使用追加的方式写日志
    logappend=true 
    集群名字#这个是创建副本集的方式,如果master指定了,这个地方不可以再指定了
    replSet=config 
    指定服务器监听的端口,默认是27017port=21000 #以守护进程的方式运行
    MongoDBfork=trueconfigsvr=true 
    启用日志选项,MongoDB的数据操作将会写入到journal文件夹的文件里
    journal=true 
    不启动认证
    #noauth=true 
    启动认证
    #auth=true

    image.png

    配置路由服务器:/route/route.conf

    vi /usr/local/mongodb/route/route.conf
    设定config server的地址列表,每个server地址之间以“,”分割
    configdb=config/192.168.0.166:21000,192.168.0.218:21000,192.168.0.130:21000 
    进程存放目录
    pidfilepath=/usr/local/mongodb/route/pid/route.pid 
    指定服务器监听的端口,默认是27017
    port=20000 
    sharded集群中每个chunk的大小,单位:MB,默认为64
    #chunkSize=1 
    日志文件存放目录
    logpath=/usr/local/mongodb/route/log/route.log 
    使用追加的方式写日志
    logappend=true 
    以守护进程的方式运行fork=true

    image.png

    配置shard服务器:

    shard1/shard1.conf
    vi /usr/local/mongodb/shard1/shard1.conf
    指定数据目录,默认是/data/db/。每个mongod进程都需要独立的目录
    dbpath=/usr/local/mongodb/shard1/data 
    日志文件存放目录
    logpath=/usr/local/mongodb/shard1/log/shard1.log 
    进程存放目录pidfilepath=/usr/local/mongodb/shard1/pid/shard1.pid 
    一个数据库一个文件夹
    directoryperdb=true 
    使用追加的方式写日志
    logappend=true 
    集群名字 
    这个是创建副本集的方式,如果master指定了,这个地方不可以再指定了
    replSet=shard1 
    指定服务器监听的端口,默认是27017
    port=22001 
    以守护进程的方式运行
    MongoDBfork=true 
    启用日志选项,MongoDB的数据操作将会写入到journal文件夹的文件里
    journal=true 
    此实例为shard(分片),侦听27018端口
    shardsvr=true

    image.png

    shard2/shard2.conf
    vi /usr/local/mongodb/shard2/shard2.conf
    指定数据目录,默认是/data/db/。每个mongod进程都需要独立的目录
    dbpath=/usr/local/mongodb/shard2/data 
    日志文件存放目录
    logpath=/usr/local/mongodb/shard2/log/shard2.log 
    进程存放目录
    pidfilepath=/usr/local/mongodb/shard2/pid/shard2.pid 
    一个数据库一个文件夹directoryperdb=true 
    使用追加的方式写日志
    logappend=true 
    集群名字 
    这个是创建副本集的方式,如果master指定了,这个地方不可以再指定了
    replSet=shard2 
    指定服务器监听的端口,默认是27017
    port=22002 
    以守护进程的方式运行
    MongoDBfork=true 
    启用日志选项,MongoDB的数据操作将会写入到journal文件夹的文件里
    journal=true 
    此实例为shard(分片),侦听27018端口
    shardsvr=true

    image.png

    shard3/shard3.conf
    vi /usr/local/mongodb/shard3/shard3.conf
    指定数据目录,默认是/data/db/。每个mongod进程都需要独立的目录
    dbpath=/usr/local/mongodb/shard3/data 
    日志文件存放目录
    logpath=/usr/local/mongodb/shard3/log/shard3.log 
    进程存放目录
    pidfilepath=/usr/local/mongodb/shard3/pid/shard3.pid 
    一个数据库一个文件夹
    directoryperdb=true 
    使用追加的方式写日志
    logappend=true 
    集群名字 
    这个是创建副本集的方式,如果master指定了,这个地方不可以再指定了
    replSet=shard3 
    指定服务器监听的端口,默认是27017
    port=22003 
    以守护进程的方式运行
    MongoDBfork=true 
    启用日志选项,MongoDB的数据操作将会写入到journal文件夹的文件里
    journal=true 
    此实例为shard(分片),侦听27018端口
    shardsvr=true

    image.png

  4. 将同样的配置分发到其他节点上

    将mongodb 整个目录拷贝到其他2个节点上:

    cd /usr/local

    scp -r mongodb/ root@192.168.0.218:/usr/local/

    scp -r mongodb/ root@192.168.0.130:/usr/local/

    image.png

  5. 配置环境变量(3台都需要配置)

    vi /etc/profile 最后添加内容:

    #mongodb

    MONGODB_HOME=/usr/local/mongodb

    export PATH=$PATH:${MONGODB_HOME}/bin

    image.png

    使其生效:

    source /etc/profile

    image.png

  6. 启动3台的config server(3台分别执行)

    mongod -f /usr/local/mongodb/config/config.conf

    image.png

  7. 登录任意一台,初始化副本集

    登录:mongo --host 192.168.0.166 --port 21000

    image.png

    use admin

    db.runCommand({"replSetInitiate":{"_id":"config","members":[{"_id":0,"host":"192.168.166:21000"},{"_id":1,"host":"192.168.0.218:21000"},{"_id":2,"host":"192.168.0.130:21000"}]}});

    image.png

    查看副本集配置:

    rs.conf()

    image.png

    查看副本集状态:

    rs.status()

  8. 创建分片副本集

    i. 第一个分片副本集shard1(3台分别启动)

    mongod -f /usr/local/mongodb/shard1/shard1.conf

    image.png

    登录任意一台,初始化第一个分片副本集:

    $ mongo --host 192.168.0.166 --port 22001

    > use admin

    > db.runCommand({"replSetInitiate":{"_id":"shard1","members":[{"_id":0,"host":"192.168.0.166:22001",priority:10},{"_id":1,"host":"192.168.0.218:22001",priority:8},{"_id":2,"host":"192.168.0.130:22001",arbiterOnly:true}]}});

    image.png

    ii. 第一个分片副本集shard2(3台分别启动)

    mongod -f /usr/local/mongodb/shard2/shard2.conf

    image.png

    登录任意一台,初始化第二个分片副本集:

    $ mongo --host 192.168.0.218 --port 22002

    > use admin

    > db.runCommand({"replSetInitiate":{"_id":"shard2","members":[{"_id":0,"host":"192.168.0.166:22002",arbiterOnly:true},{"_id":1,"host":"192.168.0.218:22002",priority:10},{"_id":2,"host":"192.168.0.130:22002",priority:8}]}});

    image.png

    iii. 第一个分片副本集shard3(3台分别启动)

    mongod -f /usr/local/mongodb/shard3/shard3.conf

    image.png

    $ mongo --host 192.168.0.130 --port 22003

    > use admin

    > db.runCommand({"replSetInitiate":{"_id":"shard3","members":[{"_id":0,"host":"192.168.0.166:22003",priority:8},{"_id":1,"host":"192.168.0.218:22003",arbiterOnly:true},{"_id":2,"host":"192.168.0.130:22003",priority:10}]}});

    image.png

  9. 配置路由服务器mongos

    首先确定配置服务器和分片服务器启动成功后,启动路由服务器(3台分别启动)

    mongos -f /usr/local/mongodb/route/route.conf

    image.png

  10. 启用分片

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

    登录任意一台mongos

    $ mongo --host 192.168.0.130 --port 20000

    使用admin数据库

    > use admin

    image.png

    串联路由服务器与分片副本集

    >db.runCommand({addshard:"shard1/192.168.0.166:22001,192.168.0.218:22001,192.168.0.130:22001"})

    >db.runCommand({addshard:"shard2/192.168.0.166:22002,192.168.0.218:22002,192.168.0.130:22002"})

    >db.runCommand({addshard:"shard3/192.168.0.166:22003,192.168.0.218:22003,192.168.0.130:22003"})

    image.png

    查看集群状态

    sh.status()

    image.png

    查看分片服务器的配置

    db.runCommand({ listshards:1 })

    image.png

  11. 测试

    目前配置服务、路由服务、分片服务、副本集服务都已经串联起来了,但我们的目的是希望插入数据,数据能够自动分片。连接在mongos上,准备让指定的数据库、指定的集合分片生效。

    连接数据库

    mongo --host 192.168.0.166 --port 20000

     创建emqx库,指定emqx分片生效

    show dbs;

    use admin

    db.runCommand({enablesharding:"emqx"})

    image.png

    使用emqx里的test表来做分片,片键为id且唯一,指定数据库里分片的集合和片键

    db.runCommand({shardcollection:"emqx.test",key:{id:1},unique : true })

    image.png

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

    批量导入一笔数据

    use emqx;

    show collections;

    for (var i = 1; i <= 1000000; i++) db.test.save({id:i, name:"weiyang", addr:"Beijing",  country:"China"});

    image.png

    查看集合test数据的条数

    db.test.count()

    image.png

    验证集合test分片

    db.test.stats()

  12. 删除分片和数据库(可选、额外)

     删除分片表

    1. use emqx

    2. db.test.drop()

    3. use config

    4. db.collections.remove({_id:"emqx.test"})

    5. db.locks.remove( { _id: "emqx.test" } )

    image.png

    删除数据库

    use config

    db. databases.remove( { _id: "emqx" } )

    db.locks.remove( { _id: "emqx" } )

    image.png

    刷新数据库

    use admin

    db.adminCommand("flushRouterConfig")

    image.png

  13. 集群安全

     key 生成

    生成autokey密钥,然后分发到其他两台节点上:

    cd /usr/local/mongodb/key/

    openssl rand -base64 753 >autokey

    chmod 600 autokey

    scp autokey root@192.168.0.218:/usr/local/mongodb/key/

    scp autokey root@192.168.0.130:/usr/local/mongodb/key/

     配置文件修改

    分别修改 机器166、218、 130所对应配置, shard 1-3(分片) 、config(配置)、route(路由,不加auth=true)下对对应的文件夹下 添加 keyFile 所对应路径:

    添加一下信息:

    keyFile= /usr/local/mongodb/key/autokey

    auth=true 

    增加权限

    use admin

    db.createUser({user:"admin",pwd:"admin",roles:["userAdminAnyDatabase"]})

    针对emqx 数据库增加用户:emqx;密码:emqx;

    use emqx

    db.createUser({user:"emqx",pwd:"emqx",roles:["readWrite"]})

    image.png

五、启停操作

mongodb的启动顺序是,先启动配置服务器,在启动分片,最后启动mongos

1. 3台分别启动:

i.  mongod -f /usr/local/mongodb/config/config.conf

ii.  mongod -f /usr/local/mongodb/shard1/shard1.conf

mongod -f /usr/local/mongodb/shard2/shard2.conf

mongod -f /usr/local/mongodb/shard3/shard3.conf

iii.  mongos -f /usr/local/mongodb/route/route.conf

2. 3台分别停止命令:ps -ef|grep mongod|grep -v grep |awk '{print $2}'|xargs kill

       

    您需要登录后才可以回复