MySQL主从复制架构及实现

新博客网站1

新博客网站2

一,MySQL复制

(1).复制

1.每个节点都有相同的数据集
2.向外拓展
3.二进制日志
4.单向

(2).功用

1.数据分布
2.负载均衡读
3.备份
4.高可用和故障
5.MySQL升级测试

(3).实现

1.Master 必须要开启二进制日志
2.slave扮演为mysql客户端,启动一个线程,请求读取master的二进制日志
3.slave请求时如果携带二进制日志文件的位置,则master会从该位置之后的返回
4.slave请求时如果没有携带位置,master则从第一个二进制文件,最开始的位置开始返回
5.slave每接收到一个事件都会保存在中继日志中
6.master启动一个dump线程,来响应请求者,该线程复制读取二进制日志文件,并返回
7.slave节点负责与master通信的线程为io线程,负责从中继日志中重放到从数据库中,为sql线程

(4).基本流程

1.slave节点
2.I/O Thread:从master请求二进制日志事件,并保存于中继日志中;
3.SQL Thread:从中继日志中读取到的事件,在本地完成重放
4.主节点,为每个I/O线程启动一个dump线程,用于向其发送binary log events

MySQL主从复制架构及实现_第1张图片
image.png

(5).特点

1.异步复制
2.主从数据库不一致

(6).架构

1.主从模型(需要读写分离器,从可能会落后)
2.主主模型(可能会导致数据不一致) (serverID)
3.第三方多主方案 MMM,MHA,Galera-Cluster(percona)
4.环状复制

二,实战

(1).主从

1.主节点
2.启动二进制日志
3.为当前节点设置一个全局的ID号
4.创建有复制权限的用户账号
5.从节点
6.启动中继日志
7.为当前节点设置一个全局的ID号
8.使用有复制权限的用户连接主服务器,并启动复制线程

#开启二进制日志
vim /etc/my.cnf
[mysqld]
log_bin=master-bin
server_id=1
innodb_file_per_table=ON
skip_name_resolve=ON

#查看是否生效
MariaDB [(none)]> show global variables like '%log%';

MariaDB [(none)]> show master logs;
+-------------------+-----------+
| Log_name          | File_size |
+-------------------+-----------+
| master-bin.000001 |       329 |
+-------------------+-----------+

MariaDB [(none)]> show global variables like '%server%';
+---------------------------------+-----------------+
| Variable_name                   | Value           |
+---------------------------------+-----------------+
| character_set_server            | utf8            |
| collation_server                | utf8_general_ci |
| innodb_ft_server_stopword_table |                 |
| server_id                       | 1               |
+---------------------------------+-----------------+
#创建有复制权限的用户
 MariaDB [(none)]>grant replication slave,replication client on *.* to 'repluser'@'192.168.%.%' identified by 'replpass';
MariaDB [(none)]> flush privileges;
确保 iptables没有拦截3306

#slave服务器
#开启二进制日志
vim /etc/my.cnf
[mysqld]
relay-log=relay-log
server_id=2
innodb_file_per_table=ON
skip_name_resolve=ON
#重启mysqld
#同上检查
#开启复制
MariaDB [(none)]> change master to master_host='192.168.66.129',master_user='repluser',master_password='replpass',master_log_file='master-bin.000001',master_log_pos=329
    -> ;
#查看从状态
MariaDB [(none)]> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: 
                  Master_Host: 192.168.66.129
                  Master_User: repluser
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: master-bin.000001
          Read_Master_Log_Pos: 329
               Relay_Log_File: relay-log.000001
                Relay_Log_Pos: 4
        Relay_Master_Log_File: master-bin.000001
             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: 329
              Relay_Log_Space: 256
              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_SSL_Crl: 
           Master_SSL_Crlpath: 
                   Using_Gtid: No
                  Gtid_IO_Pos: 
      Replicate_Do_Domain_Ids: 
  Replicate_Ignore_Domain_Ids: 
                Parallel_Mode: conservative
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: 
1 row in set (0.00 sec)
#启动复制线程
MariaDB [(none)]> start slave;
Query OK, 0 rows affected (0.00 sec)

ps:复制架构应该注意的问题

1.限制从服务器为只读,在从服务器上设置为read_only=on ,对于super无效,可以启一个线程获取read lock,不释放锁
2.在master节点启动sync_binlog=on 保证主从服务的事务安全,如果用到innodb,开启innodb_flush_logs_at_trx_commit=ON,innodb_support_xa=ON,在slave节点上,skip_slave_start=on
3.在master节点应该开启sync_master_onfo,slave节点 sync_relay_log,sync_relay_log_info
4.slave master.info文件记录主服务器信息,reloy_log.info保存从服务器重放到的位置,在master中
ps:如果主节点已经运行一段时间了,并且有大量的数据,如果配置并启动slave节点
1.通过备份恢复数据至从服务器
2.复制起始位置为备份是,二进制文件及POS

(2).主主

1.互为主从 (1).数据不一致,选择其中一个,删了另外一个,慎用!(2).自动增长id,一个节点使用奇数,一个为偶数(auto_increment_offset=2,auto_increment_increment=2)(新版本不用设置增长长度)
2.配置步骤
3.各个节点使用一个server_id
4.都启动binary log 和 relay log
5.创建有复制权限的账号
6.有必要时要定义自动增长
7.均指定对方为主节点,并启动复制线程

#操作几乎同主从,只是要配置自动增长id,在每个节点创建拥有复制权限的账号,每个节点开始二进制日志和中继日志

(3).半同步复制

1.只要有一个从节点复制数据,就返回成功
2.超时时间,如果超过此时间,则自动降级为异步模式,不再等待回复

在主从基础上,先关闭复制线程
在master安装插件
MariaDB [mydb]> install plugin rpl_semi_sync_master SONAME 'semisync_master.so';
在slave
MariaDB [mydb]> install plugin rpl_semi_sync_slave SONAME 'semisync_slave.so';

set global rpl_semi_sync_master_enabled=1;开启master
set global rpl_semi_sync_slave_enabled=1; 开启slave

MariaDB [t]> show global status like '%semi%';
+--------------------------------------------+-------+
| Variable_name                              | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients               | 1     |
| Rpl_semi_sync_master_net_avg_wait_time     | 1414  |
| Rpl_semi_sync_master_net_wait_time         | 2828  |
| Rpl_semi_sync_master_net_waits             | 2     |
| Rpl_semi_sync_master_no_times              | 0     |
| Rpl_semi_sync_master_no_tx                 | 0     |
| Rpl_semi_sync_master_status                | ON    |
| Rpl_semi_sync_master_timefunc_failures     | 0     |
| Rpl_semi_sync_master_tx_avg_wait_time      | 1536  |
| Rpl_semi_sync_master_tx_wait_time          | 3072  |
| Rpl_semi_sync_master_tx_waits              | 2     |
| Rpl_semi_sync_master_wait_pos_backtraverse | 0     |
| Rpl_semi_sync_master_wait_sessions         | 0     |
| Rpl_semi_sync_master_yes_tx                | 2     |
+--------------------------------------------+-------+
14 rows in set (0.00 sec)

(4).复制过滤器

1.让从节点仅复制指定数据库或者指定表
2.有两种实现方式 (1).主服务器仅向二进制文件中记录与特定数据库相关的事件(时间点还原无法使用,不建议binlog_do_db,binlog_ignore_db),(2).在从服务器在sql线程在重放时只读取需要的数据(replicate_do_db,replicate_ignore_db可以精确到table)

(5).基于SSL复制

1.实现参考

三,补充资料

5、基于SSL的复制
        前提:支持SSL
        (1) 主服务器端配置证书和私钥,并创建一个要求必须使用SSL连接的复制账号(REQUIRE SSL);
        (2) SLAV端连接master时,使用MASTER_SSL相关的选项来配置证书等信息;
        
    6、跟复制功能相关的文件:
        master.info:用于保存slave连接至master时的相关信息;
        relay-log.info:保存了当前slave节点上已经复制的当前二进制日志和本地relay log日志对应关系; 
                
    7、复制的监控和维护
        (1) 清理日志:PURGE 
        
        (2) 复制监控
            SHOW MASTER STATUS
            SHOW BINLOG EVENTS
            SHOW BINARY LOGS
            
            SHOW SLAVE STATUS
            
        (3) 如何判断slave是否落后于master        
         Seconds_Behind_Master: 0
         
         (4) 如何确定主从节点数据是否一致?
            通过表自身的CHECKSUM检查
            使用percona-tools中pt-table-checksum
            
        (5) 数据不一致的修复方法:
            丢弃一个,重复复制;

你可能感兴趣的:(MySQL主从复制架构及实现)