如何通过operator扩展mysql

网友投稿 696 2022-10-21

本站部分文章、图片属于网络上可搜索到的公开信息,均用于学习和交流用途,不能代表睿象云的观点、立场或意见。我们接受网民的监督,如发现任何违法内容或侵犯了您的权益,请第一时间联系小编邮箱jiasou666@gmail.com 处理。

如何通过operator扩展mysql

背景

mysql 数据库相信每个公司都会用到,除了使用云数据库以外,如果需要自己维护一套mysql同时保证高可用,绝对没有那么容易。单例的mysql一旦遇到宕机、断网等问题,业务就会马上中断,而且不容易恢复,这个时候就需要对mysql进行扩展。

mysql 复制机制原理

通过可以通过mysql的复制机制,将mysql复制多个副本,这是mysql扩展的基础。

那么就先简单说明一下mysql复制的原理。

master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events);slave将master的binary log events拷贝到它的中继日志(relay log);slave重做中继日志中的事件,将改变反映它自己的数据。

通常通过show slave status命令查看IO_thread 和sql_thread 就是指这两个过程,如果是Running,那么就代表复制是正常的。

主从架构

最常见的就是主从架构,通过包括1个主库和多个从库,从库通过复制方式从主库同步数据。主库提供写数据的能力,从库提供读数据的能力。通常的业务场景是读多写少,那么一主多从的架构往往非常适合,从库可以大量的扩展,读数据能力也能够很大的提升。

但是当主库宕机以后,虽然读能力还在,但是如果需要恢复写的能力,就需要人工参与进行恢复。

常见需要以下步骤

寻找最接近master的主库(因为同步可能会有延迟)保证relay log同步完毕提升mysql从库为主库

双主架构

如果想要减少故障的时间,减少人工参与的频率。可以使用互为主从的架构。

两台mysql都可读写,互为主备,默认只使用一台(masterA)负责数据的写入,另一台(masterB)备用;masterA是masterB的主库,masterB又是masterA的主库,它们互为主从;两台主库之间做高可用,可以采用keepalived等方案(使用VIP对外提供服务);所有提供服务的从服务器与masterB进行主从同步(双主多从);

单写(主备模式)

单写和主从类似,虽然互为备份,但是只允许只有一个库进行写入,那么一般情况下也就没有一致性的问题了。只需要在主库宕机的时候,将流量自动切换到另外一个库就行了。

双写(主主模式)

双写就是两个库都提供写的服务,两个库互为复制,可以马上进行数据同步,可以同时提升读和写的性能。

有那么好的事?那么为什么主从还有存在的必要,说明这个方式还有有缺点的。CAP原则中,无法三则同时达到,那其实也就牺牲了一致性,这个方法会存在数据数据一致性问题,因为同步存在一个时间差, 当两个库同时操作一个类数据就会存在问题。

可能会存在以下问题

主键冲突事务冲突其他

所以我们这边一般不会采用主主模式

定制operator

当我们在传统环境搭建mysql的时候,经常需要人为参与处理很多故障。但是在云原生环境中,采用operator模式,就可以非常自动地对mysql进行自动化运维管理。

如下图的架构通过定义新的资源为mysql,operator创建出statefulset进行生成mysql pod实例,通过operator对mysql状态的识别,根据配置的期望值对mysql进行自动化配置。快速搭建双主架构。

读写分离

应用通过 service: read 进行读取数据库(通过自动检测mysql状态,并设置service 的 selector 为从库的mysql pod)

应用通过 sevice: write 写数据库(通过自动检测mysql状态,并设置service 的 selector 为主库的mysql pod)

如果是spring的项目,通过提供两个service就可以实现读写分离。

在spring的AOP层,通过注解的方式对读和写的业务进行标记,然后让不同的sql走不同的数据库。

mysql代理

虽然上架构提供了mysql读写分离机制,但是需要代码层面进行修改,对代码有侵入性。往往从mysql单例切换过来都需要修改代码,无法无缝接入,那么有什么更好的办法吗?

那么就可以使用代理的方式访问mysql。

代理模式

通过mysql和应用之间增加了一个组件,通过原生访问mysql的方式访问,该组件接收到sql信息,并进行sql路由,将读和写的请求分别转发到从库和主库。

通常只需要在dataHost中配置writeHost与readHost,并且通过balance配置负载均衡策略,通过switchType配置故障切换策略,这里就不详细叙述了

show slave status

新架构

那么在原来的mysql operator架构中,就可以引入mycat。但是mycat和原有operator的一部分功能是重复的。

mycat支持读写的故障转移,Mycat 心跳机制通过检测 show slave status 中的 "Seconds_Behind_Master", "Slave_IO_Running","Slave_SQL_Running" 三个字段来确定当前主从同步的状态以及 Seconds_Behind_Master 主从复制时延。

当 Seconds_Behind_Master>slaveThreshold 时,读写分离筛选器会过滤掉此 Slave 机器,防止读到很久之前的旧数据,而当主节点宕机后,切换逻辑会检查 Slave 上的 Seconds_Behind_Master 是否为 0,为 0 时则表示主从同步,可以安全切换,否则不会切换.

operator也是类似的方法控制,最后通过service进行读写转移。但是operator中我们可以自定义控制切换逻辑。

仅作为读写分离代理,不做故障切换(故障切换还是通过operator控制)。

关闭 operator的故障切换功能,读写分离和故障切换均通过mycat代理实现。

总结

通过operator可以实现mysql 完全自动化控制,除了常规的主从/主主、我们还实现MGR、mysql的定时数据备份、容灾备份等等功能。可以在兼容原生mysql的情况下,最大程度上扩展mysql,以及提高mysql的稳定性。

上一篇:炎炎夏日“署”你最美 青岛八大关街道综合行政执法中队维护城市形象
下一篇:戴维医疗:新生儿黄疸治疗箱、新生儿黄疸治疗灯和远红外加温器完成延续注册
相关文章

 发表评论

暂时没有评论,来抢沙发吧~