Mysql的主从复制
一、什么是主从复制?
二、为什么要做主从复制?
主库故障后,可切换到从数据库继续工作,一定程度上实现高可用。
读写分离,单库情况下如果某张表写的时候造成锁表,那读操作也会被阻塞,主从的话主库负责写,从库负责读,如果主库写的时候锁表,不会影响从库读。
业务量越来越大,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#开启binloglog-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主从配置-从节点#节点ID,需要在集群中唯一server_id=2#开启binloglog-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、执行语句
#创建用户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;


#配置从库CHANGE MASTER TOMASTER_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;


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;

评论
