十五大原理之零四:MYSQL主从同步原理

主从同步又可以称为主从复制!本人习惯称为主从复制

一、MySQL主从复制(同步)原理过程详细描述:

1.Slave服务器上执行start salve,开启主从复制开关。

2.此时,Slave服务器的IO线程会通过Master上授权的复制用户权限请求连接Master

服务器,并请求从指定Binlog日志文件的指定位置(日志文件名和位置就是配置主从复制服务时执行change master命令时指定的)之后发生Binlog日志内容;

3.Master服务器接收到来自Slave服务器的IO线程的请求后,Master服务器上负责复制的IO线程根据Slave服务器的IO线程请求的信息读取指定Binlog日志文件指定位置之后的Binlog日志信息,然后返回给Slave端的IO线程。返回的信息中除了Binlog日志内容外,还有本次返回日志内容后在Master服务端的新的Binlog文件名称以及在Binlog中的下一个指定更新位置;

4.当Slave服务器的IO线程获取到来自Master服务器上IO线程发送日志内容及日志文件及位置点后,将Binlog日志内容依次写入到Slave端自身的Relay Log(即中继日志)文件(MySQL-relay-bin.xxxxxx)的最末端,并将新的Binlog文件名和位置记录到master-info文件中,以便下一次读取Master端新Binlog日志时能够告诉Master服务器需要从新的Binlog日志的哪个位置开始请求新的Binlog日志内容。

5.Slave服务器端的SQL线程会实时的检测本地Relay log中新增加的日志内容,然后及时的把log文件中的内容解析成在Master端曾经执行的SQL语句的内容,并在自身Slave服务器上按语句的顺序执行应用这些SQL语句,应用完毕后清理应用过的日志。

6.经过了上面的过程,就可以确保在Master端和Slave端执行了同样的SQL语句,当复制状态正常的情况下,Mater端和Slave端的数据是完全一样的,Mysql的同步机制是有一些特殊的情况的。

主从复制原理图如下:

主从复制原理重点小结:

1.主从复制是异步的、逻辑的SQL语句级的复制。PXC

2.同步时,主库有一个IO线程,从库有两个线程,IO和SQL线程。

3.实现主从复制的必要条件,主库要开启binglog功能。

4.binlog文件只记录对数据库有更新的SQL语句(来自主数据库内容的变更)。

二、主从同步实践(双机同步)

1.环境准备

VMware Workstaion 两台

Master:10.0.0.3

slave:10.0.0.103

linux Centos 6.7

mysql 5.3.27

2.二进制安装数据库

Master和slave数据库安装一致:

[[email protected] ~]#tar xf mysql-5.5.32-linux2.6-x86_64.tar.gz

[[email protected] ~]#mv mysql-5.5.32-linux2.6-x86_64 /application/mysql-5.5.32

[[email protected] ~]#ln -s /application/mysql-5.5.32/ /application/mysql

[[email protected] ~]#useradd mysql -s /sbin/nologin -M

[[email protected] ~]#chown -R mysql.mysql /application/mysql/

初始化数据库(创建管理数据库的管理数据)

[[email protected] ~]# cd /application/mysql

[[email protected] mysql]#/application/mysql/scripts/mysql_install_db --basedir=/application/mysql/ --datadir=/application/mysql/data/ --user=mysql

[[email protected] ~]#\cp /application/mysql/support-files/my-small.cnf  /etc/my.cnf

[[email protected] ~]#\cp /application/mysql/support-files/mysql.server

启动数据库

[[email protected] ~]#/etc/init.d/mysqld

[[email protected] ~]#sed -i ‘s#/usr/local/mysql#/application/mysql#g‘  /application/mysql/bin/mysqld_safe /etc/init.d/mysqld

[[email protected] ~]#/etc/init.d/mysqld start

[[email protected] ~]#echo ‘PATH="/application/mysql/bin:$PATH"‘ >>/etc/profile

[[email protected] ~]#source /etc/profile

[[email protected] ~]#mysqladmin -uroot password#设置数据库用户密码

slave安装同上。

3.Master服务器

vim /etc/my.cnf

#skip-networking

server-id       = 3 #一般修改为主机ip地址的后8位

# Uncomment the following if you want to log updates

log-bin=mysql-bin #主数据库开启log日志记录增量以及变化内容以便同步到从库

重启数据库:

[[email protected] ~]#/etc/init.d/mysqld restart

登录数据库授权一个同步从库的用户的权限:

mysql> grant replication slave on *.* to ‘rep‘@‘10.0.0.%‘ identified by ‘oldboy123‘;

Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;

Query OK, 0 rows affected (0.01 sec)

mysql> show grants for ‘rep‘@‘10.0.0.%‘

-> ;

+-----------------------------------------------------------------------------------------------------------------------+

| Grants for [email protected]%                                                                                               |

+-----------------------------------------------------------------------------------------------------------------------+

| GRANT REPLICATION SLAVE ON *.* TO ‘rep‘@‘10.0.0.%‘ IDENTIFIED BY PASSWORD ‘*FE28814B4A8B3309DAC6ED7D3237ADED6DA1E515‘ |

+-----------------------------------------------------------------------------------------------------------------------+

锁表,记录log位置信息以便从库读取

mysql> flush table with read lock;

Query OK, 0 rows affected (0.00 sec)

mysql> show master status;

+------------------+----------+--------------+------------------+

| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |

+------------------+----------+--------------+------------------+

| mysql-bin.000005 |      333 |              |                  |

+------------------+----------+--------------+------------------+

1 row in set (0.00 sec)

mysql> flush table with read lock;

Query OK, 0 rows affected (0.02 sec)

由于两台是新安装的数据库,不存在数据,可以不用锁表、备份导入数据。

待从库配置完毕,解锁

mysql> unlock tables;

Query OK, 0 rows affected (0.00 sec)

4.slave服务器

vim /etc/my.cnf

#skip-networking

server-id       = 103

# Uncomment the following if you want to log updates

#log-bin=mysql-bin #可以不开启

重启数据库:

[[email protected] ~]# /etc/init.d/mysqld restart

登录数据库:

mysql> CHANGE MASTER TO

-> MASTER_HOST=‘10.0.0.3‘,

-> MASTER_PORT=3306,

-> MASTER_USER=‘rep‘,

-> MASTER_PASSWORD=‘oldboy123‘,

-> MASTER_LOG_FILE=‘mysql-bin.000005‘,

-> MASTER_LOG_POS=333;

Query OK, 0 rows affected (0.06 sec)

开启从库:

mysql> start slave;

Query OK, 0 rows affected (0.09 sec)

查看从库状态:

mysql> show slave status\G

*************************** 1. row ***************************

Slave_IO_State: Waiting for master to send event

Master_Host: 10.0.0.3

Master_User: rep

Master_Port: 3306

Connect_Retry: 60

Master_Log_File: mysql-bin.000005

Read_Master_Log_Pos: 1240

Relay_Log_File: slave-relay-bin.000003

Relay_Log_Pos: 587

Relay_Master_Log_File: mysql-bin.000005

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

Replicate_Do_DB:

Replicate_Ignore_DB:

Replicate_Do_Table:

Replicate_Ignore_Table:

Replicate_Wild_Do_Table:

Replicate_Wild_Ignore_Table:

Last_Errno: 0

Last_Error:

Skip_Counter: 0

Exec_Master_Log_Pos: 1240

Relay_Log_Space: 1134

Until_Condition: None

Until_Log_File:

Until_Log_Pos: 0

Master_SSL_Allowed: No

Master_SSL_CA_File:

Master_SSL_CA_Path:

Master_SSL_Cert:

Master_SSL_Cipher:

Master_SSL_Key:

Seconds_Behind_Master: 0

Master_SSL_Verify_Server_Cert: No

Last_IO_Errno: 0

Last_IO_Error:

Last_SQL_Errno: 0

Last_SQL_Error:

Replicate_Ignore_Server_Ids:

Master_Server_Id: 3

1 row in set (0.00 sec)

5.测试:

首先查看下主、从库数据库都是一致

mysql> show databases;

+--------------------+

| Database           |

+--------------------+

| information_schema |

| mysql              |

| performance_schema |

+--------------------+

3 rows in set (0.01 sec)

在主库上创建一个数据库wumin:

mysql> create database wumin;

Query OK, 1 row affected (0.00 sec)

mysql> show databases;

+--------------------+

| Database           |

+--------------------+

| information_schema |

| mysql              |

| performance_schema |

| wumin              |

+--------------------+

4 rows in set (0.00 sec)

从库中查看到主库新创建的wumin已复制到从库

mysql> show databases;

+--------------------+

| Database           |

+--------------------+

| information_schema |

| mysql              |

| performance_schema |

| wumin              |

+--------------------+

4 rows in set (0.00 sec)

时间: 2025-01-03 23:12:28

十五大原理之零四:MYSQL主从同步原理的相关文章

MySQL主从同步--原理及实现(一)

1.什么是mysql主从同步? 当master(主)库的数据发生变化的时候,变化会实时的同步到slave(从)库. 2.主从同步有什么好处? 水平扩展数据库的负载能力. 容错,高可用.Failover(失败切换)/High Availability 数据备份. 3.主从同步的原理是什么? 首先我们来了解master-slave的体系结构. 如下图: 不管是delete.update.insert,还是创建函数.存储过程,所有的操作都在master上.当master有操作的时候,slave会快速的

MySQL主从同步原理讲述

关于mysql主从同步,相信大家都不陌生,随着系统应用访问量逐渐增大,单台数据库读写访问压力也随之增大,当读写访问达到一定瓶颈时,将数据库的读写效率骤然下降,甚至不可用:为了解决此类问题,通常会采用mysql集群,当主库宕机后,集群会自动将一个从库升级为主库,继续对外提供服务:那么主库和从库之间的数据是如何同步的呢? 为了减轻主库的压力,应该在系统应用层面做读写分离,写操作走主库,读操作走从库,下图为MySQL官网给出的主从复制的原理图,从图中可以简单的了解读写分离及主从同步的过程,分散了数据库

mysql主从同步原理-luodidiao-51CTO博客

为什么要做主从复制?1.在业务复杂的系统中,有这么一个情景,有一句sql语句需要锁表,导致暂时不能使用读的服务,那么就很影响运行中的业务,使用主从复制,让主库负责写,从库负责读,这样,即使主库出现了锁表的情景,通过读从库也可以保证业务的正常运作. 2.做数据的热备 3.架构的扩展.业务量越来越大,I/O访问频率过高,单机无法满足,此时做多库的存储,降低磁盘I/O访问的频率,提高单个机器的I/O性能. 基本构建思路–确保数据相同:从库必须要有主库上的数据–配置主服务器:启用binlog日志,授权用

MYSQL主从同步原理解析!

大神请绕行! 一.为什么要主从同步? 我们会对数据库进行大量的读写操作,而如果数据库非常庞大的话,对我们的主机压力非常大,我们想到了一个解决的办法:两台服务器,一台只用来读取操作,一台只用来写入操作. 二.用途: 实时灾备,用于故障切换: 读写分离,提供查询服务: 备份,避免影响业务. 三.实战演练 主从部署必要条件: 主库开启binlog日志(设置log-bin参数) 主从server-id不同 从库服务器能连通主库 1.一主一从 (1)实战环境 两台服务器(centos7): 主服务器IP:

mysql主从同步原理

一.MySQL复制概述 ⑴.MySQL数据的复制的基本介绍 目前MySQL数据库已经占去数据库市场上很大的份额,其一是由于MySQL数据的开源性和高性能,当然还有重要的一条就是免费~不过不知道还能免费多久,不容乐观的未来,但是我们还是要能熟练掌握MySQL数据的架构和安全备份等功能,毕竟现在它还算是开源界的老大吧! MySQL数据库支持同步复制.单向.异步复制,在复制的过程中一个服务器充当主服务,而一个或多个服务器充当从服务器.主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环

mysql主从同步原理,配置,同步延迟处理

Mysql的 Replication 是一个异步的复制过程,从一个 Mysql instace(我们称之为 Master)复制到另一个 Mysql instance(我们称之 Slave).在 Master 与 Slave 之间的实现整个复制过程主要由三个线程来完成,其中两个线程(Sql线程和IO线程)在 Slave 端,另外一个线程(IO线程)在 Master 端. 要实现 MySQL 的 Replication ,首先必须打开 Master 端的Binary Log(mysql-bin.xx

Mysql主从同步原理及配置-Linux

从库的io线程会实时依据master.info信息的去主库的binlog日志里面读取更新的内容,将更新的内容取回到自己的中继日志中,同时会更新master.info信息,此时sql线程实时会从中继日志中读取并执行里面的sql语句 Master :记录数据更改操作 – 启用 binlog 日志 – 设置 binlog 日志格式 – 设置 server_id Slave 运行 2 个线程 – Slave_IO :复制 master 主机 binlog 日志文件里的 SQL 到本机的 relay-lo

mysql 主从同步原理

Replication 线程 Mysql的 Replication 是一个异步的复制过程,从一个 Mysql instace(我们称之为 Master)复制到另一个 Mysql instance(我们称之 Slave).在 Master 与 Slave 之间的实现整个复制过程主要由三个线程来完成,其中两个线程(Sql线程和IO线程)在 Slave 端,另外一个线程(IO线程)在 Master 端. 要实现 MySQL 的 Replication ,首先必须打开 Master 端的Binary L

mysql主从同步建立方法

mysql主从同步原理: (1) master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events),然后通知存储引擎(I/O thread)提交事务: (2) slave将master的binary log events拷贝到它的中继日志(relay log); (3) slave重做中继日志中的事件,将改变反映它自己的数据. mysql主从操作步骤: 1.编辑matser数据库的my.cnf文件,在[mysqld]下面插入以下配置,