一、概述
从图中可以看到有四个组件: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