Administrator
发布于 2025-03-12 / 14 阅读
2
0

MySQL双主同步热备

目的

1.数据实时备份,在主节点出现故障时能够迅速进行故障转移

2.可以用于负载均衡,过将读写请求分配到两个主节点上,可以减轻单个节点的压力,提高整个数据库系统的处理能力和稳定性。

原理

通过开启二进制日志功能,通过日志将主节点的数据变化,通过有相应权限的账户同步到从节点的服务器上

实现

注意事项

建议部署前用空表,以保证两台服务器上的数据一致,不是必须的,但数据一定要一致,否则会出错无法同步,

以下部署以8.X.X MYSQL版本为例,如果是部署在容器里,有些版本在部署时可能因为功能被阉割不支持语法。

以下以部署双向热备为例

一.修改配置文件

mysql配置文件,windows系统下配置文件为my.ini,linux系统下配置文件为my.conf

在配置文件[mysqld]下面添加或修改信息

因为当前部署的是双向同步,所以两台服务器即是主也是从,配置信息的server-id不能相同外,其他信息一样即可

log-bin=mysql-bin #开启二进制日志以及文件名称
binlog_format=mixed
server-id = 85 #mysql唯一服务器标识
slave-skip-errors = 1032 #可有可无,主要是用来跳过一些不重要的出错类型
relay_log = mysql-relay-bin #中继日志文件文件名
log_slave_updates = 1
read_only = 0 # 需要读写分离则这里填1,只读
replicate-do-db = db_1
replicate-do-db = db_2
replicate-do-db = db_3 #例这里有3个库要做数据同步
expire_logs_days = 10 #二进制日志自动删除的天数。默认值为0,表示“没有自动删除”此方法需要重启mysql

二.添加账户

在主服务器上添加有相应权限的用户名及密码,以便从服务器用该账户进行同步数据

因为是双向同步,所以所有服务器都要添加同步账号

#创建一个用户名和密码用于复制
CREATE USER 'copy_user'@'%' IDENTIFIED BY 'password';
#对创建的用户授权
GRANT REPLICATION SLAVE ON *.* TO 'copy_user'@'%';

三.查询二进制日志位置

输入以下指令

mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000xxx | xxxxxxxx |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

记录File和Position的数值,这里要注意,因为是双向同步,所以每台服务器都要查看,且不能乱了

为了方便对比和理解,假设A主机File的值为mysql-bin.000001,Position的值为10000

B主机File的值为mysql-bin.000002,Position的值为20000

四.配置复制功能

在A主机输入以下指令

CHANGE MASTER TO MASTER_HOST='B主机的ip地址或域名', MASTER_USER='copy_user', MASTER_PASSWORD='password', MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=2000;

在B主机输入以下指令

CHANGE MASTER TO MASTER_HOST='A主机的ip地址或域名', MASTER_USER='copy_user', MASTER_PASSWORD='password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=1000;

也就是在当前主机里配置另一台主机的信息,达到复制另主机上的数据为目的

五.启动复制

在每台主机上输入启动复制服务

START SLAVE;

输入以下指令可查看服务运行状态

mysql> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for source to send event
                  Master_Host: 10.0.0.80
                  Master_User: copy_user
                  Master_Port: 5150
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 100000
               Relay_Log_File: mysql-relay-bin.000006
                Relay_Log_Pos: 2663387
        Relay_Master_Log_File: mysql-bin.000002
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: db_1,db_2,db_3
          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: 36066555
              Relay_Log_Space: 2663766
              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: 80
                  Master_UUID: 0d521a2d-bb74-11ef-872e-0242ac120004
             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.03 sec)

主要看Slave_IO_Running和Slave_SQL_Running的结果是不是YES,如果不是就要查看原因,排除原因后先停止同步服务(下面指令),重新配置正确后再启动服务

STOP SLAVE;

如果查看失败可能是版本问题,可以输入以下指令看看,区别就是上面的结果以列表形式展现,去掉\G是以表格形式展现

SHOW SLAVE STATUS;

结束语

1.所有主机的server-id配置不能相同

2.同步前两台服务器的数据要一致,推荐先弄成空表,然后把数据复制进来另一个服务器会自动同步过去


评论