Mysql InnerDB Cluster高可用集群

前言

mysql作为底层存储介质在互联网企业中应用非常广泛,可用性、数据一致性是绕不过的坎,各家大企业都有自己方案,mysql8.0提供了官方解决方案,通过动手搭建InnerDB Cluster、阅读文档进行粗略了解,记录加深印象

产品架构

MYSQL InnerDB Cluster提供了一套完整的高可用方案,主要部件有:MysqlShell、Mysql Router、Mysql Servers。Mysql Shell提供了集群管理API,通过这些API可以快速完成集群配置;Mysql Router提供集群连接管理,屏蔽底层数据节点变化,以轮询方式实现读操作的负载均衡,还有关键一点:基于集群配置可自动生成路由配置,若集群发生变化路由将自动重置;Mysql Servers基于group replication构建数据节点集群,具有数据强一致性、master自动选举特点,只要(N/2+1)节点可用整个集群就可提供服务。整体产品结构如下:

来源官方网站

group replication

group replication是mysql提供的集群插件,采用新的协议来实现组内节点数据一致性,节点可弹性扩充,组内自治(隔离故障节点、主从自动切换)。整体架构如下:


来源官方网站
  • APIs:同mysql服务交互接口,将mysql服务同插件隔离开来,主要通过hook方式织入事务处理管道;一方面:接收服务事件(如:服务启动、服务恢复、服务即将提交事务等)并响应;另一方面:主动干预服务执行(如:提交\取消执行中事务)
  • Capture\Applier\Recovery:插件核心功能组件;capture_跟踪运行中事务的执行上下文,applier_远端事务在本地数据库回放执行,recovery_管理组内节点数据恢复,如:新增节点需将其状态同其他节点恢复成一致才可提供服务
  • Replication Protocol Logics:复制协议的逻辑处理,包括:冲突裁决、接收\广播组内事务信息
  • Group Communication System API:组通信系统API,是对构建复制状态机所应具备能力的高度抽象
  • Group Communication Engine:基于Paxos协议的组通信API具体实现

Mysql Router

  • 建议同应用部署在一台机子,减少网络通信开销
  • 其他待补充
组复制协议

组复制协议不同于异步复制、半同步复制,采用分布式一致性协议(Paxos协议变体)实现分布式下数据的最终一致性。过程如下:


来源官方文档

https://blog.csdn.net/d6619309/article/details/53691352

典型场景分析
  • 新增节点

    节点增加分为两阶段
    第一阶段:通知组内节点在binlog中增加VC标识,连接已有节点(donor),从binlog中同步信息至relay log在本地数据库执行,当执行至VC标识时说明同步结束,完成第一阶段

    第二阶段:在第一阶段执行期间,所有新增事务都在内存中缓存,将这些事务同步写入数据库,调整节点状态为online,通知组内服务上线

    https://dev.mysql.com/doc/refman/8.0/en/group-replication-view-changes.html

  • 故障隔离
    待补充

  • master选举
    待补充

相关产品

  • phxsql是腾讯开源的高可用数据库集群方案,感觉实现思路上差别不大:都是基于paxos协议保证一致性、master自动选举;基于代理机制屏蔽数据集群变化。另外,phxsql对mysql侵入很小,没有group replication那么多限制;增加了两个独立进程模块,集群部署管理复杂度有所增加;mysql router基于集群维度调度,建议同应用一起部署,而phxsqlproxy同mysql服务器绑定相对而言不利于保证客户端稳定性
    http://djt.qq.com/article/view/1489
    http://www.cnblogs.com/zengkefu/p/5835508.html
  • galera:暂未阅读
    http://galeracluster.com/products/

部署

系统环境
  • Linux版本:Centos 7
  • 数据库版本:mysql server 8.0
  • mysql-shell安装:sudo yum install mysql-shell
//一些用得上的mysql语句
查看系统变量:
show variables

持久化设置系统变量:
set persist {name}={value}

修改密码:
alter user 'root'@'localhost' identified by '1234’;

赋予权限:
grant all privileges on *.* to root@“%” with grant option;
flush privileges;
环境设置
  • 防火墙设置
//自己测试可以直接关闭,生产环境需要开放对应端口\IP
///关闭
systemctl stop firewalld.service
///禁止开机启动
systemctl disable firewalld.service 
  • selinx设置
    https://blog.csdn.net/ggxiaobai/article/details/53505095
集群设置
  • 核对节点配置
//clusterAdmin为集群管理员

dba.configureLocalInstance('[email protected]:3306',{clusterAdmin: 'icadmin',clusterAdminPassword: 'password'});
  • 构建集群
//查看帮助信息
dba.help() 
//创建集群
var cluster=dba.createCluster("cluster")
cluster.addInstance("ic@ic-3:3306”)

//获取集群对象
var cluster=dba.getCluster("cluster")

//移除集群实例
cluster.removeInstance('root@localhost:3310’)

//移除集群配置
cluster.dissolve({force:true})

  • 官方文档
    https://dev.mysql.com/doc/refman/8.0/en/mysql-innodb-cluster-userguide.html

你可能感兴趣的:(Mysql InnerDB Cluster高可用集群)