MongoDB 3 副本集群(Docker-compose部署)(单机模式)

资源清单

主机 IP
mongodb节点 10.0.0.1
软件 版本
docker 20.10.12
docker-compose 1.23.1
mongodb镜像 5.0.6

一、Docker 安装

1. 使用国内 yum

# yum install -y yum-utils device-mapper-persistent-data lvm2
# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

2. 卸载旧版本的 docker

## 如果主机上已经有docker存在且不是想要安装的版本,需要先进行卸载。
# yum remove -y docker \
              docker-client \
              docker-client-latest \
              docker-common \
              docker-latest \
              docker-latest-logrotate \
              docker-logrotate \
              docker-selinux \
              docker-engine-selinux \
              docker-engine \
              container*

3. 安装 Docker20.10 版本

# yum -y install docker-ce-20.10.12-3.el7 docker-ce-cli-20.10.12-3.el7 vim

4. 设置镜像加速

# mkdir /etc/docker
# vi /etc/docker/daemon.json

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

5. 启动 docker

# systemctl start docker
# systemctl enable docker
# systemctl status docker

二、Docker-compose 安装

1. Docker-compose 安装

## github.com 可能访问超时,可以使用下面的获取下载下来后上传服务器即可
# curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# curl -k "https://dl.cactifans.com/zabbix_docker/docker-compose" -o /usr/bin/docker-compose

# chmod a+x /usr/bin/docker-compose

2. 查看 docker-compose 版本

# docker-compose version

三、MongoDB 3副本集群 安装

1. 生成 keyFile

  • MongoDB使用keyfile认证,副本集中的每个mongod实例使用keyfile内容作为认证其他成员的共享密码。mongod实例只有拥有正确的keyfile才可以加入副本集。
  • keyFile的内容必须是6到1024个字符的长度,且副本集所有成员的keyFile内容必须相同。
  • 有一点要注意是的:在UNIX系统中,keyFile必须没有组权限或完全权限(也就是权限要设置成X00的形式)。Windows系统中,keyFile权限没有被检查。
  • 可以使用任意方法生成keyFile。例如,如下操作使用openssl生成复杂的随机的1024个字符串。然后使用chmod修改文件权限,只给文件拥有者提供读权限。这是MongoDB官方推荐keyFile的生成方式
## 400权限是要保证安全性,否则mongod启动会报错
# openssl rand -base64 756 > mongodb.key
# chmod 400 mongodb.key

2. 详细的 docker-compose.yml 文件信息

version: "3"

services:
  #主节点
  mongodb1:
    image: mongo:5.0.6
    container_name: mongo1
    restart: always
    ports:
      - 27017:27017
    environment:
      - MONGO_INITDB_ROOT_USERNAME=root
      - MONGO_INITDB_ROOT_PASSWORD=mongodb@evescn
    command: mongod --replSet rs0 --keyFile /mongodb.key
    volumes:
      - /etc/localtime:/etc/localtime
      - /data/mongodb/mongo1/data:/data/db
      - /data/mongodb/mongo1/configdb:/data/configdb
      - /data/mongodb/mongo1/mongodb.key:/mongodb.key
    networks:
      - mongoNet
    entrypoint:
      - bash
      - -c
      - |
        chmod 400 /mongodb.key
        chown 999:999 /mongodb.key
        exec docker-entrypoint.sh $$@
  # 副节点
  mongodb2:
    image: mongo:5.0.6
    container_name: mongo2
    restart: always
    ports:
      - 27018:27017
    environment:
      - MONGO_INITDB_ROOT_USERNAME=root
      - MONGO_INITDB_ROOT_PASSWORD=mongodb@evescn
    command: mongod --replSet rs0 --keyFile /mongodb.key
    volumes:
      - /etc/localtime:/etc/localtime
      - /data/mongodb/mongo2/data:/data/db
      - /data/mongodb/mongo2/configdb:/data/configdb
      - /data/mongodb/mongo2/mongodb.key:/mongodb.key
    networks:
      - mongoNet
    entrypoint:
      - bash
      - -c
      - |
        chmod 400 /mongodb.key
        chown 999:999 /mongodb.key
        exec docker-entrypoint.sh $$@
  # 副节点
  mongodb3:
    image: mongo:5.0.6
    container_name: mongo3
    restart: always
    ports:
      - 27019:27017
    environment:
      - MONGO_INITDB_ROOT_USERNAME=root
      - MONGO_INITDB_ROOT_PASSWORD=mongodb@evescn
    command: mongod --replSet rs0 --keyFile /mongodb.key
    volumes:
      - /etc/localtime:/etc/localtime
      - /data/mongodb/mongo3/data:/data/db
      - /data/mongodb/mongo3/configdb:/data/configdb
      - /data/mongodb/mongo3/mongodb.key:/mongodb.key
    networks:
      - mongoNet
    entrypoint:
      - bash
      - -c
      - |
        chmod 400 /mongodb.key
        chown 999:999 /mongodb.key
        exec docker-entrypoint.sh $$@
networks:
  mongoNet:
    driver: bridge

3. MongoDB 3副本集群 部署

# mkdir /data/mongodb/mongo{1,2,3}/{data,configdb} -pv

## 提供redis.conf配置
# cp mongodb.key /data/mongodb/mongo1/
# cp mongodb.key /data/mongodb/mongo2/
# cp mongodb.key /data/mongodb/mongo3/

# docker-compose up -d

4. 配置集群

a | 进入 Mongo 容器链接 Mongo

# 选择第一个容器mongo1,进入mongo 容器
docker exec -it mongo1 bash
 
# 登录mongo
# mongo -u root -p mongodb@evescn

b | 或者通过以下方式进入 Mongo 容器链接 Mongo

# docker exec -it mongo1 mongo

c | 通过以下指令配置 mongo 副本集集群

# 认证
> use admin
> db.auth('root', 'mongodb@evescn')

成功返回1,失败返回0

5. 使用配置文件初始化集群

单主机模式部署 3副本集 添加节点必须使用宿主机IP+PORT,
使用容器内部IP的情况下代码层面连接到 mongodb-cluster 集群,
获取到的集群地址信息为 docker 容器内部 IP
若业务代码没有部署在 mongodb 主机则无法访问

a | 配置文件

> config={_id:"rs0",members:[ 
{_id:0,host:"10.0.0.1:27017"}, 
{_id:1,host:"10.0.0.1:27018"}, 
{_id:2,host:"10.0.0.1:27019"}] 
}

b | 初始化集群

> rs.initiate(config)

c | 增长 mongo1mongo2 的权重

> cfg = rs.conf()

# 修改权重
> cfg.members[0].priority=5
> cfg.members[1].priority=3

# 从新配置
> rs.reconfig(cfg)

d | 验证副本集

# 切换节点查看同步状态:

> rs.printReplicationInfo()

# 仅当建立了集合后副节点才会进行同步

6. 单节点初始化副本集

单主机模式部署 3副本集 添加节点必须使用宿主机IP+PORT,
使用容器内部IP的情况下代码层面连接到 mongodb-cluster 集群,
获取到的集群地址信息为 docker 容器内部 IP
若业务代码没有部署在 mongodb 主机则无法访问

a | 初始化副本集

mongodb-cluster 集群

> rs.initiate()

## 无参初始化后,当前节点默认是PRIMARY节点,
## 并且节点信息为容器主机名+PORT,后续需要删除节点后重新添加到集群中

b | 添加节点

## 副节点
> rs.add({_id:1,host:"10.0.0.1:27018"})

## 副节点
> rs.add({_id:2,host:"10.0.0.1:27019"})

c | 查看副本集配置信息和运行状态

## 查看副本集配置信息
> rs.conf()

## 查看副本集运行状态:
> rs.status()

......
        "members" : [
                {
                        "_id" : 0,
                        "name" : "d266ffd0e331:27017",
                        "health" : 1,
                        "state" : 1,
                        "stateStr" : "PRIMARY",
                        ......
                },
......

d | 暂停节点1

# docker stop mongo1

e | 找到集群新的主节点,添加节点1,

# docker start mongo2 mongo

## 认证
> use admin
> db.auth('root', 'mongodb@evescn')
> rs.remove("d266ffd0e331:27017")  ## rs.status() 查看集群节点1的信息

## 添加节点1
> rs.add({_id:0,host:"10.0.0.1:27017"})

f | 增长 mongo1mongo2 的权重

> cfg = rs.conf()

# 修改权重
> cfg.members[0].priority=5
> cfg.members[1].priority=3

# 从新配置
> rs.reconfig(cfg)

g | 验证副本集

# 切换节点查看同步状态:

> rs.printReplicationInfo()

# 仅当建立了集合后副节点才会进行同步
posted @ 2022-04-28 16:22  evescn  阅读(3238)  评论(1编辑  收藏  举报