1032 主从mysql mysql主从从_mysql主从复制


一、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主从形式

一主一从

一主多从

多主一丛

双主复制

级联复制

五、主从复制原理


1032 主从mysql mysql主从从_mysql 主从复制_02


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同步到本地


1032 主从mysql mysql主从从_mysql 主从_03


半同步模式(mysql semi-sync)

这种模式下主节点只需要接收到其中一台从节点的返回信息,就会commit;否则需要等待直到超时时间然后切换成异步模式再提交;这样做的目的可以使主从数据库的数据延迟缩小,可以提高数据安全性,确保了事务提交后,binlog至少传输到一个从节点上,不能保证从节点将事务更新到db中。性能上会有一定的降低,响应时间会边长。


1032 主从mysql mysql主从从_1032 主从mysql_04


全同步模式

全同步模式使指主节点和从节点全部执行了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;


1032 主从mysql mysql主从从_mysql_05


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 开启进展


1032 主从mysql mysql主从从_mysql主从复制_06


八、利用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 显示有哪些线程正在运行