shell脚本安装MongoDB一主一副一仲裁样例

自定义参数

KEYFILE_PWD= #服务器密码
EMONGO_NAME= #MONGO部署包名称
MONGO_PATH= #MONGO安装路径
MONGO_PORT=#MONGO端口
MONGO_USER_NAME= #设置MONGO普通用户
PKG_NAM= #PKG包名 
ROOT_PASSWD= #设置root用户密码
TEMP_PATH= #临时目录
USER_NAME = #启动用户账号
USER_PASSWD = #设置普通用户密码

部署参数检查

#!/bin/bash

# 检查参数是否设置
echo "====检查参数是否设置====="
if [ ! $TEMP_PATH ];then
	echo "=====$TEMP_PATH 此参数未设置,请检查!====="
    exit 1
fi

if [ ! $MONGO_PATH ];then
	echo "=====$MONGO_PATH 此参数未设置,请检查!====="
    exit 1
fi

if [ ! $KEYFILE_PWD ];then
	echo "=====$KEYFILE_PWD 此参数未设置,请检查!====="
    exit 1
fi

if [ ! $ROOT_PASSWD ];then
	echo "=====$ROOT_PASSWD 此参数未设置,请检查!====="
    exit 1
fi

if [ ! $MONGO_PORT ];then
	echo "=====$MONGO_PORT 此参数未设置,请检查!====="
    exit 1
fi

ISSTART=$(netstat -nutlp|grep ${MONGO_PORT}|grep -v "grep"|wc -l)

# 检查端口是否已被监听
echo "=====检查端口是否已被监听====="
if [ "${ISSTART}" != "0" ]; then
    echo "=====MONGO 启动端口已监听,请重新选择端口====="  
    exit 1
else
    echo "=====MONGO 启动端口未监听,符合预期!=====" 
fi

# 检查目标目录是否存在
echo "=====检查目标目录是否存在====="
if [ ! -d $TEMP_PATH ];then
	echo "=====$TEMP_PATH目录不存在,创建目录====="
	mkdir -p $TEMP_PATH	
else 
    echo "=====临时目录已存在,无需创建====="
fi

if [ ! -d $MONGO_PATH/$MONGO_PORT ];then
	echo "=====$MONGO_PORT 目录不存在,创建目录====="
	mkdir -p $MONGO_PATH/$MONGO_PORT/{app,conf,run,data,log}
else 
    echo "=====$MONGO_PORT目录已存在,退出安装====="
    exit 1
fi

 echo "=====部署前检查通过====="

上传并解压安装包

#!/bin/bash
pwd

# 解压压缩包到临时目录
echo "=====解压压缩包到临时目录====="
unzip  -o $PKG_NAME.zip -d $TEMP_PATH
echo "=====查看解压后的内容====="
ls $TEMP_PATH/$PKG_NAME

# 解压mongo安装包到安装目录
echo "=====解压安装包到安装目录====="
cd $TEMP_PATH/$PKG_NAME
tar -xf $MONGO_NAME.tgz -C  $MONGO_PATH/$MONGO_PORT
echo "=====查看解压后的内容====="
ls $MONGO_PATH/$MONGO_PORT/$MONGO_NAME

# 根据启动脚本调整目录
echo "=====根据启动脚本调整目录====="
\mv $MONGO_PATH/$MONGO_PORT/$MONGO_NAME/* $MONGO_PATH/$MONGO_PORT
rm -rf $MONGO_PATH/$MONGO_PORT/$MONGO_NAME
echo "=====查看调整后目录内的内容====="
ls $MONGO_PATH/$MONGO_PORT

创建keyFile文件并分发

#!/bin/bash

# 创建keyFile文件
echo "=====开始创建keyFile文件====="
cd ${MONGO_PATH}/${MONGO_PORT}/conf/
openssl  rand  -base64 753  >  keyFile
chmod -R 600 keyFile

# 给普通用户授权
echo "=====给普通用户授权====="
chown -R ${USER_NAME}:${USER_NAME} ${MONGO_PATH}

# expect命令检查
echo "=====expect命令检查====="
which expect 
if [ $? != 0 ]; then
    yum -y install expect 
else 
    echo "=====expect已安装====="
fi 

#将keyFile传到从节点和仲裁节点
echo "=====将keyFile传到从节点和仲裁节点====="
/usr/bin/expect <<EOF
set timeout 30
spawn scp -rp  ${MONGO_PATH}/${MONGO_PORT}/conf/keyFile root@${SECONDARY}:${MONGO_PATH}/${MONGO_PORT}/conf/
expect {
"yes/no" {send "yes\r";exp_continue}
"password:" {send "$KEYFILE_PWD\r"}
}
expect eof
EOF
/usr/bin/expect <<EOF
set timeout 30
spawn scp -rp ${MONGO_PATH}/${MONGO_PORT}/conf/keyFile root@${ARBITER}:${MONGO_PATH}/${MONGO_PORT}/conf/
expect {
"yes/no" {send "yes\r";exp_continue}
"password:" {send "$KEYFILE_PWD\r"}
}
expect eof
EOF

确认keyFile文件分发

#!/bin/bash

echo "=====确认keyFile文件分发是否成功====="
keyFilePath=$MONGO_PATH/$MONGO_PORT/conf/keyFile
keyFileSize=`ls -l $keyFilePath |awk '{print $5}'`
if [ -e $keyFilePath ] && [ $keyFileSize -gt 0 ];then
    echo "keyFile文件已存在!"  
else
    echo "keyFile文件不存在,请重新上传!" 
    exit 1
fi

安装+设置启停脚本+启动

#!/bin/bash

# 拷贝模板配置文件到对应目录
echo "=====开始拷贝模板配置文件到对应目录====="
cd $TEMP_PATH/$PKG_NAME
\cp $MONGO_PORT.conf $MONGO_PATH/$MONGO_PORT/conf/$MONGO_PORT.conf
\cp $MONGO_PATH/$MONGO_PORT/bin/* /usr/bin/

chown -R ${USER_NAME}:${USER_NAME} $MONGO_PATH
echo "=====开始设置启动脚本====="
# 设置启动脚本
cat > /usr/lib/systemd/system/mongodb.service <<-EOF
[Unit]
Description=mongodb 
After=network.target remote-fs.target nss-lookup.target
[Service]
User=${USER_NAME}
Type=forking
ExecStart=/data/public/mongo/${MONGO_PORT}/bin/mongod --config /data/public/mongo/${MONGO_PORT}/conf/${MONGO_PORT}.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/data/public/mongo/${MONGO_PORT}/bin/mongod --shutdown --config /data/public/mongo/${MONGO_PORT}/conf/${MONGO_PORT}.conf
Restart=always
PrivateTmp=true  
[Install]
WantedBy=multi-user.target
EOF
echo "=====启动并设置开机自启====="
systemctl daemon-reload
systemctl start mongodb.service
echo "=====启停方式:systemctl start|stop|restart mongodb====="

#按照端口判断,默认启动时间2分钟,判断两次,按需修改循环次数
echo "=====开始判断服务是否已启动成功====="
    for((i=1;i<=12;i++));
    do
        sleep 10
        ISSTART=$(netstat -nutlp|grep ${MONGO_PORT} |grep -v "grep"|wc -l)
        if [ "$ISSTART" != "0" ]; then
            echo "发现服务端口,为确保服务真正启动成功,等待15秒后进行第二次判断!"
                sleep 15
                ISSTART=$(netstat -nutlp|grep ${MONGO_PORT} |grep -v "grep"|wc -l)
                if [ "$ISSTART" != "0" ]; then
                    echo "等待15秒后端口仍启动,服务第二次判断通过,服务启动成功!"
                    exit 0
                else
                    echo "等待15秒后端口未启动,服务第二次判断失败,服务启动失败!"
                    exit 1
                fi
        else
            echo "服务启动中,请等待!"
        fi
    done
    echo "等待2分钟后未发现服务端口,服务启动失败!"
    exit 1

设置主从+仲裁

#!/bin/bash

echo "=====开始设置主从+仲裁====="
mongo --port ${MONGO_PORT} <<EOF
use admin
config = { 
      '_id': 'replSet0',
      'members': [
            {_id:0,host:"${PRIMARY}:${MONGO_PORT}",priority:2},
            {_id:1,host:"${SECONDARY}:${MONGO_PORT}",priority:1},
            {_id:2,host:"${ARBITER}:${MONGO_PORT}",arbiterOnly:true}
      ]
}
rs.initiate(config)
rs.reconfig(config, {force: true})
rs.status()
EOF

echo "=====设置主从+仲裁完成====="

创建管理员角色

#!/bin/bash

#创建admin用户
echo "=====开始创建admin用户====="
sleep 20 # 多次测试,判断是默认刚启动为从状态,切换为主时有一定的时间延迟,因此添加sleep 20
mongo --port ${MONGO_PORT} <<EOF
use admin
db.createUser(
  {
    user: "root",
    pwd: "${ROOT_PASSWD}",
    roles: [
       { role: "root",db: "admin" }]
  }
 )
EOF

echo "=====admin用户创建完成====="

添加认证并重启服务

#!/bin/bash

# 修改配置文件
echo "=====开始修改配置文件====="
echo -e "\nauth=true" >> ${MONGO_PATH}/${MONGO_PORT}/conf/${MONGO_PORT}.conf
echo -e "\nkeyFile=${MONGO_PATH}/${MONGO_PORT}/conf/keyFile" >> ${MONGO_PATH}/${MONGO_PORT}/conf/${MONGO_PORT}.conf

echo "开始重启mongodb"
service mongodb restart

#按照端口判断,默认启动时间2分钟,判断两次,按需修改循环次数
echo "=====开始判断服务是否已启动成功====="
    for((i=1;i<=12;i++));
    do
        sleep 10
        ISSTART=$(netstat -nutlp|grep ${MONGO_PORT} |grep -v "grep"|wc -l)
        if [ "$ISSTART" != "0" ]; then
            echo "发现服务端口,为确保服务真正启动成功,等待15秒后进行第二次判断!"
                sleep 15
                ISSTART=$(netstat -nutlp|grep ${MONGO_PORT} |grep -v "grep"|wc -l)
                if [ "$ISSTART" != "0" ]; then
                    echo "等待15秒后端口仍启动,服务第二次判断通过,服务启动成功!"
                    exit 0
                else
                    echo "等待15秒后端口未启动,服务第二次判断失败,服务启动失败!"
                    exit 1
                fi
        else
            echo "服务启动中,请等待!"
        fi
    done
    echo "等待2分钟后未发现服务端口,服务启动失败!"
    exit 1

判断集群状态

#!/bin/bash
CLUSTER_STATUS=`echo "rs.status()" | mongo admin -uroot -p${ROOT_PASSWD} --port ${MONGO_PORT}|grep stateStr |awk '{print $(NF-2) $(NF-1) $NF}'`
PRI_NUM=`echo "rs.status()" | mongo admin -uroot -p${ROOT_PASSWD} --port ${MONGO_PORT} |grep PRIMARY |wc -l`
SEC_NUM=`echo "rs.status()" | mongo admin -uroot -p${ROOT_PASSWD} --port ${MONGO_PORT} |grep SECONDARY |wc -l`
ARB_NUM=`echo "rs.status()" | mongo admin -uroot -p${ROOT_PASSWD} --port ${MONGO_PORT} |grep ARBITER |wc -l`

sleep 20 # 多次测试,判断是默认刚启动为从状态,切换为主时有一定的时间延迟,因此添加sleep 20
if [ ${PRI_NUM} == '1' ] && [ ${SEC_NUM} == '1' ] && [ ${ARB_NUM} == '1' ];then
    echo "=====集群状态正常!====="
    echo "$CLUSTER_STATUS"
else
    echo "=====集群状态异常,请检查!====="
fi

清理临时目录安装包

rm -rf ${TEMP_PATH}
mkdir -p ${TEMP_PATH}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值