mangodb—分片和副本集架构部署

mangodb—分片和副本集架构部署

三台服务器20.0.0.18(19)(20)

**服务器18 **服务器19 **服务器20
mongos mongos mongos
config server config server config server
shard server1 主节点 shard server1副节点 shard server1 仲裁
shard server2 仲裁 shard server2主节点 shard server2 副节点
shard server3 副节点 shard server3 仲裁 shard server3 主节点

一.每台机器上先安装mongodb

1.关闭系统防火墙和安全机制

systemctl stop firewalld.service 
setenforce 0

2.先把安装包上传到/opt目录下解压

tar zxvf mongodb-linux-x86_64-3.6.3.tgz

mangodb—分片和副本集架构部署_第1张图片

3.在usr/local/文件夹下创建mongodb文件夹
mkdir mongodb

mangodb—分片和副本集架构部署_第2张图片

4.然后将mongodb-linux-x86_64-3.6.3下的文件移动到mongodb文件夹下
cd  /opt
mv mongodb-linux-x86_64-3.6.3/* /usr/local/mongodb/
cd /usr/local/mongodb/
mkdir data

mangodb—分片和副本集架构部署_第3张图片

5.在usr/local/mongodb文件夹下创建logs文件
touch /usr/local/mongodb/logs
6.进入/usr/local/mongodb/bin目录下,启动mongodb服务
cd /usr/local/mongodb/bin
./mongod --dbpath=/usr/local/mongodb/data --logpath=/usr/local/mongodb/logs --logappend  --port=27017 --fork

./mongo   ##启动客户端

mangodb—分片和副本集架构部署_第4张图片

mangodb—分片和副本集架构部署_第5张图片

7.分别在每台机器建立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 /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

mangodb—分片和副本集架构部署_第6张图片

二.配置服务器搭建副本集

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 = 24000
fork = true
#declare this is a config db of a cluster;
configsvr = true
#副本集名称
replSet=configs
#设置最大连接数
maxConns=20000

mangodb—分片和副本集架构部署_第7张图片

分别启动三台服务器的config server,连接:进入/etc目录下
./mongod -f /usr/local/mongodb/conf/config.conf

mangodb—分片和副本集架构部署_第8张图片

登录任意一台配置服务器,初始化配置副本集,登录:进入/usr/local/mongodb/bin目录下
./mongo --port 24000

使用admin数据库

use admin

config变量:

config = {
...  members : [
... {_id : 0, host : "20.0.0.18:24000" },
...  {_id : 1, host : "20.0.0.19:24000" },
...   {_id : 2, host : "20.0.0.20:24000" }
... ]
... }

mangodb—分片和副本集架构部署_第9张图片

mangodb—分片和副本集架构部署_第10张图片

初始化副本集:

rs.initiate(config)

mangodb—分片和副本集架构部署_第11张图片

这一步非常重要,必须初始化成功。不成功的话,路由服务器与配置服务器连接不上。
其中,”_id” : “configs”应与配置文件中配置的 replicaction.replSetName 一致,”members” 中的 “host” 为三个节点的 ip 和 port。

三台分片服务器搭建副本集

配置分片副本集(三台机器一起配置)。

1.设置第一个分片副本集
配置文件:

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 = 25001
fork = true
#副本集名称
replSet=shard1
#declare this is a shard db of a cluster;
shardsvr = true
#设置最大连接数
maxConns=20000

mangodb—分片和副本集架构部署_第12张图片

启动三台服务器的shard1 server,进入/usr/local/mongodb/bin目录下:

./mongod -f /usr/local/mongodb/conf/shard1.conf

登陆任意一台服务器,初始化副本集,进入/usr/local/mongodb/bin目录下:

./mongo --port 25001

使用admin数据库
use admin

定义副本集配置,第三个节点的 “arbiterOnly”:true 代表其为仲裁节点。

 config = {
...   _id : "shard1",
... members : [
...  {_id : 0, host : "20.0.0.18:25001" },
...  {_id : 1, host : "20.0.0.19:25001" },
...  {_id : 2, host : "20.0.0.20:25001" , arbiterOnly: true }
...      ]
...  }


mangodb—分片和副本集架构部署_第13张图片

初始化副本集配置

rs.initiate(config);

image-20220830002112651

2.设置第二个分片
进入配置文件(三台机子一起配置)

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 = 25002
fork = true
#副本集名称
replSet=shard2
#declare this is a shard db of a cluster;
shardsvr = true
#设置最大连接数
maxConns=20000

mangodb—分片和副本集架构部署_第14张图片

启动三台服务器的shard2 server,进入/usr/local/mongodb/bin目录下:

./mongod -f /usr/local/mongodb/conf/shard2.conf

mangodb—分片和副本集架构部署_第15张图片

登陆任意一台服务器,进入/usr/local/mongodb/bin初始化副本集

./mongo --port 25002

use admin

定义副本集配置

config = {
...  _id : "shard2",
... members : [
...  {_id : 0, host : "20.0.0.18:25002"  , arbiterOnly: true },

...  {_id : 1, host : "20.0.0.19:25002" },
...  {_id : 2, host : "20.0.0.20:25002" }
... ]
... }

mangodb—分片和副本集架构部署_第16张图片

初始化副本集配置
rs.initiate(config);

mangodb—分片和副本集架构部署_第17张图片

这里出现了错误 ,换另外一台机子做

设置第三个分片副本集
配置文件代码如下:

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 = 25003
fork = true
#副本集名称
replSet=shard3
#declare this is a shard db of a cluster;
shardsvr = true
#设置最大连接数
maxConns=20000

mangodb—分片和副本集架构部署_第18张图片

启动三台服务器的shard3 server,进入/usr/local/mongodb/bin目录下:

./mongod -f /usr/local/mongodb/conf/shard3.conf

登陆任意一台服务器,初始化副本集

./mongo --port 25003

use admin

定义副本集配置

config = {
...  _id : "shard3",
...   members : [
... {_id : 0, host : "20.0.0.18:25003" },
...  {_id : 1, host : "20.0.0.19:25003" , arbiterOnly: true},
... {_id : 2, host : "20.0.0.20:25003" }
... ]
... }


mangodb—分片和副本集架构部署_第19张图片

初始化副本集配置

rs.initiate(config);

mangodb—分片和副本集架构部署_第20张图片

4、 配置路由服务器

先启动配置服务器和分片服务器,后启动路由实例启动路由实例:(三台机器)

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 = 23000
fork = true
#监听的配置服务器,只能有1个或者3个 configs为配置服务器的副本集名字
configdb = configs/20.0.0.18:24000,20.0.0.19:24000,20.0.0.20:24000

#设置最大连接数
maxConns=20000

启动三台服务器的mongos server,进入/usr/local/mongodb/bin目录下:

./mongos -f /usr/local/mongodb/conf/mongos.conf

mangodb—分片和副本集架构部署_第21张图片

ps:中间出现服务一直等待连接中,也没有报错 就是连接不上,后来 排错是因为初始化config.server副本集出错了 忘记加 _id : “configs”,服务一直找不到它(遇到问题可以查看config.log的日志文件,看不懂直接有道翻译)

mangodb—分片和副本集架构部署_第22张图片

5、分片

目前搭建了mongodb配置服务器、路由服务器,各个分片服务器,不过应用程序连接到mongos路由服务器并不能使用分片机制,还需要在程序里设置分片配置,让分片生效。

登陆任意一台mongos,进入/usr/local/mongodb/bin目录下
./mongo --port 23000

使用admin数据库
use  admin


串联路由服务器与分配副本集
sh.addShard("shard1/20.0.0.18:25001,20.0.0.19:25001,20.0.0.20:25001")

sh.addShard("shard2/20.0.0.18:25002,20.0.0.19:25002,20.0.0.20:25002")

sh.addShard("shard3/20.0.0.18:25003,20.0.0.19:25003,20.0.0.20:25003")


查看集群状态
sh.status()

mangodb—分片和副本集架构部署_第23张图片

mangodb—分片和副本集架构部署_第24张图片

6、 测试

目前配置服务、路由服务、分片服务、副本集服务都已经串联起来了,但我们的目的是希望插入数据,数据能够自动分片。连接在mongos上,准备让指定的数据库、指定的集合分片生效。

指定testdb分片生效
db.runCommand( { enablesharding :"testdb"});

mangodb—分片和副本集架构部署_第25张图片

指定数据库里需要分片的集合和片键
db.runCommand( { shardcollection : "testdb.table1",key : {id: "hashed"} } )

mangodb—分片和副本集架构部署_第26张图片

我们设置testdb的 table1 表需要分片,根据 id 自动分片到 shard1 ,shard2,shard3 上面去。要这样设置是因为不是所有mongodb 的数据库和表 都需要分片!插入100000条数据测试:

 先进入testdb数据库
 use testdb  ##因为上面设置了 只有这个库才有数据分片的功能
 
 for(var i=1;i<=10000;i++){
... db.table1.insert({id:i,name:"sundenghui"})
... }

mangodb—分片和副本集架构部署_第27张图片

查看分配状态
db.table1.stats();

mangodb—分片和副本集架构部署_第28张图片

mangodb—分片和副本集架构部署_第29张图片

mangodb—分片和副本集架构部署_第30张图片

的 table1 表需要分片,根据 id 自动分片到 shard1 ,shard2,shard3 上面去。要这样设置是因为不是所有mongodb 的数据库和表 都需要分片!插入100000条数据测试:

 先进入testdb数据库
 use testdb  ##因为上面设置了 只有这个库才有数据分片的功能
 
 for(var i=1;i<=10000;i++){
... db.table1.insert({id:i,name:"sundenghui"})
... }

[外链图片转存中…(img-DRxwTwFK-1662436163063)]

查看分配状态
db.table1.stats();

[外链图片转存中…(img-Xz7tW315-1662436163064)]

[外链图片转存中…(img-5OjsIV8l-1662436163064)]

[外链图片转存中…(img-P07DlRbm-1662436163064)]

每个节点上根据hash算法分配这10000条数据

你可能感兴趣的:(架构,mongodb,数据库)