1. 什么是数据库高可用

1.1 什么是高可用集群

N+1:N就是集群,1就是高可用,高可用的核心就是冗余,集群是保证服务最低使用标准的

1.2. 高可用集群的衡量标准

一般是通过系统的可靠性和可维护性来衡量的

MTTF:平均无故障时间,这是衡量可靠性的

MTTR:衡量系统的可维护性的

HA=MTTF/(MTTF+MTTR)*100%

SLA: 99.999%:表示一年故障时间/宕机时间不超过6分钟

SLA可用性计算公式:可用性指标 = 正常请求 / 全部请求

1年 = 365天 = 8760小时

99.9 = 8760 * 0.1% = 8760 * 0.001 = 8.76小时

99.99 = 8760 * 0.0001 = 0.876小时 = 0.876 * 60 = 52.6分钟

99.999 = 8760 * 0.00001 = 0.0876小时 = 0.0876 * 60 = 5.26分钟

1.3. 实现高可用的三种方式

  • 主从方式(非对称)

    这种方式的组织形式通常都是通过两个节点和一个或多个服务器,其中一台作为主节点(active),另一台作为备份节点(standy),备份节点应该随时都在检测主节点的健康状况,

    主节点发生故障,服务会自动切换到备份节点保障服务正常运行

  • 对称方式

    两个节点,都运行着不同的服务且相互备份,互相检测对方的健康,当任意一个节点发生故障,这个节点上的服务就会自动切换到另一节点

  • 多机方式

    包含多个节多个服务器,每个节点都要备份运行不同的服务,出现问题自动迁移

1.4. MySQL数据的高可用实现

1.4.1. 主从方式(非对称)

  • 资源:两台同版本的MySQL数据库

  • 主从实现的内部运行原理机制

    • 第一步:主数据库服务器会把数据的修改记录记录进binlog日志,binlog一定要打开。

    • 第二步:从库的I/O进行读取主库的binlog内容后存入自己的Relay Log中继日志中,这个I/O线程会和主库建立一个普通的客户端连接,然后主库启动一个二进制转储线程,I/O线程通过转储线程读取binlog更新事件,同步完毕后I/O进入sleep,有新的更新会再唤醒

      • Realy Log和Binlog的格式是一样的,可以用mysqlbinlog读取,也可show
      • mysql>show relaylog events in ‘relay-log.000001’;
      • 目前数据库有两种复制方式
        • binlog日志点position
        • GTID方式也要依赖binlog
    • 第三步:从服务器的SQL进程会从Relay Log中读取事件并在从库中重放

      • 服务器执行重放操作时是可以在配置里声明是否写入服务器的binlog日志中

        [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Vmdo6fxB-1593586624119)(C:\Users\16558\AppData\Roaming\Typora\typora-user-images\image-20200701101406918.png)]

1.4.2. 配置主从服务步骤

1.4.2.1. Binlog的日志点方式配置主从同步
  • 配置主从服务器参数

  • 在Master服务器上创建用于复制并授权的数据库账号

  • 备份Master数据库并初始化Slave服务器数据

  • 启动复制链路

Master服务器配置

# 慢查询开关
slow_query_log=ON
slow_query_log_file=/usr/local/slowlog/slow.log
slow_launch_time=4
long_query_time=3
# chown -R mysql:mysql /usr/local/slowlog/

binlog设置

server_id=213 #一般是取IP的后三位
log_bin=/usr/local/binlog/mysql-bin  # 只需要给名字前缀
binlog_format=row
expire_logs_days=3
max_binlog_size=200m

Slave服务器配置

# 慢查询开关
slow_query_log=ON
slow_query_log_file=/usr/local/slowlog/slow.log
slow_launch_time=4
long_query_time=3
# chown -R mysql:mysql /usr/local/slowlog/

从库的主从设置

server_id=196
log_bin=/usr/local/binlog/mysql-bin
relay_log=/usr/local/relaylog/relay-bin
#当slave宕机后,如果relay log损坏了了,导致⼀一部分中继⽇日志没有处理理,则放弃所有未完成的,
重新获取执⾏行行,保证完整性
relay_log_recovery=1
#让从库数据只读, super⽤用户, super_read_only=on
read_only=on
#从库的复制链路路服务不不会随数据库重启⽽而重启,需要⼿手动启动
skip_slave_start=on
#确保数据⼀一致性,通过innoDB的崩溃恢复机制来保护哦
master_info_repository=TABLE
relay_log_info_repository=TABLE
#select * from mysql.slave_master_info;
#select * from mysql.slave_relay_log_info;

主从指明不同步的数据库,表(根据需要配置)

# Master
# 不同步数据库
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
# 只同步某一些数据库
binlog-do-db=icoding_admin# Slave
# 复制哪些数据库
replicate-do-db=icoding_admin
replicate-do-db=game
# 不复制哪些数据库
replicate-ignore-db=mysql
replicate-ignore-db=information_schema# 需要复制的表
replicate-do-table=game
#只复制哪个库的哪个表
replicate-wild-do-table=db_name.%
# 设定需要忽略的复制表
replicate-ignore-table=information_schema
# 忽略哪个库的哪个表
replicate-wild-ignore-table=mysql.%

主库授权(在Master上)

# Master授权给slave
mysql> use mysql;
mysql> grant replication slave on *.* to 'synuser'@'192.168.0.214' identified by '123456';
mysql> flush privileges;

初始化Slave数据

# Master和Slave的数据库版本要一致,Master<=Slave
mysqldump -uroot -p123456 -h127.0.0.1 --flush-logs --master-data=2 --routines --triggers --events --single-transaction --databases icoding_admin > mydb.sql
#CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000004', MASTER_LOG_POS=154; 就用导出的日志pos

创建复制链路

# 在slave上执行
mysql>
change master to master_host='192.168.0.213',
master_port=3306,
master_user='synuser',
master_password='123456',
master_log_file='mysql-bin.000004',
master_log_pos=154;
  • 注意事项

    主从复制的时候主从数据库的UUID不能一样,如果是镜像方式,启动前将UUID文件删除,会重新创建
    cd /var/lib/mysql
    cat auto.cnf  # 将他删除
    server-uuid=890980d9-b072-11ea-8ab8-00163e03668d
    

启动主从复制

# show slave status \G 可以查看主从复制的状态和日志错误
# 启动slave
mysql> start slave;
# 停止slave
mysql> stop slave;
1.4.2.2. GTID的方式进行主从复制

和binlog步骤不同的地方:

  • 主从服务器的参数有不同的地方

    #在上⾯面的基础上,需要给主从服务器器都加上
    gtid_mode=on
    enforce_gtid_consistency=on #开启强制GTID的⼀一致性确保事务
    
  • GTID下复制链路的启动

    mysql>
    CHANGE MASTER TO
    MASTER_HOST='192.168.0.102',
    MASTER_PORT=3306,
    MASTER_USER='syncuser',
    MASTER_PASSWORD='123456',
    MASTER_AUTO_POSITION=1;
    
  • 启动GTID后以下数据库操作不可用

    • create table tableName …… select
    • 在一个事务中创建临时表
    • 在一个transaction中更新innoDB表和MyISAM表

2. 数据主从复制方式的容灾处理

2.1. MySQL支持的复制格式

2.1.1. 基于语句的复制(statement)

  • 优点:记录少,只记录执行语句,易懂
  • 缺点:insert into table1(create_time) values(now()),这个now就不是当时的时间了

2.1.2 . 基于行复制(row)

  • 优点:几乎没有基于行复制无法处理的场景
  • 缺点:数据量太大了

2.1.3. 混合类型的复制(MIXED)

mixed格式默认采用statement,比如用到UUID(),ROW_COUNT()

2.2. MySQL主从复制模式

  • 异步复制:MySQL默认就是异步复制,性能最好,但主从复制的数据不一致性概率最大

  • 同步复制:当客户端发过来一个请求后,只有当所有的从库都写到Relay Log中,才回复给前端事务完成,性能最差,但一致性很强

  • 半同步复制:至少一个从库完成Relay Log写入后就返回事务完成给前端

    主从上都要安装
    mysql> install plugin rpl_semi_sync_master soname='semisync_master.so'
    rpl_semi_sync_master_enabled
    rpl_semi_sync_master_timeout #单位是毫秒,如果主库等待从库回复超过这个时间就⾃自动切换为异步
    

Q&A

主从一般都是实时的的同步的?

如果主库执行了一条更新语句 update tableName set score=99,从库是不是也会被直接更新掉?

一般情况下,我们的从库对数据的实时性要求都不是非常高,如果我们有一个从库更新可以延时10分钟,运气好的话,在你拿到10分钟前的数据和你更新之间这个表没有操作,就可以完美解决掉。

设置一个从库,将延迟时间设置成我们能处理和反应的周期长度即可

mysql> stop slave;
mysql> change master to master_delay=600; #单位是秒, SQL_Delay: 600
mysql> start slave;

MySQL数据库高可用HA实现相关推荐

  1. mysql datahost ha_mysql MySQL数据库高可用HA实现

    起因:在工作中常常要用到mysql,平常只是对数据库crud,并没有认真的了解过她,sql语句也只是会一些最基本的,和常用的,一些不常用的都要去网上百度,即决定学习一下mysql,来了解她,虽然开发很 ...

  2. 数据库高可用(HA)技术有哪些?

    点击上方"朱小厮的博客",选择"设为星标" 后台回复"书",获取 数据库高可用是一个复杂的系统工程,本文主要介绍了几种数据库高可用的基本技术 ...

  3. MySQL数据库高可用之mmm

    一:MMM简介 MMM即Multi-Master Replication Manager for MySQL:mysql多主复制管理器,基于perl实现,关于mysql主主复制 配置的监控.故障转移和 ...

  4. MySQL数据库高可用集群搭建-PXC集群部署

    Percona XtraDB Cluster(下文简称PXC集群)提供了MySQL高可用的一种实现方法.集群是有节点组成的,推荐配置至少3个节点,但是也可以运行在2个节点上. PXC原理描述: 分布式 ...

  5. haproxy负载均衡_基于mycat+haproxy+keepalived搭建mysql数据库高可用负载均衡

    概述 目前业界对数据库性能优化普遍采用集群方式,而oracle集群软硬件投入昂贵,mysql则比较推荐用mycat去搭建数据库集群,下面介绍一下怎么用mycat+haproxy+keepalived搭 ...

  6. 几种常见Mysql数据库高可用方案

    1.概述 我们在考虑MySQL数据库的高可用的架构时,主要要考虑如下几方面: 如果数据库发生了宕机或者意外中断等故障,能尽快恢复数据库的可用性,尽可能的减少停机时间,保证业务不会因为数据库的故障而中断 ...

  7. mysql数据库高可用_MySQL数据库高可用

    一.MySQL+MyCat分库分表 1 MyCat简介 java编写的数据库中间件 Mycat运行环境需要JDK. Mycat是中间件.运行在代码应用和MySQL数据库之间的应用. 前身 : corb ...

  8. 淘宝MySQL数据库高可用实现方案

    一.常见的高可用MySQL解决方案 高性能性需要解决的主要有两个问题,即如何实现数据共享或同步数据,另一个是如何处理failover,数据共享一般的解决方案是通过SAN(Storage Area Ne ...

  9. mysql 1593_Linux高可用(HA)之MySQL主从复制中出现1593错误码的低级错误

    摘要 今天测试shell脚本自动配置MySQL主从集群的时候发现从机一直1593错误,排查了半天发现是从的配置文件中的server-id没改导致,此低级错误记录下警醒自己. 今天测试shell脚本自动 ...

最新文章

  1. Linux编译mybatis,使用mybatis assembly插件打成tar包,在linux系统中运行服务-Go语言中文社区...
  2. 网络营销推广介绍网站该如何布置关键词?
  3. 如何养成一个习惯(持续更新)
  4. 神策数据丨教育行业线索转化全链路解决方案
  5. 《第1集:机器学习的动机与应用》
  6. 互联网1分钟 | 0914
  7. SAP CRM和C4C的客户主数据修改历史记录查询
  8. 从如何优化SQL入手,提高数据仓库的ETL效率
  9. TPL Dataflow .Net 数据流组件,了解一下?
  10. python安装idle_(1)Python 安装使用IDLE
  11. 美团电单车中标警用车采购项目,上千辆定制版警用电单车上线!
  12. window10本地解析域名
  13. winform上传文件解决方案
  14. gauscoor软件怎么用_比对软件STAR的简单使用
  15. Exception in thread “main“ redis.clients.jedis.exceptions.JedisConnectionException: Failed to create
  16. 图像宽度所占字节必须是4的倍数详解
  17. 清明节网站都变灰了,你知道是怎么做的么?
  18. 快的买大黄蜂是福是祸?
  19. 查找解决使用html2pdf插件导出PDF不展示中文的问题
  20. odoo 14 手册 财务管理 应收应付 总账 报表

热门文章

  1. php 匹配反斜杠,正则表达式匹配反斜杠的方法
  2. Trie (字典树,前缀树)
  3. 超多动态效果网站源码,免费下载
  4. 10.30-11.3|浙大报考点硕士研究生2023年网上确认系统操作流程
  5. Unicode 标准新增5个行星符号
  6. html5+css+javascript深入学习实录pdf,HTML5+CSS3+JavaScript从入门到精通 微课精编版.pdf...
  7. Minecraft 1.19.2 Fabric模组开发 07.自定义NBT标签
  8. 实现获取鼠标在QtableView上的几行几列的方法
  9. 自制Jlink ob 072
  10. 又一款全自动装卸车神器