项目场景:
mongodb sharded集群存储一批runtime log. 随着数据量增多,需要增加shard以扩容集群容量。后续文中截图涉及多次验证,因此replicaSetKey不同还请读者体谅。
问题描述
新增shard对应的pod始终在restart。
原因分析:
与Running POD的日志差异
问题POD停在了"Found MongoDB server listening at xxx:27017"
正常POD日志
经过对比发现,存量shard POD是"Deploying MongoDB Sharded from scratch", 新增加的shard POD是"Deploying MongoDB Sharded with persisted data".
“Found MongoDB Server …”
先说结论:
helm upgrage时缺少参数 mongodbRootPassword,添加之后就可以进入下一步了
存量数据从何而来
- 通过kubectl exec 登录目标pod查看,db文件夹确实有内容;
- 后来在测试环境验证发现第一次启动时会初始化数据库;
- 由于查看日志时POD已重启,mongodb-sharded中shard子chart是通过statefulset部署,因此重用了PVC;这就是存量数据的由来;
缘何block在"Found MongoDB server xx"
我们知道chart背后是一个docker image,启动过程是由配置参数和启动脚本共同影响的。因此需要排查启动脚本。
获得docker image
docker pull bitnami/mongodb-sharded
查看docker file
docker inspect bitnami/mongodb-sharded
/bin/sh -c #(nop) CMD ["/opt/bitnami/scripts/mongodb-sharded/run.sh"]
/bin/sh -c #(nop) ENTRYPOINT ["/opt/bitnami/scripts/mongodb-sharded/entrypoint.sh"]
于是从entrypoint.sh开始, 最终找到了关键的.sh文件
mongodb_sharded_mongod_initialize
在/opt/bitnami/scripts/libmongodb-sharded.sh
###############
# Initialize MongoDB (mongod) service with sharded configuration
# Globals:
# MONGODB_*
# Arguments:
# None
# Returns:
# None
#########################
mongodb_sharded_mongod_initialize() {
info "Initializing MongoDB Sharded..."
rm -f "$MONGODB_PID_FILE"
mongodb_copy_mounted_config
mongodb_set_net_conf
mongodb_set_log_conf
mongodb_set_storage_conf
mongodb_sharded_set_sharding_conf "$MONGODB_CONF_FILE"
if is_dir_empty "$MONGODB_DATA_DIR/db"; then
info "Deploying MongoDB Sharded from scratch..."
ensure_dir_exists "$MONGODB_DATA_DIR/db"
am_i_root && chown -R "$MONGODB_DAEMON_USER" "$MONGODB_DATA_DIR/db"
mongodb_set_replicasetmode_conf
if [[ "$MONGODB_SHARDING_MODE" =~ ^(configsvr|shardsvr)$ ]] && [[ "$MONGODB_REPLICA_SET_MODE" = "primary" ]]; then
mongodb_sharded_initiate_svr_primary
fi
mongodb_start_bg
mongodb_create_users
mongodb_create_keyfile "$MONGODB_REPLICA_SET_KEY"
mongodb_set_keyfile_conf
mongodb_set_auth_conf
mongodb_set_listen_all_conf
mongodb_sharded_configure_replica_set
mongodb_stop
else
mongodb_create_keyfile "$MONGODB_REPLICA_SET_KEY"
mongodb_set_keyfile_conf
mongodb_set_auth_conf
info "Deploying MongoDB Sharded with persisted data..."
if [[ "$MONGODB_REPLICA_SET_MODE" = "dynamic" ]]