• 【最佳实践】高可用mongodb集群(1分片+3副本):规划及部署


    结合我们的生产需求,本次详细整理了最新版本 MonogoDB 7.0 集群的规划及部署过程,具有较大的参考价值,基本可照搬使用。
    适应数据规模为T级的场景,由于设计了分片支撑,后续如有大数据量需求,可分片横向扩展。

    ■■■ 分片集群规划

    ■ Configure hostname、hosts file、ip address

    vim /etc/hosts
    7.7.7.11 node1
    7.7.7.12 node2
    7.7.7.13 node3
    

    注:规划、实施、运维均采用host解析的方式判定各个节点,因此需确保该配置文件需正确解析node1、node2、node3.

    ■ 节点的角色及端口分配

    ┌────node1────┬────node2────┬────node3────┬port─┐
    │mongos server│mongos server│mongos server│20000│
    ├─────────────┼─────────────┼─────────────┼─────┤
    │config server│config server│config server│21000│
    │(Primary)    │(Secondary)  │(Secondary)  │     │
    ├─────────────┼─────────────┼─────────────┼─────┤
    │shard server1│shard server1│shard server1│27001│
    │(Primary)    │(Secondary)  │(Secondary)  │     │
    └─────────────┴─────────────┴─────────────┴─────┘
    

    ■■■ Pre-task preparation

    ■ 依赖包

    yum install -y libcurl openssl [3.6.23]
    yum install -y xz-libs [6.0.0另需]
    

    ■ 用户及用户组

    groupadd mongod
    groupadd mongodb
    useradd -g mongod -G mongodb mongod
    echo "passwd"|passwd mongod --stdin
    

    ■ mongodb 下载、安装

    官方所有介质均从这个入口下载:
    https://www.mongodb.com/try/download

    #20230911 最新版本,选择合适的平台介质
    wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-7.0.1.tgz
    wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel80-7.0.1.tgz
    
    mkdir -p /u01
    KDR=/u01
    cd ${KDR}
    TGZ=mongodb-linux-x86_64-rhel70-7.0.1
    
    #cp_unzip_chown_ln:
    cp /u01/nfs/MongoDB/${TGZ}.tgz .
    tar zxvf ${TGZ}.tgz
    chown -R mongod:mongod ${TGZ}
    ln -s ${KDR}/${TGZ}/bin/* /usr/local/bin/
    

    ■ database-tools 下载、安装

    6.0版本开始,将数据库相关的工具单独管理,以利于实时升级、发布
    wget https://fastdl.mongodb.org/tools/db/mongodb-database-tools-rhel70-x86_64-100.8.0.tgz
    wget https://fastdl.mongodb.org/tools/db/mongodb-database-tools-rhel80-x86_64-100.8.0.tgz

    KDR=/u01
    cd ${KDR}
    TGZ=mongodb-database-tools-rhel70-x86_64-100.8.0
    【后续步骤同上】
    #cp_unzip_chown_ln:
    

    ■ mongosh 下载、安装

    https://downloads.mongodb.com/compass/mongosh-2.0.0-linux-x64.tgz

    KDR=/u01
    cd ${KDR}
    #TGZ=mongosh-1.10.6-linux-x64
    TGZ=mongosh-2.0.0-linux-x64
    【后续步骤同上】
    #cp_unzip_chown_ln:
    

    ■ chronyd

    配置时间同步

    ■ selinux

    关闭selinux

    ■ firewalld

    配置防火墙,确保放行这几个端口

    firewall-cmd --add-port=20000/tcp --permanent
    firewall-cmd --add-port=21000/tcp --permanent
    firewall-cmd --add-port=27001-27003/tcp --permanent
    firewall-cmd --reload
    

    ■ 3个节点创建mongodb数据库文件目录

    MongoDir=/u01/mongodb
    mkdir -p ${MongoDir}
    chown -R mongod:mongod ${MongoDir}
    cat >> /etc/profile << EOF
    export MongoDir=${MongoDir}
    EOF
    

    ■ 以下均用mongod用户操作

    su - mongod
    echo ${MongoDir}
    

    ■ 3个节点均建立6个目录:conf、mongos、config、shard1、shard2、shard3

    mkdir -p ${MongoDir}/conf
    mkdir -p ${MongoDir}/mongos/log
    mkdir -p ${MongoDir}/config/data
    mkdir -p ${MongoDir}/config/log
    mkdir -p ${MongoDir}/shard1/data
    mkdir -p ${MongoDir}/shard1/log
    mkdir -p ${MongoDir}/shard2/data
    mkdir -p ${MongoDir}/shard2/log
    mkdir -p ${MongoDir}/shard3/data
    mkdir -p ${MongoDir}/shard3/log
    

    ■ 检查目录结构

    tree ${MongoDir} -L 2 --dirsfirst
    ├── conf
    │   ├── config.conf
    │   ├── mongos.conf
    │   ├── shard1.conf
    │   ├── shard2.conf
    │   └── shard3.conf
    ├── config
    │   ├── data
    │   └── log
    ├── mongos
    │   └── log
    ├── shard1
    │   ├── data
    │   └── log
    ├── shard2
    │   ├── data
    │   └── log
    └── shard3
        ├── data
        └── log
    

    ■■■ config server

    mongodb3.4以后要求配置服务器也创建副本集,不然集群搭建不成功

    ■ 配置文件

    【3个节点执行】

    cat > ${MongoDir}/conf/config.conf << EOF
    processManagement:
      fork: true
      pidFilePath: ${MongoDir}/config/log/configsvr.pid
    net:
      bindIpAll: true
      port: 21000
      ipv6: true
      maxIncomingConnections: 20000
    storage:
      dbPath: ${MongoDir}/config/data
      wiredTiger:
        engineConfig:
          cacheSizeGB: 1
    systemLog:
      destination: file
      path: ${MongoDir}/config/log/configsvr.log
      logAppend: true
    sharding:
      clusterRole: configsvr
    replication:
      replSetName: configs
    setParameter:
      connPoolMaxConnsPerHost: 20000
    EOF
    

    ■ 启动3个 config server

    mongod -f ${MongoDir}/conf/config.conf
    

    ■ 登录任意一台配置服务器,初始化配置副本集

    mongosh node1:21000
    
    定义config变量:
    config = {_id: "configs", members: [
      {_id: 0, host: "node1:21000"},
      {_id: 1, host: "node2:21000"},
      {_id: 2, host: "node3:21000"} ]
    }
    其中,_id: "configs"应与配置文件中的配置一致,"members" 中的 "host" 为三个节点的 ip 和 port
    
    初始化副本集:
    rs.initiate(config)
    
    查看此时状态:
    rs.status()
    

    ■■■ shard server

    ■ shard server1

    【3个节点执行】
    【注意】如果数据量并不大,分片需求不明显,可以先只创建shard server1,另外的分片2、分片3先不创建,后续根据实际需求可随时创建。

    cat > ${MongoDir}/conf/shard1.conf << EOF
    processManagement:
      fork: true
      pidFilePath: ${MongoDir}/shard1/log/shard1.pid
    net:
      bindIpAll: true
      port: 27001
      ipv6: true
      maxIncomingConnections: 20000
    storage:
      dbPath: ${MongoDir}/shard1/data
      wiredTiger:
        engineConfig:
          cacheSizeGB: 5
    systemLog:
      destination: file
      path: ${MongoDir}/shard1/log/shard1.log
      logAppend: true
    sharding:
      clusterRole: shardsvr
    replication:
      replSetName: shard1
    security:
      keyFile: ${MongoDir}/conf/mongo.keyfile
    setParameter:
      connPoolMaxConnsPerHost: 20000
      maxNumActiveUserIndexBuilds: 6
    EOF
    

    启动3个 shard1 server:
    mongod -f ${MongoDir}/conf/shard1.conf

    登陆任意节点,初始化副本集:
    注:初始化副本集的操作不能在仲裁节点上执行!在哪个节点初始化,则哪个节点默认是副本集的主节点。

    mongosh --port 27001
    使用admin数据库,定义副本集配置,"arbiterOnly":true 代表其为仲裁节点:
    use admin
    #模式选择 P/S/S
    config = {_id: "shard1", members: [
        {_id: 0, host: "node1:27001"},
        {_id: 1, host: "node2:27001"},
        {_id: 2, host: "node3:27001"}
      ]
    }
    #模式选择 P/S/A
    config = {_id: "shard1", members: [
        {_id: 0, host: "node1:27001"},
        {_id: 1, host: "node2:27001"},
        {_id: 2, host: "node3:27001", arbiterOnly:true}
      ]
    }
    rs.initiate(config);
    rs.status()
    

    ■ shard server2 【备用,暂不执行】

    ■ shard server3 【备用,暂不执行】

    ■■■ mongos server

    【3个节点执行】
    注:需先启动 config server 和 shard server, 后启动 mongos server (3个节点)

    cat > ${MongoDir}/conf/mongos.conf << EOF
    processManagement:
      fork: true
      pidFilePath: ${MongoDir}/mongos/log/mongos.pid
    net:
      bindIpAll: true
      port: 20000
      ipv6: true
      maxIncomingConnections: 20000
    systemLog:
      destination: file
      path: ${MongoDir}/mongos/log/mongos.log
      logAppend: true
    sharding:
      configDB: configs/node1:21000,node2:21000,node3:21000
    EOF
    

    启动3个 mongos server:
    mongos -f ${MongoDir}/conf/mongos.conf

    ■■■ 启用分片机制

    以上配置过程可见,mongos server 只有 configsvr 配置信息,并无 shardsvr 的信息,因此还需设置使分片可用,否则是无法使用分片的,就是说:shardsvr 无法直接操作,只能通过 mongos server 启用分片机制后,才能操作
    问题:如果只有一个分片,还需要设置吗?答案是:需要,原因见上。

    ■ 3.6.23 / 7.0.0

    登陆任一 mongos server, 使用 admin 数据库,串联路由服务器与分配副本集:

    mongosh node1:20000
    use admin
    sh.addShard("shard1/node1:27001,node2:27001,node3:27001")
    查看集群状态:
    sh.status()
    sh.removeShard("shard2")
    

    ■■■ 使用分片机制

    暂不涉及,后续可视需要再配置。

    ■■■ 用户权限配置

    对于搭建好的mongodb分片集群,为了安全,需启动安全认证,使用账号密码登录。
    默认的mongodb是不设置认证的。只要ip和端口正确就能连接,这样是很不安全的。
    mongodb官网声称,为了能保障mongodb的安全可以做以下几个步骤:
    1、使用新的端口,默认的27017端口如果一旦知道了ip就能连接上,不太安全
    2、设置mongodb的网络环境,最好将mongodb部署到公司服务器内网,这样外网是访问不到的。公司内部访问使用vpn等
    3、开启安全认证。认证要同时设置服务器之间的内部认证方式,同时要设置客户端连接到集群的账号密码认证方式
    以下详细描述如何配置安全认证。

    ■ node1 创建副本集认证的key文件

    用openssl生成密码文件,然后使用chmod来更改文件权限,仅为文件所有者提供读取权限

    cd ${MongoDir}/conf
    openssl rand -out mongo.keyfile -base64 90
    chmod 600 mongo.keyfile
    ll mongo.keyfile
    -r-------- 1 mongod mongod 122 Aug  4 08:33 mongo.keyfile
    

    提示:所有副本集节点都必须要用同一份keyfile,一般是在一台机器上生成,然后拷贝到其他机器上,且必须有读的权限,否则将来会报错:
    permissions on ${MongoDir}/conf/mongo.keyfile are too open

    ■ node1 修改配置文件指定keyfile

    编辑配置文件,添加如下内容:

    for FILE in ${MongoDir}/conf/{config,shard1,mongos}.conf
    do
    cat >> ${FILE} << EOF
    security:
      keyFile: /u01/mongodb/conf/mongo.keyfile
    EOF
    done
    

    ■ node1 将修改后的配置文件和key文件拷贝到 node2、node3

    scp ${MongoDir}/conf/{config.conf,shard[1-3].conf,mongos.conf,mongo.keyfile} node2:${MongoDir}/conf
    scp ${MongoDir}/conf/{config.conf,shard[1-3].conf,mongos.conf,mongo.keyfile} node3:${MongoDir}/conf
    

    ■ 重新启动节点

    依次启动配置节点、分片节点、路由节点

    ■ 创建帐号和认证

    客户端mongosh,通过localhost或127.0.0.1登录任意一个mongos路由,可以执行创建操作
    提示:此时相当于一个后门,只能在 admin 下添加用户
    提示:通过mongos添加的账号信息,只会保存到配置节点的服务中,具体的数据节点不保存账号信息,因此分片中的账号信息不涉及到同步问题
    建议:先创建超管用户和普通用户,然后再开启安全配置

    创建管理员帐号:

    use admin
    db.createUser({user: "admin", pwd: "passwd!2#", roles: ["root"]})
    db.createUser({user: "inspur", pwd: "passwd!2#", roles: ["userAdminAnyDatabase"]})
    db.dropUser("inspur")
    鉴权操作:
    db.auth("admin", "passwd!2#")
    db.auth("inspur", "passwd!2#")
    

    创建一个普通权限帐号:

    use testdb
    db.createUser({user: "liking", pwd: "passwd!2#", roles: ["readWrite"]})
    db.auth("liking", "passwd!2#")
    

    ■ 用管理员帐号可查看整体的分片情况

    use admin
    db.auth("admin", "passwd!2#")
    sh.status()
    

    ■ 用普通帐号访问数据

    use testdb
    db.auth("liking", "passwd!2#")
    

    ■ 客户端连接多个mongos的标准格式

    mongosh mongodb://'admin':'passwd%212%23'@node1:20000,node2:20000,node3:20000/testdb?authSource=admin
    
  • 相关阅读:
    金昌JCH文件批量转BMP/JPG图片脚本
    详解SIFT、SURF和ORB特征点检测和描述算法
    C语言程序-输出一百以下的偶数while
    mysql按月分组并补齐
    科技“蝶变”,两轮电动车下一个五年的“新动力”
    Autojs 小游戏实践-神农百草园
    你知道Online DDL吗?
    JVM介绍
    教你轻松使用Fastjson
    开源网安解决方案荣获四川数实融合创新实践优秀案例
  • 原文地址:https://www.cnblogs.com/likingzi/p/17756486.html