Mysql的主从复制
共 3181字,需浏览 7分钟
·
2021-07-31 03:21
一、什么是主从复制?
二、为什么要做主从复制?
主库故障后,可切换到从数据库继续工作,一定程度上实现高可用。
读写分离,单库情况下如果某张表写的时候造成锁表,那读操作也会被阻塞,主从的话主库负责写,从库负责读,如果主库写的时候锁表,不会影响从库读。
业务量越来越大,I/O访问频率过高,单机无法满足,此时做多库的存储,降低磁盘I/O访问的频率,提高单个机器的I/O性能。
三、Mysql主从复制的原理?
master必须启用binlog,binlog中记录了每一次数据变化事件
slave会在一定时间间隔内对master的binlog进行探测,判断其是否发生改变,如果发生改变,则开启一个I/O线程请求master的binlog中的事件
master为slave的I/O线程启动一个dump线程(binlog转储线程),检查自己binlog中的事件,跟对方请求的位置对比后,向其发送二进制事件
slave接收到master发送过来的数据把它放置到Relay log(中继日志,也是二进制)文件中;并记录该次请求到master的具体哪一个二进制日志文件内部的哪一个位置
slave将启动一个sql线程从Relay log中读取二进制日志,在本地重放,使得其数据和主节点的保持一致;并记录relay log中该次执行的位置信息
最后I/O线程和SQL线程将进入睡眠状态,等待下一次被唤醒
四、主从复制搭建
4.1、安装mysql
注:我已经安装好两台mysql服务,分别为192.168.209.128、192.168.209.129
rpm安装默认目录:/var/lib/mysql/:数据文件/usr/share/mysql:配置文件模板/usr/bin/:mysql客户端工具目录/var/log/:日志目录4.2、修改配置
192.168.209.129(从)的配置如下:#mysql主从配置--主节点
#节点ID,需要在集群中唯一
server-id=1
#开启binlog
log-bin=mysql-bin
#是否控制binlog刷盘,0:不控制,意思就是让mysql自己决定是否刷盘,性能好但可能造成刷盘不及时,1:每次事务提交都会刷盘,性能差但安全
sync_binlog=1
#binlog日志格式,一共分为statement、row、mixed三种模式
binlog_format=mixed
#binlog过期清理时间
expire_logs_days=7
#binlog每个日志文件的大小
max_binlog_size=100m
#binlog缓存大小
binlog_cache_size=4m
#最大binlog缓存大小
max_binlog_cache_size=512m
#不生成日志文件的数据库,多个忽略数据库可以用逗号拼接,这库一般都是mysql自带的库,和业务无关的,就不用记录binlog了
binlog_ignore_db=mysql,information_schema, performance_schema
#跳过从库的错误
slave-skip-errors=all
配置完后运行如下命令重启mysql:#mysql主从配置-从节点
#节点ID,需要在集群中唯一
server_id=2
#开启binlog
log-bin=mysql-bin
#中继日志名
relay-log=mysql-relay-bin
#从库上事件从中继日志中过滤,下面的这些表建议都过滤掉
replicate-wild-ignore-table =mysql.%
replicate-wild-ignore-table =test.%
replicate-wild-ignore-table =log.%
replicate-wild-ignore-table =information_schema.%
replicate-wild-ignore-table =performance_schema.%
systemctl restart mysqld查看下mysql是否启动成功:
systemctl status mysqld
4.3、执行语句
slave(从)中执行:#创建用户
CREATE USER replyer IDENTIFIED BY 'Reply_12345';
#赋予该用户复制的权利
grant replication slave on *.* to 'replyer'@'192.168.209.129' identified by 'Reply_12345';
FLUSH PRIVILEGES;
#查看master的状态
show master status;
注:配置从库的MASTER_LOG_POS一定要和master的Position一致,不要看我上面这个图,我这个图是后来补的。最后运行完后,主库状态中的Position和从库状态中的Read_Master_Log_Pos一定是一致的。如果Slave_SQL_Running是no执行:#配置从库
CHANGE MASTER TO
MASTER_HOST = '192.168.209.128',
MASTER_USER = 'replyer',
MASTER_PASSWORD = 'Reply_12345',
MASTER_PORT = 3306,
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=861,
MASTER_RETRY_COUNT = 60,
MASTER_HEARTBEAT_PERIOD = 10;
#启动从库slave进程
start slave;
#查看从库状态
show slave status;
stop slave;SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1; start slave; show slave status;如果Slave_IO_Running是no执行:show master status;show slave status;看这俩文件是不是一个,不是一个的话执行:slave stop; CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=0; slave start;show slave status;一般也就是这问题了。
4.4、主从复制演示
登上slave执行(master执行完每一步后可以执行对应的语句观察同步情况):#创建xp_db库
create database xp_db;
#使用xp_db库
use xp_db;
#在xp_db库中创建student表
CREATE TABLE `student` (
`id` int(11) NOT NULL AUTO_INCREMENT ,
`name` varchar(255) NULL ,
PRIMARY KEY (`id`)
);
#查看xp_db库中的表
show tables;
#往student表中插入数据
INSERT INTO student(name) VALUES ('xiaopi');
show databases;
use xp_db;
show tables;
select * from student;