MySQL主从复制原理和实践

mysql主从复制

mysql支持单向 双向 链式级联 实时 异步复制,在复制过程中,一台服务器充当主服务器(Master),而一个或多个其他服务器充当从服务器(Slave)

mysql主从复制的应用场景

1、主从服务器互为备份

2、主从服务器读写分离分担网站压力

读写分离

中大型公司:通过程序(php,java)

测试环境:代理软件(mysql-proxy,amoeba)

门户网站:分布式dbproxy(读写分离,hash负载均衡,健康检查)

主从同步实践操作(多实例环境)

1、主库上面设置server-id值并开启binlog参数
[[email protected] ~]# egrep "log-bin|server-id" /data/3306/my.cnf 
log-bin = /data/3306/mysql-bin
server-id = 1

检查实际配置效果
[[email protected] ~]# mysql -uroot -p123456 -S /data/3306/mysql.sock -e "show variables like ‘log_bin‘;" 
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin       | ON    |
+---------------+-------+

2、建立用于同步的账号
mysql>  grant replication slave  on *.* to [email protected]‘172.16.80.%‘ identified by ‘123456‘;
说明:replication slave 是mysql同步的必须权限,此处不要授权all

mysql> flush privileges;

查看授权后的结果
mysql> show grants for [email protected]‘172.16.80.%‘;
+--------------------------------------------------------------------------------------------------------------------------+
| Grants for [email protected]%                                                                                               |
+--------------------------------------------------------------------------------------------------------------------------+
| GRANT REPLICATION SLAVE ON *.* TO ‘rep‘@‘172.16.80.%‘ IDENTIFIED BY PASSWORD ‘*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9‘ |
+--------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

3、锁表,导出数据库
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.000002 |      332 |              |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

[[email protected] ~]# mysqldump -uroot -p123456 -S /data/3306/mysql.sock -A -B --events --master-data=2 > /opt/rep.sql #导出所有数据库
[[email protected] ~]# vim /opt/rep.sql
-- CHANGE MASTER TO MASTER_LOG_FILE=‘mysql-bin.000002‘, MASTER_LOG_POS=332;  #可以看到该语句的记录位置和上面show master status是一样的,注释状态

4、数据库导出后,解锁
mysql> show master status;   #再次查看位置点,以验证上面的锁表操作是否有效
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000002 |      332 |              |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

mysql> unlock tables;
Query OK, 0 rows affected (0.00 sec)

5、从库上面
[[email protected] ~]# egrep "log-bin|server-id" /data/3307/my.cnf     
#log-bin = /data/3307/mysql-bin    #log-bin无需开启
server-id = 3   #server-id的值不能和主库上面的值一样

[[email protected] ~]# mysql -uroot -p123456 -S /data/3307/mysql.sock < /opt/rep.sql   #导入从主库备份的数据库

[[email protected] ~]# mysql -uroot -phello123 -S /data/3307/mysql.sock             
mysql> change master to     -> master_host=‘172.16.80.118‘,    -> master_user=‘rep‘,    -> master_password=‘123456‘,    -> master_log_file=‘mysql-bin.000002‘,    -> master_log_pos=332;
Query OK, 0 rows affected (0.03 sec)

验证一下
[[email protected] ~]# cat /data/3307/data/master.info 
18
mysql-bin.000002
332
172.16.80.118
rep
123456
3306
60
0

mysql> start slave;      
Query OK, 0 rows affected (0.01 sec)

mysql> show slave status\G;    #观察Slave_IO和Slave_SQL 这两个线程的状态是否是yes
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 172.16.80.118
                  Master_User: rep
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000002
          Read_Master_Log_Pos: 332
               Relay_Log_File: relay-bin.000002
                Relay_Log_Pos: 253
        Relay_Master_Log_File: mysql-bin.000002
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              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: 332
              Relay_Log_Space: 403
              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
1 row in set (0.00 sec)

6、登录主库创建数据库,看是否会同步到从库上面
[[email protected] ~]# mysql -uroot -p123456 -S /data/3306/mysql.sock 
mysql> create database martin; 
Query OK, 1 row affected (0.01 sec)

观察从库,可以看到已经同步过来
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| martin             |
| mysql              |
| performance_schema |
| test               |
+--------------------+
5 rows in set (0.00 sec)

[[email protected] ~]# cd /data/3307
[[email protected] 3307]# ls
data  my.cnf  mysql  mysqld.pid  mysql_martin3307.err  mysql.sock  relay-bin.000001  relay-bin.000002  relay-bin.index  relay-log.info
[[email protected]entos03 3307]# cat data/master.info 
18
mysql-bin.000002
419
172.16.80.118
rep
123456
3306
60
0

[[email protected] 3307]# mysqlbinlog  relay-bin.000002
/*!\C utf8 *//*!*/;
SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=33/*!*/;
SET @@session.lc_time_names=0/*!*/;
SET @@session.collation_database=DEFAULT/*!*/;
create database martin

mysql主从复制原理总结:

1、异步同步方式

2、逻辑同步模式,多种模式,默认是通过sql语句执行

3、主库通过记录bin-log实现对从库的同步,bin-log记录数据库更新的语句

4、主库一个IO线程,从库一个IO线程和一个SQL线程

5、从库关键文件master.info  relay-log  relay-info

6、如果从库还需要做级联从库,从库需要打开log-bin和log-slave-updates参数

时间: 2024-10-15 05:52:04

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

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 日志,然后从库连接到主库之后,

深度探索MySQL主从复制原理

深度探索MySQL主从复制原理 一 .概要 MySQL Replication (MySQL 主从复制) 是什么? 为什么要主从复制以及它的实现原理是什么? 1.1 MySQL 主从复制概念 MySQL 主从复制是指数据可以从一个MySQL数据库服务器主节点复制到一个或多个从节点.MySQL 默认采用异步复制方式,这样从节点不用一直访问主服务器来更新自己的数据,数据的更新可以在远程连接上进行,从节点可以复制主数据库中的所有数据库或者特定的数据库,或者特定的表. 1.2 MySQL 主从复制主要用