美文网首页
MongoDB:3.分片集群

MongoDB:3.分片集群

作者: 小六的昵称已被使用 | 来源:发表于2019-05-12 09:49 被阅读0次

    环境

    [root@centos181001 ~]# cat /etc/centos-release
    CentOS Linux release 7.6.1810 (Core)
    
    [root@mongodb-hotel-test ~]# mongo --version
    MongoDB shell version v4.0.9
    git version: fc525e2d9b0e4bceff5c2201457e564362909765
    OpenSSL version: OpenSSL 1.0.1e-fips 11 Feb 2013
    allocator: tcmalloc
    modules: none
    build environment:
        distmod: rhel70
        distarch: x86_64
        target_arch: x86_64
    
    节点1:192.168.30.81
    节点2:192.168.30.82
    节点3:192.168.30.83
        Config Server 服务端口:27100
        第一个 Shard 服务端口:27001
        第二个 Shard 服务端口:27002
        第三个 Shard 服务端口:27003
        
    
    关于 Config Server:从MongoDB 3.4开始,必须将配置服务器部署为副本集(CSRS)
                        所以在3台服务器都要安装设置 Config Server以达到高可用的目录
    
    关于 Shard:Shard 分片是为了将数据平均分配到不通分片节点的分布式方式来实现高性能的横向扩展。
                    但是这样如果有其中一个节点挂掉的话,分布在这个节点上的数据将丢失
                    所以官方建议为每个 Sharding 配置3个副本集以实现 Sharding 的高可用。
    

    MongoDB分片群集包含以下组件:

    shard:每个分片包含分片数据的子集。从MongoDB 3.6开始,必须将分片部署为副本集。
    
    mongos:mongos充当查询路由器,提供客户端应用程序和分片集群之间的接口,也是唯一接口。
    
    config servers:配置服务器存储群集的元数据和配置设置。从MongoDB 3.4开始,必须将配置服务器部署为副本集(CSRS)。
    

    生产环境配置

    在生产群集中,确保数据冗余并确保系统具有高可用性。对于生产分片群集部署,请考虑以下事项:

    将Config Server部署为3成员副本集
    将每个Shard部署为3成员副本集
    部署多个mongos路由器
    

    mongos和分布

    部署多个mongos路由器以支持高可用性和可伸缩性。常见的模式是 mongos 在每个应用程序服务器上防止一个,这样可以减少应用程序和路由器之间的网络延迟
    
    或者您可以将 mongos 放在专用主机上。大型部署受益于此方法,因为它将客户端应用程序服务器的数量与 mongos 实例数量分离,这样可以更好的控制 mongod 实例所服务的连接数。
    
    客户端永远不应连接到单个分片以执行读取或写入操作。
    

    第一步:安装 MongoDB(By All)

    1.设置官方YUM源

    cat <<EOF >/etc/yum.repos.d/mongodb.repo
    [mongodb-org-4.0]
    name=MongoDB Repository
    baseurl=https://repo.mongodb.org/yum/redhat/7Server/mongodb-org/4.0/x86_64/
    gpgcheck=1
    enabled=1
    gpgkey=https://www.mongodb.org/static/pgp/server-4.0.asc
    EOF
    

    2.安装

    yum install -y mongodb-org
    
        mongodb-org 一metapackage,将自动安装以下四个组件包。
        mongodb-org-server  包含mongod守护程序,关联的init脚本和配置文件(/etc/mongod.conf)。您可以使用初始化脚本从mongod 配置文件开始。有关详细信息,请参阅运行MongoDB Community Edition。
        mongodb-org-mongos  包含mongos守护进程。
        mongodb-org-shell   包含mongoshell。
        mongodb-org-tools   包含以下的MongoDB工具:,,, , ,,和。mongoimport bsondumpmongodumpmongoexportmongofilesmongorestoremongostatm
    

    第二步:部署 Config Server

    1.创建 Config Server 工作目录并编辑配置文件(By All)

    ## 创建工作目录
    mkdir -p /mongo/config/{log,data,run}
    
    ## 编辑配置文件
    cat > /mongo/config/mongod.conf << EOF
    systemLog:
      destination: file
      logAppend: true
      path: /mongo/config/log/mongod.log
    storage:
      dbPath: /mongo/config/data
      journal:
        enabled: true
    processManagement:
      fork: true
      pidFilePath: /mongo/config/run/mongod.pid
      timeZoneInfo: /usr/share/zoneinfo
    net:
      port: 27100
      bindIp: 0.0.0.0
    replication:
      replSetName: config
    sharding:
      clusterRole: configsvr
    EOF
    cat /mongo/config/mongod.conf
    

    2.在所有服务器上启动 Config Server 服务(By All)

    mongod --config /mongo/config/mongod.conf
    

    3.登录任意一台初始化 Config Server 副本集

    ## 登录
    mongo --port 27100
    
    ## 创建配置(_id : "config" 等于上边的 replSetName: config)
    config = {
       _id : "config",
        members : [
            {_id : 0, host : "192.168.30.81:27100" },
            {_id : 1, host : "192.168.30.82:27100" },
            {_id : 2, host : "192.168.30.83:27100" }
        ]
    }
    
    ## 初始化副本集配置
    rs.initiate(config)
    
    ## 查看状态
    rs.status()
    

    第三步:配置 Shard 和副本集

    3个副本集除路径和端口外其他信息都一样

    1.创建第一个 Shard

    ## 创建工作目录(By All)
    mkdir -p /mongo/shard1/{log,data,run}
    
    ## 编辑配置文件(By All)
    cat > /mongo/shard1/mongod.conf << EOF
    systemLog:
      destination: file
      logAppend: true
      path: /mongo/shard1/log/mongod.log
    storage:
      dbPath: /mongo/shard1/data
      journal:
        enabled: true
    processManagement:
      fork: true
      pidFilePath: /mongo/shard1/run/mongod.pid
    net:
      port: 27001
      bindIp: 0.0.0.0
    replication:
      replSetName: shard1
    sharding:
      clusterRole: shardsvr
    EOF
    
    ## 在所有服务器上启动 Sharding 服务(By All)
    mongod --config /mongo/shard1/mongod.conf
    
    ## 登录任意一台初始化 Sharding 副本集
    mongo --port 27001
    
    ## 需要切换到 admin 数据库操作
    use admin
    
    ## 定义副本集配置
    config = {
       _id : "shard1",
        members : [
            {_id : 0, host : "192.168.30.81:27001" },
            {_id : 1, host : "192.168.30.82:27001" },
            {_id : 2, host : "192.168.30.83:27001" }
        ]
    }
    
    ## 初始化副本集配置
    rs.initiate(config);
    
    ## 查看状态
    rs.status()
    

    2.创建第二个 Shard

    ## 创建工作目录(By All)
    mkdir -p /mongo/shard2/{log,data,run}
    
    ## 编辑配置文件(By All)
    cat > /mongo/shard2/mongod.conf << EOF
    systemLog:
      destination: file
      logAppend: true
      path: /mongo/shard2/log/mongod.log
    storage:
      dbPath: /mongo/shard2/data
      journal:
        enabled: true
    processManagement:
      fork: true
      pidFilePath: /mongo/shard2/run/mongod.pid
    net:
      port: 27002
      bindIp: 0.0.0.0
    replication:
      replSetName: shard2
    sharding:
      clusterRole: shardsvr
    EOF
    
    ## 在所有服务器上启动 Sharding 服务(By All)
    mongod --config /mongo/shard2/mongod.conf
    
    ## 登录任意一台初始化 Sharding 副本集
    mongo --port 27002
    
    ## 需要切换到 admin 数据库操作
    use admin
    
    ## 定义副本集配置
    config = {
       _id : "shard2",
        members : [
            {_id : 0, host : "192.168.30.81:27002" },
            {_id : 1, host : "192.168.30.82:27002" },
            {_id : 2, host : "192.168.30.83:27002" }
        ]
    }
    
    ## 初始化副本集配置
    rs.initiate(config);
    
    ## 查看状态
    rs.status()
    

    3.创建第三个 Shard

    ## 创建工作目录(By All)
    mkdir -p /mongo/shard3/{log,data,run}
    
    ## 编辑配置文件(By All)
    cat > /mongo/shard3/mongod.conf << EOF
    systemLog:
      destination: file
      logAppend: true
      path: /mongo/shard3/log/mongod.log
    storage:
      dbPath: /mongo/shard3/data
      journal:
        enabled: true
    processManagement:
      fork: true
      pidFilePath: /mongo/shard3/run/mongod.pid
    net:
      port: 27003
      bindIp: 0.0.0.0
    replication:
      replSetName: shard3
    sharding:
      clusterRole: shardsvr
    EOF
    
    ## 在所有服务器上启动 Sharding 服务(By All)
    mongod --config /mongo/shard3/mongod.conf
    
    ## 登录任意一台初始化 Sharding 副本集
    mongo --port 27003
    
    ## 需要切换到 admin 数据库操作
    use admin
    
    ## 定义副本集配置
    config = {
       _id : "shard3",
        members : [
            {_id : 0, host : "192.168.30.81:27003" },
            {_id : 1, host : "192.168.30.82:27003" },
            {_id : 2, host : "192.168.30.83:27003" }
        ]
    }
    
    ## 初始化副本集配置
    rs.initiate(config);
    
    ## 查看状态
    rs.status()
    

    第四步:配置 Router mongos

    ## 创建工作目录(By All)
    mkdir -p /mongo/mongos/{log,data,run}
    
    ## 编辑配置文件(configDB要与配置服务器 ID 保持一致)(By All)
    cat > /mongo/mongos/mongod.conf << EOF
    systemLog:
      destination: file
      logAppend: true
      path: /mongo/mongos/log/mongod.log
    processManagement:
      fork: true
      pidFilePath: /mongo/mongos/run/mongod.pid
    net:
      port: 27200
      bindIp: 0.0.0.0
    sharding:
      configDB: config/192.168.30.81:27100,192.168.30.82:27100,192.168.30.83:27100
    EOF
    
    ## 启动(By All)
    mongos --config /mongo/mongos/mongod.conf
    
    ## 登录任意一台
    mongo --port 27200
    
    ## 将分片添加到 mongos
    sh.addShard("shard1/192.168.30.81:27001,192.168.30.82:27001,192.168.30.83:27001")
    sh.addShard("shard2/192.168.30.82:27002,192.168.30.83:27002,192.168.30.81:27002")
    sh.addShard("shard3/192.168.30.83:27003,192.168.30.81:27003,192.168.30.82:27003")
    
    ## 设置slave可读
    rs.slaveOk()
    
    ## 查看状态
    rs.status()
    

    附录:

    https://docs.mongodb.com/manual/core/sharded-cluster-components/

    相关文章

      网友评论

          本文标题:MongoDB:3.分片集群

          本文链接:https://www.haomeiwen.com/subject/ssgqaqtx.html