简介
1.Replication可以实现将数据从一台数据库服务器(master)复制到一或多台数据库服务器(slave)
2.默认情况下属于异步复制,无需维持长连接
3.通过配置,可以复制所有的库或者几个库,甚至库中的一些表
4.是MySQL内建的,本身自带的
作用
1.Fail Over 故障切换
2.Backup Server 备份服务,无法对SQL语句执行产生的故障恢复,有限的备份
3.High Performance高性能,可以多台slave,实现读写分离
原理
简单的说就是master将数据库的改变写入二进制日志,slave同步这些二进制日志,并根据这些二进制日志进行数据操作
步骤
第一步:master记录二进制日志。在每个事务更新数据完成之前,master在二进制日志记录这些改变。MySQL将事务写入二进制日志,即使事务中的语句都是交叉执行的。在事件写入二进制日志完成后,master通知存储引擎提交事务。
第二步:slave将master的binary log拷贝到它自己的中继日志。首先,slave开始一个工作线程——I/O线程。I/O线程在master上打开一个普通的连接,然后开始binlog dump process。Binlog dump process从master的二进制日志中读取事件,如果已经执行完master产生的所有文件,它会睡眠并等待master产生新的事件。I/O线程将这些事件写入中继日志。
第三步:SQL slave thread(SQL从线程)处理该过程的最后一步。SQL线程从中继日志读取事件,并重新执行其中的事件而更新slave的数据,使其与master中的数据一致。
常见方案
1.一主多从。一般用来做读写分离的,master写,其他slave读,这种架构最大问题I/O压力集中
2.M-S-S。使用一台slave作为中继,分担Master的压力,slave中继需要开启bin-log,并配置log-slave-updates
M-S 讲解
环境
master mysql5.7.20 10.10.10.63
slave mysql5. 7.20 10.10.10.64
部署Master
创建同步数据库
mysql> create database HA;
修改配置文件
service mysqld stop #要先停服务
vim /etc/my.cnf
log-bin=mysql-bin-master #二进制日志前缀
server-id=1 #本机数据库ID 标示
binlog-do-db=HA #可以被从服务器复制的库, 二进制需要同步的数据库名
binlog-ignore-db=mysql #不可以被从服务器复制的库
Systemctl restart mysqld #重启mysql
授权
mysql> grant replication slave on *.* to slave@10.10.10.64 identified by "123456";
mysql> flush privileges;
查看状态信息
mysql> show master status;
+-------------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------------+----------+--------------+------------------+
| mysql-bin-master.000001 | 259 | HA | mysql |
+-------------------------+----------+--------------+------------------+
查看二进制文件
ls /usr/local/mysql/data/
mysql> show binlog events\G
数据一致
复制前要保证同步的数据库一致, 将导出的数据库传给从服务器
mysqldump -uroot -p123456 HA >HA.sql #可以导出数据库
部署slave
两台数据库服务器mysql版本要一致
mysql> show variables like '%version%';
测试连接到主服务器
mysql -uslave -p123456 -h 10.10.10.63
只有复制的权限, 是看不到其他库的。导入数据库,和主数据库服务器保持一致
mysql> create database HA;
mysql -uroot -p123456 HA<HA.sql
修改从服务器配置文件
service mysqld stop
vim /etc/my.cnf
server-id = 2 #从服务器ID号,不要和主ID相同 ,如果设置多个从服务器,每个从服务器必须有一个唯一的server-id值,必须与主服务器的以及其它从服务器的不相同。可以认为server-id值类似于IP地址:这些ID值能唯一识别复制服务器群集中的每个服务器实例。
文本框是mysql 5.1的配置
mysql>stop slave; #停止slave
mysql> change master to master_host='10.10.10.63',master_user='slave',master_password='123456'; #配置master相关信息
mysql> start slave; #启动slave
mysql> show slave status\G 查看状态
Slave_IO_Running :一个负责与主机的io通信
Slave_SQL_Running:负责自己的slave mysql进程
两个为YES 就成功了!
再到主服务器上查看状态:
mysql> show processlist \G
排错
如果遇到主从不同步,看一下主从bin-log的位置,然后再同步。
在主服务器上看二进制日志事件列表
mysql> show binlog events \G
从服务器执行MySQL命令下
mysql> stop slave; #先停止slave服务
mysql> change master to master_log_file='mysql-bin-master.000001',master_log_pos=1164;
#根据上面主服务器的show master status的结果,进行从服务器的二进制数据库记录回归,达到同步的效果
mysql>slave start; #启动从服务器同步服务
mysql> show slave status\G; #用show slave status\G;看一下从服务器的同步情况
Slave_IO_Running: Yes
Slave_SQL_Running: Yes #如果都是yes,那代表已经在同步
重启从服务器,再查看状态:
slave stop;
slave start;
排错思路:
1、二进制日志没有开启
2、IPTABLES 没有放开端口
3、对应的主机 IP地址写错了
M-S-S 讲解
环境
master mysql5.7.20 10.10.10.68
slave中继 mysql5. 7.20 10.10.10.69
slave mysql5. 7.20 10.10.10.70
master服务器
mysql> grant replication slave on *.* to repl@'10.10.10.%' identified by '123456';
mysql> flush privileges;
vim /etc/my.cnf #修改配置 增加以下选项
server-id=1
binlog-do-db=HA
log-bin=mysql-bin-master
binlog-ignore-db=mysql
sync-binlog=1
binlog-format=row
systemctl restart mysqld #重启服务
#### 中继服务器
导入数据库
配置my.cnf
vim /etc/my.cnf
server-id= 2 #修改主配置文件也要开启bin-log:
log-bin=mysql-bin-slave1
log-slave-updates=1 #把它从relay-log当中读取出来的二进制日志并且这本机上执行的操作也记录这自己的二进制日志里面,这样才能使第三台slave通过中继slave读取到相应数据变化
binlog-format=row #以行方式
systemctl restart mysqld
授权
mysql> stop slave;
mysql> change master to master_host=‘10.10.10.68’,master_user=‘repl’,master_password=‘123456’;
mysql> start slave; #查看中继服务的状态
mysql> show slave status \G
再授权一个用户给slave(70):
mysql> grant replication slave on *.* to 'repl'@'10.10.10.70' identified by '123456';
mysql> flush privileges;
slave服务器
导入数据库
配置my.cnf
vim /etc/my.cnf
server-id = 3
log-bin=mysql-bini-slave2
binlog-format=row
systemctl restart mysqld #重启
指定slave中继服务作为70的主
mysql> stop slave;
mysql> change master to master_host='10.10.10.69',master_user='repl',master_password='123456';
mysql> start slave;
mysql> show slave status \G #查看从服务的状态