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

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/

mongo 3.4分片集群系列之三:搭建分片集群--哈希分片 + 安全的更多相关文章

  1. Elasticsearch使用系列-Docker搭建Elasticsearch集群

    Elasticsearch使用系列-ES简介和环境搭建 Elasticsearch使用系列-ES增删查改基本操作+ik分词 Elasticsearch使用系列-基本查询和聚合查询+sql插件 Elas ...

  2. MongoDB系列—— Window 搭建Mongodb 集群

    Mongodb的集群方式的搭建有三种:Replica Set / Sharding / Master-Slaver.这里只说明最简单的集群搭建方式(Replica Set) Replica Set M ...

  3. MongoDB副本集配置系列五:副本集的在线迁移

    MongoDB副本集的在线迁移 查看当前集群的状态: { "setName" : "gechongrepl", "setVersion" : ...

  4. 剖析Elasticsearch集群系列之三:近实时搜索、深层分页问题和搜索相关性权衡之道

    转载:http://www.infoq.com/cn/articles/anatomy-of-an-elasticsearch-cluster-part03 近实时搜索 虽然Elasticsearch ...

  5. MongoDB系列之三(副本集配置)

    今天我测试了一下MongoDB的副本集的配置. 首先从概念上说一下MongoDB副本集和主从复制的区别.其实副本集(Replica Set)是主从复制的高级形式.高级在哪里呢?主动复制实现了数据备份+ ...

  6. MongoDB副本集配置系列三:副本集的认证方式

    1:副本集配置参考这篇博客: http://www.cnblogs.com/xiaoit/p/4478951.html 2:副本集的认证 假设有两台机器已经配置好了副本集(副本集罪一般最少3台机器,这 ...

  7. mongo 3.4分片集群系列之八:分片管理

    这个系列大致想跟大家分享以下篇章: 1.mongo 3.4分片集群系列之一:浅谈分片集群 2.mongo 3.4分片集群系列之二:搭建分片集群--哈希分片 3.mongo 3.4分片集群系列之三:搭建 ...

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

    这个系列大致想跟大家分享以下篇章: 1.mongo 3.4分片集群系列之一:浅谈分片集群 2.mongo 3.4分片集群系列之二:搭建分片集群--哈希分片 3.mongo 3.4分片集群系列之三:搭建 ...

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

    这个系列大致想跟大家分享以下篇章: 1.mongo 3.4分片集群系列之一:浅谈分片集群 2.mongo 3.4分片集群系列之二:搭建分片集群--哈希分片 3.mongo 3.4分片集群系列之三:搭建 ...

随机推荐

  1. STL算法设计理念 - 函数对象和函数对象当參数和返回值

    函数对象: 重载函数调用操作符的类.其对象常称为函数对象(function object),即它们是行为类似函数的对象. 一个类对象,表现出一个函数的特征,就是通过"对象名+(參数列表)&q ...

  2. AHCI IDE

    AHCI模式性能好 IDE模式,提高约20%,使用Windows 7 系统,AHCI 模式是最佳选择,特别是对SSD硬盘IDE是为XP的兼容性,RAID 模式是要有两块以上硬盘才能实现AHCI模式装的 ...

  3. Android系统开发(4)——Autotools

    Autotools工具的构成 1.autoscan autoscan是用来扫描源码文件夹生成configure.san文件的,configure.san包括了系统配置的基本选项.里面都是一些宏定义,我 ...

  4. WebForms UnobtrusiveValidationMode 须要“jquery”ScriptResourceMapping。

    一.问题产生的背景: 在敲牛腩新闻公布系统的后台登录页面的时候,我们用到了RequiredFieldValidator控件(验证非空控件),该控件的作用是禁止输入规定的内容,RequiredField ...

  5. 使用heartbeat+monit实现主备双热备份系统

    一.使用背景 项目须要实现主备双热自己主动切换的功能,保证系统7*24小时不间断执行.现已有两台双网卡的IBM的server,为了不再添加成本採购独立外部存储设备和双机热备软件.採用了linux下开源 ...

  6. jmeter获取时间_time 函数

    原始时间戳13位精确到毫秒:${__time(,)} 时间戳精确到秒10位:${__time(/1000,)} 时间日期到年月日2019-04-21:${__time(yyyy-MM-dd,)} 时间 ...

  7. 第一天,Robert和Sue大师培训给的启示

    程序猿的零点从他睡觉那一刻开始计时. 今天是周六,听到了Robert关于销售技巧的培训还有Sue关于微信零售业O2O电商的分析,一并加上昨天晚上直到11点的Leadership培训,这个周末真的是收获 ...

  8. redux 调试工具

    首先安装谷歌插件: redux-devtools 然后项目中安装插件:redux-devtools-extension 最后在创建 store 的时候进行配置: import { composeWit ...

  9. Eclipse的安装使用

    1.从官网下载最新的Eclipse http://www.eclipse.org/downloads/

  10. Hihocoder #1479 : 三等分 树形DP

    三等分  描述 小Hi最近参加了一场比赛,这场比赛中小Hi被要求将一棵树拆成3份,使得每一份中所有节点的权值和相等. 比赛结束后,小Hi发现虽然大家得到的树几乎一模一样,但是每个人的方法都有所不同.于 ...