三台虚拟机
10.0.0.51 db01
10.0.0.52 db02
10.0.0.53 db03
防火墙关闭
systemctl disable firewalld
selinux 关闭
sed -i s#SELINUX=enforcing#SELINUX=disabled# /etc/selinux/config
重启物理机
reboot
#清理环境:
pkill mysqld
rm -rf /data/3306/*
mkdir -p /data/3306/data /data/3306/binlog
chown -R mysql.mysql /data/*
准备配置文件
主库db01:
mv /etc/my.cnf /tmp
cat > /etc/my.cnf <<EOF
[mysqld]
basedir=/usr/local/mysql80
datadir=/data/3306/data
socket=/tmp/mysql.sock
server_id=51
port=3306
secure-file-priv=/tmp
log_bin=/data/3306/binlog/mysql-bin
binlog_format=row
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
innodb_undo_directory=/data/3306/data
innodb_undo_tablespaces = 2
innodb_undo_logs = 128
[mysql]
prompt=db01 [\\d]>
EOF
slave1(db02):
mv /etc/my.cnf /tmp
cat > /etc/my.cnf <<EOF
[mysqld]
basedir=/usr/local/mysql80
datadir=/data/3306/data
socket=/tmp/mysql.sock
server_id=52
port=3306
secure-file-priv=/tmp
log_bin=/data/3306/binlog/mysql-bin
binlog_format=row
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
innodb_undo_directory=/data/3306/data
innodb_undo_tablespaces = 2
innodb_undo_logs = 128
[mysql]
prompt=db02 [\\d]>
EOF
slave2(db03):
mv /etc/my.cnf /tmp
cat > /etc/my.cnf <<EOF
[mysqld]
basedir=/usr/local/mysql80
datadir=/data/3306/data
socket=/tmp/mysql.sock
server_id=53
port=3306
secure-file-priv=/tmp
log_bin=/data/3306/binlog/mysql-bin
binlog_format=row
gtid-mode=on
enforce-gtid-consistency=true
innodb_undo_directory=/data/3306/data
innodb_undo_tablespaces = 2
innodb_undo_logs = 128
log-slave-updates=1
[mysql]
prompt=db03 [\\d]>
EOF
初始化数据
mysqld --initialize-insecure --user=mysql --basedir=//usr/local/mysql80 --datadir=/data/3306/data
启动数据库
/usr/local/mysql80/support-files/mysql.server start
3.1 通过mysqldump(XBK)备份构建传统主从
a.各节点检查server_id、server_uuid、binlog
mysql -e "select @@server_id; select @@server_uuid;show variables like 'log_bin%';"
b.主库(51)创建复制用户和远程管理用户
mysql -e "create user repl@'10.0.0.%' identified with mysql_native_password by '123';grant replication slave on *.* to repl@'10.0.0.%';"
mysql -e "create user root@'10.0.0.%' identified with mysql_native_password by '123';grant all on *.* to root@'10.0.0.%';"
mysql -e "select user,host,plugin from mysql.user;"
主库创建复制用户
alter user root@'localhost' identified with mysql_native_password by '123';
使用pos位点创建主从同步。
change master to master_host='10.0.0.51',master_port=3306,master_user='repl',
master_password='123',master_log_file='binlog.000001',master_log_pos=156, master_connect_retry=30;
# master_host:对应主服务器的IP地址。
# master_port:对应主服务器的端口。
# master_user:在主数据库创建的用于同步数据的用户账号。
# master_password:在主数据库创建的用于同步数据的用户密码。
# master_log_file:指定从数据库要复制数据的日志文件,对应show master status显示。
# 的File字段的取值,我这里是master-bin.000001。
# master_log_pos:指定从数据库从哪个位置开始复制数据,对应show master status显示的Position字段# 的取值,我这里是154。
复制相关命令
start slave; #启动数据库
stop slave; #关闭数据库
reset slave; #重置数据库
基于GTID复制(保证从库的干净。不要在从库上哪怕建一个用户。)
mysql -e "CHANGE MASTER TO MASTER_HOST='10.0.0.51', MASTER_USER='repl', MASTER_PASSWORD='123', MASTER_PORT=3306, MASTER_AUTO_POSITION=1;"
半同步、增强半同步开启
下面的俩参数 timeout 代表当前事务提交10s没有返回ack断掉变成异步复制的方式。
slave_enabled=1,代表只要一个从库复制成功就返回ack。
问题4业务比较集中的时候可以选择不设置半同步锁的事务。
MGR架构原理
change master to master_host=‘127.0.0.1’,master_port=3306,master_user=‘repl’,
master_password=‘123’,master_log_file=‘log.000010’,master_log_pos=154, master_connect_retry=30;