原理:MySQL 的主从复制和 MySQL的读写分离两者有着紧密联系,首先要部署主从复制,只有主从复制完成了,才能在此基础上进行数据的读写分离。
(1)MySQL 支持的复制类型
①基于语句的复制。在主服务器上执行的 SQL 语句,在从服务器上执行同样的语句,MySQL 默认采用基于语句的复制,效率比较高。
②基于行的复制。把改变的内容复制过去,而不是把命令在从服务器上执行一遍。
③混合类型的复制。默认采用基于语句的复制,一旦发现基于语句无法精确复制时,就会采用基于行的复制。
(2)复制工作过程
①在每个事务更新数据完成之前,Master 将这些改变记录进二进制日志。写入二进制日志完成后,Master 通知存储引擎提交事务。
②Slave 将 Master 的 Binary log 复制到其中继日志(Relay log)。首先,Slave 开始一个工作线程--I/0 线程,I/0 线程在 Master 上打开一个普通的连接,然后开始 Binlog dump process。Binlog dump process 从 Master 的进制日志中读取事件,如果已经跟上 Master,它会睡眠并等待 Master 产生新的事件。I/0 线程将这些事件写入中继日志。
③ SQL slave thread(SQL 从线程)处理该过程的最后一步。SQL 线程从中继日志读取事件,并重放其中的事件而更新 Slave 数据,使其与 Master 中的数据保持一致。只要该线程与 I/0 线程保持一致,中继日志通常会位于0S 的缓存中,所以中继日志的开销很小。复制过程有一个很重要的限制,即复制在S1ave 上是串行化的,也就是说 Master 上的并行更新操作不能在 Slave 上并行操作。
搭建主从复制
主服务器配置:
1.在所有节点进行时间同步
yum -y install ntpdate
ntpdate ntpl.aliyun.com
2.配置防火墙和SELiunx
systemctl stop firewalld
systemctl disable firewalld
sed -i 's/SELinux=enforcing/SELINUX=disabled/g' /etc/selinux/config
setenforce 0
3.安装MySQL数据库(此处略)
4.配置Master主服务器
(1)在/etc/my.cnf中修改或增加下面内容
log-bin=/usr/local/mysql/data/mysql-bin 启用二进制日志(Binary Log)并指定其存储路径
binlog_format=MIXED 定义二进制日志的记录格式为混合模式
server-id=1 为mysql实例分配一个唯一的服务器标识符
(2)重启MySQL服务
systemctl restart mysqld
(3)登录MySQL程序,给从服务器授权
alter user 'root'@'localhost' identified with mysql_native_password by '123456';
create user 'myslave'@'%' identified by '123456';
grant replication slave on *.* to 'myslave'@'%';
alter user 'myslave'@'%' identified with mysql_native_password by '123456';
flush privileges;
show master status;
其中File列显示日志名,Position列显示偏移量,这两个值在后面配置从服务器的时候需要。Slave应从该点进行新的更新
从服务器配置:
(1)修改配置文件,server-id不能相同
vim /etc/my.cnf
server-id=2 增加,唯一的服务器标识符,集群内不能冲突
(2)重启Mysql服务
systemctl restart mysqld
(3)登录mysql,配置同步
按主服务器结果更改下面命令中master_log_file和master_log_pos参数
mysql -uroot -ppwd123
alter user 'root'@'localhost' identified with mysql_password by '123456';
change master to master_host='192.168.10.101',master_user='myslave',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=157;
(4)启动同步
mysql>start slave;
(5)查看slave状态,确保以下两个值为YES
mysql>show slave status\G