MongoDB 4.2.2 分片集群搭建(一)

由于作此博客时mongoDB的最新版本为4.2.2 ,故此本文搭建以4.2.2版本为例

  • 一.mongoDB分片集群架构介绍
  • 二.服务器列表 (version:Centos7.3 )
  • 三.搭建前准备
    • 1.分别把下载好的mongodb安装包上传到12台服务器上;
    • 2.在12台服务器上分别添加环境变量:
    • 3.准备keyfile秘钥文件 用于集群内部通讯
  • 四.搭建集群环境
    • 1.搭建config配置集群
      • (1)分别在conf1 conf2 conf3三台服务器/opt/mongodb文件夹下创建目录:
      • (2)这里sercurity 认证先注释掉 分别启动三台conf服务器的mongod服务:
      • (3)在任意一台conf服务器上连接mongod服务:
      • (4)把三台conf服务器初始化成一个副本集:
      • (5)为conf集群添加root用户
    • 2.搭建shard分片集群
      • (1)分别在shard1 主 从 仲裁三台服务器/opt/mongodb文件夹下创建目录:
      • (2)这里sercurity 认证先注释掉 分别启动三台shard1服务器的mongod服务:
      • (3)在任意一台shard1服务器上连接mongod服务:
      • (4)把三台shard1服务器初始化成一个副本集:
      • (5)为shard1集群添加root用户
    • 3.搭建route路由集群 并整合conf集群和shard集群
      • (1)分别在route集群三台服务器/opt/mongodb文件夹下创建目录:
      • (2)分别启动三台route服务器的mongos服务:
      • (3)登录到任意一台route服务器
  • 五.创建新用户

一.mongoDB分片集群架构介绍

MongoDB 4.2.2 分片集群搭建(一)_第1张图片
上图选自于mongoDB官方网站
由上图可知:搭建一个高可用.可水平扩展的mongodb分片集群包含三个方面:
1.router路由服务器 用来接收用户请求,并且做分发处理.本次使用3台机器搭建路由服务集群;
2.config servers配置服务器 存储所有分片集群的配置信息,本次使用3台机器搭建配置服务集群
3.shard分片服务器 存储实际数据, 这里每个分片都可以搭建副本集群,本次搭建策略是一主一从一仲裁, 3台机器组成一个分片副本集,本次搭建了两个分片副本集;
Linux下mongoDB 4.2.2版本安装包下载(本文采用版本)
mongoDB 其它环境或版本安装包下载(读者自行选择)

二.服务器列表 (version:Centos7.3 )

服务器 ip port
route1 xxx.xxx.xxx.243 27017
route2 xxx.xxx.xxx.244 27017
route3 xxx.xxx.xxx.245 27017
conf1 xxx.xxx.xxx.246 27019
conf2 xxx.xxx.xxx.247 27019
conf3 xxx.xxx.xxx.248 27019
shard1_primary xxx.xxx.xxx.249 27018
shard1_secondary xxx.xxx.xxx.250 27018
shard1_arbiter xxx.xxx.xxx.251 27018
shard2_primary xxx.xxx.xxx.28 27018
shard2_secondary xxx.xxx.xxx.29 27018
shard2_arbiter xxx.xxx.xxx.30 27018

本次搭建模仿生产环境,使用12台服务器,读者可以根据实际资源情况对服务器做适当增减;

三.搭建前准备

1.分别把下载好的mongodb安装包上传到12台服务器上;

解压:

tar -zxvf mongodb-linux-x86_64-rhel70-4.2.2.tgz

剪切到:/opt/mongodb目录下

mv mongodb-linux-x86_64-rhel70-4.2.2 /opt/mongodb

目录结构如下:
MongoDB 4.2.2 分片集群搭建(一)_第2张图片
这里读者可以根据个人喜好 或者实际服务器目录大小决定实际存放目录

2.在12台服务器上分别添加环境变量:

	vim /etc/profile

追加:

	export PATH=$PATH:/opt/mongodb/bin

使其立即生效:

	source /etc/profile

3.准备keyfile秘钥文件 用于集群内部通讯

在任意一台机器上执行以下命令生产秘钥文件::

	openssl rand -base64 741 > /opt/mongodb/keyfile/mongodb-keyfile

修改文件权限,默认权限太高,启动会报错:

	chmod 400 /opt/mongodb/keyfile/mongodb-keyfile

把生成好的秘钥文件复制到其余服务器上,修改权限;

至此准备工作完成

四.搭建集群环境

1.搭建config配置集群

(1)分别在conf1 conf2 conf3三台服务器/opt/mongodb文件夹下创建目录:

/opt/mongodb/config/conf/config.yaml
/opt/mongodb/config/db
/opt/mongodb/config/log

其中config.yaml配置文件如下:

sharding:
  clusterRole: configsvr   #配置集群角色
replication:
  replSetName: config  	   #配置集群副本集名称 可以随意取
net:
  port: 27019              #启动端口 configsvr默认启动端口为 27019
  bindIp: 0.0.0.0          #允许被任意ip访问
systemLog:
  destination: file        #和path配合使用 如果指定此值 则必须指定日志文件路径
  logAppend: true		   #重启时 日志策略 true 追加  false 创建新的日志文件
  path: /opt/mongodb/config/log/config.log    #日志路径
storage:
  dbPath: /opt/mongodb/config/db              #数据库路径
  journal:
    enabled: true           #保证数据文件的有效性和可恢复性
processManagement:
  fork: true                #后台启动
  pidFilePath: /opt/mongodb/config/log/config.pid  #mongodb进程日志文件
  timeZoneInfo: /usr/share/zoneinfo   #时区有关 可以不做配置 
#security:
  #keyFile: /opt/mongodb/keyfile/mongodb-keyfile    #秘钥文件 用于集群内部认证

(2)这里sercurity 认证先注释掉 分别启动三台conf服务器的mongod服务:

mongod -f /opt/mongodb/config/conf/config.yaml

可以使用ps -ef|grep mongod 查看服务有没有启动成功;

(3)在任意一台conf服务器上连接mongod服务:

mongo --port 27019

(4)把三台conf服务器初始化成一个副本集:

注意 _id:副本集名称要和config.yaml中的replSetName配置相同;
只需初始化一次即可

rs.initiate(
			  {
				_id: "config",
				configsvr: true,
				members: [
				  { _id : 0, host : "xxx.xxx.xxx.246:27019" },
				  { _id : 1, host : "xxx.xxx.xxx.247:27019" },
				  { _id : 2, host : "xxx.xxx.xxx.248:27019" }
				]
			  }
			)

查看集群状态:

rs.status();

(5)为conf集群添加root用户

注意:1.这里必须要连接到primary节点下创建用户,在secondary节点上创建用户会报错(笔者亲测);
2.连接上primary节点后,一定要切换到admin数据库下创建root用户:

use admin;
db.createUser(
			  {
				user: "root",
				pwd: "root",
				roles: [ { role: "root", db: "admin" } ]
			  }
			);
  1. kill调mongod服务进程,把config.yaml配置文件中的security认证注释打开,重启mongod服务;
  2. 本次连接就需要登录了:登录方式有两种:

连接时登录:

	mongo 127.0.0.1:27019/admin -u root -p root

连接后登录

mongo --port 27019      #连接到mongod服务器
use admin               #切换到admin数据库
db.auth('root','root')  #登录 返回1说明登录成功

登录后可以使用:show dbs; rs.status()等验证;

至此conf配置服务器集群搭建完成;

2.搭建shard分片集群

(1)分别在shard1 主 从 仲裁三台服务器/opt/mongodb文件夹下创建目录:

/opt/mongodb/shard1/conf/shard1.yaml
/opt/mongodb/shard1/db
/opt/mongodb/shard1/log
其中shard1.yaml配置文件如下:

sharding:
    clusterRole: shardsvr
replication:
    replSetName: shard1
net:
    port: 27018
    bindIp: 0.0.0.0
systemLog:
    destination: file
    logAppend: true
    path: /opt/mongodb/shard1/log/shard1.log
storage:
    dbPath: /opt/mongodb/shard1/db
    journal:
        enabled: true
processManagement:
    fork: true
    pidFilePath: /opt/mongodb/shard1/log/shard1.pid
    timeZoneInfo: /usr/share/zoneinfo
#security:
    #keyFile: /opt/mongodb/keyfile/mongodb-keyfile


(2)这里sercurity 认证先注释掉 分别启动三台shard1服务器的mongod服务:

mongod -f /opt/mongodb/shard1/conf/shard1.yaml

可以使用ps -ef|grep mongod 查看服务有没有启动成功;

(3)在任意一台shard1服务器上连接mongod服务:

mongo --port 27018

(4)把三台shard1服务器初始化成一个副本集:

注意 _id:副本集名称要和shard1.yaml中的replSetName配置相同;
这里只能连接到primary或secondary节点上初始化,连接到仲裁节点初始化会报错(笔者亲测),只需初始化一次即可

rs.initiate(
				  {
					_id : "shard1",
					members: [
					  { _id : 0, host : "xxx.xxx.xxx.249:27018" ,priority : 2 },
					  { _id : 1, host : "xxx.xxx.xxx.250:27018" ,priority : 1 },
					  { _id : 2, host : "xxx.xxx.xxx.251:27018" ,arbiterOnly :true }
					]
				  }
				)

注意:此种初始化方式是指定3台shard1节点分别为一主一从一仲裁(本次搭建采用);
其中arbiterOnly :true配置意思是指定该机器为仲裁机器,此机器不存业务数据,故此不需要太好的配置;priority 参数越高 越有可能成为primary节点;

拓展:这里还有另外一种初始化的方式 :即一主两从,不指定仲裁机器,每个分片只有两台服务器可采用此种策略:

rs.initiate(
				  {
					_id : "shard1",
					members: [
					  { _id : 0, host : "xxx.xxx.xxx.249:27018" },
					  { _id : 1, host : "xxx.xxx.xxx.249:27018" },
					  { _id : 2, host : "xxx.xxx.xxx.249:27018" }
					]
				  }
				)

查看集群状态:

rs.status();

(5)为shard1集群添加root用户

注意:1.这里必须要连接到primary节点下创建用户,在secondary节点上创建用户会报错(笔者亲测);
2.连接上primary节点后,一定要切换到admin数据库下创建root用户:

use admin;
db.createUser(
			  {
				user: "root",
				pwd: "root",
				roles: [ { role: "root", db: "admin" } ]
			  }
			);
  1. kill调mongod服务进程,把shard1.yaml配置文件中的security认证注释打开,重启mongod服务;
  2. 本次连接就需要登录了:登录方式有两种:

连接时登录:

	mongo 127.0.0.1:27018/admin -u root -p root

连接后登录

mongo --port 27018      #连接到mongod服务器
use admin               #切换到admin数据库
db.auth('root','root')  #登录 返回1说明登录成功

登录后可以使用:show dbs; rs.status()等验证;

至此shard1分片集群搭建完成;

shard2分片集群搭建通shard1基本相同 注意配置文件中副本集名称改动,及相应启动项改动即可;

至此shard1 shard2 由6台机器组成的两个分片集群搭建完成;

3.搭建route路由集群 并整合conf集群和shard集群

(1)分别在route集群三台服务器/opt/mongodb文件夹下创建目录:

/opt/mongodb/route/conf/route.yaml
/opt/mongodb/route/log
此集群只做请求分发,不存储具体数据,故此不需要db目录,
其中route.yaml配置文件如下:

sharding:
    configDB: config/xxx.xxx.xx.246:27019,xxx.xxx.xx.247:27019,xxx.xxx.xx.248:27019
net:
    port: 27017
    bindIp: 0.0.0.0

systemLog:
    destination: file
    logAppend: true
    path: /opt/mongodb/route/log/route.log


processManagement:
    fork: true
    pidFilePath: /opt/mongodb/route/log/route.pid
    timeZoneInfo: /usr/share/zoneinfo

security:
    keyFile: /opt/mongodb/keyfile/mongodb-keyfile

(2)分别启动三台route服务器的mongos服务:

mongos -f /opt/mongodb/route/conf/route.yaml

注意:这里启动的时候和config集群shard集群不同,这里的security认证要打开,不然会报错(笔者踩过的坑),

(3)登录到任意一台route服务器

这里的登录密码就是config集群配置的用户名和密码;上面介绍的两种登录方式在这里也适用;这里用mongo连接的时候 端口可以不指定 因为mongo默认的启动端口就是27017 和我们这边设置的相同;
这里使用root用户登录:

mongo;
use admin;
db.auth('root','root');

把shard1 shard2分片集群都添加进去,每个分片添加一个节点即可,主 从都可以;

use admin;
sh.addShard( "shard1/xxx.xxx.xxx.249:27018");
sh.addShard( "shard2/xxx.xxx.xxx.29:27018");

至此一个带有权限控制的 可水平扩容的分片mongodb4.2.2版本集群搭建完成;

五.创建新用户

登录到任意一台route服务器,已root用户登录,并创建新用户;

mongo;
use admin;
db.auth('root','root');
use database01;
db.createUser(
			  {
				user: "readWrite",
				pwd: "readWrite",
				roles: [ { role: "readWrite", db: "database01" } ]
			  }
			)

以上命令意思是先已root角色登录到服务器,再切换到 database01数据库下 创建一个角色为: readWrite的用户;这里在哪个数据库创建用户,登录的时候就在哪个数据库认证;

你可能感兴趣的:(mongodb)