MySQL主从复制原理实践

MySQL主从复制

MySQL主从复制实则是将原本创建和修改数据库的SQL命令集合复制到从库本地,在从库本地重新执行这些SQL命令来建立与主库一样的数据。搭建从库以后,包括复制主库当前截止位置的所有数据,和接下来主库还在不断增长的数据。事实上,停库备份全部数据再复制过去没什么问题,问题在于怎么实时复制数据库增长的这段数据?而这就要借助binlog日志的功能...

主从复制原理

1)开启主库log-bin功能,是为了用户在写数据库过程中,MySQL会同时建立一份binlog日志来记录数据库所做的增删改等操作;还要建立一个从库和主库之间验证关系的换用账号rep,并授权;

2)锁表,对数据库做全备操作,最大程度保证数据一致性,最重要的是获取当前数据库binlog日志分界点;

3)将停库后的数据库全量恢复到从库

4)在从库中执行CHANGE MASTER TO...命令来验证用户,和告诉从库当前备份的数据库binlog日志分界点在哪,并生成master.info文件;

5)开启从库,此时mysql replication功能才真正发挥作用,从库B会利用自己的IO线程不断询问主库A:哥们,我有暗号(密码)是自己人,呃...我这本地有这些这些货,你那有没有新货(新增的数据),也给我搞点。然后主库A就会去看自己binlog日志,发现真有些新货,就会给这些新货发给从库B,并且附赠一份清单,告诉从库B他现在仓库里有哪些货,下次从库B再来找他要新货只要拿出这个清单A就知道他那里的货是不是和自己一样的了,如果一样就不发了,如果不一样,就按照这个清单上的货截止位置发最新的,这里的新货就可以理解为binlog文件内容,清单就为binlog位置信息post;

从库每次拿到新货就会很开心啊,启动自己的SQL线程将这些新货解析到自己的数据库中,保证与主库A完全一致。

主从复制案例实践

  在本地多mysql多实例中,将/data/3306/mysql.sock作为主库,/data/3307/mysql.sock作为从库

  • 主库

1)开主库binlog功能,并且保证server id不一样

[[email protected] ~]# egrep "log-bin|server-id" log-bin /data/3306/my.cnf /data/3307/my.cnf
/data/3306/my.cnf:log-bin = /data/3306/mysql-bin
/data/3306/my.cnf:server-id = 1
/data/3307/my.cnf:#log-bin = /data/3307/mysql-bin
/data/3307/my.cnf:server-id = 3

2)主库授权从库账号rep

mysql> grant replication slave on *.* to [email protected]‘172.16.2.%‘ identified by ‘oldboy123‘;
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges;

3)锁表(锁表后不能退出当前mysql控制窗口)

mysql> flush table with read lock;

4)查看binlog临界点

mysql> show master status;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000015 |     3204 |              |                  |
+------------------+----------+--------------+------------------+

5)全备

[[email protected] ~]# mysqldump -uroot -poldboy1234 -S /data/3306/mysql.sock -A -B --events|gzip > /server/backup/mysql_$(date +%F).sql.gz
[[email protected] backup]# ll mysql_2016-07-07.sql.gz
-rw-r--r-- 1 root root 144620 Jul  7 04:18 mysql_2016-07-07.sql.gz

6)解锁表

mysql> unlock table;
  • 从库

1)确保server ID 不同

[[email protected] ~]# grep server-id /data/3307/my.cnf
server-id = 4

2)恢复全备

[[email protected] backup]# mysql -uroot -poldboy456 -S /data/3307/mysql.sock </server/backup/mysql_2016-07-07.sql

3)配置master,填写正确的binlog位置点

mysql> CHANGE MASTER TO MASTER_HOST=‘172.16.2.10‘, MASTER_PORT=3306, MASTER_USER=‘rep‘,
MASTER_PASSWORD=‘oldboy123‘, MASTER_LOG_FILE=‘mysql-bin.000015‘, MASTER_LOG_POS=3204;
##此时如果master密码配置错误,重新改master.info文件不生效,需执行reset slave all;
[[email protected] data]# cat master.info
18
mysql-bin.000015
3204
172.16.2.10
rep
oldboy123
3306
60
0

4)开启从库复制开关,验证数据

mysql> start slave;
mysql> show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 172.16.2.10
                  Master_User: rep
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000015
          Read_Master_Log_Pos: 3289
               Relay_Log_File: relay-bin.000002
                Relay_Log_Pos: 338
        Relay_Master_Log_File: mysql-bin.000015
             Slave_IO_Running: Yes     #从库从主库复制binlog日志进程
            Slave_SQL_Running: Yes     #从库读取中继日志转换成SQL语句应用到数据库进程
              Replicate_Do_DB:
          Replicate_Ignore_DB: mysql
           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: 3289
              Relay_Log_Space: 488
              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: 1

验证完成。

时间: 2024-08-08 03:43:11

MySQL主从复制原理实践的相关文章

MySQL主从复制原理和实践

mysql主从复制 mysql支持单向 双向 链式级联 实时 异步复制,在复制过程中,一台服务器充当主服务器(Master),而一个或多个其他服务器充当从服务器(Slave) mysql主从复制的应用场景 1.主从服务器互为备份 2.主从服务器读写分离分担网站压力 读写分离 中大型公司:通过程序(php,java) 测试环境:代理软件(mysql-proxy,amoeba) 门户网站:分布式dbproxy(读写分离,hash负载均衡,健康检查) 主从同步实践操作(多实例环境) 1.主库上面设置s

Mysql主从复制原理与实践

Mysql主从复制原理: 1.Mysql支持单双向.链式级联.异步复制.可以一主一从,也可以一主多从. 2.链式级联中的从是下级从的主.类似A-->B-->C-->D. 3.主从复制配好后,数据库的更新必须在主服务器上进行,以免造成主从冲突. 4.主从服务器架构可实现对用户的请求实现读写分离.从处理用户的select,主处理update,insert,delete等更新.以此保持主从实时同步. 5.可以把从服务器根据业务来拆分. 6.mysql主从复制是异步复制.master与slave

MySQL主从复制原理及实践

第1章 MySQL的主从复制介绍 MySQL的主从复制方案,和上述文件及文件系统级别同步是类似的,都是数据的传输.只不过MySQL无需借助第三方工具,而是其自带的同步复制功能.另外一点,MySQL的主从复制并不是磁盘上文件直接同步,而是逻辑的binlog日志同步到本地再应用执行的过程. 复制可以单向:M=>S,也可以是双向M<==>M,也可以是多M换装同步等.如果设置了链式级联复制,那么,从(slave)服务器本身除了充当从服务器外,也会同时充当其下面从服务器的主服务器.链式级联复制类似

MySQL主从复制原理深入解析与练习

MySQL主从复制画图描述: MySQL主从复制原理上图详解: ① 用户做crud操作,写入数据库,更新结果记录到binlog中: ② 主从同步是主找从的,从库IO发起请求,主库的主进程看从库的master change中给的参数是否合法,如果合法主进程交给IO进程进行3操作,否则拒绝: ③ 主库根据master的位置点,从这个位置点的binlog日志一直到binlog最后,将其准备发送给从库: ④ 将找到的binlog日志发给从库,并且还会发送新的日志点: ⑤ 从库收到binlog日志,将其写

mysql 主从复制原理

主从形式 mysql主从复制 灵活 一主一从 主主复制 一主多从---扩展系统读取的性能,因为读是在从库读取的: 多主一从---5.7开始支持 联级复制 用途及条件 mysql主从复制用途 实时灾备,用于故障切换 读写分离,提供查询服务 备份,避免影响业务 主从部署必要条件: 主库开启binlog日志(设置log-bin参数) 主从server-id不同 从库服务器能连通主库 主从原理 mysql主从复制原理 从库生成两个线程,一个I/O线程,一个SQL线程: i/o线程去请求主库 的binlo

Mysql主从复制原理过程

1.自个画的流程图. 2.简单描述mysql主从复制原理过程 2.1(对应上图步骤1) 在SLAVE服务器上执行start slave命令开启主从复制开关,开始进行主从复制. 2.2(对应上图步骤2) 此时,SLAVE服务器的I/O线程会通过在MASTER上已经授权的复制用户权限请求连接MASTER服务器,并请求从指定binlog日志文件的指定位置(日志文件名和位置就是在配置主从配置复制服务时执行change master命令指定的)之后开始发送binlog日志内容. 2.3(对应上图步骤3)

[转]MySQL主从复制原理介绍

MySQL主从复制原理介绍 一.复制的原理 MySQL 复制基于主服务器在二进制日志中跟踪所有对数据库的更改(更新.删除等等).每个从服务器从主服务器接收主服务器已经记录到其二进制日志的保存的更新,以便从服务器可以对其数据拷贝执行相同的更新. MySQL 使用3个线程来执行复制功能,其中1个在主服务器上,另两个在从服务器上.当发出START SLAVE时,从服务器创建一个I/O线程,以连接主服务器并让它发送记录在其二进制日志中的语句.主服务器创建一个线程将二进制日志中的内容发送到从服务器.该线程

linux Mysql 主从复制 原理介绍和步骤详解

大家好,我是霸王卸甲,今天我给大家带来的是linux数据库中的主从复制的简单介绍和步骤详解. 主从复制 mysql主从复制 灵活 一主一从 主主复制 一主多从---扩展系统读取的性能,因为读是在从库读取的: 多主一从---5.7开始支持 联级复制--- 用途及条件 mysql主从复制用途 实时灾备,用于故障切换 读写分离,提供查询服务 备份,避免影响业务 主从部署必要条件: 主库开启binlog日志(设置log-bin参数) 主从server-id不同 从库服务器能连通主库 主从原理mysql主

如何实现 MySQL 的读写分离?MySQL 主从复制原理的是啥?如何解决 MySQL 主从同步的延时问题?

高并发这个阶段,肯定是需要做读写分离的,啥意思?因为实际上大部分的互联网公司,一些网站,或者是 app,其实都是读多写少.所以针对这个情况,就是写一个主库,但是主库挂多个从库,然后从多个从库来读,那不就可以支撑更高的读并发压力了吗? 如何实现 MySQL 的读写分离? 其实很简单,就是基于主从复制架构,简单来说,就搞一个主库,挂多个从库,然后我们就单单只是写主库,然后主库会自动把数据给同步到从库上去. MySQL 主从复制原理的是啥? 主库将变更写入 binlog 日志,然后从库连接到主库之后,