阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

MySQL的异步复制和半同步复制

227次阅读
没有评论

共计 4863 个字符,预计需要花费 13 分钟才能阅读完成。

实验拓扑

MySQL 主从复制
主机名 主机地址 角色
node1 192.168.2.201 Master
node2 192.168.2.202 Slave
node3 192.168.2.203 Slave

本文使用 CentOS7.1,数据库:MariaDB-5.5.50
注意:本文关闭了 selinux,以及 iptables。

一、异步复制:

相关知识点:
  • MySQL 的异步复制是 MySQL 自带的数据同步功能,在公司里面也是也就最为常见的。
  • Master 服务器中需要开启二进制日志binlog,从服务器需要开启中继日志relay-log
  • 二进制日志 binlog 的主要功能是:记录令数据库内容产生改变的语句,如 insert 语句;二进制日志在备份还原的时候至关重要。
  • 中继日志 relay-log 则是从服务器中开启,作用是从主服务器的二进制日志中复制,并在在从服务器本地执行一次,达到与主服务器内容一致的效果。
  • 一般 MySQL 复制是放在内网中进行的,因为 MySQL 的同步并没有进行加密。而且相比较于在公网传输,在内网中丢包的概率较低,带宽也高。
Master 节点:Node1
(1) 启动二进制日志;
    [mysqld]
    log_bin=mysql-bin
(2) 为当前节点设置一个全局唯一的 ID 号;
    [mysqld]
    server_id=1
(3) 授权创建仅有复制权限的用户账号;
    mysql> GRANT REPLCATION SLAVE, REPLICATION CLIENT ON *.* TO 'repuser'@'192.168.2.%' IDENTIFIED BY 'repuser';

(4)查看 Master 端的二进制日志记录到哪里,用于决定 Slave 复制的起始位置
    MariaDB [(none)]> show master status;
    +-------------------+----------+--------------+------------------+
    | File              | Position | Binlog_Do_DB | Binlog_Ignore_DB |
    +-------------------+----------+--------------+------------------+
    | Master-log.000001 |     245 |              |                  |
    +-------------------+----------+--------------+------------------+
     #Slave 服务器如果是一个空的数据库而主服务器不为空:#在同步之前可以先用 Master 的全量备份,恢复到 Slave 数据库中。#然后再从备份那一刻记录的 Position 开始复制。#假设 Master 和 Slave 都为空,上面的情况就表示 Slave 从二进制日志 Master-log.000001 的 245 开始复制
从节点:Node2 设置
(1) 启动中继日志;
    [mysqld]
    relay_log=relay-log
    relay_log_index=relay-log.index
(2) 为当前节点设置一个全局惟的 ID 号;
    [mysqld]
    server_id=2
    #node3 把这里改为 3
(3) Slave 服务器打开只读模式;
    [mysqld]
    read_only = 1
(4) 使用有复制权限的用户账号连接至主服务器,并启动复制线程;
     #注意:上面的是在 /etc/my.cnf 的配置文件中添加,下面 mysql> 的则是在 mysql 服务器中运行的命令
    mysql> CHANGE MASTER TO 
    MASTER_HOST='192.168.2.201', 
    MASTER_USER='repuser', 
    MASTER_PASSWORD='repuser', 
    MASTER_LOG_FILE='Master-log.000001', 
    MASTER_LOG_POS=245;(5)在从服务器中开启复制线程
   mysql> START SLAVE;
查看从服务器的状态信息
mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.2.201
                  Master_User: repuser
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: Master-log.000003
          Read_Master_Log_Pos: 1379
               Relay_Log_File: relay-log.000002
                Relay_Log_Pos: 1414
        Relay_Master_Log_File: Master-log.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: 1379
              Relay_Log_Space: 1702
              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)

插入几条命令之后,从以上的状态信息中可以看得到我们的 Master 服务器是 192.168.2.201
拥有复制功能的账号是 repuser,现在复制到 Master-log.000003 的 Position 1379 这个位置;
上面的输出结果中,我在复制完成之后使用了 flush logs 手动地滚动了二进制日志,所以二进制去到 000003

二、半同步复制

相关知识点:
  • 半同步复制是由谷歌研发的一种数据库主从复制方式。
  • 与传统的异步复制相比,半同步复制在多个 Slave 节点中会选取一个节点进行半同步复制。也就是说,当 Master 提交一个事务的时候,在这个半同步复制的 Slave 端返回一个同步完成的 Ack 包之后,服务器才会向用户返回事务提交成功,而其他的节点则是采用传统的异步复制方式进行同步。
  • 半同步是复制是基于异步复制之上进行的,也就是说配置半同步复制之前需要先配置到异步复制。
  • 半同步复制可以保证在主节点发生故障的时候,总有一个节点的数据与主节点一样。这样在进行切换的时候,可以更加快速地把这个 Slave 节点设置成主节点来使用。
    Master 节点:Node1

    由于上面已经进行了异步复制的配置,下面仅进行半同步复制的操作。
    (1)Master 安装插件并修改变量:

    mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';

    插件的文件名字和路径一般在 rpm -ql mariadb-server 那里查看。
    这个插件的库文件是安装好之后就直接有的,只是没有默认安装。
    (2)启用选项

    mysql> SET GLOBAL VARIABLES rpl_semi_sync_master_enabled=1;
Slave 节点:Node2

(1)slave 安装插件并修改变量:

mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
mysql> SET GLOBAL VARIABLES rpl_semi_sync_slave_enabled=1;

这里需要注意的是,node1 作为主节点使用的是 master 模块。node2,node3 作为从节点使用 slave 模块

(2)查看半同步复制的全局变量

mysql> SHOW GLOBAL VARIABLES LIKE '%semi%';
+------------------------------------+-------+
| Variable_name                      | Value |
+------------------------------------+-------+
| rpl_semi_sync_master_enabled       | ON    |
| rpl_semi_sync_master_timeout       | 10000 |
| rpl_semi_sync_master_trace_level   | 32    |
| rpl_semi_sync_master_wait_no_slave | ON    |
+------------------------------------+-------+

设置 rpl_semi_sync_master_enabled= 1 的效果
第一行是 ON 则表示半同步复制已经开启。

(3)查看半同步复制的全局变量

mysql> SHOW GLOBAL STATUS LIKE '%semi%';
+--------------------------------------------+-------+
| Variable_name                              | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients               | 1     |
| Rpl_semi_sync_master_net_avg_wait_time     | 645   |
| Rpl_semi_sync_master_net_wait_time         | 645   |
| Rpl_semi_sync_master_net_waits             | 1     |
| Rpl_semi_sync_master_no_times              | 1     |
| Rpl_semi_sync_master_no_tx                 | 5     |
| Rpl_semi_sync_master_status                | ON    |
| Rpl_semi_sync_master_timefunc_failures     | 0     |
| Rpl_semi_sync_master_tx_avg_wait_time      | 783   |
| Rpl_semi_sync_master_tx_wait_time          | 783   |
| Rpl_semi_sync_master_tx_waits              | 1     |
| Rpl_semi_sync_master_wait_pos_backtraverse | 0     |
| Rpl_semi_sync_master_wait_sessions         | 0     |
| Rpl_semi_sync_master_yes_tx                | 1     |
+--------------------------------------------+-------+

第一行 Rpl_semi_sync_master_clients 显示 1,表示有一台主机是半同步复制的状态。

最后需要说明的是,semi 复制的 MySQL5.7 中性能有明显的改善。
假如真的需要使用半同步复制,建议使用 5.7 的版本。

下一篇文章,我们将会讲怎么使用 MHA 配合半同步复制高可用 MariaDB,见 http://www.linuxidc.com/Linux/2017-10/147555.htm

本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-10/147554.htm

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-22发表,共计4863字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中