centos7一鍵部署mariadb數據庫【單點主主主備】

1. 概述

平時集羣需要經常部署mariadb數據庫服務。mariadb的部署,有很多種方式,可以根據實際需求選擇不同的部署架構。

比較常用的包括:

  • 單點部署
  • 雙主部署
  • 主從部署

本篇內容主要主要是完成另一個支持這三種部署方式的腳本,在平時使用足夠。

腳本在安裝了centos7.9的虛擬機環境測試過,偶爾會發生錯誤,其他時間都能夠正常部署。

2. 代碼如下

保存爲:my_mariadb_install.sh後,執行該腳本即可

my_mariadb_install.sh s 單點部署

my_mariadb_install.sh ms 主從架構

my_mariadb_install.sh mm 雙主架構

腳本僅在我自己部署的虛擬機測試通過,切勿用於生產環境

#!/bin/bash
#部署maraidb的腳本

if [ "$1"  != "s" ] && [ "$1" != "mm" ] && [ "$1" != "ms" ]
then
        echo "$(basename $0) [s|mm|ms]"
        exit 0
fi

#創建單節點部署腳本
cat << EOF > install_modify_mariadb.sh
HOSTNAME=\$1
IP=\$2
PASSWORD=\$3
echo "數據庫主機名:\${HOSTNAME},數據庫IP:\${IP},數據庫密碼是:\${PASSWORD}"
echo -ne "正在yum安裝mariadb..."
yum -y install mariadb mariadb-server mariadb-devel mariadb-libs > /dev/null 2>&1
echo "安裝完成."
echo "配置編碼..."
SERVER_CONF=(
        init_connect='SET collation_connection = utf8_unicode_ci'
        init_connect='SET NAMES utf8'
        character-set-server=utf8
        collation-server=utf8_general_ci
        skip-character-set-client-handshake
        max-connections=4096
        open-files-limit=4096
        innodb_buffer_pool_size=1024M
        innodb_log_file_size=64M
        innodb_lock_wait_timeout=900
)
LENTH=\${#SERVER_CONF[*]}
for i in \$(seq 0 \$((\${LENTH}-1)))
do
        sed -i "/mariadb-5.5/a\${SERVER_CONF[LENTH-i-1]}" /etc/my.cnf.d/server.cnf
done

CLIENT_CONF=(
        default-character-set=utf8
)
for line in \${CLIENT_CONF[*]}
do
        sed -i "/client-mariadb/a\${line}" /etc/my.cnf.d/client.cnf
done

echo "配置最大連接數..."
sed -i '/PrivateTmp/a\LimitNOFILE=10000' /usr/lib/systemd/system/mariadb.service
systemctl daemon-reload
systemctl enable mariadb -q

echo "啓動服務..."
systemctl start mariadb  2>/dev/null && echo "本地節點:\${IP}數據庫啓動成功..."
echo "初始化數據庫..."
mysql << HHH > init_mariadb.sh
delete from mysql.user where user = " " and host = "localhost";
delete from mysql.user where user = " " and host = "127.0.0.1";
delete from mysql.user where user = " " and host = "\${HOSTNAME}";
delete from mysql.user where user = "root" and host = "\${HOSTNAME}";
delete from mysql.user where user = "root" and host = "::1";
grant all privileges on *.* to 'root'@'localhost' identified by '\${PASSWORD}';
grant all privileges on *.* to 'root'@'127.0.0.1' identified by '\${PASSWORD}';
flush privileges;
HHH
/bin/bash init_mariadb.sh
EOF

#創建雙節點腳本
cat << EOF > master_conf.sh
#寫配置文件
m1_conf=(
        log-bin=mysql-bin 
        server-id=1
        auto_increment_increment=2 
        auto_increment_offset=1
)
for line in \${m1_conf[*]}
do
        sed -i "/mysqld_safe/i\${line}" /etc/my.cnf
done
systemctl restart mariadb
EOF

cat << EOF > master_mariadb.sh
PASSWORD=\$1
REMOTEIP=\$2
sql="grant replication slave on *.* to 'repl'@'\${REMOTEIP}' identified by '\${PASSWORD}';"
mysql -hlocalhost -uroot -p\${PASSWORD} -e "\${sql}"
sql="flush privileges;"
mysql -hlocalhost -uroot -p\${PASSWORD} -e "\${sql}"
sql="show master status"
rtn=\$(mysql -hlocalhost -uroot -p\${PASSWORD} -N -e "\${sql}")
mysqlbin=\$(echo \${rtn}|awk '{print \$1}')
posttion=\$(echo \${rtn}|awk '{print \$2}')
echo "\${mysqlbin} \${posttion}"
EOF

cat << EOF > slave_conf.sh
m2_conf=(
        log-bin=mysql-bin 
        server-id=2 
        auto_increment_increment=2 
        auto_increment_offset=2
)
for line in \${m2_conf[*]}
do
        sed -i "/mysqld_safe/i\${line}" /etc/my.cnf
done
systemctl restart mariadb
EOF

cat << EOF > slave_mariadb.sh
PASSWORD=\$1
MASTER_IP=\$2
mysqlbin=\$3
position=\$4
sql="change master to master_host='\${MASTER_IP}',master_user='repl',master_password='\${PASSWORD}',master_log_file='\${mysqlbin}',master_log_pos=\${position};"
mysql -hlocalhost -uroot -p\${PASSWORD} -e "\${sql}"
sql="start slave;"
mysql -hlocalhost -uroot -p\${PASSWORD} -e "\${sql}"
EOF

#腳本功能

#單節點模式
if [ "${1}" == "s" ]
then
echo "mariadbg單節點快速部署--->"
read -p "數據庫root密碼:" PASSWORD
if [ "${PASSWORD}" == "" ]
then
        PASSWORD="liwanliang"
fi
read -p "輸入節點的[IP地址]:" IP
if [ "${IP}" == "" ]
then
        echo "未輸入IP,退出"
        exit 0
fi
read -p "輸入節點的(主機名):" HOST_NAME
if [ "${HOST_NAME}" == ]
then
        echo "未輸入主機名,退出"
        exit 0
fi
/bin/bash install_modify_mariadb.sh ${HOST_NAME} ${IP} ${PASSWORD}
#rm -rf install_modify_mariadb.sh
#雙節點模式(主從)
elif [ "${1}" == "ms" ]
then
echo "mariadb主從架構部署--->"
read -p "數據庫root密碼:" PASSWORD
read -p "主節點master的[IP地址]:" IP1
read -p "主節點master的(主機名):" HOSTNAME1
read -p "從節點slave的[IP地址]:" IP2
read -p "從節點slave的(主機名):" HOSTNAME2
#本地安裝
/bin/bash install_modify_mariadb.sh ${HOSTNAME1} ${IP1} ${PASSWORD}
/bin/bash master_conf.sh
#遠程安裝
scp install_modify_mariadb.sh ${IP2}:/tmp
ssh ${IP2} "/bin/bash /tmp/install_modify_mariadb.sh ${HOSTNAME2} ${IP2} ${PASSWORD}"
scp slave_conf.sh ${IP2}:/tmp
ssh ${IP2} "/bin/bash /tmp/slave_conf.sh"
#本地執行主節點腳本
rtn=$(/bin/bash master_mariadb.sh ${PASSWORD} ${IP2})
echo "主節點狀態信息:${rtn}"
mysqlbin=$(echo ${rtn}|awk '{print $1}')
position=$(echo ${rtn}|awk '{print $2}')
#遠程執行從腳本
scp slave_mariadb.sh ${IP2}:/tmp/
ssh ${IP2} "/bin/bash /tmp/slave_mariadb.sh ${PASSWORD} ${IP1} ${mysqlbin} ${position}"
### 主主架構
elif [ "${1}" == "mm" ]
then
echo "mariadb主主架構部署--->"
read -p "數據庫root密碼:" PASSWORD
read -p "主節點master1的[IP地址]:" IP1
read -p "主節點master1的(主機名):" HOSTNAME1
read -p "主節點master2的[IP地址]:" IP2
read -p "主節點master2的(主機名):" HOSTNAME2
#本地安裝
/bin/bash install_modify_mariadb.sh ${HOSTNAME1} ${IP1} ${PASSWORD}
/bin/bash master_conf.sh
#遠程安裝
scp install_modify_mariadb.sh ${IP2}:/tmp
ssh ${IP2} "/bin/bash /tmp/install_modify_mariadb.sh ${HOSTNAME2} ${IP2} ${PASSWORD}"
scp slave_conf.sh ${IP2}:/tmp 
ssh ${IP2} "/bin/bash /tmp/slave_conf.sh"
#本地執行主節點腳本
rtn=$(/bin/bash master_mariadb.sh ${PASSWORD} ${IP2})
echo "主節點master1狀態信息:${rtn}"
mysqlbin=$(echo ${rtn}|awk '{print $1}')
position=$(echo ${rtn}|awk '{print $2}')
#遠程執行從腳本
scp slave_mariadb.sh ${IP2}:/tmp/
ssh ${IP2} "/bin/bash /tmp/slave_mariadb.sh ${PASSWORD} ${IP1} ${mysqlbin} ${position}"
scp master_mariadb.sh ${IP2}:/tmp/
rtn=$(ssh ${IP2} "/bin/bash /tmp/master_mariadb.sh ${PASSWORD} ${IP1}")
echo "主節點master2狀態信息:${rtn}"
mysqlbin=$(echo ${rtn}|awk '{print $1}')
position=$(echo ${rtn}|awk '{print $2}')
/bin/bash slave_mariadb.sh ${PASSWORD} ${IP2} ${mysqlbin} ${position}
fi
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章