MySQL主从复制概述:
主从复制时指数据<MySQL>可以从一个服务器主节点复制到另一个或多个从节点<MySQL>。
MySQL默认采用异步复制方式,从节点不用一直访问主服务器来更新自己的数据,数据的更新可以在远程连接上进行,从节点可以复制主数据库中的所有数据库或者特定的数据,或者特定的表。
MySQL主从复制原理:
1、Master服务器,数据改变会记录二进制binlog日志,当master上的数据发生改变时,写入二进制日志中;
2、Slave服务器,在一定时间间隔内对master二进制日志进行探测其是否发生改变,如果发生改变,则开始一个I/O Thread请求master二进制事件;
3、Master服务器(主节点),为每个I/O线程启动一个dump线程,用于向其发送二进制事件,并保存至从节点本地的中继日志中;
4、Slave服务器(从节点),启动SQL线程从中继日志中读取二进制日志,在本地重放,使得其数据和主节点保持一致,最后I/O Thread和SQL Thread将进入睡眠状态,等待下一次同步再次被唤醒。
总结:
1、从库(Slave服务器)会生成两个线程,一个I/O线程,一个SQL线程;I/O线程会去请求主库(Master服务器)的binlog,并将得到的binlog写到本地的relay-log(中继日志)文件中;
2、主库(Master服务器)会生成一个log dump线程,用来给从库(Slave服务器)I/O线程传递binlog;
3、从库(Slave服务器),SQL线程,会读取relay log文件中的日志,并解析成SQL语句逐一执行;
主从安装:
安装环境:
操作系统环境:CentOS Linux release 7.7.1908 (Core),MySQL8
单台安装:Linux,CentOS安装MySQL8、设置密码和远程登录
安装目标:服务器node11(192.168.1.11)为Master服务器,服务器node11(192.168.1.12)为Slave服务器;
MySQL安装完成后,配置文件(/etc/my.cnf)的默认内容为:
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
此时,先做备份:
cp /etc/my.cnf /etc/my.init.cnf
Master服务器,配置(/etc/my.cnf):
[client]
# 设置mysql客户端连接服务端时默认使用的端口
port=3306
default-character-set=utf8
[mysql]
default-character-set=utf8
protocol=tcp
[mysqld]
# 设置3306端口
port=3306
# 允许最大连接数
max_connections=10000
# 允许连接失败的次数。这是为了防止有人从该主机试图攻击数据库系统
max_connect_errors=10
# 服务端使用的字符集默认为UTF8
character-set-server=utf8
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
# 默认使用“mysql_native_password”插件认证
default_authentication_plugin=mysql_native_password
server-id = 11
log-bin=mysql-bin
max_binlog_size=1024M
auto_increment_offset=1
auto_increment_increment=4
log-slave-updates=true
secure_file_priv=/tmp/
replicate-do-db=share
重启服务器:systemctl restart mysqld
Slave服务器,配置(/etc/my.cnf):
[client]
# 设置mysql客户端连接服务端时默认使用的端口
port=3306
default-character-set=utf8
[mysql]
default-character-set=utf8
protocol=tcp
[mysqld]
# 设置3306端口
port=3306
# 允许最大连接数
max_connections=10000
# 允许连接失败的次数。这是为了防止有人从该主机试图攻击数据库系统
max_connect_errors=10
# 服务端使用的字符集默认为UTF8
character-set-server=utf8
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
# 默认使用“mysql_native_password”插件认证
default_authentication_plugin=mysql_native_password
server-id = 12
log-bin=mysql-bin
max_binlog_size=1024M
auto_increment_offset=2
auto_increment_increment=4
log-slave-updates=true
secure_file_priv=/tmp/
replicate-do-db=share
重启服务器:systemctl restart mysqld
Master服务器,创建同步用户并分配权限:
#创建用户
mysql> set global validate_password.policy=0;
mysql> set global validate_password.length=6;
mysql> create user 'repl'@'192.168.1.12' identified with mysql_native_password by 'repl1234';
#分配权限
mysql> grant replication slave on *.* to 'repl'@'192.168.1.12';
mysql> grant replication client on *.* to 'repl'@'192.168.1.12';
mysql> flush privileges;
#查看分配权限:
mysql> show grants for 'repl'@'192.168.1.12';
#查看主机MySQL状态:
mysql> show master status;
Slave服务器,启动主从复制:
mysql> change master to
master_host='192.168.1.11',
master_user='repl',
master_password='repl1234',
master_log_file='mysql-bin.000001',
master_log_pos=1508;
mysql> start slave;
注意参数:master_host、master_user、master_password、master_log_file、master_log_pos;
Master服务器(show processlist\G):
Slave服务器(show processlist\G):
Slave服务器(show slave status\G):