博客已迁移,请看签名

新博客:http://www.51it.wang

搭建高可用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

下载地址:

https://www.mongodb.org/dl/linux/x86_64-amazon?_ga=2.51756777.1974588697.1521554583-771022144.1517400121


实现原理:


如上图:颜色一致的为一组分片


基本概念:

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









上一篇 下一篇
评论
©博客已迁移,请看签名 | Powered by LOFTER