MySQL双主同步的实现

双主复制:

  • 在两个节点上都可以写入数据,互为主从节点。
  • 解决单点失败的问题:一个主节点失败,所有节点都会失败。

双主配置:

  • (1) 各节点使用一个惟一server_id
  • (2) 都启动binary log和relay log
  • (3) 创建拥有复制权限的用户账号
  • (4) 定义自动增长id字段的数值范围各为奇偶
  • (5) 均把对方指定为主节点,并启动复制线程

注意:

双主复制的时候:考虑自动增长id

解决方法:
  • 配置一个节点使用奇数id
auto_increment_offset=1   #开始点
auto_increment_increment=2 #增长幅度
  • 另一个节点使用偶数id
auto_increment_offset=2
auto_increment_increment=2
master1存在数据的情况下,实现两个节点的主主复制模型
master1: 10.0.0.10
master2: 10.0.0.13
mysql8.0默认开启二进制日志,且二进制日志类型为:row
mysql默认开启中继日志

master1:
#开启二进制日志和配置serverid
[root@CentOS8 ~]# cat /etc/my.cnf.d/mysql-server.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mysql/mysqld.log
pid-file=/run/mysqld/mysqld.pid

server_id=10
log-bin=/data/logbin/mysql-logbin
auto_increment_offset=1   #开始点
auto_increment_increment=2 #增长幅度

#创建用于复制的账号
mysql> create user repluser@'10.0.0.%';
Query OK, 0 rows affected (0.01 sec)

mysql> grant replication slave on *.* to repluser@'10.0.0.%';
Query OK, 0 rows affected (0.00 sec)

#刷新权限
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

#备份数据库所有文件
[root@CentOS8 ~]# mysqldump -uroot -A -F --single-transaction --master-data=1 > fullback_date +%F-%T

#将用于备份的文件传给master2
[root@CentOS8 ~]# scp ./fullback_2022-09-24-23\:11\:58 10.0.0.13:/root/

master2:
#配置serverid、开启二进制日志和中继日志
[root@CentOS8 ~]# cat /etc/my.cnf.d/mysql-server.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mysql/mysqld.log
pid-file=/run/mysqld/mysqld.pid

server_id=13
auto_increment_offset=2
auto_increment_increment=2
#relay-log=/data/relaylog/relay-log
#slave_skip_errors=1007|ALL

#默认值为1,临时关闭二进制日志,避免数据刚开始数据同步的时候将信息写入二进制日志造成空间浪费
mysql> set sql_log_bin=0;
Query OK, 0 rows affected (0.00 sec)

#执行数据恢复
mysql> source fullback_2022-09-24-23:15:14

#开启二进制日志
mysql> set sql_log_bin=1;
Query OK, 0 rows affected (0.00 sec)

#刷新权限,如果不刷新权限,master1不能用change mster to连接过来
mysql> flush privileges;

#连接到master1
mysql> change master to
    -> master_host='10.0.0.10',
    -> master_user='repluser',
    -> master_port=3306,
    -> master_log_file='mysql-logbin.000005',
    -> master_log_pos=156;
Query OK, 0 rows affected, 2 warnings (0.12 sec)

#开启从节点的sql和io线程
mysql> start slave;

master1:
#连接到master2,因为上面mster2开启了复制线程,已经将信息同步到了master2,包括master1的repluser用户
mysql> change master to
    -> master_host='10.0.0.10',
    -> master_user='repluser',
    -> master_port=3306,
    -> master_log_file='mysql-logbin.000005',
    -> master_log_pos=156;
Query OK, 0 rows affected, 2 warnings (0.12 sec)

#开启从节点复制线程
start slave

master1;
#查看sql、io两个线程的状态,以及数据时差(Seconds_Behind_Master:)
mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 10.0.0.13
                  Master_User: repluser
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: binlog.000001
          Read_Master_Log_Pos: 323
               Relay_Log_File: CentOS8-relay-bin.000002
                Relay_Log_Pos: 488
        Relay_Master_Log_File: binlog.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: 323
              Relay_Log_Space: 699
              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: 13
                  Master_UUID: f3544d44-3c1c-11ed-8ef3-000c29cbc410
             Master_Info_File: mysql.slave_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:
       Master_public_key_path:
        Get_master_public_key: 0
            Network_Namespace:
1 row in set (0.00 sec)

master2:
#查看master2的状态
mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 10.0.0.10
                  Master_User: repluser
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-logbin.000005
          Read_Master_Log_Pos: 759
               Relay_Log_File: CentOS8-relay-bin.000002
                Relay_Log_Pos: 538
        Relay_Master_Log_File: mysql-logbin.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: 759
              Relay_Log_Space: 749
              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: 10
                  Master_UUID: 4667b3c2-3c1a-11ed-9aa4-000c295a5cb9
             Master_Info_File: mysql.slave_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:
       Master_public_key_path:
        Get_master_public_key: 0
            Network_Namespace:
1 row in set (0.00 sec)

范例:master1不能存在数据,实现两个节点的主主复制模型
#在第一个master节点上实现
[root@master1 ~]#vim /etc/my.cnf.d/mariadb-server.cnf
[mysqld]
server-id=8
log-bin
auto_increment_offset=1         #开始点
auto_increment_increment=2      #增长幅度  
[root@master1 ~]#systemctl start mariadb
[root@master1 ~]#mysql
MariaDB [(none)]>show master logs;
+--------------------+-----------+
| Log_name           | File_size |
+--------------------+-----------+
| mariadb-bin.000001 |     28303 | | mariadb-bin.000002 |       386 |
+--------------------+-----------+
2 rows in set (0.000 sec)
MariaDB [(none)]> grant replication slave on *.* to repluser@'192.168.100.%'
identified by 'magedu'; #在第二个master节点上实现
[rootmaster2 ~]#vim /etc/my.cnf.d/mariadb-server.cnf
[mysqld]                                                                        
        server-id=18
log-bin
auto_increment_offset=2         #开始点
auto_increment_increment=2      #增长幅度
[root@master2 ~]#systemctl start mariadb
[root@master2 ~]#mysql
MariaDB [(none)]> CHANGE MASTER TO
    ->   MASTER_HOST='192.168.100.8',
    ->   MASTER_USER='repluser',
    ->   MASTER_PASSWORD='magedu',
    ->   MASTER_PORT=3306,
    ->   MASTER_LOG_FILE='mariadb-bin.000002',
    ->   MASTER_LOG_POS=386;
Query OK, 0 rows affected (0.019 sec)
MariaDB [(none)]> start slave;
Query OK, 0 rows affected (0.003 sec)
MariaDB [(none)]> show master logs;  #查看二进制位置
+--------------------+-----------+
| Log_name           | File_size |
+--------------------+-----------+
| mariadb-bin.000001 |     28303 | | mariadb-bin.000002 |       344 |
+--------------------+-----------+
2 rows in set (0.001 sec) #在第一个master节点上实现
MariaDB [(none)]> CHANGE MASTER TO
    ->   MASTER_HOST='192.168.100.18',
    ->   MASTER_USER='repluser',
      ->   MASTER_PASSWORD='magedu',
    ->   MASTER_PORT=3306,
    ->   MASTER_LOG_FILE='mariadb-bin.000002',
    ->   MASTER_LOG_POS=344;
Query OK, 0 rows affected (0.007 sec)
MariaDB [(none)]> start slave;
Query OK, 0 rows affected (0.002 sec)
MariaDB [db1]> create table t1(id int auto_increment primary key,name char(10)); #两个节点分别插入数据
#在第一个节点上执行
MariaDB [db1]> create database db1;
MariaDB [db1]> insert t1 (name) values('user1'); #在第二个节点上执行
MariaDB [db1]> insert t1 (name) values('user2'); #两个节点同时插入数据
MariaDB [db1]> insert t1 (name) values('userX');
MariaDB [db1]> select * from t1;
+----+-------+
| id | name  |
+----+-------+
|  1 | user1 | |  2 | user2 | |  3 | userX | |  4 | userX |
+----+-------+
4 rows in set (0.001 sec) #两个节点同时创建数据库,发生复制冲突
MariaDB [db1]> create database db2;
MariaDB [db1]> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                   Master_Host: 192.168.100.18
                   Master_User: repluser
                   Master_Port: 3306
                 Connect_Retry: 60
               Master_Log_File: mariadb-bin.000002
           Read_Master_Log_Pos: 1029
               Relay_Log_File: mariadb-relay-bin.000002
                 Relay_Log_Pos: 1110
         Relay_Master_Log_File: mariadb-bin.000002
             Slave_IO_Running: Yes
             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: 1007
                   Last_Error: Error 'Can't create database 'db2'; database
exists' on query. Default database: 'db2'. Query: 'create database db2'
                 Skip_Counter: 0
           Exec_Master_Log_Pos: 897
            Relay_Log_Space: 1553
               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: 1007
               Last_SQL_Error: Error 'Can't create database 'db2'; database
exists' on query. Default database: 'db2'. Query: 'create database db2'
   Replicate_Ignore_Server_Ids:
             Master_Server_Id: 18
               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:
             Slave_DDL_Groups: 2
Slave_Non_Transactional_Groups: 0
   Slave_Transactional_Groups: 2 1 row in set (0.003 sec)

Original: https://www.cnblogs.com/heyongshen/p/16727042.html
Author: 背对背依靠
Title: MySQL双主同步的实现

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/578574/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • .NET客户端实现Redis中的管道(PipeLine)与事物(Transactions)

    序言 Redis中的管道(PipeLine)特性:简述一下就是,Redis如何从客户端一次发送多个命令,服务端到客户端如何一次性响应多个命令。 Redis使用的是客户端-服务器模型…

    Linux 2023年5月28日
    0122
  • Popovers

    弹出式窗口弹出式窗口是一个短暂的视图,当你点击一个控件或一个区域时,它就会出现在屏幕上的其他内容之上。通常情况下,弹出窗口包括一个箭头,指向它出现的位置。弹出式窗口可以是非模态或模…

    Linux 2023年6月7日
    0102
  • 设计模式——中介者模式

    中介者模式定义 用一个中介对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而使其耦合松散,而且可以独立地改变它们之间的交互。 Mediator抽象中介者角色 抽象中…

    Linux 2023年6月7日
    088
  • shell脚本调试方法

    set -x bash -x test.sh 作者:习惯沉淀 如果文中有误或对本文有不同的见解,欢迎在评论区留言。 如果觉得文章对你有帮助,请点击文章右下角【推荐】一下。您的鼓励是…

    Linux 2023年5月28日
    0101
  • shell 获取变量是什么数据类型

    bash;gutter:true; function check(){ local a="$1" printf "%d" "$a&…

    Linux 2023年5月28日
    092
  • Linux服务器下oracle数据库启动服务操作步骤

    一、在Linux下启动Oracle1.登录到Linux服务器,切换到oracle用户权限(命令是:# su –l oracle) 2.进入sqlplus界面(命令是:$ sqlpl…

    Linux 2023年6月13日
    0105
  • Redis6 源码调式

    Redis6 源码调式 安装Cygwin 1、下载安装Cygwin 去Cygwin的官方网站http://www.cygwin.com/ window 64位请选择 setup-x…

    Linux 2023年5月28日
    0129
  • python 对文件操作

    实现对文件的简单操作 #!/usr/bin/env python -*- coding:utf-8 -*- def Find(class_name): class_list = […

    Linux 2023年6月13日
    0134
  • 根据两个向量计算它们之间的旋转矩阵

    一、简介 本文主要介绍通过给定的两个空间向量,计算出从一个向量旋转到另一个向量的旋转矩阵。 二、步骤 ① 假设两个向量分别为vectorBefore(x1,y1,z1), vect…

    Linux 2023年6月7日
    0113
  • POJ3071(Football)–概率DP

    题意:有(1< en….网上当然也后不少解题报告,但是很多直接给出状态转移方程和贴出代码,而少了其中重要的推断过程,我觉得不是很好。所以自己给写一个较为详细的过程…

    Linux 2023年6月7日
    0116
  • 插入排序算法C语言实现

    插入排序算法C语言实现 我写出来的排序算法用printf一步步解读,与google algorithm APP上模拟的单步执行不一致。 于是参考了https://www.cnblo…

    Linux 2023年6月14日
    0130
  • WEB自动化-08-Cypress 接口测试

    8 接口测试 在服务和服务、系统和系统之间进行通信时,常常会使用到接口。通过接口测试,可以在项目早期更快发现问题。接口有很多类型,而现阶段使用的接口是基于HTTP协议的接口。 8….

    Linux 2023年6月7日
    0124
  • 壁纸爬取——协程应用

    (协程)壁纸爬取 一、 算法解析 1.1 进入爬取壁纸的网站(表层网页) 彼岸桌面壁纸-二次元 少爬涩图,健康生活! 1.2 获取显示单张壁纸的页面(深层网页)地址 选择网页元素:…

    Linux 2023年6月14日
    0183
  • 设计模式——面向对象设计原则

    面向对象设计原则 都是为了高内聚低耦合原则。编程时基本都要遵守 分类原则:一种人只干一种事。 举例:(比较简单就不代码了) 人可以干的事情有很多:敲代码、唱歌、跳舞、打篮球&#82…

    Linux 2023年6月7日
    0162
  • Linux 安装Apache2和PHP

    首先先更新系统 sudo apt update; sudo apt upgrade 然后下载Apache2和PHP主要程序以及它的插件 sudo apt install apach…

    Linux 2023年6月7日
    097
  • [编程一生]历史文章分类汇总

    2021年过去了,总结一下我的239篇原创。方便大家利用自带的搜索功能当智能机器人来用。 面试类 方法论 架构类 网络通信与 操作系统原理 稳定性建设 Java 中间件 程序人生 …

    Linux 2023年6月13日
    096
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球