引言,网上的文章或多或少都有一些问题,总结了一条正确的操作
1.环境 centos 7.5
2.部署目标 简单自动切换复制集 三节点
3.开始搭建
3.1 第一步先拷贝docker-compose.yml到三台服务器
主服务器
docker-compose.yml(
明明一个节点为何会有一个叫mongo1还有一个叫amongo1,其实普通的复制集搭建的非常方便,而amongo1是带了权限验证的mongo1节点,如果不带权限验证,任何人都可以访问你的mongo,所以我们需要先起动三台服务器下的mongo1/2/3,登录并设置好复制集,并且创建一个用户,然后再down掉mongo1/2/3 再启动amongo1/2/3
)
version: '2'
services:
mongo1:
container_name: mongo1
image: mongo:latest
restart: always
ports:
- '37017:27017'
environment:
- TZ=Asia/Shanghai
volumes:
- ./mongo1:/data/db
command: mongod --replSet rs
amongo1:
container_name: amongo1
image: mongo:latest
restart: always
ports:
- '37017:27017'
environment:
- TZ=Asia/Shanghai
volumes:
- ./mongo1:/data/db
- ./conf:/opt
command:
- /bin/bash
- -c
- |
chmod 600 /opt/mongodb-keyfile
mongod --keyFile "/opt/mongodb-keyfile" --bind_ip_all --auth --replSet rs
从服务器
version: '2'
services:
mongo2:
container_name: mongo2
image: mongo:latest
restart: always
ports:
- '37018:27017'
environment:
- TZ=Asia/Shanghai
volumes:
- ./mongo2:/data/db
command: mongod --replSet rs
amongo2:
container_name: amongo2
image: mongo:latest
restart: always
ports:
- '37018:27017'
environment:
- TZ=Asia/Shanghai
volumes:
- ./mongo2:/data/db
- ./conf:/opt
command:
- /bin/bash
- -c
- |
chmod 600 /opt/mongodb-keyfile
mongod --keyFile "/opt/mongodb-keyfile" --bind_ip_all --auth --replSet rs
仲裁节点
version: '2'
services:
mongo3:
container_name: mongo3
image: mongo:latest
restart: always
ports:
- '37019:27017'
environment:
- TZ=Asia/Shanghai
volumes:
- ./mongo3:/data/db
command: mongod --replSet rs
amongo3:
container_name: amongo3
image: mongo:latest
restart: always
ports:
- '37019:27017'
environment:
- TZ=Asia/Shanghai
volumes:
- ./mongo3:/data/db
- ./conf:/opt
command:
- /bin/bash
- -c
- |
chmod 600 /opt/mongodb-keyfile
mongod --keyFile "/opt/mongodb-keyfile" --bind_ip_all --auth --replSet rs
3.2 细心的你会发现我们有一个conf文件夹(三台服务器的conf文件夹内容一模一样),你需要再docker-compose同级目录创建一个名叫conf的文件夹,里面有两个文件
一个叫 mongo.conf
内容如下
security:
authorization: enabled
keyFile: /opt/mongodb-keyfile
第二个是mongo复制集之间同步数据需要的密钥
名字叫 mongodb-keyfile
可以使用这个命令生成
openssl rand -base64 741 > mongodb-keyfile
两个文件生成好以后,把conf文件夹 拷贝到三台服务器的docker-compose同级文件夹下
3.3 下面该启动并初始化mongo复制集了
依次在三台服务器下输入命令
docker-compose up -d mongo1
docker-compose up -d mongo2
docker-compose up -d mongo3
启动好之后
在主服务器使用以下命令进入容器
docker exec -it mongo1 bash
输入以下命令进入容器
mongo
执行以下命令初始化复制集
rs.initiate({_id: "rs",version: 1,members: [{ _id: 0, host : "192.168.30.45:37017" },{ _id: 1, host : "192.168.30.45:37018" },{ _id: 2, host : "192.168.30.45:37019" }]})
初始化好之后复制集搭建好了,但是不急着退出 咱们再创建一个账号密码
创建用户和密码
db.createUser({user: "root",pwd: "123456",roles: [{role: "userAdminAnyDatabase",db:"admin"}]})
现在你就可以退出了
到目前为止,不带验证同步的复制集搭建完毕
你可以先试试是否数据都是同步的
然后很简单,因为之前密钥你都弄好了
直接依次docker-compose down 掉三台服务器
依次输入命令
docker-compose up -d amongo1
docker-compose up -d amongo2
docker-compose up -d amongo3
这样你的复制集就登录不进去啦,开不开心0.0
这时候需要你到主服务器上输入进入容器的命令
docker exec -it amongo1 bash
进入后
输入mongo 进入mongo数据库
使用之前你创建好的admin用户进行创建新的用户对于某库的权限
比如
db.createUser({user: "root2",pwd: "123456",roles: [{ role: "readWrite", db: "test" }]})
这代表你新建了一个名字叫root的用户 他可以访问test数据库
你试试用root2 123456 test 连接一下
是不是可以了
惊不惊喜,意不意外,结束