#!/bin/bash
# file: mysql_ha_master_slave_auto_config.sh
# purpose: 自动配置MySQL主从架构
# 前提:
# 1. 已经安装好了MySQL的两台服务器
# 2. 服务器服务已运行
# 3. 服务器之间的SSH互信
# 默认情况下,该脚本在主库端执行
# =====================
# variable
# ----------
# 服务器相关
ip_master=192.168.174.128
ip_slave=192.168.174.129
# 当前服务器角色:
# 1,主库端
# 2,从库端
current_role=""
os_user='root'
os_password='*************'
# ----------
# 数据库相关
# 用户
mysql_root_user='root'
mysql_root_password='*******'
mysql_repl_user='replme'
mysql_repl_password='*******'
# 配置
mysql_port='33944'
# 文件
file_mysql_cnf='/etc/my.cnf'
# 参数
# server-id
#mysql_parameter_server_id_master=0
#mysql_parameter_server_id_slave=0
#mysql_parameter_server_id_diff=5
# 主从相关信息
mysql_replication_file=""
mysql_replication_pos=0
# ----------
# ----------
# ----------
# =====================
# function
# ------------
function do_sql() {
# variable
func_str_ip="$1"
func_str_sql="$2"
# ----------------------
# changed
func_str_user="$3"
func_str_password="$4"
func_str_port="$5"
# ----------------------
#echo "func_str_ip --> $func_str_ip"
#echo "func_str_sql --> $func_str_sql"
#echo "func_str_user --> $func_str_user"
#echo "func_str_password --> $func_str_password"
#echo "func_str_port --> $func_str_port"
echo
# action
# 本场景中不涉及到对MySQL某个库的操作,所以没有选择[db]
# mysql -u $user -p"$password" $db -N -e "$f_sql_str"
mysql -h"$func_str_ip" -P$func_str_port -u "$func_str_user" -p"$func_str_password" -N -e "$func_str_sql"
}
# ------------
# 对指定主机执行Linux命令
# 前提:
# 1. IP可达
# 2. SSH等价关系
function do_linux_by_ssh() {
# variable
func_str_ip="$1"
func_str_user="$2"
func_str_command="$3"
# action
ssh -t $func_str_user@$func_str_ip "$func_str_command"
}
# ------------
# 检查当前运行服务器角色
function check_machine_role() {
f_current_ip=$(ifconfig | grep "inet addr" | head -n 1 | cut -d':' -f2 | cut -d' ' -f1)
if [ "$f_current_ip" == "$ip_master" ]
then
current_role="1"
elif [ "$f_current_ip" == "$ip_slave" ]
then
current_role="2"
else
echo "--> Not Match."
fi
}
# ------------
# 计算和
function calc_sum() {
#statements
num1=$1
num2=$2
echo $(($num1+$num2))
}
# ------------
# 主库端操作
function mysql_master_config() {
echo "--> 初步查看"
do_sql "$ip_master" "show master status;" "$mysql_root_user" "$mysql_root_password" "$mysql_port"
do_sql "$ip_master" "select user,host from mysql.user;" "$mysql_root_user" "$mysql_root_password" "$mysql_port"
# 增加Replication用户
echo "Add user replication"
do_sql "$ip_master" "create user $mysql_repl_user@'$ip_slave' identified by '$mysql_repl_password';" "$mysql_root_user" "$mysql_root_password" "$mysql_port"
do_sql "$ip_master" "grant replication slave,replication client on *.* to $mysql_repl_user@'$ip_slave'" "$mysql_root_user" "$mysql_root_password" "$mysql_port"
# 增加root用户
do_sql "$ip_master" "create user $mysql_root_user@'$ip_master' identified by '$mysql_repl_password';" "$mysql_root_user" "$mysql_root_password" "$mysql_port"
do_sql "$ip_master" "grant all privileges on *.* to $mysql_root_user@'$ip_master" "$mysql_root_user" "$mysql_root_password" "$mysql_port"
do_sql "$ip_master" "create user $mysql_root_user@'$ip_slave' identified by '$mysql_repl_password';" "$mysql_root_user" "$mysql_root_password" "$mysql_port"
do_sql "$ip_master" "grant all privileges on *.* to $mysql_root_user@'$ip_slave" "$mysql_root_user" "$mysql_root_password" "$mysql_port"
# 再次查看
do_sql "$ip_master" "select user,host from mysql.user;" "$mysql_root_user" "$mysql_root_password" "$mysql_port"
# 获取基本信息
mysql_replication_file=`do_sql "$ip_master" "show master status;" "$mysql_root_user" "$mysql_root_password" "$mysql_port" | awk '{printf $1}'`
mysql_replication_pos=`do_sql "$ip_master" "show master status;" "$mysql_root_user" "$mysql_root_password" "$mysql_port" | awk '{printf $2}'`
# display
echo "主库端:file - [$mysql_replication_file]; POS - [$mysql_replication_pos]"
}
# ------------
# 从库端操作
function mysql_slave_config() {
# 初步查看
do_sql "$ip_slave" "show master status;" "$mysql_root_user" "$mysql_root_password" "$mysql_port"
do_sql "$ip_slave" "select user,host from mysql.user;" "$mysql_root_user" "$mysql_root_password" "$mysql_port"
# 增加用户 - root
# 增加root用户
echo "Add user"
do_sql "$ip_slave" "create user $mysql_root_user@'$ip_master' identified by '$mysql_repl_password';" "$mysql_root_user" "$mysql_root_password" "$mysql_port"
do_sql "$ip_slave" "grant all privileges on *.* to $mysql_root_user@'$ip_master" "$mysql_root_user" "$mysql_root_password" "$mysql_port"
do_sql "$ip_slave" "create user $mysql_root_user@'$ip_slave' identified by '$mysql_repl_password';" "$mysql_root_user" "$mysql_root_password" "$mysql_port"
do_sql "$ip_slave" "grant all privileges on *.* to $mysql_root_user@'$ip_slave" "$mysql_root_user" "$mysql_root_password" "$mysql_port"
# 再次查看
do_sql "$ip_slave" "select user,host from mysql.user;" "$mysql_root_user" "$mysql_root_password" "$mysql_port"
# Change master
echo "Change Master"
echo "--------------"
echo "Command is:"
"change master to master_host='$ip_master',master_port=$mysql_port,master_user='$mysql_repl_user',master_password='$mysql_repl_password',master_log_file='$mysql_replication_file',master_log_pos=$mysql_replication_pos;"
echo "--------------"
do_sql "$ip_slave" "change master to master_host='$ip_master',master_port=$mysql_port,master_user='$mysql_repl_user',master_password='$mysql_repl_password',master_log_file='$mysql_replication_file',master_log_pos=$mysql_replication_pos;" "$mysql_root_user" "$mysql_root_password" "$mysql_port"
# display
do_sql "$ip_slave" "show slave status\G" "$mysql_root_user" "$mysql_root_password" "$mysql_port"
# run
echo "Start slave"
do_sql "$ip_slave" "start slave" "$mysql_root_user" "$mysql_root_password" "$mysql_port"
}
# =====================
# display
# =====================
# begin
# 判定当前服务器角色
check_machine_role
echo "当前脚本执行服务器角色:$current_role"
# 配置主库端
echo ""
echo "主库"
echo "==============="
mysql_master_config
# 配置从库端
echo ""
echo "从库"
echo "==============="
mysql_slave_config
# =====================
# end
# =====================
# Finished