暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

mongodb集群搭建及故障测试

方案概述

mongodb 集群搭建包括分片副本集的搭建、config server的搭建及mongos配置

实施步骤

一、 搭建说明

1、集群的组件介绍

A、mongos(query routers):查询路由,负责client的连接,并把任务分给shards,然后收集结果。一个集群可以有多个query routers(replica sets),以分担客户端请求(负载均衡)。
B、config server:配置服务器。保存了集群的元数据(比如数据放在哪个shards上),query router通过config server中的配置信息决定把任务分配到哪个shards上。从3.4开始,config servers可以做成replica sets。
C、shards:分片,即数据结点,存储数据和执行计算。为了保证高可用和数据一致性,生产环境中shards应该做成replicasets(防止丢失数据)。
image.png

2、IP及端口规划

实例 192.168.1.140 192.168.1.141 192.168.1.142
Router mongos1(65313) mongos2(65313) mongos3(65313)
Config config server1 (configRS 23015) config server2 (configRS 23015) config server3 (configRS 23015)
Shard shard1-主(28011) shard2-主(28012) shard3-主(28013)
Shard shard2-从(28012) shard1-从(28011) shard2-从(28012)
Shard shard3-从(28013) shard3-从(28013) shard1-从(28011)

3、linux目录规划

image.png

二、 准备工作

1、下载mongodb软件

https://www.mongodb.com/download-center#atlas

2、服务器IP设置

[root@node1]$ vi /etc/sysconfig/network-scripts/ifcfg-eth0
将BOOTPROTO=dhcp 修改成 =static,将 ONBOOT=no 改成 =yes
在文件末添加:
IPADDR=192.168.1.140
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
[root@node1]$ systemctl restart network

3、新建用户组及用户

[root@node1]$ groupadd mongo
[root@node1]$ useradd -g mongo -m mongo
[root@node1]$ passwd mongo

4、建立相应的目录

[mongo@node1]$ mkdir -p /home/mongo/dbs/{config,router,shard}
[mongo@node1]$ mkdir -p /home/mongo/dbs/config/{data,logs}
[mongo@node1]$ mkdir -p /home/mongo/dbs/router/logs
[mongo@node1]$ mkdir -p /home/mongo/dbs/shard/{data,logs}
[mongo@node1]$ mkdir -p /home/mongo/dbs/shard/data/{shard1,shard2,shard3}

5、安装软件

[mongo@node1]$ tar -xvf mongodb-linux-x86_64-4.0.10.tgz -C /home/mongo/mongodb

6、配置环境变量

[mongo@node1]$ echo “PATH=$PATH:/home/mongo/mongodb/bin
export PATH”

三、配置config server

1、新建config实例的启动参数文件,并启动实例

注:每台服务器都顺序执行一次
[mongo@node1]$ cd /home/mongo/dbs/config/
[mongo@node1]$ vi mongo.config
dbpath=/home/mongo/dbs/config/data
logpath=/home/mongo/dbs/config/logs/mongo.log
port=23015
fork=true
replSet=configRS
configsvr=true
[mongo@node1]$ mongod -f /home/mongo/dbs/config/mongo.config

2、任意进入一台服务器,配置config server为replica sets

[mongo@node1]$ mongo --port 23015

use admin
rs.initiate( {
… _id: “configRS”,
… configsvr: true,
… members: [
… { _id: 0, host: “192.168.1.140:23015” },
… { _id: 1, host: “192.168.1.141:23015” },
… { _id: 2, host: “192.168.1.142:23015” }
… ]
… } );
rs.status()

四、启动mongos server

注:每台服务器都顺序执行一次
[mongo@node1]$ cd /home/mongo/dbs/router
[mongo@node1]$ vi mongos.config
configdb = configRS/192.168.1.140:23015,192.168.1.141:23015,192.168.1.142:23015
port = 65313
chunkSize = 1
logpath =/home/mongo/dbs/router/logs/mongos.log
logappend = true
fork = true

[mongo@node1]$ mongos -f /home/mongo/dbs/router/mongos.config

五、配置shard server

1、新建shard实例的启动参数文件

注:每台服务器都顺序执行一次
[mongo@node1]$ cd /home/mongo/dbs/shard
[mongo@node1]$ vi shard1.config
dbpath=/home/mongo/dbs/shard/data/shard1
logpath=/home/mongo/dbs/shard/logs/shard1.log
port=28011
fork=true
replSet=shard1

[mongo@node1]$ vi shard2.config
dbpath=/home/mongo/dbs/shard/data/shard2
logpath=/home/mongo/dbs/shard/logs/shard2.log
port=28012
fork=true
replSet=shard2

[mongo@node1]$ vi shard3.config
dbpath=/home/mongo/dbs/shard/data/shard3
logpath=/home/mongo/dbs/shard/logs/shard3.log
port=28013
fork=true
replSet=shard3

2、启动shard实例

第一台服务器先启动shard1,然后去第二台服务器启动shard2,再去第三台服务器启动shard3。
启动完后,每个服务器再去启动剩下的2个实例。
[mongo@node1]$ mongod -f /home/mongo/dbs/shard/shard1.config
[mongo@node1]$ mongod -f /home/mongo/dbs/shard/shard2.config
[mongo@node1]$ mongod -f /home/mongo/dbs/shard/shard3.config

3、任意进入一台服务器,配置每个shard为replica sets

[mongo@node1]$ mongo --port 28011

use admin
config = {"_id" : “shard1”,
“members” : [
{"_id" : 0, “host” : “192.168.1.140:28011”},
{"_id" : 1, “host” : “192.168.1.141:28011”},
{"_id" : 2, “host” : “192.168.1.142:28011”}
]}
rs.initiate(config)
rs.status()

[mongo@node1]$ mongo --port 28012

use admin
config = {"_id" : “shard2”,
“members” : [
{"_id" : 0, “host” : “192.168.1.141:28012”},
{"_id" : 1, “host” : “192.168.1.140:28012”},
{"_id" : 2, “host” : “192.168.1.142:28012”}
]}
rs.initiate(config)
rs.status()

[mongo@node1]$ mongo --port 28013

use admin
config = {"_id" : “shard3”,
“members” : [
{"_id" : 0, “host” : “192.168.1.142:28013”},
{"_id" : 1, “host” : “192.168.1.141:28013”},
{"_id" : 2, “host” : “192.168.1.140:28013”}
]}
rs.initiate(config)
rs.status()

六、配置分片

[mongo@node1]$ mongo --port 65313

use admin
db.runCommand({“addShard”:“shard1/192.168.1.140:28011”})
db.runCommand({“addShard”:“shard2/192.168.1.141:28012”})
db.runCommand({“addShard”:“shard3/192.168.1.142:28013”})
db.runCommand({listshards:1})

七、测试

1、登录到router实例

[mongo@node1]$ mongo --port 65313

2、开启分片功能

use admin
对库enmo开启分片
db.runCommand({“enablesharding”:“enmo”})
–对库llh下的表person按字段ID配置hash分库算法
db.runCommand({“shardcollection”:“enmo.person”,“key”:{_id:‘hashed’}})

3、插入数据

use enmo
for(var i=0;i<100000;i++){db.person.insert({name:“test”+i});}

4、查看数据是否已经分片

[mongo@node1]$ mongo --port 28011
[mongo@node1]$ mongo --port 28012
[mongo@node1]$ mongo --port 28013

5、登录从库服务器,查看主从是否同步

八、故障模拟

情况1:关掉shard1的主节点,看是否产生了新的主节点,且数据是否正常同步

image.png
登录从库查看当前shard1的状态,可以看到已经将12的从库变成了主节点

情况2:关掉config的主节点,看数据是否能正常分片

image.png
插入新数据:
image.png
可以看到,数据分片正常,同步正常
image.png
image.png
image.png

情况3:将1台服务器直接关机,看mongo是否还能正常工作

image.png
插入数据:
image.png
可以看到,数据分片正常,同步正常
image.png
image.png
image.png

九、运维相关

1、关闭mongo

以mongo用户登录每台服务器

(1)、关闭shard实例

[mongo@node1]$ mongod --dbpath=/home/mongo/dbs/shard/data/shard1 –shutdown
[mongo@node1]$ mongod --dbpath=/home/mongo/dbs/shard/data/shard2 –shutdown
[mongo@node1]$ mongod --dbpath=/home/mongo/dbs/shard/data/shard3 –shutdown

(2)、关闭config实例

[mongo@node1]$ mongod --dbpath=/home/mongo/dbs/config/data –shutdown

(3)、关闭route实例

[mongo@node1]$ mongo --port 65313

use admin
db.shutdownServer();

2、启动mongo

以mongo用户登录每台服务器

1、启动config实例

[mongo@node1]$ mongod -f /home/mongo/dbs/config/mongo.config

2、启动route实例

[mongo@node1]$ mongos -f /home/mongo/dbs/router/mongos.config

3、启动shard实例

[mongo@node1]$ mongod -f /home/mongo/dbs/shard/shard1.config
[mongo@node1]$ mongod -f /home/mongo/dbs/shard/shard2.config
[mongo@node1]$ mongod -f /home/mongo/dbs/shard/shard3.config

3、查看mongo的进程

一共有4个mongod进程,1个mongos进程。
[mongo@node1]$ ps -ef|grep -E ‘mongod|mongos’ |grep -v grep

附加命令

1、关闭mongo实例
mongod --dbpath=/home/mongo/dbs/shard/data/shard1 --shutdown
2、设置副本节点可以读数据:db.getMongo().setSlaveOk();
3、查看分片情况:db.runCommand({listshards:1})
4、更改配置立即生效:rs.reconfig(config, { force: true})

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论