欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

MySQL复制优点、原理详解

程序员文章站 2022-04-03 17:46:53
复制是将主数据库的ddl和dml操作通过二进制日志传到从库上,然后再从库重做,从而使得从库和主库保持数据的同步。mysql可以从一台主库同时向多台从库进行复制,从库同时也可...

复制是将主数据库的ddl和dml操作通过二进制日志传到从库上,然后再从库重做,从而使得从库和主库保持数据的同步。mysql可以从一台主库同时向多台从库进行复制,从库同时也可以作为其他从库的主库,实现链式复制。

mysql复制的优点:

  • 主库故障,可以快速切换至从库提供服务;
  • 在从库执行查询操作,降低主库的访问压力;
  • 在从库执行备份,避免备份期间对主库影响;

mysql复制原理

1、mysql主库在事务提交时会把数据变更作为事件events记录在binlog中,主库上的sync_binlog参数控制binlog日志刷新到磁盘;

2、主库推送binlog中的事件到从库的relay log,之后从库根据relay log进行重做,通过逻辑复制来达到主从库的数据一致;

mysql通过3个线程来完成主从库间的数据复制:其中binlog dump线程运行在主库上,i/o线程和sql线程运行在从库上。当在从库启动复制(start slave)时,首先创建i/o线程连接主库,主库随后创建binlog dump线程读取数据库事件并发送给i/o线程,i/o线程获取到事件数据后更新到从库的relay log中,之后从库上的sql线程读取relay log中更新的数据库事件并应用,

如下图所示:

MySQL复制优点、原理详解

查看主库:

mysql> show processlist\g; 
*************************** 1. row *************************** 
   id: 3 
  user: root 
  host: 10.24.33.187:54194 
   db: null 
command: sleep 
  time: 176 
 state:  
  info: null 
*************************** 2. row *************************** 
   id: 4 
  user: root 
  host: 10.24.33.187:54195 
   db: null 
command: sleep 
  time: 176 
 state:  
  info: null 
*************************** 3. row *************************** 
   id: 8 
  user: root 
  host: localhost 
   db: test 
command: query 
  time: 0 
 state: starting 
  info: show processlist 
*************************** 4. row *************************** 
   id: 12 
  user: repl 
  host: dsz884.hcg.homecredit.net:39731 
   db: null 
command: binlog dump  --binlog dump线程 
  time: 87 
 state: master has sent all binlog to slave; waiting for more updates --由此可见,以“推送”的方式同步 
  info: null 
4 rows in set (0.00 sec) 
 
error:  
no query specified 

查看备库:

mysql> show processlist\g; 
*************************** 1. row *************************** 
   id: 1 
  user: system user 
  host:  
   db: null 
command: connect 
  time: 4427 
 state: waiting for master to send event 
  info: null 
*************************** 2. row *************************** 
   id: 2 
  user: system user 
  host:  
   db: null 
command: connect 
  time: 2044 
 state: slave has read all relay log; waiting for more updates 
  info: null 

由此可见,mysql复制是异步的,从库和主库存在一定的延时。

复制相关的日志

1、binlogbinlog会记录mysql中所有的数据修改操作,可以通过如下方式查看binlog的格式,对应有三种,分别为statement、row和mixed:

mysql> show variables like '%binlog_format%'; 
+---------------+-------+ 
| variable_name | value | 
+---------------+-------+ 
| binlog_format | row  | 
+---------------+-------+ 
1 row in set (0.00 sec) 

2、relay logrelay log的文件格式、内容和binlog一样,唯一区别是从库上的sql线程执行完当前relay log中的事件后,sql线程会自动删除该relay log,从而释放空间。为保证从库crash重启后,从库的i/o线程和sql线程仍能知道从哪里开始复制,从库默认会创建两个日志文件master.info和relay-log.info来保存复制的进度,这两个文件分别记录了从库的i/o线程当前读取主库binlog的进度和sql线程应用relay log的进度。

mysql> show slave status \g; 
*************************** 1. row *************************** 
        slave_io_state: waiting for master to send event 
         master_host: 10.24.33.186 --主库ip 
         master_user: repl --主库用于主从复制的用户账号 
         master_port: 3306 --主库端口 
        connect_retry: 60  
       master_log_file: mysql-bin.000005 --从库i/o线程当前读取主库binlog文件名 
     read_master_log_pos: 4356 --从库i/o线程读取主库binlog的位置 
        relay_log_file: strong-relay-bin.000006 --sql线程正在应用的relay log 
        relay_log_pos: 320 --relay log的位置 
    relay_master_log_file: mysql-bin.000005 --relay log对应的binlog 
       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: 4356 --sql线程正在应用relay log的位置对应的binlog的位置 
       relay_log_space: 1153 
       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 
         master_uuid: 2a3e3fd9-0587-11e8-bdb8-0800272325a8 
       master_info_file: /usr/local/mysql-5.7.21-el7-x86_64/data/master.info 
          sql_delay: 0 
     sql_remaining_delay: null 
   slave_sql_running_state: slave has read all relay log; waiting for more updates 
      master_retry_count: 86400 
         master_bind:  
   last_io_error_timestamp:  
   last_sql_error_timestamp:  
        master_ssl_crl:  
      master_ssl_crlpath:  
      retrieved_gtid_set:  
      executed_gtid_set:  
        auto_position: 0 
     replicate_rewrite_db:  
         channel_name:  
      master_tls_version:  
1 row in set (0.00 sec) 
 
error:  
no query specified 
 
mysql>

mysql复制方式

binlog的格式有三种,分别对应了mysql复制的3种技术。

mysql复制架构

mysql复制的常见架构有一主多从复制架构、多级复制架构和双主复制(dual master)架构。

1、一主多从架构在主库读请求压力非常大的场景下,通过配置一主多从复制架构实现读写分离,把对实时性要求不是特别高的读取请求通过负载均衡分布到多个从库上,从而降低主库的读取压力,如图:

MySQL复制优点、原理详解

2、多级复制架构一主多从架构能解决大部分读请求压力特别大的场景的需求,由于mysql的复制是主库推送binlog到从库,主库的i/o压力和网络压力会随着从库的增加而增加(每个从库都会在主库上有一个独立的binlog dump线程来发送binlog事件),而多级复制架构解决了一主多从场景下,主库额外的i/o和网络压力的场景,如图:

3、双主复制/dual master架构双主复制/dual master架构特别适合于dba做维护需要主从切换的场景,通过该架构避免了重复搭建从库的麻烦,如图:

MySQL复制优点、原理详解