一、环境介绍
机器:腾讯云1H2G1M轻量云服务器
系统:CentOS7.5
内核:3.10.0-1127.19.1.el7.x86_64
二、安装Docker
2.1、查看系统内核版本
Docker 要求 CentOS 系统的内核版本高于 3.10。使用uname -r查看
2.2、更新yum包到最新
yum update
2.3、卸载旧版本(如果安装过旧版本的话)
yum remove docker docker-common docker-se docker-engine
2.4、安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的
yum install -y yum-utils device-mapper-persistent-data lvm2
2.5、设置yum源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
2.6、可以查看所有仓库中所有docker版本,并选择特定版本安装
yum list docker-ce --showduplicates | sort -r
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安装启动都成功了
三、配置Docker
Docker里面下载的镜像默认是从国外的源上下载下来的,有时候会很慢,所以为了能顺利下载,所以我们配置一下国内镜像源
3.1、获取国内镜像加速器
每个人的镜像加速器不同,我们可以从阿里云的容器镜像加速服务获取地址,链接:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors 如果没有开启的话就开启下,就会发现有一串镜像链接,也可以用我发的链接
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的版本
Docker是支持mongo3.6的,于是接下来我们获取mongo3.6版本的
4.2、下载Mongo3.6版本
sudo docker pull mongo:3.6
下载好了,我们查看下是否下载成功
4.3、查看MongoDB是否下载成功
sudo docker images
看到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,默认这些端口是没有开的,所以你得去你自己对应的服务器的安全组里开放这些端口
5.4、创建一个network
docker network create mongo_cluster_net
查看是否创建成功
docker network ls
成功创建
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
运行结果:
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
运行结果如下:
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"})
db.runCommand({shardcollection:"test.kpl",key:{id:"hashed"}})
测试插入数据
先进到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
耗时4186ms
接着我们来看一下具体的分片情况:
db.stats()
可以发现1000条数据分布在了我们分的3个shard中,测试完毕!!!
六、验证
6.1、验证数据是否插入成功
先进到27001查看数据
mongo 1.14.67.241:27001
use test
show collections
能看到kpl这个集合已经创建成功,接着查看数据
db.kpl.find()
数据正常插入并显示,同理,去27002和29012(都是带头大哥PRIMARY的)能查到剩下的数据
6.2、验证带头大哥倒下是否能有被替换上
以shard1为例,27001的是带头大哥,我们进去
mongo 1.14.67.241:27001
然后查看谁是带头大哥谁是仲裁人
rs.conf()
知道了谁是带头大哥(27001)后,我们就把带头大哥杀死,然后看看有没有接替的
先查看带头大哥对应的容器
docker ps -a
27001对应的容器名是shard10,然后我们把shard10杀死
docker stop shard10
继续查看,发现已经死了
然后看看29001是否接替上
确实已经接替了27001的位置,而27001已经倒下进不去了
实验验证成功!!!
附加:
docker关闭所有容器:
docker stop $(docker ps -a | awk '{ print $1}' | tail -n+2)
docker开启所有容器:
docker start $(docker ps -a | awk '{ print $1}' | tail -n+2)
评论区