搭建高可用mongodb集群(二:分片、副本集)
在第一节中尝试了Mongodb集群主从,发现很多问题,并不能实现高可用热切换,2台机器可参考我另外一篇文章主从集群。
链接:https://lcryblog.lofter.com/post/1e131973_1268bf54
环境准备:
Centos6.9最小化安装,三台机器:
IP1:10.0.3.182
IP2:10.0.3.183
IP3:10.0.3.184
安装包版本:mongodb-linux-x86_64-amazon-3.4.6.tgz
下载地址:
实现原理:
如上图:颜色一致的为一组分片
基本概念:
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(分片)上,为了防止数据丢失同步在副本集中存储了一份,仲裁在数据存储到分片的时候决定存储到哪个节点。
集群安装:(三台机器)
端口分配如下:
mongos:20000
config:21000
shard1:27001
shard2:27002
shard3:27003
放防火墙,不解释了吧~~
1.上传安装包到服务器
包名:mongodb-linux-x86_64-amazon-3.4.6.tgz
2.解压
tar -xzvf mongodb-linux-x86_64-amazon-3.4.6.tgz -C /usr/local/
3.进入文件夹
cd /usr/local/mongodb-linux-x86_64-amazon-3.4.6
4.改名
mv mongodb-linux-x86_64-amazon-3.4.6 mongodb
5.创建相关目录
分别在每台机器建立conf、mongos、config、shard1、shard2、shard3六个目录,因为mongos不存储数据,只需要建立日志文件目录即可。
mkdir -p /usr/local/mongodb/conf
mkdir -p /usr/local/mongodb/mongos/log
mkdir -p /usr/local/mongodb/config/data
mkdir -p /usr/local/mongodb/config/log
mkdir -p /usr/local/mongodb/shard1/data
mkdir -p /usr/local/mongodb/shard1/log
mkdir -p /usr/local/mongodb/shard2/data
mkdir -p /usr/local/mongodb/shard2/log
mkdir -p /usr/local/mongodb/shard3/data
mkdir -p /usr/local/mongodb/shard3/log
6.配置环境变量
编辑vi /etc/profile,添加下方内容
export MONGODB_HOME=/usr/local/mongodb
export PATH=$MONGODB_HOME/bin:$PATH
7.环境变量立即生效
执行
source /etc/profile
8.config server配置服务器
mongodb3.4以后要求配置服务器也创建副本集,不然集群搭建不成功。
编辑vi /usr/local/mongodb/conf/config.conf
## 配置文件如下:
pidfilepath = /usr/local/mongodb/config/log/configsrv.pid
dbpath = /usr/local/mongodb/config/data
logpath = /usr/local/mongodb/config/log/congigsrv.log
logappend = true
bind_ip = 0.0.0.0
port = 21000
fork = true
configsvr = true
replSet=configs #副本集名称
maxConns=20000 #设置最大连接数
9.启动三台config server
执行
mongod -f /usr/local/mongodb/conf/config.conf
10.初始化配置副本集
登录任意一台配置服务器:
mongo --port 21000
执行:
config = {_id : "configs",members : [{_id : 0, host : "10.0.3.182:21000" },{_id : 1, host : "10.0.3.183:21000" },{_id : 2, host : "10.0.3.184:21000" }]}
再执行:
rs.initiate(config)
------其中,”_id” : “configs”应与配置文件中配置的 replicaction.replSet一致,”members” 中的 “host” 为三个节点的 ip 和 port
11.配置分片副本集(三台机器)
一)设置第一个分片副本集
执行vi /usr/local/mongodb/conf/shard1.conf
添加以下内容:
pidfilepath = /usr/local/mongodb/shard1/log/shard1.pid
dbpath = /usr/local/mongodb/shard1/data
logpath = /usr/local/mongodb/shard1/log/shard1.log
logappend = true
bind_ip = 0.0.0.0
port = 27001
fork = true
httpinterface=true #打开web监控
rest=true
replSet=shard1 #副本集名称
shardsvr = true
maxConns=20000 #设置最大连接数
二)启动三台服务器的shard1 server
mongod -f /usr/local/mongodb/conf/shard1.conf
三)初始化第一个副本集
登录不是仲裁节点的任意一台机器:
mongo --port 27001
use admin #使用admin数据库
执行:
config = {_id : "shard1",members : [{_id : 0, host : "10.0.3.182:27001" },{_id : 1, host : "10.0.3.183:27001" },{_id : 2, host : "10.0.3.184:27001" , arbiterOnly: true }]}
----定义副本集配置,第三个节点的 "arbiterOnly":true 代表其为仲裁节点。
再执行:
rs.initiate(config)
------------------------------------------------
一)设置第二个分片副本集
执行vi /usr/local/mongodb/conf/shard2.conf
添加以下内容:
pidfilepath = /usr/local/mongodb/shard2/log/shard2.pid
dbpath = /usr/local/mongodb/shard2/data
logpath = /usr/local/mongodb/shard2/log/shard2.log
logappend = true
bind_ip = 0.0.0.0
port = 27002
fork = true
httpinterface=true #打开web监控
rest=true
replSet=shard2 #副本集名称
shardsvr = true
maxConns=20000 #设置最大连接数
二)启动三台服务器的shard2 server
mongod -f /usr/local/mongodb/conf/shard2.conf
三)初始化第二个副本集
登录不是仲裁节点的任意一台机器:
mongo --port 27002
use admin #使用admin数据库
执行:
config = {_id : "shard2",members : [{_id : 0, host : "10.0.3.182:27002" , arbiterOnly: true},{_id : 1, host : "10.0.3.183:27002" },{_id : 2, host : "10.0.3.184:27002" }]}
再执行:
rs.initiate(config)
-------------------------------------------------
一)设置第三个分片副本集
执行vi /usr/local/mongodb/conf/shard3.conf
添加以下内容:
pidfilepath = /usr/local/mongodb/shard3/log/shard3.pid
dbpath = /usr/local/mongodb/shard3/data
logpath = /usr/local/mongodb/shard3/log/shard3.log
logappend = true
bind_ip = 0.0.0.0
port = 27003
fork = true
httpinterface=true #打开web监控
rest=true
replSet=shard3 #副本集名称
shardsvr = true
maxConns=20000 #设置最大连接数
二)启动三台服务器的shard3 server
mongod -f /usr/local/mongodb/conf/shard3.conf
三)初始化第三个副本集
登录不是仲裁节点的任意一台机器:
mongo --port 27003
use admin #使用admin数据库
执行:
config = {_id : "shard3",members : [{_id : 0, host : "10.0.3.182:27003" },{_id : 1, host : "10.0.3.183:27003" , arbiterOnly: true},{_id : 2, host : "10.0.3.184:27003" }]}
再执行:
rs.initiate(config)
12.配置路由服务器 mongos
先启动配置服务器和分片服务器,后启动路由实例:(三台机器)
执行
vi /usr/local/mongodb/conf/mongos.conf
添加如下内容:
pidfilepath = /usr/local/mongodb/mongos/log/mongos.pid
logpath = /usr/local/mongodb/mongos/log/mongos.log
logappend = true
bind_ip = 0.0.0.0
port = 20000
fork = true
#监听的配置服务器, configs为配置服务器的副本集名字
configdb = configs/10.0.3.182:21000,10.0.3.183:21000,10.0.3.184:21000
13.启动三台服务器的mongos server
mongos -f /usr/local/mongodb/conf/mongos.conf
14.启用分片
目前搭建了mongodb配置服务器、路由服务器,各个分片服务器,不过应用程序连接到mongos路由服务器并不能使用分片机制,还需要在程序里设置分片配置,让分片生效。
登陆任意一台mongos
mongo --port 20000
use admin #使用admin数据库
串联分片:
sh.addShard("shard1/10.0.3.182:27001,10.0.3.183:27001,10.0.3.184:27001")
sh.addShard("shard2/10.0.3.182:27002,10.0.3.183:27002,10.0.3.184:27002")
sh.addShard("shard3/10.0.3.182:27003,10.0.3.183:27003,10.0.3.184:27003")
sh.status() #查看分片状态
15.验证
任意连接一个分片:
mongo 127.0.0.1:27001
执行
rs.status()
# SECONDARY 表示从节点
# PRIMARY 表示主节点
# ARBITER 表示仲裁节点
-------------------优化启动--------------------
启动脚本:
vi start.sh
#添加下面内容
mongod -f /usr/local/mongodb/conf/config.conf
mongod -f /usr/local/mongodb/conf/shard1.conf
mongod -f /usr/local/mongodb/conf/shard2.conf
mongod -f /usr/local/mongodb/conf/shard3.conf
mongos -f /usr/local/mongodb/conf/mongos.conf
关闭脚本:
vi stop.sh
#添加下面内容
killall mongod
killall mongos
最后用客户端连接一下,万全OJBK
个人总结:
在参考多个文章,中途执行rs.initiate(config)总有一个不行,
一定记住,初始化shard1、2、3的时候要首先use admin数据库,
还有就是不要使用仲裁节点去初始化也会报错,就这么多。
搭建集群的时候可以用XSHELL发送到全部终端,快捷方便,我这里只截图,具体怎么用自行琢磨
有问题欢迎私信
参考文章:
https://www.ityouknow.com/mongodb/2017/08/05/mongodb-cluster-setup.html
https://www.lanceyan.com/category/tech/mongodb
https://zhuanlan.zhihu.com/p/25594963