• mongo 3.4分片集群系列之三:搭建分片集群--哈希分片 + 安全


    这个系列大致想跟大家分享以下篇章:

    1、mongo 3.4分片集群系列之一:浅谈分片集群

    2、mongo 3.4分片集群系列之二:搭建分片集群--哈希分片

    3、mongo 3.4分片集群系列之三:搭建分片集群--哈希分片 + 安全

    4、mongo 3.4分片集群系列之四:搭建分片集群--哈希分片 + 安全 + 区域

    5、mongo 3.4分片集群系列之五:详解平衡器

    6、mongo 3.4分片集群系列之六:详解配置数据库

    7、mongo 3.4分片集群系列之七:配置数据库管理

    8、mongo 3.4分片集群系列之八:分片管理

     

    这一篇也是实践篇。

    主要要讲两大部分:

    一是在现有的,已经搭建好的哈希分片集群上,加上内部认证和用户访问控制(也就是继“mongo 3.4分片集群系列之二:搭建分片集群--哈希分片”搭建的分片集群,增加安全机制)。

    二是在搭建的时候,搭建分片集群和安全一起做,也就是从无集群到有集群的过程。

     

    这里说的安全机制,只是简单的通过密钥文件做内部认证,和用户访问控制。

    一、      在现有的分片集群上,添加安全机制。

    1、        创建和分发密钥文件

    # cd /etc/

    # sudo openssl rand –base64 755 > mongo_keyfile

    # sudo chmod 400 mongo_keyfile

    mongo_keyfile是我指定的密钥文件名,可以按需更改;

    修改权限,一定要做,否则之后会出现很多不知名的错误。

    这里要先将192.168.209.155上的mongo_keyfile文件拿到192.168.209.156上

    #sudo rsync –arvz –P bear@192.168.209.155:/etc/mongo_keyfile /etc/

    拷贝过来后,注意检查权限是不是400,如图

         

    2、        配置分片集群管理用户和数据库用户(在192.168.209.155上操作)

    (1)   分片集群管理用户

    mongos和配置服务器的集群管理员用户是可以通用的,但是分片要创建自己的本地管理员用户。

    连接到mongos

    # mongo --port 6666

    输入以下命令:(这里只是为了方便理解,其实命令行打成一行即可)

    use admin;

    db.createUser(

      {

        user: "admin",

        pwd: "adminbear",

    roles: [

          { role: "root", db: "admin" },

          { role: "clusterAdmin", db: "admin" },

          { role: "userAdmin", db: "admin" }

        ]

      }

    );

    其中,user用户名和pwd密码,可按需更改。由于角色分配的时候,分配root最高权限给了admin,所以admin既是集群的最高管理员用户,又是所有数据库的最高管理员用户

    (2)   数据库用户

    以下是为数据库名DatabaseName,创建数据库用户。

    输入以下命令:(这里只是为了方便理解,其实命令行打成一行即可)

    use DatabaseName;

    db.createUser(

      {

        user: "bear",

        pwd: "bear",

    roles: [

          { role: "readWrite", db: "DatabaseName" }

        ]

      }

    );

    其中,user用户名和pwd密码,可按需更改。

    exit;

    退出当前的进程

    3、        过渡每一个mongos实例来强制验证(不停机)

    (1)   第一个Mongos路由 mongo_router1(在192.168.209.155上操作)

    1)        新建一个配置文件

    # sudo vim /etc/mongo_router1_tmp.conf

    文件中的配置如下:(所有空位都是空格,不是TAB键哦,大小写是严格区分的)

    net:

     port: 6666

    sharding:

     configDB: mongo_config/192.168.209.155:6000,192.168.209.155:6001,192.168.209.155:6002

    security:

     transitionToAuth: true

     keyFile: /etc/mongo_keyfile

    如下图:

             

    2)        关闭mongos实例

    连接到mongos

    # mongo --port 6666 –u admin –p adminbear --authenticationDatabase admin

    use admin;

    db.shutdownServer();

    exit;

    3)        用新的配置文件重新mongos实例

    # mongos --config /etc/mongo_router1_tmp.conf &

    (2)   第二个Mongos路由 mongo_router2(在192.168.209.156上操作)

    1)        新建一个配置文件

    # sudo vim /etc/mongo_router2_tmp.conf

    文件中的配置如下:(所有空位都是空格,不是TAB键哦,大小写是严格区分的)

    net:

     port: 6666

    sharding:

     configDB: mongo_config/192.168.209.155:6000,192.168.209.155:6001,192.168.209.155:6002

    security:

     transitionToAuth: true

     keyFile: /etc/mongo_keyfile

    如下图:

             

    2)        关闭mongos实例

    连接到mongos

    # mongo --port 6666 –u admin –p adminbear --authenticationDatabase admin

    use admin;

    db.shutdownServer();

    exit;

    3)        用新的配置文件重新mongos实例

    # mongos --config /etc/mongo_router2_tmp.conf &

    4、        过渡每一个配置服务器的副本集成员实例来强制验证(不停机)(在192.168.209.155上操作)

    这里配置服务器的主节点是mongo_config1

    (1)   第二个配置服务器 mongo_config2

    1)        复制密钥文件到指定目录/mongo_config2/

    # sudo cp /etc/mongo_keyfile /mongo_config2/

    2)        新建一个配置文件

    # sudo vim /mongo_config2/mongo_config2_tmp.conf

    文件中的配置如下:(所有空位都是空格,不是TAB键哦,大小写是严格区分的

    storage:

     dbPath: “/mongo_config2/data”

     indexBuildRetry: false

    systemLog:

     destination: file

     path: “/mongo_config2/log/mongo_config2.log

    net:

     port: 6001

    sharding:

     clusterRole: configsvr

    replication:

     replSetName: mongo_config

    security:

     transitionToAuth: true

     keyFile: /mongo_config2/mongo_keyfile

    如下图:

             

    3)        关闭mongod实例

    连接到mongod

    # mongo --port 6001 –u admin –p adminbear --authenticationDatabase admin

    use admin;

    db.shutdownServer();

    exit;

    4)        用新的配置文件重新mongod实例

    # mongod --fork --config /mongo_config2/mongo_config2_tmp.conf

    (2)   第三个配置服务器 mongo_config3

    1)        复制密钥文件到指定目录/mongo_config3/

    # sudo cp /etc/mongo_keyfile /mongo_config3/

    2)        新建一个配置文件

    # sudo vim /mongo_config3/mongo_config3_tmp.conf

    文件中的配置如下:(所有空位都是空格,不是TAB键哦,大小写是严格区分的)

    storage:

     dbPath: “/mongo_config3/data”

     indexBuildRetry: false

    systemLog:

     destination: file

     path: “/mongo_config3/log/mongo_config3.log

    net:

     port: 6002

    sharding:

     clusterRole: configsvr

    replication:

     replSetName: mongo_config

    security:

     transitionToAuth: true

     keyFile: /mongo_config3/mongo_keyfile

    如下图:

             

    3)        关闭mongod实例

    连接到mongod

    # mongo --port 6002 –u admin –p adminbear --authenticationDatabase admin

    use admin;

    db.shutdownServer();

    exit;

    4)        用新的配置文件重新mongod实例

    # mongod --fork --config /mongo_config3/mongo_config3_tmp.conf

    (3)   第一个配置服务器 mongo_config1

    1)        复制密钥文件到指定目录/mongo_config1/

    # sudo cp /etc/mongo_keyfile /mongo_config1/

    2)        新建一个配置文件

    # sudo vim /mongo_config1/mongo_config1_tmp.conf

    文件中的配置如下:(所有空位都是空格,不是TAB键哦,大小写是严格区分的)

    storage:

     dbPath: “/mongo_config1/data”

     indexBuildRetry: false

    systemLog:

     destination: file

     path: “/mongo_config1/log/mongo_config1.log

    net:

     port: 6000

    sharding:

     clusterRole: configsvr

    replication:

     replSetName: mongo_config

    security:

     transitionToAuth: true

     keyFile: /mongo_config1/mongo_keyfile

    如下图:

             

    3)        降级主节点

    连接到mongod

    # mongo --port 6000 –u admin –p adminbear --authenticationDatabase admin

    rs.stepDown();

    4)        关闭mongod实例

    use admin;

    db.shutdownServer();

    exit;

    5)        用新的配置文件重新mongod实例

    # mongod --fork --config /mongo_config1/mongo_config1_tmp.conf

    5、        过渡每一个分片实例来强制验证(停机)

    (1)   第一个分片 mongo_shard1(在192.168.209.155上操作)

    1)        创建分片本地管理员

    连接到mongod

    # mongo --port 6100

    输入以下命令:(这里只是为了方便理解,其实命令行打成一行即可)

    use admin;

    db.createUser(

      {

        user: "adminShard1",

        pwd: "adminbear",

    roles: [

          { role: "clusterAdmin", db: "admin" },

          { role: "userAdmin", db: "admin" }

        ]

      }

    );

    其中,user用户名和pwd密码,可按需更改。

    2)        复制密钥文件到指定目录/mongo_shard1/

    # sudo cp /etc/mongo_keyfile /mongo_shard1/

    3)        新建一个配置文件

    # sudo vim /mongo_shard1/mongo_shard1_tmp.conf

    文件中的配置如下:(所有空位都是空格,不是TAB键哦,大小写是严格区分的)

    storage:

     dbPath: “/mongo_shard1/data”

     indexBuildRetry: false

    systemLog:

     destination: file

     path: “/mongo_shard1/log/mongo_shard1.log

    net:

     port: 6100

    sharding:

     clusterRole: shardsvr

    security:

     transitionToAuth: true

     keyFile: /mongo_shard1/mongo_keyfile

    如下图:

             

    4)        关闭mongod实例

    连接到mongod

    # mongo --port 6100 –u adminShard1 –p adminbear --authenticationDatabase admin

    use admin;

    db.shutdownServer();

    exit;

    5)        用新的配置文件重新mongod实例

    # mongod --fork --config /mongo_shard1/mongo_shard1_tmp.conf

    (2)   第二个分片 mongo_shard2(在192.168.209.156上操作)

    1)        创建分片本地管理员

    连接到mongod

    # mongo --port 6100

    输入以下命令:(这里只是为了方便理解,其实命令行打成一行即可)

    use admin;

    db.createUser(

      {

        user: "adminShard2",

        pwd: "adminbear",

    roles: [

          { role: "clusterAdmin", db: "admin" },

          { role: "userAdmin", db: "admin" }

        ]

      }

    );

    其中,user用户名和pwd密码,可按需更改。

    2)        复制密钥文件到指定目录/mongo_shard2/

    # sudo cp /etc/mongo_keyfile /mongo_shard2/

    3)        新建一个配置文件

    # sudo vim /mongo_shard2/mongo_shard2_tmp.conf

    文件中的配置如下:(所有空位都是空格,不是TAB键哦,大小写是严格区分的)

    storage:

     dbPath: “/mongo_shard2/data”

     indexBuildRetry: false

    systemLog:

     destination: file

     path: “/mongo_shard2/log/mongo_shard2.log

    net:

     port: 6100

    sharding:

     clusterRole: shardsvr

    security:

     transitionToAuth: true

     keyFile: /mongo_shard2/mongo_keyfile

    如下图:       

             

    4)        关闭mongod实例

    连接到mongod

    # mongo --port 6100 –u adminShard2 –p adminbear --authenticationDatabase admin

    use admin;

    db.shutdownServer();

    exit;

    5)        用新的配置文件重新mongod实例

    # mongod --fork --config /mongo_shard2/mongo_shard2_tmp.conf

    6、        强制每一个mongos实例来强制验证(不停机)

    (1)   第一个Mongos路由 mongo_router1(在192.168.209.155上操作)

    1)        新建一个配置文件

    # sudo vim /etc/mongo_router1_secure.conf

    文件中的配置如下:(所有空位都是空格,不是TAB键哦,大小写是严格区分的)

    net:

     port: 6666

    sharding:

     configDB: mongo_config/192.168.209.155:6000,192.168.209.155:6001,192.168.209.155:6002

    security:

    keyFile: /etc/mongo_keyfile

    如下图:

             

    2)        关闭mongos实例

    连接到mongos

    # mongo --port 6666 –u admin –p adminbear --authenticationDatabase admin

    use admin;

    db.shutdownServer();

    exit;

    3)        用新的配置文件重新mongos实例

    # mongos --config /etc/mongo_router1_secure.conf &

    (2)   第二个Mongos路由 mongo_router2(在192.168.209.156上操作)

    1)        新建一个配置文件

    # sudo vim /etc/mongo_router2_secure.conf

    文件中的配置如下:(所有空位都是空格,不是TAB键哦,大小写是严格区分的)

    net:

     port: 6666

    sharding:

     configDB: mongo_config/192.168.209.155:6000,192.168.209.155:6001,192.168.209.155:6002

    security:

     keyFile: /etc/mongo_keyfile

    如下图:

             

    2)        关闭mongos实例

    连接到mongos

    # mongo --port 6666 –u admin –p adminbear --authenticationDatabase admin

    use admin;

    db.shutdownServer();

    exit;

    3)        用新的配置文件重新mongos实例

    # mongos --config /etc/mongo_router2_secure.conf &

    7、        强制每一个配置服务器的副本集成员实例来强制验证(不停机)(在192.168.209.155上操作)

    这里配置服务器的主节点是mongo_config1

    (1)   第二个配置服务器 mongo_config2

    1)        新建一个配置文件

    # sudo vim /mongo_config2/mongo_config2_secure.conf

    文件中的配置如下:(所有空位都是空格,不是TAB键哦,大小写是严格区分的)

    storage:

     dbPath: “/mongo_config2/data”

     indexBuildRetry: false

    systemLog:

     destination: file

     path: “/mongo_config2/log/mongo_config2.log

    net:

     port: 6001

    sharding:

     clusterRole: configsvr

    replication:

     replSetName: mongo_config

    security:

     keyFile: /etc/mongo_keyfile

    如下图:

             

    2)        关闭mongod实例

    连接到mongod

    # mongo --port 6001 –u admin –p adminbear --authenticationDatabase admin

    use admin;

    db.shutdownServer();

    exit;

    3)        用新的配置文件重新mongod实例

    # mongod --fork --config /mongo_config2/mongo_config2_secure.conf

    (2)   第三个配置服务器 mongo_config3

    1)        新建一个配置文件

    # sudo vim /mongo_config3/mongo_config3_secure.conf

    文件中的配置如下:(所有空位都是空格,不是TAB键哦,大小写是严格区分的)

    storage:

     dbPath: “/mongo_config3/data”

     indexBuildRetry: false

    systemLog:

     destination: file

     path: “/mongo_config3/log/mongo_config3.log

    net:

     port: 6002

    sharding:

     clusterRole: configsvr

    replication:

     replSetName: mongo_config

    security:

     keyFile: /etc/mongo_keyfile

    如下图:

             

    2)        关闭mongod实例

    连接到mongod

    # mongo --port 6002 –u admin –p adminbear --authenticationDatabase admin

    use admin;

    db.shutdownServer();

    exit;

    3)        用新的配置文件重新mongod实例

    # mongod --fork --config /mongo_config3/mongo_config3_secure.conf

    (3)   第一个配置服务器 mongo_config1

    1)        新建一个配置文件

    # sudo vim /mongo_config1/mongo_config1_secure.conf

    文件中的配置如下:(所有空位都是空格,不是TAB键哦,大小写是严格区分的)

    storage:

     dbPath: “/mongo_config1/data”

     indexBuildRetry: false

    systemLog:

     destination: file

     path: “/mongo_config1/log/mongo_config1.log

    net:

     port: 6000

    sharding:

     clusterRole: configsvr

    replication:

     replSetName: mongo_config

    security:

     keyFile: /etc/mongo_keyfile

    如下图:

             

    2)        降级主节点

    连接到mongod

    # mongo --port 6000 –u admin –p adminbear --authenticationDatabase admin

    rs.stepDown();

    3)        关闭mongod实例

    use admin;

    db.shutdownServer();

    exit;

    4)        用新的配置文件重新mongod实例

    # mongod --fork --config /mongo_config1/mongo_config1_secure.conf

    8、        强制每一个分片实例来强制验证(停机)

    (1)   第一个分片 mongo_shard1(在192.168.209.155上操作)

    1)        新建一个配置文件

    # sudo vim /mongo_shard1/mongo_shard1_secure.conf

    文件中的配置如下:(所有空位都是空格,不是TAB键哦,大小写是严格区分的)

    storage:

     dbPath: “/mongo_shard1/data”

     indexBuildRetry: false

    systemLog:

     destination: file

     path: “/mongo_shard1/log/mongo_shard1.log

    net:

     port: 6100

    sharding:

     clusterRole: shardsvr

    security:

     keyFile: /mongo_shard1/mongo_keyfile

    如下图:

             

    2)        关闭mongod实例

    连接到mongod

    # mongo --port 6100 –u adminShard1 –p adminbear --authenticationDatabase admin

    use admin;

    db.shutdownServer();

    exit;

    3)        用新的配置文件重新mongod实例

    # mongod --fork --config /mongo_shard1/mongo_shard1_secure.conf

    (2)   第二个分片 mongo_shard2(在192.168.209.156上操作)

    1)        新建一个配置文件

    # sudo vim /mongo_shard2/mongo_shard2_secure.conf

    文件中的配置如下:(所有空位都是空格,不是TAB键哦,大小写是严格区分的)

    storage:

     dbPath: “/mongo_shard2/data”

     indexBuildRetry: false

    systemLog:

     destination: file

     path: “/mongo_shard2/log/mongo_shard2.log

    net:

     port: 6100

    sharding:

     clusterRole: shardsvr

    security:

     keyFile: /mongo_shard2/mongo_keyfile

    如下图:       

             

    2)        关闭mongod实例

    连接到mongod

    # mongo --port 6100 –u adminShard2 –p adminbear --authenticationDatabase admin

    use admin;

    db.shutdownServer();

    exit;

    3)        用新的配置文件重新mongod实例

    # mongod --fork --config /mongo_shard2/mongo_shard2_secure.conf

     

     ---------------------------------------第一部分  over ------------------------------------------------------

    二、      搭建分片集群和安全机制

    (大致的流程与“mongo 3.4分片集群系列之二:搭建分片集群--哈希分片”差不多,有区别的我会用红色字体标注)

    1、说说分片集群的架构

    这里要搭建的分片集群架构如下:

    2个mongos,1个三个成员的副本集配置服务器,2个单实例的分片。图示如下:

    简单介绍一下MongoDB分片集群由以下组件组成:

      • mongos:mongos作为查询路由器,提供客户端应用程序和分片集群之间的接口。
      • 配置服务器:配置服务器存储集群的元数据和配置信息。从MongoDB 3.4开始,配置服务器必须部署为副本集(CSRS)。
      • 分片:每个分片包含分片数据的一部分。每个分片可以部署为副本集。这里先做单实例,没有做副本集。

    2、分片前注意事项

    关于分片集群的一些注意点,请参阅:mongo 3.4分片集群系列之一:浅谈分片集群 ,其中第4点,分片前考虑事项。

    好啦。慎重考虑完分片前考虑事项的话,接下来就进入实践吧~~~

    3、搭建哈希分片集群

    下面是参照官网的  https://docs.mongodb.com/manual/tutorial/deploy-sharded-cluster-ranged-sharding/

    3.1、搭建前准备:

    物理环境:

    我这边是用两个虚拟机模仿两台服务器的(真实服务器也按照这个方法实践,可以行得通)。

    IP分别为192.168.209.155和192.168.209.156。其中,这两个IP之间必须互通。即192.168.209.155可以ping通192.168.209.156,192.168.209.156也可以ping通192.168.209.155。

    配置大致如下:(此操作是建立在mongo3.4版本)

    名称

    主机

    端口

    副本集

    Data路径

    Log路径

    Router1

    192.168.209.155

    6666

    Router2

    192.168.209.156

    6666

    Config1

    192.168.209.155

    6000

    mongo_config

    /mongo_config1/data

    /mongo_config1/log

    Config2

    6001

    /mongo_config2/data

    /mongo_config2/log

    Config3

    6002

    /mongo_config3/data

    /mongo_config3/log

    Shard1

    192.168.209.155

    6100

    /mongo_shard1/data

    /mongo_shard1/log

    Shard2

    192.168.209.156

    6100

    /mongo_shard2/data

    /mongo_shard2/log

    接下来就来搭建哈希分片集群咯~~~

    3.2前添加、创建密钥文件,以及修改权限

    # cd /etc/

    # sudo openssl rand –base64 755 > mongo_keyfile

    # sudo chmod 400 mongo_keyfile

    mongo_keyfile是我指定的密钥文件名,可以按需更改;

    修改权限,一定要做,否则之后会出现很多不知名的错误。

    这里要先将192.168.209.155上的mongo_keyfile文件拿到192.168.209.156

    #sudo rsync –arvz –P bear@192.168.209.155:/etc/mongo_keyfile /etc/

    拷贝过来后,注意检查权限是不是400,如图

         

    3.2、创建配置服务器副本集

    部署具有三个成员的配置服务器副本集。

    (1)   mongo_config1 (在192.168.209.155上操作)

    1)         创建数据路径文件夹和日志路径文件夹

    # sudo mkdir –p /mongo_config1/data

    # sudo mkdir –p /mongo_config1/log

    2)         复制密钥文件到指定目录/mongo_config1

    # sudo cp /etc/mongo_keyfile /mongo_config1/

    3)         创建配置文件

    # sudo vim /mongo_config1/mongo_config1_secure.conf

    文件中的配置如下:(所有空位都是空格,不是TAB键哦,大小写是严格区分的)

    storage:

     dbPath: “/mongo_config1/data”

     indexBuildRetry: false

    systemLog:

     destination: file

     path: “/mongo_config1/log/mongo_config1.log

    net:

     port: 6000

    sharding:

     clusterRole: configsvr

    replication:

     replSetName: mongo_config

    security:

     keyFile: /mongo_config1/mongo_keyfile

    如下图:

               

    4)         启动mongod实例

    # mongod --fork --config /mongo_config1/mongo_config1_secure.conf

    --fork 是以线程方式启动mongod服务

    --config 指定配置文件路径

    (2)   mongo_config2(在192.168.209.155上操作)

    1)         创建数据路径文件夹和日志路径文件夹

    # sudo mkdir –p /mongo_config2/data

    # sudo mkdir –p /mongo_config2/log

    2)         复制密钥文件到指定目录/mongo_config2

    # sudo cp /etc/mongo_keyfile /mongo_config2/

    3)         创建配置文件

    # sudo vim /mongo_config2/mongo_config2_secure.conf

    文件中的配置如下:(所有空位都是空格,不是TAB键哦,大小写是严格区分的)

    storage:

     dbPath: “/mongo_config2/data”

     indexBuildRetry: false

    systemLog:

     destination: file

     path: “/mongo_config2/log/mongo_config2.log

    net:

     port: 6001

    sharding:

     clusterRole: configsvr

    replication:

     replSetName: mongo_config

    security:

     keyFile: /mongo_config2/mongo_keyfile

    如下图:

                

    4)         启动mongod实例

    # mongod --fork --config /mongo_config2/mongo_config2_secure.conf

    --fork 是以线程方式启动mongod服务

    --config 指定配置文件路径

    (3)   mongo_config3 (在192.168.209.155上操作)

    1)         创建数据路径文件夹和日志路径文件夹

    # sudo mkdir –p /mongo_config3/data

    # sudo mkdir –p /mongo_config3/log

    2)         复制密钥文件到指定目录/mongo_config3

    # sudo cp /etc/mongo_keyfile /mongo_config3/

    3)         创建配置文件

    # sudo vim /mongo_config3/mongo_config3_secure.conf

    文件中的配置如下:(所有空位都是空格,不是TAB键哦,大小写是严格区分的)

    storage:

     dbPath: “/mongo_config3/data”

     indexBuildRetry: false

    systemLog:

     destination: file

     path: “/mongo_config3/log/mongo_config3.log

    net:

     port: 6002

    sharding:

     clusterRole: configsvr

    replication:

     replSetName: mongo_config

    security:

     keyFile: /mongo_config3/mongo_keyfile

    如下图:

             

    4)         启动mongod实例

    # mongod --fork --config /mongo_config3/mongo_config3_secure.conf

    --fork 是以线程方式启动mongod服务

    --config 指定配置文件路径

    (4)   初始化副本集mongo_config(在192.168.209.155上操作)

    1)         连接任意一个mongod实例

    # sudo mongod --port 6000

    2)         初始化副本集

    输入以下命令:(这里只是为了方便理解,其实命令行打成一行即可)

    rs.initiate(

      {

        _id: "mongo_config",

        configsvr: true,

        members: [

          { _id : 0, host : "192.168.209.155:6000" },

          { _id : 1, host : "192.168.209.155:6001" },

          { _id : 2, host : "192.168.209.155:6002" }

        ]

      }

    )

    _id:必须匹配传递给mongod 的--replSet参数。

    members:是一个数组,每个副本集成员都需要一个文档。

    configsvr:必须设置true。

    3.3、创建分片

    (1)   mongo_shard1 (在192.168.209.155上操作)

    1)         复制密钥文件到指定目录/mongo_shard1

    # sudo cp /etc/mongo_keyfile /mongo_shard1/

    2)         为mongo_shard1创建配置文件

    # sudo vim /mongo_shard1/mongo_shard1_secure.conf

    文件中的配置如下:(所有空位都是空格,不是TAB键哦,大小写是严格区分的)

    storage:

     dbPath: “/mongo_shard1/data”

     indexBuildRetry: false

    systemLog:

     destination: file

     path: “/mongo_shard1/log/mongo_shard1.log

    net:

     port: 6100

    sharding:

     clusterRole: shardsvr

    security:

     keyFile: /mongo_shard1/mongo_keyfile

    如下图:

               

    3)         启动mongod实例

    # mongod --fork --config /mongo_shard1/mongo_shard1_secure.conf

    (2)   mongo_shard2(在192.168.209.156上操作)

    1)         复制密钥文件到指定目录/mongo_shard2

    # sudo cp /etc/mongo_keyfile /mongo_shard2/

    2)         为mongo_shard2创建配置文件

    # sudo vim /mongo_shard2/mongo_shard2_secure.conf

    文件中的配置如下:(所有空位都是空格,不是TAB键哦,大小写是严格区分的)

    storage:

     dbPath: “/mongo_shard2/data”

     indexBuildRetry: false

    systemLog:

     destination: file

     path: “/mongo_shard2/log/mongo_shard2.log

    net:

     port: 6101

    sharding:

     clusterRole: shardsvr

    security:

     keyFile: /mongo_shard2/mongo_keyfile

    如下图:

               

    3)         启动mongod实例

    # mongod --fork --config /mongo_shard2/mongo_shard2_secure.conf

    3.3、创建路由

    (1)   mongo_router1(在192.168.209.155上操作)

    1)         为mongo_router1创建配置文件

    # sudo vim /etc/mongo_router1_secure.conf

    文件中的配置如下:(所有空位都是空格,不是TAB键哦,大小写是严格区分的)

    net:

     port: 6666

    sharding:

     configDB: mongo_config/192.168.209.155:6000,192.168.209.155:6001,192.168.209.155:6002

    security:

     keyFile: /etc/mongo_keyfile

    如下图:

    2)         启动mongos实例

    # mongos --config /etc/mongo_router1_secure.conf

    (2)   mongo_router2(在192.168.209.156上操作)

    1)         为mongo_router2创建配置文件

    # sudo vim /etc/mongo_router2_secure.conf

    文件中的配置如下:(所有空位都是空格,不是TAB键哦,大小写是严格区分的)

    net:

     port: 6666

    sharding:

     configDB: mongo_config/192.168.209.155:6000,192.168.209.155:6001,192.168.209.155:6002

    security:

     keyFile: /etc/mongo_keyfile

    如下图:

    2)         启动mongos实例

    # mongos --config /etc/mongo_router2_secure.conf

     

    -----------以上是内部认证,以下是用户访问控制----------

    内部认证:是指要加入集群的组件要有指定密钥文件才能加入集群;组件包括mongos路由,配置服务器,分片

    用户访问控制:是指应用程序连接集群,要验证的用户和密码

     

    3.4、添加分片到集群

    (1)   连接任意一个mongos,这里连接mongo_router1(在192.168.209.155上操作)

    # mongo --port 6666

    (2)   添加分片

    1)         添加第一个分片mongo_shard1

    sh.addShard(“192.168.209.155:6100”);

    2)         添加第二个分片mongo_shard2

    sh.addShard(“192.168.209.156:6100”);

    3.5前添加、创建用户

    (1)   集群管理员用户

    mongos和配置服务器的集群管理员用户是可以通用的,但是分片要创建自己的本地管理员用户。

    1)         创建集群管理员用户(直接在3.4的窗口中运行即可)

    输入以下命令:(这里只是为了方便理解,其实命令行打成一行即可)

    use admin;

    db.createUser(

      {

        user: "admin",

        pwd: "adminbear",

    roles: [

          { role: "root", db: "admin" },

          { role: "clusterAdmin", db: "admin" },

          { role: "userAdmin", db: "admin" }

        ]

      }

    );

    其中,user用户名和pwd密码,可按需更改。由于角色分配的时候,分配root最高权限给了admin,所以admin既是集群的最高管理员用户,又是所有数据库的最高管理员用户

    exit;

    退出当前的进程

    2)         创建第一个分片mongo_shard1管理员用户(在192.168.209.155上操作)

    连接到第一个分片mongo_shard1

    # mongo --port 6100

    输入以下命令:(这里只是为了方便理解,其实命令行打成一行即可)

    use admin;

    db.createUser(

      {

        user: "adminShard1",

        pwd: "adminbear",

    roles: [

          { role: "clusterAdmin", db: "admin" },

          { role: "userAdmin", db: "admin" }

        ]

      }

    );

    其中,user用户名和pwd密码,可按需更改。

    exit;

    退出当前的进程

    3)         创建第二个分片mongo_shard2管理员用户(在192.168.209.155上操作)

    连接到第二个分片mongo_shard2

    # mongo --host 192.168.209.156 --port 6100

    输入以下命令:(这里只是为了方便理解,其实命令行打成一行即可)

    use admin;

    db.createUser(

      {

        user: "adminShard2",

        pwd: "adminbear",

    roles: [

          { role: "clusterAdmin", db: "admin" },

          { role: "userAdmin", db: "admin" }

        ]

      }

    );

    其中,user用户名和pwd密码,可按需更改。

    exit;

    退出当前的进程

    (2)   数据库用户(应用程序用户)(在192.168.209.155上操作)

    连接到mongos路由 mongo_router1

    # mongo --port 6666 –u admin –p adminbear –authenticationDatabase admin

    超级用户已经在之前创建集群管理员用户时,同时赋予权限了。这里不再述说。

    以下是为数据库名DatabaseName,创建数据库用户。

    输入以下命令:(这里只是为了方便理解,其实命令行打成一行即可)

    use DatabaseName;

    db.createUser(

      {

        user: "bear",

        pwd: "bear",

    roles: [

          { role: "readWrite", db: "DatabaseName" }

        ]

      }

    );

    其中,user用户名和pwd密码,可按需更改。

    3.5、为数据库启用分片(直接接着以上的窗口中运行即可)

    sh.enableSharding(“databaseName”);

    其中databaseName,为要分片的数据库。

    3.6、使用哈希分片分片集合(直接在3.5的窗口中运行即可)

    这里有两种情况,一种是空集合,另一种是有数据的集合,但对于这两种情况都建议用以下方法。

    (1)   对于确定作为分片键的字段,建立哈希索引

    use databaseName;

    db.collectionName.createIndex(Name:”hashed”);

    其中,databaseName是3.5启用的分片数据库名称;collectionName是要分片的集合;Name是作为分片键的字段。

    (2)   哈希分片

    sh.shardCollection(“databaseName.collectionName”,{Name:”hashed”})

    其中,databaseName是3.5启用的分片数据库名称;collectionName是要分片的集合;Name是作为分片键的字段。

     

      ---------------------------------------第二部分  over ------------------------------------------------------

      ---------------------------------------  over -----------------------------------------------------------------

    以上资料,大部分是参考官网的资料,在此表示感谢。

       https://docs.mongodb.com/manual/tutorial/deploy-sharded-cluster-ranged-sharding/

       https://docs.mongodb.com/manual/tutorial/enforce-keyfile-access-control-in-existing-sharded-cluster-no-downtime/

  • 相关阅读:
    [置顶] 图书推荐:SQL Server 2012 T-SQL基础 Itzik Ben-Gan
    UVA1366-----Martian Mining------DP
    动态规划——最长公共子序列(LCS)
    需求分析挑战之旅(疯狂的订餐系统)(3)——背景-需要-需求规格
    JavaScript学习笔记(四十四) 装饰器
    C中的volatile用法
    Java注解Annotation学习
    非常好!讲逻辑回归的,讲得很透彻
    RPC的学习 & gprotobuf 和 thrift的比较
    僵尸进程学习 & 进程状态列表 & Linux信号学习
  • 原文地址:https://www.cnblogs.com/ddbear/p/7778123.html
Copyright © 2020-2023  润新知