MySQL--------基于半同步复制搭建主从

本文涉及的产品
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介:

1. 背景

   * MySQL Replication默认都是异步(asynchronous),当主库在执行完一些事务后,是不会管备库的进度的。如果备库不幸落后,而更不幸的是主库此时又出现Crash(例如宕机),这时备库中的数据就是不完整的。简而言之,在主库发生故障的时候,我们无法使用备库来继续提供数据一致的服务了。

   * Semi sync Replication在一定程度上保证提交的事务已经传给了至少一个备库。

   * Semi sync Replication仅仅保证事务的已经传递到备库上,但是并不确保已经在备库上执行完成。

   * Semi sync Replication主库等待超时(rpl_semi_sync_master_timeout)后,会自动降级为默认的异步(asynchronous)。

     * MySQL 5.5版本开始支持Semi sync Replication

wKiom1lxiCnjjGNJAAEHlE6yGKo102.jpg


2. 环境

  * master 服务器环境

1
2
3
4
5
6
7
8
9
10
11
mysql> system cat /etc/redhat-release
CentOS release 6.8 (Final)
mysql> system ifconfig eth0  | sed -rn  '2s#^.*addr:(.*)  Bca.*$#\1#gp'
172.18.0.1
mysql> show variables  like  'version' ;
+ ---------------+------------+
| Variable_name | Value      |
+ ---------------+------------+
| version       | 5.6.36-log |
+ ---------------+------------+
1 row  in  set  (0.00 sec)


   * master 服务器环境

1
2
3
4
5
6
7
8
9
10
11
mysql> system cat /etc/redhat-release
CentOS release 6.8 (Final)
mysql> system ifconfig eth0  | sed -rn  '2s#^.*addr:(.*)  Bca.*$#\1#gp'
172.18.4.1
mysql> show variables  like  'version' ;
+ ---------------+------------+
| Variable_name | Value      |
+ ---------------+------------+
| version       | 5.6.36-log |
+ ---------------+------------+
1 row  in  set  (0.00 sec)


   * master服务器my.cnf配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
[mysqld]
########basic settings########
# 主从server-id一定要设置不同
server- id  = 110
port = 3306
user = mysql
bind_address = 0.0.0.0    
character_set_server=utf8mb4
skip_name_resolve = 1
datadir =  /data/mysql_data
log_error = error.log
#######replication settings########
master_info_repository = TABLE
relay_log_info_repository = TABLE
# MySQL复制是基于binlog日志的
log_bin = bin.log
sync_binlog = 1
log_slave_updates
# MySQL binlog格式搭建主从时必须设置为row
binlog_format = row
relay_log = relay.log
relay_log_recovery = 1
slave_skip_errors = ddl_exist_errors
######semi sync replication settings########
# 设置插件目录路径
plugin_dir= /usr/local/mysql/lib/plugin
# 加载插件
plugin_load =  "rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so"
# 开启master semi sync replication
loose_rpl_semi_sync_master_enabled = 1
# 开启slave semi sync replication
loose_rpl_semi_sync_slave_enabled = 1
# 等待5秒无ack应答自动切换为异步模式
loose_rpl_semi_sync_master_timeout = 5000


   * slave服务器my.cnf配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
[mysqld]
########basic settings########
server- id  = 210
port = 3306
user = mysql
bind_address = 0.0.0.0
character_set_server=utf8mb4
skip_name_resolve = 1
datadir =  /data/mysql_data
log_error = error.log
# slave上开启只读,避免应用误写导致主从数据不一致
read_only = on
#######replication settings########
master_info_repository = TABLE
relay_log_info_repository = TABLE
log_bin = bin.log
sync_binlog = 1
log_slave_updates
binlog_format = row
relay_log = relay.log
relay_log_recovery = 1
binlog_gtid_simple_recovery = 1
slave_skip_errors = ddl_exist_errors
######semi sync replication settings########
plugin_dir= /usr/local/mysql/lib/plugin
plugin_load =  "rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so"
loose_rpl_semi_sync_master_enabled = 1
loose_rpl_semi_sync_slave_enabled = 1
loose_rpl_semi_sync_master_timeout = 5000


3. 搭建基于半同步主从

   * Master 创建复制所使用的用户 [ 此处ip设置为slave服务IP或者% ]

1
grant  replication slave  on  *.*  to  'rpl' @ '172.18.4.1'  identified  by  '123' ;


   * master服务器上查看binlog文件名和日志位置

1
2
3
4
5
6
7
mysql> show master status;
+ ------------+----------+--------------+------------------+-------------------+
| File       | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+ ------------+----------+--------------+------------------+-------------------+
| bin.000003 |     1187 |              |                  |                   |
+ ------------+----------+--------------+------------------+-------------------+
1 row  in  set  (0.00 sec)


   * slave服务器上设置master信息

        未开启slave服务时,Slave_IO_Running与Slave_SQL_Running状态成No

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
mysql> show slave status;     # 未开启复制功能时,slave状态是空的
Empty  set  (0.00 sec)
 
mysql> change master  to  master_host= '172.18.0.1' ,master_user= 'rpl' ,master_password= '123' ,master_log_file= 'bin.000003' ,master_log_pos=1187;
Query OK, 0  rows  affected, 2 warnings (0.01 sec)
 
mysql> show slave status\G
*************************** 1. row ***************************
                Slave_IO_State: 
                   Master_Host: 172.18.0.1
                   Master_User: rpl
                   Master_Port: 3306
                 Connect_Retry: 60
               Master_Log_File: bin.000003
           Read_Master_Log_Pos: 1187
                Relay_Log_File: relay.000001
                 Relay_Log_Pos: 4
         Relay_Master_Log_File: bin.000003
              Slave_IO_Running:  No
             Slave_SQL_Running:  No
               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: 1187
               Relay_Log_Space: 120
               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:  NULL
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: 0
                   Master_UUID: 
              Master_Info_File: mysql.slave_master_info
                     SQL_Delay: 0
           SQL_Remaining_Delay:  NULL
       Slave_SQL_Running_State: 
            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)


   * 开启slave服务,并查看状态

   正常开启slave服务后,Slave_IO_Running与Slave_SQL_Running状态成Yes

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
mysql> start slave;
Query OK, 0  rows  affected (0.01 sec)
 
mysql> show slave status\G
*************************** 1. row ***************************
                Slave_IO_State: Waiting  for  master  to  send event
                   Master_Host: 172.18.0.1
                   Master_User: rpl
                   Master_Port: 3306
                 Connect_Retry: 60
               Master_Log_File: bin.000003
           Read_Master_Log_Pos: 1187
                Relay_Log_File: relay.000002
                 Relay_Log_Pos: 277
         Relay_Master_Log_File: bin.000003
              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: 1187
               Relay_Log_Space: 440
               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: 110
                   Master_UUID: 08ea3ca7-6dd4-11e7-a45c-00163e0432c5
              Master_Info_File: mysql.slave_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)


   * Master上查看Slave连接信息

1
2
3
4
5
6
7
mysql> show slave hosts;
+ -----------+------+------+-----------+--------------------------------------+
| Server_id | Host | Port | Master_id | Slave_UUID                           |
+ -----------+------+------+-----------+--------------------------------------+
|       210 |      | 3306 |       110 | d6ceba69-6dd4-11e7-a462-00163e028c02 |
+ -----------+------+------+-----------+--------------------------------------+
1 row  in  set  (0.00 sec)


  * Master上操作创建数据库与表,并插入数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
mysql>  create  database  mytest  character  set  utf8mb4;
Query OK, 1 row affected (0.01 sec)
 
mysql> use mytest;
mysql>  create  table  users(
     -> id  BIGINT  NOT  NULL  AUTO_INCREMENT,
     ->  name  VARCHAR (255)  NOT  NULL ,
     -> sex ENUM( 'M' 'F' NOT  NULL  DEFAULT  'M' ,
     -> age  INT  SIGNED  NOT  NULL  DEFAULT  '0' ,
     ->  PRIMARY  KEY  (id)
     -> )ENGINE=INNODB  DEFAULT  CHARSET=utf8mb4;
Query OK, 0  rows  affected (0.03 sec)
 
mysql>  insert  into  users  values ( null 'tom' 'M' , 24), ( null 'jak' 'F' , 32), ( null 'sea' 'M' , 35), ( null 'lisea' 'M' , 29);
Query OK, 4  rows  affected (0.01 sec)
Records: 4  Duplicates: 0  Warnings: 0
 
mysql>  select  from  users;
+ ----+-------+-----+-----+
| id |  name   | sex | age |
+ ----+-------+-----+-----+
|  1 | tom   | M   |  24 |
|  2 | jak   | F   |  32 |
|  3 | sea   | M   |  35 |
|  4 | lisea | M   |  29 |
+ ----+-------+-----+-----+
rows  in  set  (0.00 sec)


   * Slave上查看

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
mysql> show databases;
+ --------------------+
Database            |
+ --------------------+
| information_schema |
| mysql              |
| mytest             |
| performance_schema |
| test               |
+ --------------------+
rows  in  set  (0.00 sec)
 
mysql> use mytest;
Reading  table  information  for  completion  of  table  and  column  names
You can turn  off  this feature  to  get a quicker startup  with  -A
 
Database  changed
mysql> show tables;
+ ------------------+
| Tables_in_mytest |
+ ------------------+
| users            |
+ ------------------+
1 row  in  set  (0.00 sec)
 
mysql>  select  from  users;
+ ----+-------+-----+-----+
| id |  name   | sex | age |
+ ----+-------+-----+-----+
|  1 | tom   | M   |  24 |
|  2 | jak   | F   |  32 |
|  3 | sea   | M   |  35 |
|  4 | lisea | M   |  29 |
+ ----+-------+-----+-----+
rows  in  set  (0.00 sec)


4. Master/Slave传输过程

wKiom1lxotPxcM3kAACljxo7h8k904.jpg

5. 总结


以需求驱动技术,技术本身没有优略之分,只有业务之分。





      本文转自asd1123509133 51CTO博客,原文链接:http://blog.51cto.com/lisea/1949707,如需转载请自行联系原作者





相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
Kubernetes Cloud Native 关系型数据库
提升数据安全与性能,掌握Helm一键部署MySQL 8.0主从技巧
【4月更文挑战第9天】提升数据安全与性能,掌握Helm一键部署MySQL 8.0主从技巧
1056 0
|
10月前
|
SQL 存储 关系型数据库
MySQL主从复制 —— 作用、原理、数据一致性,异步复制、半同步复制、组复制
MySQL主从复制 作用、原理—主库线程、I/O线程、SQL线程;主从同步要求,主从延迟原因及解决方案;数据一致性,异步复制、半同步复制、组复制
1178 11
|
Prometheus 监控 关系型数据库
数据库同步革命:MySQL GTID模式下主从配置的全面解析
数据库同步革命:MySQL GTID模式下主从配置的全面解析
1643 0
|
存储 关系型数据库 MySQL
利用 MySQL 克隆插件搭建主从
MySQL 的 Clone 插件是一个强大的功能,首次引入于 MySQL 8.0.17 版本。简单来说,Clone Plugin 是一款物理克隆数据工具,它能够帮助我们快速、高效地克隆或复制数据库,极大地简化了数据库迁移、备份和恢复的过程,让我们在处理大量数据时更加得心应手。本篇文章我们一起来学习下如何使用克隆插件。
259 2
|
运维 关系型数据库 MySQL
【实操记录】MySQL主从配置
本文使用MySQL原生支持的主从同步机制,详细记录了配置步骤及运维操作方法,可供大家直接参考、使用。 本文假设已经部署了两台主机的MySQL软件,且数据库服务正常,详细部署步骤可本站搜索:"mysql二进制安装包部署"
952 0
|
SQL 关系型数据库 MySQL
【MySQL】主从异步复制配置
【MySQL】主从异步复制配置
211 1
|
关系型数据库 MySQL Linux
服务器Linux系统配置mysql数据库主从自动备份
这是一个基本的配置主从复制和设置自动备份的指南。具体的配置细节和命令可能因您的环境和需求而有所不同,因此建议在操作前详细阅读MySQL文档和相关资源,并谨慎操作以避免数据丢失或不一致。
389 3
|
关系型数据库 MySQL Linux
本地虚拟机centos7通过docker安装主从mysql5.7.21
本地虚拟机centos7通过docker安装主从mysql5.7.21
345 0
|
弹性计算 关系型数据库 MySQL
检查MySQL主从同步状态
【4月更文挑战第30天】
160 0
|
SQL 关系型数据库 MySQL
MySQL主从模式最佳实践
主从模式是很常见的数据库存储解决方案,一主多从,当然还有双主模式(多主模式),你对数据库的主从模式有哪些见解,欢迎跟 V 哥聊聊。
489 0

推荐镜像

更多