前言
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
集群设置
- 核对节点配置
//clusterAdmin为集群管理员
dba.configureLocalInstance('root@localhost.localdomain: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})