docker-compose配置mongodb复制集

本文使用单机配置mongodb复制集,也即是一个docker-compose文件中运行三个mongod服务。

配置要点

docker-compose配置复制集只要注意几点:
1.command执行命令时需要指定 --keyFile跟 --replSet两个属性。keyFile是为了添加复制集时的验证处理,拥有同样的keyFile文件的节点才可以被添加到复制集中。
2.docker-compose配置复制集需要指定–replSet属性值,否则直接配置直接失败。

生成keyFile:
openssl rand -base64 756 > keyfile
chmod 400 keyfile
权限设置为400就可以,设置太大了会出现permission too open错误。还有另外值的注意的是该keyfile文件的所属用户不正确会出现:bad file错误。

使用docker启动mongodb后,使用的用户是systemd-coredump,也就是999

上面引用来自这里
所以,当出现bad file错误后,需要设置keyfile用户组:
sudo chown 999 keyfile

keyfile文件中至少需要有6个字符,里面的内容可以是任意的。如果keyfile文件中只有一个key,则直接写一个字符串就可以,如:
123456
如果有多个需要用单引号括起来或者使用破折号:
‘123456’
‘asdfgh’

-123456
-asdfgh

docker-compose.yml
version: "3.8"

services:
  mongo1:
    image: mongo:4.2.8
    container_name: mongo1
    command: mongod --keyFile /work/conf/keyfile --replSet testM
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: 123
    volumes:
      - /work/mytest/mongo-replication/d1:/data/db
      - /work/mytest/mongo-replication/conf:/work/conf
    networks:
      mreplic:
        ipv4_address: 192.168.2.2

  mongo2:
    image: mongo:4.2.8
    container_name: mongo2
    command: mongod --keyFile /work/conf/keyfile --replSet testM
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: 123
    volumes:
      - /work/mytest/mongo-replication/d2:/data/db
      - /work/mytest/mongo-replication/conf:/work/conf
    networks:
      mreplic:
        ipv4_address: 192.168.2.3

  mongo3:
    image: mongo:4.2.8
    container_name: mongo3
    command: mongod --keyFile /work/conf/keyfile --replSet testM
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: 123
    volumes:
      - /work/mytest/mongo-replication/d3:/data/db
      - /work/mytest/mongo-replication/conf:/work/conf
    networks:
      mreplic:
        ipv4_address: 192.168.2.4


networks:
  mreplic:
    name: mreplic
    driver: bridge
    ipam:
      config:
        - subnet: 192.168.2.0/24
          gateway: 192.168.2.1
配置复制集

我们执行docker-compose up命令运行容器。
然后随意选择一个容器进去:
docker exec -it mongo1 /bin/bash

配置时需要在admin数据库中。
1.use admin;
验证权限
2. db.auth(“root”,“123”)
验证通过后,则可以执行initiate()操作,我们可以直接执行空方法initiate()设置当前mongodb为primary节点(因为这个时候只有该容器在复制集中,则会被选为primary节点。)或者

rs.initiate({
	"_id" : "testM",
	"members" : [
		{
			"_id" : 0,
			"host" : "mongo1:27017"
		},
		{
			"_id" : 1,
			"host" : "mongo2:27017"
		},
		{
			"_id" : 2,
			"host" : "mongo3:27017"
		}
	]
}
)

如果是直接rs.initiate()后,需要使用rs.add(“mongo2:27017”)添加节点,注意该方法只能在主节点使用。

这个时候复制集已经配置完成,但是SECONDARY节点默认是不可读写的,我们可以通过进入到SECONDARY节点执行rs.slaveOk()让该节点可读。

你可能感兴趣的:(MongoDB,mongodb,docker,复制集)