加入收藏 | 设为首页 | 会员中心 | 我要投稿 银川站长网 (https://www.0951zz.com/)- 云通信、基础存储、云上网络、机器学习、视觉智能!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

了解 MySQL 主从复制的全同步和异步模式

发布时间:2023-10-07 13:43:55 所属栏目:MySql教程 来源:
导读:这篇文章主要介绍了半同步与异步的MySQL主从复制如何配置,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、MySQL主从复制原理这里我以MySQL5

这篇文章主要介绍了半同步与异步的MySQL主从复制如何配置,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

一、MySQL主从复制原理

这里我以MySQL5.5为例来说一下MySQL的主从复制的原理:

首先由备节点的I/O线程负责向主节点请求数据,主节点验证通过以后会由dump线程把数据发送给备用节点。备用节点的I/O线程收到资源后会把把这些数据写入到中继日志,备节点的SQL线程检测到中继日志变更后会立刻根据中继日志的内容跟新备库的内容。这样就完成了同步的过程。

二、常见的复制模型

1、一主一从模型

这种架构的优点就是比较简单,搭建和维护都比较容易,成本也比较低。对于一些负载量不是特别大、可靠性要求不是特别高的场合,完全可以采用这种模型。但是对于一些负载比较大站点,和对可用性要求比较高的场合,这种架构就不太适用了。因为如果访问量比较大,Master节点的压力会比较的,另外如果 Master崩溃,也会导致业务的终止.

2、一主多从模型

在绝大多数场景中,我们的应用都是读多写。我们使用这种架构,通过读写分离的技术,可以有效降低Master上读的压力。我们在后端的slave上可以做一些数据备份,数据挖掘等方面的工作。但是如果备库比较多,同时主库又要负责其他的请求时,主库的压力会明显增大,此时主库会成为整个系统的性能瓶颈。

   当然,还有其他的复制模型,比如多级中继,和环状复制等,这些复制的基本原理都和上面的差不多,这里不再详细的解释了。

3、配置主从复制

(1)、异步复制

主从同步的条件:

Master:

      a:启用二进制日志;

      b:选择一个server-id

      c:创建具有复制权限的用户

Slave:

      a:启用中继日志

      b:选择一个唯一的server-id

      c:连接主服务器,并开始复制数据

A、首先在主库上建立用于复制的最小权限的用户

grant replication slave,replication client on *.* to repl@'10.12.%' identified by '123456';

B、在从库上连接主库

CHANGE MASTER TO MASTER_HOST='10.12.128.19',MASTER_PORT=3306,MASTER_USER='repl',

MASTER_PASSWORD='123456',MASTER_LOG_FILE='mysql-bin.000006', MASTER_LOG_POS=451;

#查看复制的状态

mysql> show slave status\G

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

   Slave_IO_State: Waiting for master to send event

    Master_Host: 10.12.128.19

    Master_User: repl

    Master_Port: 3306

   Connect_Retry: 60

   Master_Log_File: mysql-bin.000006

  Read_Master_Log_Pos: 1512

   Relay_Log_File: relay_index.000002

   Relay_Log_Pos: 283

 Relay_Master_Log_File: mysql-bin.000006

   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: 1512

   Relay_Log_Space: 452

   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: 3306

    Master_UUID: 97f33396-ed12-11e4-921a-000c29e8ee06

   Master_Info_File: /mydata/data5.6/master.info

    SQL_Delay: 0

  SQL_Remaining_Delay: NULL

 Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it

  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

1 row in set (0.00 sec)

C、然后再从库上执行:

启动复制

start slave;

   也可以单独启动IO线程和SQL线程。

(如果从库的IO线程状态一直是connecting的状态,可能是防火墙的原因,一般来说关闭防火墙或者配置防火墙规则就可以了)

(2)、半同步复制

半同步复制是基于Google为MySQL开发的半同步复制的插件。半同步复制的原理是,一个事务在主服务器上执行完成后,必须至少确保至少在一台从服务器上执行完成后,事务才算提交成功。如果在一定时间内从服务器没有响应,则会自动降级为异步复制。

这个半同步复制是建立在异步复制的基础之上进行的。

首先需要安装Google的半同步插件:

master:

install plugin rpl_semi_sync_master soname 'semisync_master.so';

slave:

install plugin rpl_semi_sync_slave soname 'semisync_slave.so';

然后开启半同步的功能

master:

set global rpl_semi_sync_master_enabled = 1;

set global rpl_semi_sync_master_timeout = 100; //以毫秒计算

slave:

set global rpl_semi_sync_slave_enabled = ON;

在从库上还需要重启IO线程:

stop slave IO_thread;

start slave IO_thread;

分别在主库和备库上查看半同步插件运行的状态:

mysql> show global status like 'rpl%';

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

| Variable_name       | Value |

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

| Rpl_semi_sync_master_clients   | 1 |

| Rpl_semi_sync_master_net_avg_wait_time | 0 |

| Rpl_semi_sync_master_net_wait_time  | 0 |

| Rpl_semi_sync_master_net_waits   | 0 |

| Rpl_semi_sync_master_no_times   | 1 |

| Rpl_semi_sync_master_no_tx    | 8 |

| Rpl_semi_sync_master_status   | ON |

| Rpl_semi_sync_master_timefunc_failures | 0 |

| Rpl_semi_sync_master_tx_avg_wait_time | 0 |

| Rpl_semi_sync_master_tx_wait_time  | 0 |

| Rpl_semi_sync_master_tx_waits   | 0 |

| Rpl_semi_sync_master_wait_pos_backtraverse | 0 |

| Rpl_semi_sync_master_wait_sessions  | 0 |

| Rpl_semi_sync_master_yes_tx   | 0 |

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

14 rows in set (0.04 sec)

mysql> show global status like 'rpl%';

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

| Variable_name   | Value |

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

| Rpl_semi_sync_slave_status | ON |

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

1 row in set (0.04 sec)

可以看到,主库和备库的半同步插件都已经处于启用状态。

(编辑:银川站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章