共计 4144 个字符,预计需要花费 11 分钟才能阅读完成。
这篇文章主要介绍了半同步与异步的 MySQL 主从复制如何配置,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让丸趣 TV 小编带着大家一起了解一下。
一、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)
可以看到,主库和备库的半同步插件都已经处于启用状态。
感谢你能够认真阅读完这篇文章,希望丸趣 TV 小编分享的“半同步与异步的 MySQL 主从复制如何配置”这篇文章对大家有帮助,同时也希望大家多多支持丸趣 TV,关注丸趣 TV 行业资讯频道,更多相关知识等着你来学习!