美文网首页
Mongodb 3.4分片+副本集实例

Mongodb 3.4分片+副本集实例

作者: justonlyyo | 来源:发表于2017-12-04 16:59 被阅读0次

    配置服务器,全部设置为静态地址

    转到/home目录,创建一个mongo目录用做实验,我们需要创建如下的目录层级和空的配置文件:

    /home/mongo/conf/ # 存放各种角色的服务器的的配置文件的文件夹

    /home/mongo/conf/config.conf # 配置服务器的配置文件
    /home/mongo/conf/mongos.conf # mongos的配置文件
    /home/mongo/conf/shard1.conf # 第一个分片的配置文件
    /home/mongo/conf/shard2.conf # 第二个分片的配置文件
    /home/mongo/conf/shard3.conf #第三个分片的配置文件

    /home/mongo/config/ # 配置服务器的文件夹

    /home/mongo/config/data/ # 配置服务器的数据库目录
    /home/mongo/config/log/ # 配置服务器的日志目录

    /home/mongo/mongos/ # mongos服务器的文件夹

    /home/mongo/mongos//log/ # 配置服务器的日志目录

    /home/mongo/shard1/ # shard1的文件夹

    /home/mongo/shard1/data/ # shard1的数据库目录
    /home/mongo/shard1/log/ # shard1的日志目录

    /home/mongo/shard2/ # shard2的文件夹

    /home/mongo/shard2/data/ # shard2的数据库目录
    /home/mongo/shard2/log/ # shard2的日志目录

    /home/mongo/shard3/ # shard3的文件夹

    /home/mongo/shard3/data/ # shard3的数据库目录
    /home/mongo/shard3/log/ # shard3的日志目录

    服务器角色有以下几种:
    1. mongos

    数据库集群请求的入口,所有的请求都通过mongos进行协调,mongos是一个请求分发中心,它负责把对应的数据请求请求转发到对应的shard服务器上。在生产环境通常有多mongos作为请求的入口,防止其中一个挂掉所有的mongodb请求都没有办法操作。

    2. config server

    配置服务器,存储所有数据库元信息(路由、分片)的配置。由于mongos本身没有物理存储分片服务器和数据路由信息,只是缓存在内存里,配置服务器则实际存储这些数据。mongos第一次启动或者关掉重启就会从 config server 加载配置信息,以后如果配置服务器信息变化会通知到所有的 mongos 更新自己的状态,这样 mongos 就能继续准确路由。在生产环境通常有多个 config server 配置服务器,因为它存储了分片路由的元数据,防止数据丢失!配置服务器保存数据要求的空间不大,硬件要求也不高.但必须保持高可用性.

    3. shard

    shard,分片(sharding)是指将数据库拆分,将其分散在不同的机器上的过程。将数据分散到不同的机器上,不需要功能强大的服务器就可以存储更多的数据和处理更大的负载。基本思想就是将集合切成小块,这些块分散到若干片里,每个片只负责总数据的一部分,最后通过一个均衡器来对各个分片进行均衡(数据迁移)。分片是数据的主要存储位置.一般分片的都配置成副本集的形式,一个分片往往是一个副本集,以提高数据可靠性.

    4. replica set

    副本集,是shard的备份,防止shard挂掉之后数据丢失。复制提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性, 并可以保证数据的安全性。

    其中,副本集中主要有以下几种角色:

    1. primary

    主服务器,具备读写功能,数据最新,副本集中的其他服务器从此服务器同步数据.

    2. secondary

    从服务器,从主服务器同步数据.在主服务器宕机的时候,可以通过选举竞争成为主服务器.除非显示的执行rs.salveOk(),否则不能从从服务器上读取数据,一般也不允许向从服务器写入数据.

    3. arbiter

    仲裁服务器.不保存数据,仅仅是为了维持奇数的选举成员.负载很小.

    本例的物理服务器共三台,他们分别担任的角色如下表所示:

    192.168.99.60 192.168.99.61 192.168.99.62
    mongos mongos mongos
    config server config server config server
    shard1 primary shard1 secondary shard1 arbiter
    shard2 secondary shard2 arbiter shard2 primary
    shard3 arbiter shard3 primary shard3 secondary

    端口分配如下:

    角色 端口
    mongos 20000
    config server 21000
    shard1 27001
    shard2 27002
    shard3 27003
    编辑config server配置文件

    mongodb 现在要求配置服务器也必须以副本集方式运行.
    注意,除了yaml以外,mongodb还支持这种 = 的配置语法.
    `
    vi /home/mongo/conf/config.conf

    配置内容

    pidfilepath = /home/mongo/config/log/configsrv.pid # pid文件位置
    dbpath = /home/mongo/config/data # 数据库目录
    logpath = /home/mongo/config/log/configsvr.log # 日志目录
    logappend = true # 日志追加

    bind_ip = 0.0.0.0
    port = 21000
    fork = true # 后台运行
    configsvr = true # 配置服务器必须有这一项,用于标识身份

    副本集名称

    replSet=configs

    设置最大连接数

    maxConns=20000
    `

    启动并初始化 config server副本集

    三台配置完以后,分别启动这三台 config server
    mongod -f /home/mongo/conf/config.conf
    登录其中的一台,初始化副本集.
    `

    连接

    mongo --port 21000

    config变量

    config = {
    ... _id : "configs",
    ... members : [
    ... {_id : 0, host : "192.168.99.60:21000" },
    ... {_id : 1, host : "192.168.99.61:21000" },
    ... {_id : 2, host : "192.168.99.62:21000" }
    ... ]
    ... }

    初始化副本集

    rs.initiate(config)
    `

    特别提醒,rs,initiate() 方法不能在arbiter角色的主机上运行,(config server的副本集中没有arbiter主机)
    配置 shard1

    配置文件
    `
    vi /home/mongo/conf/shard1.conf

    配置文件内容

    ——————————————–

    pidfilepath = /home/mongo/shard1/log/shard1.pid
    dbpath = /home/mongo/shard1/data
    logpath = /home/mongo/shard1/log/shard1.log
    logappend = true

    bind_ip = 0.0.0.0
    port = 27001
    fork = true

    打开web监控

    httpinterface=true
    rest=true

    副本集名称

    replSet=shard1

    declare this is a shard db of a cluster;

    shardsvr = true

    设置最大连接数

    maxConns=20000
    启动三台服务器的shard1 server
    mongod -f /home/mongo/conf/shard1.conf
    登陆任意一台服务器,初始化副本集
    mongo --port 27001

    使用admin数据库

    use admin

    定义副本集配置,第三个节点的 "arbiterOnly":true 代表其为仲裁节点。

    config = {
    ... _id : "shard1",
    ... members : [
    ... {_id : 0, host : "192.168.99.60:21000" },
    ... {_id : 1, host : "192.168.99.61:21000" },
    ... {_id : 2, host : "192.168.99.62:21000", arbiterOnly: true }
    ... ]
    ... }

    初始化副本集配置

    rs.initiate(config);
    `
    如此类推,分别把shard2,shard3都配置好并初始化副本集.

    注意不要在仲裁主机上进行副本集的初始化动作,会报错的.
    配置 mongos

    由于mongos需要从配置服务器读取配置,并且mongos需要启用分片,所以要先启动配置服务器的副本集和shard的分片副本集们.
    先配置mongos
    `
    vi /home/mongo/conf/mongos.conf

    内容

    pidfilepath = /home/mongo/mongos/log/mongos.pid
    logpath =/home/mongo/mongos/log/mongos.log
    logappend = true

    bind_ip = 0.0.0.0
    port = 20000
    fork = true

    监听的配置服务器,只能有1个或者3个 configs为配置服务器的副本集名字

    configdb = configs/192.168.99.60:21000,192.168.99.61:21000,192.168.99.62:21000

    设置最大连接数

    maxConns=20000
    然后再分别启动3台mongos
    mongos -f /home/mongo/conf/mongos.conf # 注意这里不是mongod.而是mongos
    `

    启用分片

    登陆任意一台mongos
    `
    mongo --port 20000

    使用admin数据库

    use admin

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

    sh.addShard("shard1/192.168.99.60:27001,192.168.99.61:27001,192.168.99.62:27001")
    sh.addShard("shard2/192.168.99.60:27002,192.168.99.61:27002,192.168.99.62:27002")
    sh.addShard("shard3/192.168.99.60:27003,192.168.99.61:27003,192.168.99.62:27003")

    查看集群状态

    sh.status()
    `

    开始数据库的分片

    sh.enableSharding("db_name")

    对表进行分片,注意片键的选择要慎重.

    sh.shardCollection("db_name.collection_name", {key_name":1})

    测试

    连接到mongos的20000端口
    mongo --port 192.168.99.65:20000 sh.enableSharding(some_db) sh.shardCollection("some_db.some_collection",{"no":1}) use some_db for(var i=0;i<1000000;i++){db.some_collection.save({"no":i});}
    运行结束后,查看分片的情况
    `
    db.some_collection.stats()

    中间会有一段类似
        "shards" : {
                "shard1" : {
                        "ns" : "testdb.table1",
                        "count" : 42183,
                        "size" : 0,
                        ...
                        "ok" : 1
                },
                "shard2" : {
                        "ns" : "testdb.table1",
                        "count" : 38937,
                        "size" : 2180472,
                        ...
                        "ok" : 1
                },
                "shard3" : {
                        "ns" : "testdb.table1",
                        "count" :18880,
                        "size" : 3419528,
                        ...
                        "ok" : 1
                }
        },
    

    mongodb的启动顺序是,先启动配置服务器,在启动分片,最后启动mongos. 关闭时,直接killall杀掉所有进程
    killall mongod
    killall mongos
    `

    有关账户和密码:

    1.如果要开启auth 的话,config server配置文件要加上
    auth = true
    keyFile = /home/cluster/mongodb_key/autokey
    这两句话.

    1. mongos的配置文件里加上
      keyFile = /home/cluster/mongodb_key/autokey 这一句配置.
      (mongos的配置文件里不要加上auth = true,会报错)
      3.mongos配置文件无需开auth,mongos的登录的管理员账户是config server的里账户.
      4.从mongos登录时的数据库,如果你以前配置过密码那就不需要重新在mongos配置密码了.

    相关文章

      网友评论

          本文标题:Mongodb 3.4分片+副本集实例

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