mysql 高可用方案梳理

Wesley13
• 阅读 410

mysql 高可用方案梳理


集群部署种类

同步集群

  1. 结构:data + sql + mgm节点
  2. 特点
    • 内存级别的,对硬件要求较低,但是对内存要求较大。换算比例为:1:1.1
    • 数据同时放在几台服务器上,冗余较好;
    • 速度一般
    • 建表需要声明为engine=ndbcluster
    • 扩展性强
    • 可以实现高可用性和负载均衡,实现对大型应用的支持
    • 必须是特定的mysql版本,如:已经编译好的max版本
    • 配置和管理方便,不会丢失数据

异步集群

  1. 结构:master + slave
  2. 特点
    • 主从数据库异步数据
    • 数据放在几台服务器上,冗余一般
    • 速度较快
    • 扩展性差
    • 无法实现高可用性和负载均衡(只能在程序级别实现读写分离,减轻对主数据库的压力)
    • 配置和管理较差,可能会丢失数据

集群部署方案

高可用方案

参考地址

  • 主从主主半同步复制:需要额外考虑haproxykeepalived的高可用机制
  • 半同步复制优化
  • 高可用架构优化
  • 共享存储
  • 分布式协议

常见实现方式

方案

描述

优点

缺点

LVS + Keepalived(最常用)

存在脑裂问题,还无法做到准确判断mysqld是否HANG的情况

DRBD + Heartbeat

存在脑裂问题,且DRDB并不需要,增加会有其他问题

MySQL Proxy

无法高可用,是一个写分离

MySQL Cluster

官方集群的部署方案,通过使用NDB存储引擎实时备份冗余数据,实现数据库的高可用性和数据一致性。

全部使用官方组件,不依赖于第三方软件;可以实现数据的强一致性;

国内使用较少;配置较复杂,需要使用NDB存储引擎,与mysql常规引擎存在一定差异;

MySQL MHA

可解决脑裂问题,但需要IP多,管理麻烦、坑多

相关产品比较

名称

描述

amoeba

中间件早期产品。应用连接amoeba操作mysql,就像操作单个mysql一样,后端还在使用jdbc driver

cobar

amoeba基础上发展版本,显著变化是将jdbc driver改为原生mysql通信协议层。去掉jdbc规范,即不能支持oracle等数据库

mycat

cobar基础上发展版本,显著变化是将BIO改为NIO,并发量大幅提高;增加对Order ByGroup Bylimit等聚合功能的支持

建议

依据业务场景、数据量、访问量、并发量、高可用要求等综合权衡。

  1. 若是双主复制,不做数据拆分,可考虑使用MHAKeepalivedheartbeat
  2. 若是双主复制,做数据拆分,可考虑使用Cobar(阿里mysql中间件)
  3. 若是双主复制 + Slave,做数据拆分,需要读写分离,可考虑使用Amoeba(mysql代理,增强mysql,类似产品有mycat

实现方案

haproxykeepalived 实现,参考地址

名词解释

名称

解释

脑裂问题

在高可用(HA)系统中,当联系2个节点的“心跳线”断开时,本来为一整体、动作协调的HA系统,就分裂成为2个独立的个体。由于相互失去了联系,都以为是对方出了故障。

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
2年前
Python3:sqlalchemy对mysql数据库操作,非sql语句
Python3:sqlalchemy对mysql数据库操作,非sql语句python3authorlizmdatetime2018020110:00:00coding:utf8'''
Stella981 Stella981
2年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Easter79 Easter79
2年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这