MySQL复制架构的搭建及配置过程

目录
  • 一主多从复制架构
  • 多主复制架构
  • 级联复制架构
  • 多主与级联复制结合架构
  • 多主复制架构的搭建
  • master1的配置
  • master2的配置
  • MySQL高可用的搭建

一主多从复制架构

在实际应用场景中,MySQL复制90%以上都是一个Master复制到一个或者多个Slave的架构模式。

在主库读取请求压力非常大的场景下,可以通过配置一主多从复制架构实现读写分离,把大量的对实时性要求不是特别高的读请求通过负载均衡分部到多个从库上(对于实时性要求很高的读请求可以让从主库去读),降低主库的读取压力,如下图所示。

缺点:

  • master不能停机,停机就不能接收写请求
  • slave过多会出现延迟

由于master需要进行常规维护停机了,那么必须要把一个slave提成master,选哪一个是一个问题?

某一个slave提成master了,就存在当前master和之前的master数据不一致的情况,并且之前master并没有保存当前master节点的binlog文件和pos位置。

多主复制架构

多主复制架构解决了一主多从复制架构中master的单点故障问题。

可以配合一个第三方的工具,比如keepalived轻松做到IP的漂移,这样master停机维护也不会影响写操作。

级联复制架构

一主多从中如果slave过多,会导致主库的I/O压力和网络压力会随着从库的增加而增长,因为每个从库都会在主库上有一个独立的BINLOG Dump线程来发送事件,而级联复制架构解决了一主多从场景下的,主库额外的I/O和网络压力。

如下图所示。

对比一主多从的架构,级联复制仅仅是从主库Master复制到少量的从库,其他从库再从这少量的从库中复制数据,这样就减轻了主库Master的压力。

当然也有缺点:MySQL的传统复制是异步的,级联复制场景下主库的数据是经历两次复制才到达其他从库中,期间的延迟要比一主多从复制场景下只经历一次复制的还大。

可以通过在二级slave上选择表引擎为BLACKHOLE来降低级联复制的延迟。顾名思义,BLACKHOLE引擎是一个“黑洞”引擎,写入BLACKHOLE表的数据并不会写会到磁盘上,BLACKHOLE表永远都是空表,INSERT、UPDATE、DELETE操作仅仅在BINLOG中记录事件。

下面演示下BLACKHOLE引擎:

mysql> CREATE TABLE `user` (
    -> `id` int NOT NULL AUTO_INCREMENT PRIMARY KEY,
    -> `name` varchar(255) NOT NULL DEFAULT '',
    -> `age` tinyint unsigned NOT NULL DEFAULT 0
    -> )ENGINE=BLACKHOLE charset=utf8mb4;
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO `user` (`name`,`age`) values("itbsl", "26");
Query OK, 1 row affected (0.00 sec)

mysql> select * from user;
Empty set (0.00 sec)

可以看到,存储引擎为BLACKHOLE的user表里没有数据。

多主与级联复制结合架构

结合多主与级联复制架构,这样解决了单点master的问题,解决了slave级联延迟的问题。

多主复制架构的搭建

主机规划:

  • master1:docker,端口3314
  • master2:docker,端口3315

master1的配置

配置文件my.cnf:

$ cat /home/mysql/docker-data/3315/conf/my.cnf
[mysqld]
character_set_server=utf8
init_connect='SET NAMES utf8'
symbolic-links=0
lower_case_table_names=1
server-id=1403314
log-bin=mysql-bin
binlog-format=ROW
auto_increment_increment=2 # 几个主库,这里就配几
auto_increment_offset=1 # 每个主库的偏移量需要不一致
gtid_mode=ON
enforce-gtid-consistency=true
binlog-do-db=order      # 要同步的数据库

启动docker:

$ docker run --name mysql3314 -p 3314:3306 --privileged=true -ti -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=order -e MYSQL_USER=user -e MYSQL_PASSWORD=pass -v /home/mysql/docker-data/3314/conf:/etc/mysql/conf.d -v /home/mysql/docker-data/3314/data/:/var/lib/mysql -v /home/mysql/docker-data/3314/logs/:/var/log/mysql -d mysql:5.7

添加用于复制的用户并授权:

mysql> GRANT REPLICATION SLAVE,FILE,REPLICATION CLIENT ON *.* TO 'repluser'@'%' IDENTIFIED BY '123456';
Query OK, 0 rows affected, 1 warning (0.01 sec)
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.01 sec)

开启同步master1(这里的user来自master2):

mysql> change master to master_host='172.23.252.98',master_port=3315,master_user='repluser',master_password='123456',master_auto_position=1;
Query OK, 0 rows affected, 2 warnings (0.03 sec)

mysql> start slave;
Query OK, 0 rows affected (0.00 sec)

master2的配置

master2的配置与master1类似。

主要区别在于my.cnf中有一个属性需要不一致:

auto_increment_offset=2 # 每个主库的偏移量需要不一致

测试:

在master2创建表,并添加数据:

mysql> create table t_order(id int primary key auto_increment, name varchar(20));
Query OK, 0 rows affected (0.01 sec)

mysql> insert into t_order(name) values("A");
Query OK, 1 row affected (0.01 sec)
mysql> insert into t_order(name) values("B");
Query OK, 1 row affected (0.00 sec)
mysql> select * from t_order;
+----+------+
| id | name |
|  2 | A    |
|  4 | B    |
2 rows in set (0.00 sec)

可以发现master2中id的步长为2,且从2开始自增。

然后在master1查询数据,并添加:

mysql> select * from t_order;
+----+------+
| id | name |
|  2 | A    |
|  4 | B    |
2 rows in set (0.00 sec)

mysql> insert into t_order(name) values("E");
Query OK, 1 row affected (0.00 sec)
|  5 | E    |
3 rows in set (0.00 sec)

可以发现master1中id的步长为2,且从1开始自增,再去master2中查询能发现id为5的数据,说明主主复制配置没有问题。

为什么两个主中id自增的偏移量要不一致呢?当两个主同时接受到插入请求时就能保证id不冲突,其实这样只能保证插入数据不冲突,无法保证删除和修改导致的数据不一致。

所以在实际的应用场景中,只能暴露一个主给客户端才能保证数据的一致性。

MySQL高可用的搭建

这里借助keepalived来对上面的多主复制架构改造来实现MySQL的高可用。

keepalived的安装:

$ sudo apt-get install -y keepalived

keepalived.conf

$ cat /etc/keepalived/keepalived3314.conf
! Configuration File for keepalived
#简单的头部,这里主要可以做邮件通知报警等的设置,此处就暂不配置了;
global_defs {
        #notificationd LVS_DEVEL
}
#预先定义一个脚本,方便后面调用,也可以定义多个,方便选择;
vrrp_script chk_haproxy {
    script "/etc/keepalived/chkmysql.sh"  #具体脚本路径
    interval 2  #脚本循环运行间隔
}
#VRRP虚拟路由冗余协议配置
vrrp_instance VI_1 {   #VI_1 是自定义的名称;
    state BACKUP    #MASTER表示是一台主设备,BACKUP表示为备用设备【我们这里因为设置为开启不抢占,所以都设置为备用】
    nopreempt      #开启不抢占
    interface eth0   #指定VIP需要绑定的物理网卡
    virtual_router_id 11   #VRID虚拟路由标识,也叫做分组名称,该组内的设备需要相同
    priority 130   #定义这台设备的优先级 1-254;开启了不抢占,所以此处优先级必须高于另一台

    advert_int 1   #生存检测时的组播信息发送间隔,组内一致
    authentication {    #设置验证信息,组内一致
        auth_type PASS   #有PASS 和 AH 两种,常用 PASS
        auth_pass asd    #密码
    }
    virtual_ipaddress {
        172.23.252.200    #指定VIP地址,组内一致,可以设置多个IP
    }
    track_script {    #使用在这个域中使用预先定义的脚本,上面定义的
        chk_haproxy
    }

    #notify_backup "/etc/init.d/haproxy restart"   #表示当切换到backup状态时,要执行的脚本
    #notify_fault "/etc/init.d/haproxy stop"     #故障时执行的脚本
}

/etc/keepalived/chkmysql.sh

$ cat /etc/keepalived/chkmysql.s.sh
#!/bin/bash

mysql -uroot -proot -P 3314 -e "show status;" > /dev/null 2>&1
if [ $? == 0 ];
then
        echo "$host mysql login successfully"
        exit 0
else
        echo "$host login failed"
        killall keepalived
        exit 2
fi

到此这篇关于MySQL复制架构的文章就介绍到这了,更多相关MySQL复制架构内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • mysql 5.7 docker 主从复制架构搭建教程

    分享mysql 5.7 docker 主从复制架构搭建教程,供大家参考,具体内容如下 环境版本: MySQL :  5.7.13 Docker : 1.11.2 CentOS : 7.1 1.先在两个物理机上分别安装两个MySQL.命令如下 复制代码 代码如下: docker pull mysql:5.7.13  docker run --name anuo-mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=qaz.00JK -d mysql:5.7.13 2.

  • MySQL 8.0.23中复制架构从节点自动故障转移的问题

    接触MGR有一段时间了,MySQL 8.0.23的到来,基于MySQL Group Replicaion(MGR)的高可用架构又提供了新的架构思路. 灾备机房的slave,如何更好的支持主机房的MGR? MGR 到底可以坏几个节点? 这次我就以上2个问题,和大家简单聊下MGR的一些思想和功能. 一.MySQL Group Relication 成员数量的容错能力 上面的表格相信大家不会陌生了,我经常在面试里会问:"4个节点的MGR,最多坏几个呢?" ,多数人回答:"最多坏1个

  • MySQL 4种常用的主从复制架构

    一主多从复制架构 在主库读取请求压力非常大的场景下,可以通过配置一主多从复制架构实现读写分离,把大量的对实时性要求不是特别高的读请求通过负载均衡分部到多个从库上(对于实时性要求很高的读请求可以让从主库去读),降低主库的读取压力,如下图所示. 在主库出现异常宕机的情况下,可以把一个从库切换为主库继续提供服务. 在主从复制场景下会出现主从延迟,想想该怎么解决? 多级复制架构 一主多从的架构能够解决大部分读请求压力特别大的的场景的需求,考虑到MySQL的复制需要主库发送BINLOG日志到从库的I/O线

  • MySQL复制架构的搭建及配置过程

    目录 一主多从复制架构 多主复制架构 级联复制架构 多主与级联复制结合架构 多主复制架构的搭建 master1的配置 master2的配置 MySQL高可用的搭建 一主多从复制架构 在实际应用场景中,MySQL复制90%以上都是一个Master复制到一个或者多个Slave的架构模式. 在主库读取请求压力非常大的场景下,可以通过配置一主多从复制架构实现读写分离,把大量的对实时性要求不是特别高的读请求通过负载均衡分部到多个从库上(对于实时性要求很高的读请求可以让从主库去读),降低主库的读取压力,如下

  • MGR集群搭建及配置过程

    MGR全称MySQL Group Replication(Mysql组复制),是MySQL官方于2016年12月推出的一个全新的高可用与高扩展的解决方案.MGR提供了高可用.高扩展.高可靠的MySQL集群服务.在MGR出现之前,用户常见的MySQL高可用方式,无论怎么变化架构,本质就是Master-Slave架构.MySQL 5.7版本开始支持无损半同步复制(lossless semi-sync replication),从而进一步提示数据复制的强一致性. MGR是MySQL数据库未来发展的一个

  • MySQL复制优点、原理详解

    复制是将主数据库的DDL和DML操作通过二进制日志传到从库上,然后再从库重做,从而使得从库和主库保持数据的同步.MySQL可以从一台主库同时向多台从库进行复制,从库同时也可以作为其他从库的主库,实现链式复制. MySQL复制的优点: 主库故障,可以快速切换至从库提供服务: 在从库执行查询操作,降低主库的访问压力: 在从库执行备份,避免备份期间对主库影响: MySQL复制原理 1.MySQL主库在事务提交时会把数据变更作为事件Events记录在Binlog中,主库上的sync_binlog参数控制

  • windows下MySQL5.6版本安装及配置过程附有截图和详细说明

                        编辑者:Vocabulary 下面详细介绍5.6版本MySQL的下载.安装及配置过程. 图1.1 MySQL5.6 目前针对不同用户,MySQL提供了2个不同的版本: Ø         MySQL Community Server:社区版,该版本完全免费,但是官方不提供技术支持. Ø         MySQL Enterprise Server:企业版,它能够高性价比的为企业提供数据仓库应用,支持ACID事物处理,提供完整的提交.回滚.崩溃恢复和行级锁

  • Linux下PHP+MYSQL+APACHE配置过程 (摘)第1/2页

    需要软件如下:  apache: http://www.apache.org  mysql: http://www.mysql.com  php: http://www.php.net/downloads.php  gd: http://www.boutell.com/gd/#buildgd  ZendOptimizer http://www.zend.org/products/zend_optimizer  Gettext http://ftp.gnu.org/pub/gnu/gettext/

  • MySql 5.7.17压缩包免安装的配置过程图解

    MySQL数据库管理软件有两种版本,一种是企业版,一种是社区版,其中,前者是收费的,如果是个人使用的,社区版足矣.下载mysql-5.7.17-winx64.zip,并将之解压于自己选定的目录后,如图1,会在文件夹里看到配置文件my-default.ini,此时,需将其复制,并粘贴进bin文件夹里,并将其重新命名为my.ini,如图2.至此准备工作完成,下面将详说具体的配置过程. 工具/原料 (1)电脑:Lenovo B460e:  (2)操作系统:windows 7,64位:  (3)mysq

  • mysql主从复制配置过程

    主库配置 1. 配置mysql vim /etc/my.cn # 在文件中增加以下内容 server-id=1 # 保证server id唯一 log-bin = /var/lib/mysql/mysql-bin.log binlog-do-db = db1 binlog-do-db = db2 其中db1和db2是计划进行主从复制的库,如果有多个,写多行即可.配置完毕后,重启数据库: service mysqld restart 2. 添加复制用户 通过phpmyadmin,添加新用户,并授予

  • MySQL多实例安装开机自启动服务配置过程

    1.mysql多实例 mysql多实例是指在一台或多台机器上跑多个mysql数据库,大大节省开销的费用,方便管理数据内容. 2.环境设备 系统版本 安装方式以及版本 centos8 mysql5.7(二进制安装) 3.创建数据目录 安装包添加环境变量以及属主等步骤省略,各路神仙都会 [root@clq ~]# mkdir /opt/data/{3306,3307,3308} -p [root@clq ~]# chown mysql.mysql /opt/data/* 4.分别初始化数据库 [ro

  • django搭建项目配置环境和创建表过程详解

    1. 搭建项目配置环境和创建表 创建一个ttsx的项目 django-admin startproject ttsx 在ttsx下的__init__中导入mysql import pymysql pymysql.install_as_MySQLdb() 配置mysql 读写分离配置 # default:默认的配置的是主数据库 'default': { 'ENGINE': 'django.db.backends.mysql', 'HOST': 'localhost', 'PORT': 3306,

随机推荐