MySQL主从复制(传统和GTIDs)
Posted ღ᭄小艾ヅ࿐
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL主从复制(传统和GTIDs)相关的知识,希望对你有一定的参考价值。
目录:
一、mysql集群概述:
1.集群的主要类型:
- 高可用集群:高可用集群是指通过特殊的软件把独立的服务器连接起来,组成一个能够提供故障切换功能的集群
2.如何衡量高可用:
- 计算方法:
3.常用的集群架构:
- MySQL Replication
- MySQL Cluster
- MySQL Group Replication (MGR)多主一从
- MariaDB Galera Cluster
-MHA | Keepalived | HeartBeat | Lvs, Haproxy等技术构建高可用集群
二、MySQL复制简介:
1.什么是MySQL复制:
- Replication可以实现将数据从一台数据库服务器(master)复制到一台到多台数据库服务器(slave)
- 默认情况下,属于异步复制,所以无需维持长连接
2.MySQL复制原理(重点):
- 简单来说,master将数据库的改变写入二进制日志,slave同步这些二进制日志,并根据这些二进制日志进行数据重演操作,实现数据异步同步
- master:主
- slave:从
- 详细描述:(当主从同步配置完毕后)
- slave端的io线程发送请求给master端的binlog dump线程
- master端的binlog dump线程获取二进制日志信息(文件名和位置信息)发送给slave端的io线程
- slave端io线程获取到的内容依次写入到slave端relaylog(中继日志)里,并把master端的binlog文件名和位置记录到master.info里
- slave端的SQL线程,检测到relay log 中内容更新,就会解析relay log里更新的内容,并执行这些操作,从而达到和m aster数据一致
1).扩展(relay log中继日志):
- 作用:记录从(slave)服务器接收来自主(master)服务器的二进制日志
- 场景:用于主从复制
- master主服务器将自己的二进制日志发送给slave从服务器,slave先保存在自己的中继日志中,然后再执行自己本地的relay log里的sql达到数据库更改和master保持一致
- 如何开启?
默认不开启,需要修改配置文件,完成开启
3.MySQL复制架构:
1).双机热备(AB复制):
- 默认情况下,master接收读写请求,slave只接受读请求以减轻master的压力
2).级联复制:
- 优点:进一步分担读的压力
- 缺点:slave1出现故障,后面的所有级联slave服务器都会同步失败
3).并联复制(一主多从):
- 优点:解决级联复制slave1的单点故障问题 ,同时也分担读压力
- 缺点:间接增加master的压力(传输二进制日志压力)
4).双主复制
- 特点:从命名上看,两台master好像都能接收读写请求,但实际上,往往运作的时候,同一时刻只有一台master会接受写请求,另外一台接受读请求
三、MySQL主从复制的搭建(AB复制):
1.传统AB复制架构(M-S):
- 说明:在配置mysql主从架构时,必须保证数据库版本高度一致
2.环境规划:
编号 | 主机名称 | 主机ip地址 | 角色信息 |
---|---|---|---|
1 | master | 192.168.74.19 | master主服务器 |
2 | slave | 192.168.74.25 | slave从服务器 |
- 由于两台机器处于集群架构,需要互相连接。绑定主机名称与IP地址到/etc/hosts
- 时间需要同步(重要)
3.MySQL主从复制核心思路:
1.slave必须安装相同版本的mysql数据库软件
2.master必须开启二进制日志;slave端必须开启relay log日志
3.master端和slave端的server-id号不能一样
4.slave端配置向master来同步数据
- master端必须创建一个复制用户
- 保证master和slave端初始数据一样
- 配置主从复制(slave端)
4.MySQL主从复制的具体实践:
- 在slave从服务器端安装mysql软件(不需要初始化)
- 相对于主服务器MySQL的安装与配置,从服务器端不需要进行初始化操作,因为其数据将来都来自主服务器
1).配置my.cnf文件:
- 从服务器:
2).把master主服务器的数据目录同步到slave从服务器:
- 第一步:把master服务器中的mysql停止掉
- 第二步:把master服务器中的/mysql_3306/data/auto.cnf文件删除
每安装一个mysql软件,其data数据目录都会产生一个auto.cnf文件,里面是一个唯一性的编号,相当于我们每个人的身份证号码
- 第三步:把master服务器中的/mysql_3306中的data目录拷贝一份到slave从服务器的/usr/localmysql目录
- 第四步:同步完成后,把主服务器与从服务器中的mysql启动
3).常见问题解决方案:
- 常见问题1:mysql无法启动
出现以上问题的主要原因在于/etc/init.d目录中没有mysqld这个文件,换句话说就是没有拷贝mysql.server脚本
- 常见问题2:MySQL没有安装在/usr/local/mysql目录中,service也无法启动
所以我们更换了mysql的安装位置,则必须更改/etci/init.d/mysql脚本中basedir和datadir目录- 我的是修改这个文件,因人而异!!
4).配置master-slave主从同步:
- 第一步:在master主服务器中创建一个账号,专门用于实现数据同步
- 第二步:在master中锁表,然后查看二进制文件的名称及位置
- 第三步:在slave从服务器中,使用change master to 指定主服务器,实现数据同步
- 第四步:在slave从服务器中启动slave数据同步:
start slave;
查看:
- 第五步:测试验证(只能在主服务器写入数据,从服务器不能写只能读)
我在主服务器新建了一个数据库叫db_lin2,新创了一张表叫tb_chaochao,并且插入了一条信息- 接下来我们进入从服务器查看:
这样子就完成主从同步了!!!!
5.总结:
- 主从复制必须保证两台数据库实例的server-id不一样
- 主服务器必须开启二进制日志,从服务器必须开启中继日志
- 主从复制搭建必须保证初始数据一样
- 主服务器必须要给从服务器创建一个复制用户,并授予复制的权限
- master -> slave架构,主写会同步到从,而从写不会同步到主
6.slave从服务器不小心写入数据解决方案
- 正常情况下:master可读可写,但slave从服务器只能读不能写。
- 一旦我们在slave从服务器中写入数据,主从架构会失败
- 我已经在从服务器中写了一条数据
遇上以上问题,如果数量较少,还可以通过跳过当前语句的方式解决。但是如果从服务器写入数据过多则以上架构得重新搭建!!- 解决方案:
答:可以通过变量sql_slave_skip_counter临时跳过事务进行处理
四、基于GTIDs的主从复制架构(M-S)
1.GTIDs概述:
- GTIDs全局事务标识符
- 当使用GTIDs时,每一个事务都可以被识别并且跟踪
- 添加新的slave或者当发生故障需要将master身份或者角色迁移到slave上时,都无需考虑是哪一个二进制日志以及哪个position值,极大简化了相关操作
- GTIDs是完全基于事务的,因此不支持myisam存储引擎
- GTID由source_id和transaction_id组成
- 使用GTIDs的限制条件有哪些?
2.基于GTIDs的主从复制:
- 思路:
修改配置文件支持GTIDs(主+从)
重启数据库(主+从)
为了保证数据一致性,master和slave设置为只读模式(主+从)
从服务器上重新配置同步(从)
3.基于GTIDs的主从复制实践:
- 第一步:修改配置文件支持GTIDs
- master(my.cnf)
- slave(my.cnf)
- 第二步:重新启动mysql
- 第三步:主从配置只读模式(主服务器和从服务器都要执行)
- 第四步:slave从服务器重新配置change master to
- 第五步:关闭主从服务器的只读模式
4.slave从服务器不小心写入数据解决方案:
- 方法一
- 方法二:重新同步data目录
以上是关于MySQL主从复制(传统和GTIDs)的主要内容,如果未能解决你的问题,请参考以下文章
MySQL数据库在线热备(主从复制之基于GTIDs的AB复制)
MySQL数据库在线热备(主从复制之基于GTIDs的AB复制)
Linux----------mysql主从复制和基于GTID主从复制
在线建立或重做mysql主从复制架构方法(传统模式和GTID模式)