Administrator
发布于 2023-10-19 / 7 阅读
0
0

Mysql主从复制

微信图片_20250719100502.png

主从复制相关线程

  • 主节点:

    dump Thread:为每个Slave的I/O Thread启动一个dump线程,用于向其发送binary log events

  • 从节点:

    I/O Thread:向Master请求二进制日志事件,并保存于中继日志中

    SQL Thread:从中继日志中读取日志事件,在本地完成重放

跟复制功能相关的文件:

  • master.info:用于保存slave连接至master时的相关信息,例如账号、密码、服务器地址等

  • relay-log.info:保存在当前slave节点上已经复制的当前二进制日志和本地relay log日志的对应关

  • mysql-relay-bin.00000#: 中继日志,保存从主节点复制过来的二进制日志,本质就是二进制日志

实现主从复制配置

主节点配置:
#为当前节点设置一个全局惟一的ID号,启用二进制日志
[mysqld]
server-id=100
log-bin=/data/mysql/mysql-bin

查看从二进制日志的文件和位置开始进行复制

mysql> show master status;

创建有复制权限的用户账号

#Mysql8.0需注意从节点连接插件是否更改,或者启用ssl
mysql> create user repluser@'10.0.0.%' identified by '123456';
Query OK, 0 rows affected (0.02 sec)
​
mysql> grant replication slave on *.* to repluser@'10.0.0.%';
Query OK, 0 rows affected (0.00 sec)
从节点配置:
[mysqld]
server_id=101           #为当前节点设置一个全局惟的ID号
read_only=on            #设置数据库只读,针对supper user无效
#super-read-only=on     #设置数据库只读,针对supper user有效,初始配置时因为要还原数据,不能加此项,后续完成配置后可加
relay_log=relay-log     #relay log的文件路径,默认值hostname-relay-bin
relay_log_index=relay-log.index     #默认值hostname-relay-bin.index
log_bin=/data/mysql/mysql-bin       #开启二进制,可选

使用有复制权限的用户账号连接至主服务器,并启动复制线程

CHANGE MASTER TO MASTER_HOST='10.0.0.100',
MASTER_USER='repluser',
MASTER_PASSWORD='123456',
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql-bin.000005',
MASTER_LOG_POS=1171;

查看复制状态

mysql> show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for source to send event
                  Master_Host: 10.0.0.100
                  Master_User: repluser
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000005
          Read_Master_Log_Pos: 1470
               Relay_Log_File: relay-log.000002
                Relay_Log_Pos: 625
        Relay_Master_Log_File: mysql-bin.000005
             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: 1470
              Relay_Log_Space: 829
              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: 100
                  Master_UUID: fda4b257-58f2-11f0-8985-000c2912e78a
             Master_Info_File: mysql.slave_master_info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Replica has read all relay log; waiting for more updates
           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
         Replicate_Rewrite_DB: 
                 Channel_Name: 
           Master_TLS_Version: 
       Master_public_key_path: 
        Get_master_public_key: 0
            Network_Namespace: 
1 row in set, 1 warning (0.00 sec)
​
ERROR: 
No query specified

优化主和从节点服务器的性能

mysql> set global innodb_flush_log_at_trx_commit=2;
Query OK, 0 rows affected (0.00 sec)
​
mysql> set global sync_binlog=0;
Query OK, 0 rows affected (0.00 sec)
​
mysql> show variables like 'sync_binlog';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| sync_binlog   | 0     |
+---------------+-------+
1 row in set (0.01 sec)
在从节点清除信息
mysql> RESET SLAVE; #从服务器清除master.info ,relay-log.info, relay log ,开始新的relay log
mysql> RESET SLAVE  ALL #清除所有从服务器上设置的主服务器同步信息,如HOST,PORT, USER和 PASSWORD 等
复制错误解决方法

可以在从服务器忽略几个主服务器的复制事件,此为global变量,或指定跳过事件的ID

#系统变量,指定跳过复制事件的个数
SET GLOBAL sql_slave_skip_counter = N
#服务器选项,只读系统变量,指定跳过事件的ID
[mysqld]
slave_skip_errors=1007|ALL
保证主从复制的事务安全

在master节点启用参数:

sync_binlog=1 #每次写后立即同步二进制日志到磁盘,性能差
#如果用到的为InnoDB存储引擎:
innodb_flush_log_at_trx_commit=1    #每次事务提交立即同步日志写磁盘
sync_master_info=n                  #n次事件后master.info同步到磁盘

在slave节点启用服务器选项:

skip-slave-start=ON     #不自动启动slave

在slave节点启用参数:

sync_relay_log=#        #\#次写后同步relay log到磁盘
sync_relay_log_info=#   #\#次事务后同步relay-log.info到磁盘



评论