主从复制的原理图
主从复制其实就是使主库和从库数据一致,主库的数据变更,需要同步到从库中。
读写分离:如果是写操作(insert、update、delete),则直接操作主库;如果是读(select)操作,则直接操作从库(从库是可以有多个的)
使用主从复制原因(目的)
- 在从主服务器进行备份,避免备份期间影响主服务器服务
- 增加服务器的数量,读写分离,当主服务器出现问题时,可以切换到从服务器,提高并发性能。
主从复制的基本原理
如图所示,有两台服务器,一台master,一台slave初始数据一样:
首先master开启二进制日志(binary log),只要master数据变化,就将改变记录到二进制日志,master上面有一个dump线程,当二进制日志发生变化,通知slave服务器上的I/O线程来读master上的二进制日志,slave 将 master 的 二进制日志(binary log ) 拷贝到它的中继日志 (relay log) ,当中slave上还有一个sql线程,读取中继日志,并执行中继日志中的事件,使得slave上的数据和master数据一样,从而达到主从复制。
问题
主服务器如何知道从服务器上有哪些数据,需要从哪里开始给从服务器数据(从服务器如何知道从哪里开始获取服务器数据)
master-info文件的作用
- 记录取日志结束的pos位置号,日志文件的名字
relay-log.info文件的作用
实验步骤
环境:有两台服务器,一台master(192.168.21.165),一台slave(192.168.21.191),保证主从服务器MySQL版本一致数据一致,在从服务器脚本直接安装MySQL。
1.主服务器master开启二进制日志,从服务器slave区分server-id =2
#配置文件[mysqld]新增两行打开
log_bin
server_id = 1 #区别服务器ID,从服务器也要写server-id =2,但是可以不加log_bin
service mysqld restart #重启mysql服务
2.保证主从服务器数据一致
mysqldump --all-databases >/backup/all_db.sql #备份主服务器所有数据
scp all_db.sql root@192.168.21.191 :/root #scp传输主服务器的备份到从服务器root目录下
3.master创建一个可以有复制权限的授权用户,这样slave可以来master复制二进制文件
mysql>grant replication slave on *.* to 'wyt'@'%' identified by '123456';
4.slave添加授权用户的信息
#先查看master当前二进制文件状态
mysql>show master status;
+----------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+----------------------+----------+--------------+------------------+-------------------+
| localhost-bin.000003 | 436 | | | |
+----------------------+----------+--------------+------------------+-------------------+
#到从服务器进入MySQL
CHANGE MASTER TO MASTER_HOST='192.168.21.165',
MASTER_USER='wyt',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='localhost-bin.000003',
MASTER_LOG_POS=436;
#查看slave状态
mysql>show slave status\G;
#可以看到 Slave_IO_Running: No Slave_SQL_Running: No 所以需要开启
mysql>start slave;