#安装脚本
###############################安装mysql客户端
if [ "$1" == "install_mysql_cli" ];then
rpm -Uvh https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
yum install --nogpgcheck mysql-community-client -y
fi
###############################安装主节点
if [ "$1" == "install_mysql_master" ];then
if [ -d "/mysql_data/mysql_master" ];then
echo -e "\033[31m '__________________________________ 存在mysql_master文件夹,为防止覆盖原有mysql数据,退出安装 ,and EXIT' \033[0m"
exit 1
fi
mkdir -p /mysql_master/{log,data,conf/conf.d}
cat >> /mysql_master/conf/my.cnf <<EOF
[mysqld]
server-id=1
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
secure-file-priv= NULL
log-bin=mysql-bin ##开启⼆进制⽇志
binlog-ignore-db=mysql ## 指定不需要同步的数据库名称
# Custom config should go here
#!includedir /etc/mysql/conf.d/
#skip-log-bin
EOF
docker run --name mysql_master -itd --network=host --restart=always -v /mysql_master/log:/var/log/mysql -v /mysql_master/data:/var/lib/mysql -v /mysql_master/conf:/etc/mysql -v /etc/localtime:/etc/localtime -e MYSQL_ROOT_PASSWORD=$2 mysql:8.0.30
sleep 1
docker ps
echo -e "\033[32m '>>>>>> mysql master 节点安装完成' \033[0m"
fi
###############################安装从节点1
if [ "$1" == "install_mysql_slave1" ];then
if [ -d "/mysql_data/mysql_slave1" ];then
echo -e "\033[31m '__________________________________ 存在mysql_slave1文件夹,为防止覆盖原有mysql数据,退出安装 ,and EXIT' \033[0m"
exit 1
fi
mkdir -p /mysql_slave1/{log,data,conf/conf.d}
cat >> /mysql_slave1/conf/my.cnf <<EOF
[mysqld]
server-id=2
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
secure-file-priv= NULL
log-bin=mysql-bin ##开启⼆进制⽇志
binlog-ignore-db=mysql ## 指定不需要同步的数据库名称
# Custom config should go here
#!includedir /etc/mysql/conf.d/
#skip-log-bin
EOF
docker run --name mysql_slave1 -itd --network=host --restart=always -v /mysql_slave1/log:/var/log/mysql -v /mysql_slave1/data:/var/lib/mysql -v /mysql_slave1/conf:/etc/mysql -v /etc/localtime:/etc/localtime -e MYSQL_ROOT_PASSWORD=$2 mysql:8.0.30
sleep 1
docker ps
echo -e "\033[32m '>>>>>> mysql slave1 节点安装完成' \033[0m"
fi
###############################安装从节点2
if [ "$1" == "install_mysql_slave2" ];then
if [ -d "/mysql_data/mysql_slave2" ];then
echo -e "\033[31m '__________________________________ 存在mysql_slave2文件夹,为防止覆盖原有mysql数据,退出安装 ,and EXIT' \033[0m"
exit 1
fi
mkdir -p /mysql_data/mysql_slave2/{log,data,conf/conf.d}
cat >> /mysql_data/mysql_slave2/conf/my.cnf <<EOF
[mysqld]
server-id=3
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
secure-file-priv= NULL
log-bin=mysql-bin ##开启⼆进制⽇志
binlog-ignore-db=mysql ## 指定不需要同步的数据库名称
# Custom config should go here
#!includedir /etc/mysql/conf.d/
#skip-log-bin
EOF
docker run --name mysql_slave2 -itd --network=host --restart=always -v /mysql_data/mysql_slave2/log:/var/log/mysql -v /mysql_data/mysql_slave2/data:/var/lib/mysql -v /mysql_data/mysql_slave2/conf:/etc/mysql -v /etc/localtime:/etc/localtime -e MYSQL_ROOT_PASSWORD=$2 mysql:8.0.30
sleep 1
docker ps
echo -e "\033[32m '>>>>>> mysqlslave2 节点安装完成' \033[0m"
fi
###############################创建slave用户并赋予权限
if [ "$1" == "create_slave_user" ];then
mysql -h 127.0.0.1 -u root -p$2 -e "CREATE USER 'slave_user'@'%' IDENTIFIED BY '$3';"
sleep 1
mysql -h 127.0.0.1 -u root -p$2 -e "GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave_user'@'%';"
fi
###############################查看binlog位置
if [ "$1" == "get_addr" ];then
mysql -h $2 -u root -p$3 -e "show master status;"
fi
###############################slave配置
if [ "$1" == "init_slave" ];then
mysql -h $2 -u root -p$3 -e "change master to master_host='$4', master_user='slave_user', master_password='$5', master_port=3306, master_log_file='$6', master_log_pos=$7, master_connect_retry=30;"
fi
###############################查看从库状态
if [ "$1" == "status_slave" ];then
echo $2 "从库状态如下"
mysql -h $2 -u root -p$3 -e "show slave status \G;"
fi
###############################启动从库状态
if [ "$1" == "start_slave" ];then
mysql -h $2 -u root -p$3 -e "start slave;"
fi
```
安装说明
```
docker安装mysql主从集群安装说明
三个节点 主节点(192.168.2.10) 从节点1(192.168.2.11) 从节点2(192.168.2.12)
脚本名称 mysql.txt
# 所有节点执行下载mysql镜像命令
docker pull mysql:8.0.30
# 在主节点节点安装mysql客户端
sh mysql.txt install_mysql_cli
# 在主节点执行安装容器
sh mysql.txt install_mysql_master pas1
#pas1为自定义的root密码,三个节点使用相同的root密码便于管理
# 在从节点1安装容器
sh mysql.txt install_mysql_slave1 pas1
#pas1为自定义的root密码,三个节点使用相同的root密码便于管理
# 在从节点2安装容器
sh mysql.txt install_mysql_slave2 pas1
#pas1为自定义的root密码,三个节点使用相同的root密码便于管理
# 在主节点执行创建slave用户并赋予权限
sh mysql.txt create_slave_user pas1 pas2
#pas2为集群内部认证密码可以跟root密码设置成一样的
# 在主节点执行查看binlog位置
sh mysql.txt get_addr 127.0.0.1 pas1
#其中Filed的值为日志名称, Position值为日志位置
# 在主节点执行针对slave1的配置
sh mysql.txt init_slave 192.168.2.11 pas1 192.168.2.10 pas2 日志名称 日志位置
#说明: sh mysql.txt init_slave slave1的ip root密码 主节点ip 集群密码 日志名称 日志位置
# 在主节点执行针对slave2的配置
sh mysql.txt init_slave 192.168.2.12 pas1 192.168.2.10 pas2 日志名称 日志位置
# 在主节点执行查看从库状态
sh mysql.txt status_slave 192.168.2.11 pas1
sh mysql.txt status_slave 192.168.2.12 pas1
# 在主节点执行启动从库状态
sh mysql.txt start_slave 192.168.2.11 pas1
sh mysql.txt start_slave 192.168.2.12 pas1
# 在主节点执行再次查看从库状态,观察有无错误
sh mysql.txt status_slave 192.168.2.11 pas1
sh mysql.txt status_slave 192.168.2.12 pas1
# 写入数据测试
写入统一使用主机的3306端口