侧边栏壁纸
  • 累计撰写 44 篇文章
  • 累计创建 8 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

使用Docker搭建MongoDB真分布

博主
2024-01-30 / 0 评论 / 1 点赞 / 9 阅读 / 21397 字 / 正在检测是否收录...

一、环境介绍

机器:腾讯云1H2G1M轻量云服务器

系统:CentOS7.5

内核:3.10.0-1127.19.1.el7.x86_64

二、安装Docker

2.1、查看系统内核版本

Docker 要求 CentOS 系统的内核版本高于 3.10。使用uname -r查看

image-20211124222334587.png

2.2、更新yum包到最新

yum update

2.3、卸载旧版本(如果安装过旧版本的话)

yum remove docker docker-common docker-se docker-engine

image-20211124222819267.png

2.4、安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的

yum install -y yum-utils device-mapper-persistent-data lvm2

image-20211124222723433.png

2.5、设置yum源

yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

image-20211124224330538.png

2.6、可以查看所有仓库中所有docker版本,并选择特定版本安装

yum list docker-ce --showduplicates | sort -r

image-20211124224430272.png

2.7、安装docker

yum install docker-ce  #安装最新稳定版本
或
yum install docker-ce-17.12.1.ce  #安装指定版本

由于repo中默认只开启stable仓库,故这里安装的是最新稳定版。

2.8、启动并加入开机启动

systemctl start docker
systemctl enable docker

2.9、验证是否安装成功

docker version

有client和server两部分表示docker安装启动都成功了

image-20211124225744800.png

三、配置Docker

Docker里面下载的镜像默认是从国外的源上下载下来的,有时候会很慢,所以为了能顺利下载,所以我们配置一下国内镜像源

3.1、获取国内镜像加速器

每个人的镜像加速器不同,我们可以从阿里云的容器镜像加速服务获取地址,链接:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors 如果没有开启的话就开启下,就会发现有一串镜像链接,也可以用我发的链接

image-20211124225515713.png

3.2、更改国内镜像加速器

sudo mkdir -p /etc/docker
sudo nano /etc/docker/daemon.json

然后把以下内容复制进去,保存并退出

{
  "registry-mirrors": ["https://9m0ljxd3.mirror.aliyuncs.com"]
}

重启生效

sudo systemctl daemon-reload
sudo systemctl restart docker

至此,Docker安装并配置全部完成

四、Docker内获取MongoDB

4.1、查看Docker是否支持Mongo:3.6的版本

image-20211124231323362.png

Docker是支持mongo3.6的,于是接下来我们获取mongo3.6版本的

4.2、下载Mongo3.6版本

sudo docker pull mongo:3.6

image-20211124231701960.png

下载好了,我们查看下是否下载成功

4.3、查看MongoDB是否下载成功

sudo docker images

image.png

看到mongo了,说明安装成功了

五、搭建MongoDB真分布

5.1、安装docker-compose

sudo yum install -y python3-pip
sudo pip3 install setuptools
sudo pip3 install --upgrade pip
sudo pip3 install docker-compose

5.2、安装bridge-utils(否则无法使用btcrl show查看docker网络)

sudo yum install bridge-utils

5.3、首先准备好mongo集群的端口

port 27001 28001 29001 shard1的3个端口。
port 27002 28002 29002 shard2的3个端口。
port 27012 28012 29012 shard3的3个端口。
port 27003 28003 29003 configserver的3个端口
port 27004 mongos的端口 只准备一个mongos出口 可以设置多个
以上东西不用在服务器输入,只需要开放对应端口即可

注意:因为这是服务器安装的mongdb,默认这些端口是没有开的,所以你得去你自己对应的服务器的安全组里开放这些端口

image.png

5.4、创建一个network

docker network create mongo_cluster_net

查看是否创建成功

docker network ls

image.png

成功创建

5.5、创建文件夹

mkdir -p /mnt/mongo/data/
mkdir -p /mnt/mongo/log/

5.6、将全部的9个mongodb的shard全部都装到docker的container里

docker run -d -p 27001:27018 -v /mnt/mongo/data/shard10/:/data/db/ -v /mnt/mongo/log/shard10/:/data/configdb/ --network mongo_cluster_net --name shard10 mongo:3.6 mongod --shardsvr --replSet shard1 --logpath=/data/configdb/shard1.log
docker run -d -p 28001:27018 -v /mnt/mongo/data/shard11/:/data/db/ -v /mnt/mongo/log/shard11/:/data/configdb/ --network mongo_cluster_net --name shard11 mongo:3.6 mongod --shardsvr --replSet shard1 --logpath=/data/configdb/shard1.log
docker run -d -p 29001:27018 -v /mnt/mongo/data/shard12/:/data/db/ -v /mnt/mongo/log/shard12/:/data/configdb/ --network mongo_cluster_net --name shard12 mongo:3.6 mongod --shardsvr --replSet shard1 --logpath=/data/configdb/shard1.log
docker run -d -p 27002:27018 -v /mnt/mongo/data/shard20/:/data/db/ -v /mnt/mongo/log/shard20/:/data/configdb/ --network mongo_cluster_net --name shard20 mongo:3.6 mongod --shardsvr --replSet shard2 --logpath=/data/configdb/shard2.log
docker run -d -p 28002:27018 -v /mnt/mongo/data/shard21/:/data/db/ -v /mnt/mongo/log/shard21/:/data/configdb/ --network mongo_cluster_net --name shard21 mongo:3.6 mongod --shardsvr --replSet shard2 --logpath=/data/configdb/shard2.log
docker run -d -p 29002:27018 -v /mnt/mongo/data/shard22/:/data/db/ -v /mnt/mongo/log/shard22/:/data/configdb/ --network mongo_cluster_net --name shard22 mongo:3.6 mongod --shardsvr --replSet shard2 --logpath=/data/configdb/shard2.log
docker run -d -p 27012:27018 -v /mnt/mongo/data/shard30/:/data/db/ -v /mnt/mongo/log/shard30/:/data/configdb/ --network mongo_cluster_net --name shard30 mongo:3.6 mongod --shardsvr --replSet shard3 --logpath=/data/configdb/shard3.log
docker run -d -p 28012:27018 -v /mnt/mongo/data/shard31/:/data/db/ -v /mnt/mongo/log/shard31/:/data/configdb/ --network mongo_cluster_net --name shard31 mongo:3.6 mongod --shardsvr --replSet shard3 --logpath=/data/configdb/shard3.log
docker run -d -p 29012:27018 -v /mnt/mongo/data/shard32/:/data/db/ -v /mnt/mongo/log/shard32/:/data/configdb/ --network mongo_cluster_net --name shard32 mongo:3.6 mongod --shardsvr --replSet shard3 --logpath=/data/configdb/shard3.log

运行结果:

image.png

5.7、配置config-server

docker run -d -p 27003:27003 --name confsvr1 -v /mnt/mongo/data/cfgsvr1/:/data/db/ mongo:3.6 --configsvr --dbpath /data/db --replSet crs --port 27003
docker run -d -p 28003:27003 --name confsvr2 -v /mnt/mongo/data/cfgsvr2/:/data/db/ mongo:3.6 --configsvr --dbpath /data/db --replSet crs --port 27003
docker run -d -p 29003:27003 --name confsvr3 -v /mnt/mongo/data/cfgsvr3/:/data/db/ mongo:3.6 --configsvr --dbpath /data/db --replSet crs --port 27003

运行结果如下:

image.png

5.8、将shard的replica和config-server的replica配置完成

安装mongodb-clients

nano /etc/yum.repos.d/mongodb-org-3.6.repo

然后输入以下内容,保存并退出

[mongodb-org-3.6]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.6/x86_64/
gpgcheck=1
enabled=1
gpgkey=
https://www.mongodb.org/static/pgp/server-3.6.asc
yum install -y mongodb-org

配置shard的replica

mongo 1.14.67.241:27001 #注意:这个ip地址你要填你自己主机的ip地址,下同
config = { _id:"shard1", members:[{_id:0,host:"1.14.67.241:27001"},{_id:1,host:"1.14.67.241:28001",arbiterOnly:true},{_id:2,host:"1.14.67.241:29001"}]}
rs.initiate(config)
exit
mongo 1.14.67.241:27002
config = { _id:"shard2", members:[{_id:0,host:"1.14.67.241:27002"},{_id:1,host:"1.14.67.241:28002",arbiterOnly:true},{_id:2,host:"1.14.67.241:29002"}]}
rs.initiate(config)
exit
mongo 1.14.67.241:27012
config = { _id:"shard3", members:[{_id:0,host:"1.14.67.241:27012"},{_id:1,host:"1.14.67.241:28012",arbiterOnly:true},{_id:2,host:"1.14.67.241:29012"}]}
rs.initiate(config)
exit
mongo 1.14.67.241:27003
config = { _id:"crs",configsvr:true, members:[{_id:0,host:"1.14.67.241:27003"},{_id:1,host:"1.14.67.241:28003"},{_id:2,host:"1.14.67.241:29003"}]}
rs.initiate(config)
exit

用docker为mongos造一个container

docker run -d -p 27004:27017 -v /mnt/mongo/log/mongos1/:/var/log/mongodb/ --network mongo_cluster_net --name mongos1 mongo:3.6 mongos --bind_ip_all --port 27017 --configdb crs/1.14.67.241:27003,1.14.67.241:28003,1.14.67.241:29003

将所有的shards统一到mongos中

mongo 1.14.67.241:27004
use admin
db.runCommand({addshard:"shard1/1.14.67.241:27001,1.14.67.241:28001,1.14.67.241:29001"})
db.runCommand({addshard:"shard2/1.14.67.241:27002,1.14.67.241:28002,1.14.67.241:29002"})
db.runCommand({addshard:"shard3/1.14.67.241:27012,1.14.67.241:28012,1.14.67.241:29012"})
db.runCommand({listshards:1})

测试分片是否成功

db.runCommand({enablesharding:"test"})

image.png

db.runCommand({shardcollection:"test.kpl",key:{id:"hashed"}})

image.png

测试插入数据

先进到tese数据库

use test

尝试插入1000条数据

var before = new Date()
for(var i=1;i<=1000;i++){
db.kpl.insert({
id:i,
name:i,
english:Math.round(Math.random() * 100),
math:Math.round(Math.random() * 100),
chinese:Math.round(Math.random() * 100),
geography:Math.round(Math.random() * 100),
music:Math.round(Math.random() * 100),
love:Math.round(Math.random() * 100)
})
print(i)
}
var after = new Date()
execution_mills = after - before

image.png

耗时4186ms

接着我们来看一下具体的分片情况:

db.stats()

image.png

可以发现1000条数据分布在了我们分的3个shard中,测试完毕!!!

六、验证

6.1、验证数据是否插入成功

先进到27001查看数据

mongo 1.14.67.241:27001
use test
show collections

image.png

能看到kpl这个集合已经创建成功,接着查看数据

db.kpl.find()

image.png

数据正常插入并显示,同理,去27002和29012(都是带头大哥PRIMARY的)能查到剩下的数据

image.png

image.png

6.2、验证带头大哥倒下是否能有被替换上

以shard1为例,27001的是带头大哥,我们进去

mongo 1.14.67.241:27001

image.png

然后查看谁是带头大哥谁是仲裁人

rs.conf()

image.png

知道了谁是带头大哥(27001)后,我们就把带头大哥杀死,然后看看有没有接替的

先查看带头大哥对应的容器

docker ps -a

image.png

27001对应的容器名是shard10,然后我们把shard10杀死

docker stop shard10

继续查看,发现已经死了

image.png

然后看看29001是否接替上

image.png

确实已经接替了27001的位置,而27001已经倒下进不去了

image.png

实验验证成功!!!

附加:

docker关闭所有容器:

docker stop $(docker ps -a | awk '{ print $1}' | tail -n+2)

docker开启所有容器:

docker start $(docker ps -a | awk '{ print $1}' | tail -n+2)


1
  1. 支付宝打赏

    qrcode alipay
  2. 微信打赏

    qrcode weixin
  3. QQ打赏

    qrcode qq

评论区