一、Mysql主从复制概念
MySQL主从复制是指数据可以从一个Mysql数据库服务器主节点复制到一个或多个从节点。Mysql默认采用异步复制方式,这样从节点不用一直访问主服务器来更新自己的数据,数据的更新可以在远程连接上进行,从节点可以复制主数据库中的所有数据库或者特定数据库,或者特定的表。
二、复制作用
读写分离
在开发工作中,有时候遇见某个SQL语句需要锁表,导致暂时不能使用读的服务,这样就会影响现有业务,使用主从复制,让主库负责些,从库负责读,这样,即使主库出现了缩表的情况,通过读从库也可以保证业务的正常运作。
数据分布
架构扩展
醉着系统中的业务访问量的增大,如单机部署数据库,就会导致I/O访问频率过高。有了主从复制,增加多个数据存储节点,将负载分布在多个从节点上,降低单机磁盘I/O访问的频率,提高单个机器的I/O性能。
负载均衡
数据实时备份
高可用和故障切换
MySQL升级测试
三、日志记录三种模式
-- 基于SQL语句的复制(statement-based replication, SBR),
-- 基于行的复制(row-based replication, RBR),
-- 混合模式复制(mixed-based replication, MBR)。
设置自动清除7天前的数据
set global expire_logs_days = 7
会在刷新log(flush logs)或者重启服务时生效
四、Mysql主从形式
一主一从
一主多从
多主一丛
双主复制
级联复制
五、主从复制原理
Mysql主从复制涉及到三个线程,一个运行在主节点(Log dump thread),其余两个(I/O thread,SQL thread) 运行在从节点。
主节点binary log dump线程
当从节点连接主节点时,主节点会创建一个log dump线程,用于发送bin-log的内容。在读取bin-log中的操作时,此线程会对主节点上的bin-log加索,当读取完成,在发送给从节点之前,锁会被释放。
从节点I/O线程:
当从节点行执行start slave命令之后,从节点会创建一个I/O线程用来连接主节点,请求主库中更新的bin-log。I/O线程接收到主节点binlog dump 进程发来的更新之后,保存在本地的relay-log中。
从节点SQL线程:
从relay log中读取日志信息,解析成具体的操作并执行,最终保证主从数据的一致性。
六、MYSQL主从复制模式
Mysql 主从复制默认时异步的模式。Mysql增删改操作会记录到binary log中,当slave节点连接master时,会主动从master处获得最新的bin-log文件。并把log-log中的sql在从节点重放。
异步模式(mysql async-mode)
这种模式下,主节点不会主动push bin log到从节点,这样有可能导致failover的情况下,也需从节点没有及时接收到最新的bin-log同步到本地
半同步模式(mysql semi-sync)
这种模式下主节点只需要接收到其中一台从节点的返回信息,就会commit;否则需要等待直到超时时间然后切换成异步模式再提交;这样做的目的可以使主从数据库的数据延迟缩小,可以提高数据安全性,确保了事务提交后,binlog至少传输到一个从节点上,不能保证从节点将事务更新到db中。性能上会有一定的降低,响应时间会边长。
全同步模式
全同步模式使指主节点和从节点全部执行了commit并确认才会向客户端返回成功。
GTID复制模式
在传统的复制里面,当发生故障,需要主从切换,需要找到binlog的pos点,然后将主节点指向新的主节点,相对来说比较麻烦,也容易出错。在MySQL 5.6里面,不用再找binlog和pos点,我们只需要知道主节点的IP,端口,以及账号密码就行,因为复制时自动的,MySQL会通过内不机制GTID自动找点同步。
多线程复制(基于库),Mysql 5.6 以前的版本,slave的复制时单线程的。一个事件一个事件的读取应用。而master时并发写入的,所以延时时避免不了的。唯一有效的方法时把多个库放在多台slave,这样又有点浪费服务器。在mysql5.6里面,我们可以把多个表放在多个库,这样就可以使用多线程复制。
基于GTID复制实现的工作原理
主节点更新数据时,会在事务前产生GTID,一起记录到binlog日志中。
从节点的I/O线程将变更bin-log,写入到本地的reaylog中
SQL线程从relay log中获取gtid,然后对比本地的binlog 是否有记录(所以mysql从节点必须要开启binary log)
如果有记录,说明该GTID的事务以及指向,从节点会忽略。
如果没有记录,从节点会从relay log中指向该GTID的食物,并记录到binlog。
在解析过程中会判断是否有主键,如果没有就用二级索引,如果没有就用全表扫描。
七、主动配置
1、主节点配置
[mysqld]
server-id = 1
log-bin= /var/lib/mysql/mysql-bin #二进制日志路径
innodb-file-per-table=1
2、主节点创建复制用户
GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'replication'@'%' IDENTIFIED BY 'your_password';
3、初始化数据
导出主数据库数据
还原到从数据库
4、从库配置
[mysqld]
server-id = 2
relay-log=/var/lib/mysql/relay-log
relay-log-index=relay-log.index
innodb-file-per-table=1
5.查看主数据库状态
show master status G;
6.从服务器指定master和二进制日志POS位置
CHANGE MASTER TO MASTER_HOST='192.168.130.128',MASTER_USER='replication',
MASTER_PMASTER_PASSWORD='your_password',
MASTER_LOG_FILE='mysql-bin.000004',MASTER_LOG_POS=187;
说明: MASTER_HOST为主服务器IP或主机名; MASTER_PORT为主服务器端口; MASTER_USER为主服务器上用于同步的数据库账户名; MASTER_PASSWORD为主服务器上用于同步的数据库账户对应的密码; MASTER_LOG_FILE为当前bin-log日志文件名; MASTER_LOG_POS为当前偏移量; 其中MASTER_LOG_FILE和MASTER_LOG_POS可以在主数据库上执行" show master status G;"SQL语句来获得
7.查看从服务器状态
开启IO与mysql进程,开启后就可以在线复制了
SHOW SLAVE STATUSG 查看状态
START SLAVE 开启进展
八、利用innobackupex搭建传统主从复制
1:主库:利用innobackupex做备份,拷贝至从库
innobackupex --user=root --socket=/u02/33061/tmp/mysql.sock --port=33061 /tmp/
2:主库创建从库的同步复制用户
mysql> grant replication slave on *.* to 'rep1'@'%' identified by 'rep1';
3:从库:停掉从库MySQL服务,删除MySQL数据目录datadir
rm -rf /data/mysql/data
应用日志,追平备份过程中的事务
innobackupex --defaults-file=/etc/my.cnf --user=dba --password=xxx --apply-log /data/backup
根据my.cnf将备份复制到MySQL数据目录下:
innobackupex --defaults-file=/etc/my.cnf --user=dba --password=xxx --copy-back /data/backup
修改数据目录权限
chown mysql.mysql -R /data/mysql/data
4:启动从库MySQL服务.并执行change master
cat xtrabackup_info,确定binlog和pos位置,start slave;
九、双主模式配置
1.两台机器都添加复制账号
GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO
'repluser'@'%' IDENTIFIED BY 'replpass';
2.两台机器mysql配置
主机1配置:
server-id=1
log-bin=/var/lib/mysql/mysql-bin
relay-log=/var/lib/mysql/relay-log
relay-log-index=relay-log.index
innodb-file-per-table=1
auto_increment_offset=1
auto_increment_increment=2
主机2配置:
server-id=5
log-bin=/var/lib/mysql/mysql-bin
relay-log=/var/lib/mysql/relay-log
relay-log-index=relay-log.index
innodb-file-per-table=1
auto_increment_offset=2
auto_increment_increment=2
3.两台机器互主配置
主机1配置:
CHANGE MASTER TO MASTER_HOST='192.168.130.129',
MASTER_USER='repluser',MASTER_PASSWORD='replpass',
MASTER_LOG_FILE='mysql-bin.000002',MASTER_LOG_POS=288;
主机2配置:
CHANGE MASTER TO MASTER_HOST='192.168.130.128',
MASTER_USER='repluser',MASTER_PASSWORD='replpass',
MASTER_LOG_FILE='mysql-bin.000005',MASTER_LOG_POS=106;
4.用START SLAVE开启两台机的slave功能便可完成双主模型
十、常用命令如下
Slave start 启动复制线程Slave stop 停止复制线程Reset slave 重置复制线程Show slave status 显示复制线程状态Show slave statusg 显示复制线程状态(分行显示)Show master statusG 显示主数据库的状态(分行显示)Show master logs 显示主数据库日志Change master to 动态改变到主数据库的配置Show processlistv 显示有哪些线程正在运行