MySQL数据库的主主同步配置

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介:

一、架构方案思路

1.两台mysql都可读写,互为主备。本文的实验中:默认只使用一台(DCGH-DB1)负责数据的写入,另一台(DCGH-DB2)备用。

2.DCGH-DB1是DCGH-DB2的主库,DCGH-DB2又是DCGH-DB1的主库,它们互为主从。

3.不足之处:DCGH-DB2可能会一直处于空闲状态(后期经过改进后,可以用它当从库,负责部分查询)。

二、基础环境

操作系统:CentOS Linux release 7.4.1708 (Core) 64Bit
MySQL版本:MySQL Community Server version: 5.7.21 64Bit
主机名及IP:DCGH-DB1(10.1.1.31),DCGH-DB2(10.1.1.32)
两台主机的操作系统,数据库版本完全一致(克隆的)。实际环境中,需要确保操作系统版本完全一致、MySQL版本完全一致、数据完全一致,可能会涉及到数据库的备份与还原。

三、环境初始化

1.在DCGH-DB2上安装MySQL服务器,进行初始化。

[root@DCGH-DB2 ~]# curl -C - -O https://repo.mysql.com//mysql57-community-release-el7-11.noarch.rpm
[root@DCGH-DB2 ~]# rpm -ivh mysql57-community-release-el7-11.noarch.rpm
[root@DCGH-DB2 ~]# yum -y install mysql-community-server
[root@DCGH-DB2 ~]# systemctl start mysqld
[root@DCGH-DB2 ~]# systemctl enable mysqld
[root@DCGH-DB2 ~]# firewall-cmd --permanent --add-port=3306/tcp
[root@DCGH-DB2 ~]# firewall-cmd --reload
[root@DCGH-DB2 ~]# grep -i password /var/log/mysqld.log 
2018-04-11T10:11:40.732848Z 1 [Note] A temporary password is generated for root@localhost: p>-/fQDca3ag
[root@DCGH-DB2 ~]# mysql -u root -p
Enter password: 
mysql> set password=password("DCGH-test-db2");
mysql> exit
AI 代码解读

如果遭遇如下错误:ERROR 1819 (HY000): Your password does not satisfy the current policy requirements,密码不满足当前策略要求,那么请执行以下命令:

set global validate_password_policy=0;  
set global validate_password_mixed_case_count=0;  
set global validate_password_number_count=3;  
set global validate_password_special_char_count=0;  
set global validate_password_length=3;  
AI 代码解读

2.关机克隆DCGH-DB2,修改配置,使之满足DCGH-DB1要求,只需修改主机名及IP即可,登录数据库,修改密码。

[root@DCGH-DB2 ~]# hostnamectl set-hostname DCGH-DB1 --static
[root@DCGH-DB2 ~]# nmtui
[root@DCGH-DB2 ~]# systemctl restart network
[root@DCGH-DB1 ~]# mysql -u root -p
Enter password: 
mysql> set password=password("DCGH-test-db1");
mysql> exit
AI 代码解读

至此,实验环境准备完毕。

四、DCGH-DB1配置

1.修改/etc/my.cnf,在[mysqld]下加入如下内容:

server-id=31
auto-increment-increment=2
auto-increment-offset=1
log-bin=mysql-bin
binlog_format=mixed
relay-log=relay-bin
log-slave-updates
AI 代码解读

2.重启服务,创建同步用户copy,并授予相应权限,锁表,查出Position备用。

[root@DCGH-DB1 ~]# mysql -u root -A -p
Enter password: 
mysql> grant replication slave,replication client on *.* to 'copy'@10.1.1.32 identified by 'DCGH-test-db2';
mysql> flush privileges;
mysql> flush tables with read lock;
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |      627 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
AI 代码解读

五、DCGH-DB2配置

1.修改/etc/my.cnf,在[mysqld]下加入如下内容:

server-id=32
auto-increment-increment=2
auto-increment-offset=1
log-bin=mysql-bin
binlog_format=mixed
relay-log=relay-bin
log-slave-updates
AI 代码解读

2.重启服务,创建同步用户copy,并授予相应权限并在DCGH-DB2上去同步DCGH-DB1上的数据。

[root@DCGH-DB2 ~]# mysql -u root -A -p
Enter password: 
mysql> grant replication slave,replication client on *.* to 'copy'@10.1.1.31 identified by 'DCGH-test-db1';
mysql> CHANGE MASTER TO MASTER_HOST='10.1.1.31',MASTER_USER='copy',MASTER_PASSWORD='DCGH-test-db2',MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=627;
mysql> start slave;
mysql> show slave status \G
*************************** 1. row ***************************
               Slave_IO_State: 
                  Master_Host: 10.1.1.31
                  Master_User: copy
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 627
               Relay_Log_File: relay-bin.000001
                Relay_Log_Pos: 4
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: No
            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: 627
              Relay_Log_Space: 154
              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: 1593
                Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work.
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 31
                  Master_UUID: 
             Master_Info_File: /var/lib/mysql/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 180411 19:27:07
     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: 
AI 代码解读

致命报错来袭:Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different。原来是UUID重复了,这是因为咱们的MySQL服务器是克隆出来的,好办,改server-uuid(随便改个数字或字母跟之前uuid不一致即可)!

[root@DCGH-DB2 ~]# vi /var/lib/mysql/auto.cnf
server-uuid=ba5f1c18-3d70-11e8-891f-000c2986a1f0
[root@DCGH-DB2 ~]# systemctl restart mysqld
AI 代码解读

重复以上步骤:

mysql> CHANGE MASTER TO MASTER_HOST='10.1.1.31',MASTER_USER='copy',MASTER_PASSWORD='DCGH-test-db2',MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=627;
mysql> start slave;
mysql> show slave status \G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 10.1.1.31
                  Master_User: copy
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 627
               Relay_Log_File: relay-bin.000002
                Relay_Log_Pos: 320
        Relay_Master_Log_File: mysql-bin.000001
             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: 627
              Relay_Log_Space: 521
              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: 31
                  Master_UUID: ba5f1c18-3d70-11e8-891f-000c2986a1f9
             Master_Info_File: /var/lib/mysql/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave 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: 
AI 代码解读

Slave_IO_Running: Yes,Slave_SQL_Running: Yes,Seconds_Behind_Master: 0,表明目前已经同步了。

六、验证

1.回到DCGH-DB1,解锁表创建数据库DCGHDB。

mysql> unlock tables;
mysql> create database DCGHDB;
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| DCGHDB             |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
AI 代码解读

我在DCGHDB2使用show databases命令,结果一致。
2.在DCGH-DB1创建表并插入数据,看是否同步。

mysql> use DCGHDB;
Database changed
mysql> create table test(username varchar(30),password varchar(30));
mysql> insert into test(username,password) values('IVAN DU','DCGH-test');
mysql> select * from test;
+----------+-----------+
| username | password  |
+----------+-----------+
| IVAN DU  | DCGH-test |
+----------+-----------+
AI 代码解读

在DCGH-DB2查表test的数据是否一致。

mysql> use DCGHDB;
Database changed
mysql> select * from test;
+----------+-----------+
| username | password  |
+----------+-----------+
| IVAN DU  | DCGH-test |
+----------+-----------+
AI 代码解读

3.在DCGH-DB1更新表test。

mysql> update test set username='DCGH' where username='IVAN DU';
mysql> select * from test;
+----------+-----------+
| username | password  |
+----------+-----------+
| DCGH     | DCGH-test |
+----------+-----------+
AI 代码解读

在DCGH-DB2进行查看,结果一致。

mysql> select * from test;
+----------+-----------+
| username | password  |
+----------+-----------+
| DCGH     | DCGH-test |
+----------+-----------+
AI 代码解读

4.经验证,删除表数据、表结构、库都能够顺利同步。不展示,相关验证命令如下:

mysql> delete from test;
mysql> drop table test;
mysql> drop database DCGHDB;
mysql> show tables;
AI 代码解读

七、拓展知识

配置文件部分选项解读及拓展。

# 服务器的ID,必须唯一,一般设置自己的IP
server-id=31
# 复制过滤:不需要备份的数据库(MySQL库一般不同步)
binlog-ignore-db=mysql
# 开启二进制日志功能,名字可以随便取,最好有含义(比如项目名)
log-bin=DCGH
# 为每个 session 分配的内存,在事务过程中用来存储二进制日志的缓存
binlog_cache_size=1M
# 主从复制的格式(mixed,statement,row,默认格式是 statement)
binlog_format=mixed
# 二进制日志自动删除/过期的天数。默认值为 0,表示不自动删除。
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免 slave 端复制中断。 
## 如:1062 错误是指一些主键重复,1032 错误是因为主从数据库数据不一致
slave_skip_errors=1062
# 作为从服务器时的中继日志
relay_log=edu-mysql-relay-bin
# log_slave_updates 表示 slave 将复制事件写进自己的二进制日志
log_slave_updates=1
# 主键自增规则,避免主从同步ID重复的问题
auto_increment_increment=2  # 自增因子(每次加2)
auto_increment_offset=1     # 自增偏移(从1开始),单数
AI 代码解读

八、参考资料

https://dev.mysql.com/doc/refman/5.6/en/replication-howto-newservers.html
https://dev.mysql.com/doc/refman/5.7/en/stored-programs-logging.html
https://dev.mysql.com/doc/refman/5.7/en/replication.html

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
打赏
0
0
0
1
30
分享
相关文章
【YashanDB知识库】原生mysql驱动配置连接崖山数据库
【YashanDB知识库】原生mysql驱动配置连接崖山数据库
【YashanDB知识库】原生mysql驱动配置连接崖山数据库
【YashanDB知识库】数据库一主一备部署及一主两备部署时,主备手动切换方法及自动切换配置
【YashanDB知识库】数据库一主一备部署及一主两备部署时,主备手动切换方法及自动切换配置
【YashanDB知识库】数据库一主一备部署及一主两备部署时,主备手动切换方法及自动切换配置
MySQL 备份 Shell 脚本:支持远程同步与阿里云 OSS 备份
一款自动化 MySQL 备份 Shell 脚本,支持本地存储、远程服务器同步(SSH+rsync)、阿里云 OSS 备份,并自动清理过期备份。适用于数据库管理员和开发者,帮助确保数据安全。
seatunnel配置mysql2hive
本文介绍了SeaTunnel的安装与使用教程,涵盖从安装、配置到数据同步的全过程。主要内容包括: 1. **SeaTunnel安装**:详细描述了下载、解压及配置连接器等步骤。 2. **模拟数据到Hive (fake2hive)**:通过编辑测试脚本,将模拟数据写入Hive表。 3. **MySQL到控制台 (mysql2console)**:创建配置文件并执行命令,将MySQL数据输出到控制台。 4. **MySQL到Hive (mysql2hive)**:创建Hive表,配置并启动同步任务,支持单表和多表同步。
143 15
Navicat Premium 17 最新版下载与配置:5分钟完成企业级数据库工具部署
Navicat Premium 17 是一款支持多种主流数据库(如 MySQL、Oracle、PostgreSQL 等)的多数据库管理工具,提供可视化数据建模、SQL 编辑和数据同步等功能。试用版提供 14 天全功能体验,商业版支持跨平台使用。安装环境要求 Windows 10/11 或 macOS 12.0+,最低配置为 4GB 内存。下载并解压安装包后,按步骤启动安装程序、接受许可协议、自定义安装路径并完成安装。首次运行时需激活许可证并配置数据库连接。常见问题包括无法写入注册表、试用期续费及连接数据库权限问题。高级功能涵盖 SSH 通道加速、自动化任务调度和性能调优建议。
184 19
MySQL原理简介—12.MySQL主从同步
本文介绍了四种为MySQL搭建主从复制架构的方法:异步复制、半同步复制、GTID复制和并行复制。异步复制通过配置主库和从库实现简单的主从架构,但存在数据丢失风险;半同步复制确保日志复制到从库后再提交事务,提高了数据安全性;GTID复制简化了配置过程,增强了复制的可靠性和管理性;并行复制通过多线程技术降低主从同步延迟,保证数据一致性。此外,还讨论了如何使用工具监控主从延迟及应对策略,如强制读主库以确保即时读取最新数据。
MySQL原理简介—12.MySQL主从同步
【YashanDB 知识库】数据库一主一备部署及一主两备部署时,主备手动切换方法及自动切换配置
**数据库主备切换简介** 在数据库正常或异常情况下,实现主备切换至关重要。若配置不当,主节点故障将影响业务使用,尤其在23.2版本中。原因包括资源紧张或主节点异常。解决方法涵盖手动和自动切换: 1. **一主一备部署**: - **手动切换**:支持Switchover(同步正常时)和Failover(主库损坏时)。 - **自动切换**:启用yasom仲裁选主开关。 2. **一主两备部署**: - 默认最大保护模式,自动切换开启。 需检查并配置自动切换以确保高可用性。经验总结:一主一备默认关闭自动切换,需手动开启;一主两备默认开启。
【YashanDB 知识库】用 yasldr 配置 Bulkload 模式作单线程迁移 300G 的业务数据到分布式数据库,迁移任务频繁出错
问题描述 详细版本:YashanDB Server Enterprise Edition Release 23.2.4.100 x86_64 6db1237 影响范围: 离线数据迁移场景,影响业务数据入库。 外场将部分 NewCIS 的报表业务放到分布式数据库,验证 SQL 性能水平。 操作系统环境配置: 125G 内存 32C CPU 2T 的 HDD 磁盘 问题出现的步骤/操作: 1、部署崖山分布式数据库 1mm 1cn 3dn 单线启动 yasldr 数据迁移任务,设置 32 线程的 bulk load 模式 2、观察 yasldr.log 是否出现如下错
Flink CDC MySQL同步MySQL错误记录
在使用Flink CDC同步MySQL数据时,常见的错误包括连接错误、权限错误、表结构变化、数据类型不匹配、主键冲突和
253 17
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等