Linux CentOS / Fedora / RHEL7 下 MongoDB4.4 副本集+分片集群+安全认证 3台机器 部署搭建和测试

一、概述

从图中可以看到有四个组件:mongos、config server、shard、replica set。
在这里插入图片描述

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

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

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

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

仲裁者(Arbiter),是复制集中的一个MongoDB实例,它并不保存数据。仲裁节点使用最小的资源并且不要求硬件设备,不能将Arbiter部署在同一个数据集节点中,可以部署在其他应用服务器或者监视服务器中,也可部署在单独的虚拟机中。为了确保复制集中有奇数的投票成员(包括primary),需要添加仲裁节点做为投票,否则primary不能运行时不会自动切换primary。

简单了解之后,我们可以这样总结一下,应用请求mongos来操作mongodb的增删改查,配置服务器存储数据库元信息,并且和mongos做同步,数据最终存入在shard(分片)上,为了防止数据丢失同步在副本集中存储了一份,仲裁在数据存储到分片的时候决定存储到哪个节点。

二、环境准备

系统:RHEL7
软件包:mongodb-linux-x86_64-rhel70-3.6.23.tgz

服务器 192.168.40.151 192.168.40.152 192.168.40.153 端口分配
路由 mongos mongos mongos 30000
配置 config server config server config server 20000
副本1 主1 从1 仲裁1 21001
副本2 仲裁2 主2 从2 21002
副本3 从3 仲裁3 主3 21003
#角色列举,root角色是超级帐号, 必须在admin库中登录,就可以切换到任意库进行操作了

readWrite:允许用户读写指定数据库
dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
userAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户
clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。
readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限
readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限
userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。
root:只在admin数据库中可用。超级账号,超级权限
#MongoDB单点或集群常用指令
use DATABASE_NAME //创建数据库
db.dropDatabase() //删除数据库,这个指令要在当前库下操作,删之前先db看下 慎用!!!!
db.createCollection("表名") //创建集合/表
db.表名.drop() //删除集合/表
db.表名.insert(document) //插入文档
或
db.表名.save(document)
db.表名.update({
   'title':'MongoDB 教程'},{
   $set:{
   'title':'MongoDB'}}) //更新操作
db.表名.remove() //删除操作
db.表名.find(query, projection) //查询操作
db.表名.count()//统计有多少数据

三、副本+分片集群开始搭建

1、关闭防火墙

[root@Cluster_1 ~]# setenforce 0
[root@Cluster_1 ~]# systemctl stop firewalld
[root@Cluster_1 ~]# systemctl disable firewalld.service

2、时间同步

#时间同步:
[root@Cluster_1 ~]# yum install -y ntp
#修改配置文件:
[root@Cluster_1 ~]# vim /etc/ntp.conf 尾行添加:server ntp.aliyun.com
#更新时间同步:
[root@Cluster_1 ~]# ntpdate ntp.aliyun.com
#这时候发现时间与本地时间对不上可以跟时区有关
#下面是调整方法
#删除:
[root@Cluster_1 ~]# rm -rf /etc/localtime
#复制:
[root@Cluster_1 ~]# cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
#更新时间同步:
[root@Cluster_1 ~]# ntpdate -u ntp.api.bz
#检查日期:
[root@Cluster_1 ~]# date
#启动日期服务:
[root@Cluster_1 ~]# systemctl start ntpd
#开机自启:
[root@Cluster_1 ~]# systemctl enable ntpd

3、解压安装包&&重命名,分别在每台机器建立conf、mongos、config、shard1、shard2、shard3六个目录,因为mongos不存储数据,只需要建立日志文件目录即可。

[app@Cluster_1 ~]# tar -zxvf mongodb-linux-x86_64-rhel70-4.4.7.tgz -C /home/app
[app@Cluster_1 ~]# mv mongodb-linux-x86_64-rhel70-4.4.7  mongodb
[app@Cluster_1 ~]# mkdir -p /home/app/mongodb/data/{
   shard1,shard2,shard3,configsrv}
[app@Cluster_1 ~]# mkdir -p /home/app/mongodb/{
   logs,config}

4、配置config server(每台都配 并绑定本地IP),启动三台服务器的config server,登录任意一台配置服务器,初始化配置副本集

[app@Cluster_1 ~]$ vim mongodb/config/configsrv.conf

pidfilepath = /home/app/mongodb/logs/configsrv.pid
dbpath = /home/app/mongodb/data/configsrv
logpath = /home/app/mongodb/logs/configsrv.log
logappend = true
bind_ip = 192.168.40.151
port = 20000
fork = true
#declare this is a config db of a cluster;
configsvr = true
#副本集名称
replSet=configsrv
#设置最大连接数
maxConns=20000

#启动三台服务器的config server
[app@Cluster_1 ~]$ /home/app/mongodb/bin/mongod -f /home/app/mongodb/config/configsrv.conf
about to fork child process, waiting until server is ready for connections.
forked process: 1609
child process started successfully, parent exiting


#登录任意一台配置服务器,初始化配置副本集,如果配置文件里不绑定IP 直接输指令+端口即可,id为你刚刚再配置文件里设置的副本集名称
[app@Cluster_1 ~]$ /home/app/mongodb/bin/mongo 192.168.40.151  --port 20000
> 
> config = {
   
    _id : "configsrv",
     members : [
         {
   _id : 0, host : "192.168.40.151:20000" },
         {
   _id : 1, host : "192.168.40.152:20000" },
         {
   _id : 2, host : "192.168.40.153:20000" }
     ]
 }#指令结尾到这个括号结束,下面表示成功后展示的状态
{
   
	"_id" : "configsrv",
	"members" : [
		{
   
			"_id" : 0,
			"host" : "192.168.40.151:20000"
		},
		{
   
			"_id" : 1,
			"host" : "192.168.40.152:20000"
		},
		{
   
			"_id" : 2,
			"host" : "192.168.40.153:20000"
		}
	]
}
> 
> #初始化副本集
> rs.initiate(config)
{
   
	"ok" : 1,
	"$gleStats" : {
   
		"lastOpTime" : Timestamp(1627637085, 1),
		"electionId" : ObjectId("000000000000000000000000")
	},
	"lastCommittedOpTime" : Timestamp(0, 0)
}

#其中,"_id" : "configsrv"应与配置文件中配置的 replicaction.replSetName 一致,"members" 中的 "host" 为三个节点的 ip 和 port

>>>>>>>>>>>>> configsrv 配置完之后 开始配置分片

5、配置分片副本集-1 (三台机器),启动三台机器 shard1 server ,登录任意一台 21001 配置服务器初始化操作

[app@Cluster_1 ~]$ vim mongodb/config/shard1.conf
#配置文件内容
pidfilepath = /home/app/mongodb/logs/shard1.pid
dbpath = /home/app/mongodb/data/shard1
logpath = /home/app/mongodb/logs/shard1.log
logappend = true
bind_ip = 192.168.40.151
port = 21001
#以守护程序的方式启用,即在后台运行
fork = true
#副本集名称
replSet=shard1
#declare this is a shard db of a cluster;
shardsvr = true
#设置最大连接数
maxConns=20000
#开启权限验证(先注释掉,后面等创建完用户了之后再取消注释)注意一定要创建用户才做认证操作,如果不嫌麻烦也可以先把注释放开
#auth=true
#任意生成一个key文件(三台都要有同样内容的key,可以一台生成 scp 过去)
#keyFile=/home/app/mongodb/MongoUserAuth.key

#启动三台机器 shard1 server ,登录任意一台 21001 配置服务器初始化操作
[app@Cluster_1 ~]$ /home/app/mongodb/bin/mongod -f /home/app/mongodb/config/shard1.conf 
about to fork child process, waiting until server is ready for connections.
forked process: 2699
child process started successfully, parent exiting

#配置服务器初始化操作
[app@Cluster_1 ~]$ /home/app/mongodb/bin/mongo 192.168.40.151 --port 21001
> use admin
switched to db admin
#定义副本集配置,第三个节点的 "arbiterOnly":true 代表其为仲裁节点。
> config = {
   
    _id : "shard1",
     members : [
         {
   _id : 0, host : "192.168.40.151:21001" },
         {
   _id : 1, host : "192.168.40.152:21001" },
         {
   _id : 2, host : "192.168.40.153:21001",arbiterOnly: true }
     ]
 }#指令结尾到这个括号结束,下面表示成功后展示的状态
{
   
	"_id" : "shard1",
	"members" : [
		{
   
			"_id" : 0,
			"host" : "192.168.40.151:21001"
		},
		{
   
			"_id" : 1,
			"host" : "192.168.40.152:21001"
		},
		{
   
			"_id" : 2,
			"host" : "192.168.40.153:21001",
			"arbiterOnly" : true
		}
	]
}
#初始化副本集配置
> rs.initiate(config);
#表示成功了
{
    "ok" : 1 }
shard1:SECONDARY> 回车,如果一直切换不了主,多按几下回车 或者退出重新登录下
shard1:PRIMARY> 这里就变成了192.168.40.151:21001,跟之前规划的一样
shard1:PRIMARY>

>>>>>>>>>>>>>第一个分片副本结束,接下来配置第二个,一样的步骤 只不过把名字改掉就可以了

6、配置分片副本集-2 (三台机器),启动三台机器 shard2 server,登录任意一台 21002 配置服务器初始化操作

[app@Cluster_1 ~]$ vim mongodb/config/shard2.conf
#配置文件内容
pidfilepath = /home/app/mongodb/logs/shard2.pid
dbpath = /home/app/mongodb/data
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值