这个话题比较有意思,公司的测试环境本来是一个mongodb的三节点三副本全集群,升级了2次升到8.0。

结果吧,由于里面数据过于庞大,测试的时候经常把节点打挂,虽说是打挂后又能很快被docker拉起来,但是挂的那个时刻应用程序就掉了,导致测试失败。

这三台节点还都是8 cpu 32G memory的配置,真大无语了。

没办法,干脆弄成单节点,然后内存垒高到128G,cpu加到32,弄好之后,读取数据的Flink又不行了,要求是必须读mongo的副本,真完犊子。

那就强制启动个副本模式吧:

mongo启动方式用的是docker compose,启动的时候新增参数 --replSet rs0

# mongo数据目录的属主是 999:999
mkdir -p /data/mongodb/27017/data
chown -R 999:999 /data/mongodb/27017/data
mkdir -p /data/mongodb/27017/conf/
cd /data/mongodb/27017


#先gen keyfile
openssl rand -base64 756 > keyfile
chmod 400 keyfile

#准备mongod.conf
EOF < cat > /data/mongodb/27017/conf/mongod.conf 
systemLog:
   destination: file
   path: "/data/db/mongod.log"
   logAppend: true

net:
   bindIp: 0.0.0.0
   port: 27017

security:
   keyFile: "/data/configdb/keyfile"
EOF

EOF < cat > /data/mongodb/docker-compose.yaml
services:
  mongo:
    container_name: mongo
    image: mongo:8.0
    restart: always
    environment:
      TZ: Asia/Shanghai
    volumes:
      - /data/mongodb/27017/data:/data/db
      - /data/mongodb/27017/conf/mongod.conf:/data/configdb/mongod.conf
      - ./keyfile:/data/configdb/keyfile
    command: --replSet rs0 --config /data/configdb/mongod.conf
    ports:
      - 27017:27017
EOF

docker compose up -d

然后不算完啊,启动之后需要进入容器执行rs.initiate(), 放心大胆的执行,不会破坏任何原有的数据

docker exec -it mongo sh

mongosh

use admin
db.auth('root','xxxxxxxx')
rs.initiate()

Flink就变正常了,可惜然而但是,原有的应用程序就突然不行了,报无法连接mongo!

那原有的连接字串需要变一下:

mongodb://root:xxxxxxxx@192.168.1.20/?authSource=admin&directConnection=true&tls=false

真的是麻烦的一匹!!!