Mysql集群
1|0Mysql集群笔记
1|1概述
我们在考虑 MySQL 数据库的高可用的架构时,主要要考虑如下几方面:
-
如果数据库发生了宕机或者意外中断等故障,能尽快恢复数据库的可用性,尽可能的减少停机时间,保证业务不会因为数据库的故障而中断
-
用作备份、只读副本等功能的非主节点的数据应该和主节点的数据实时或者最终保持一致
-
当业务发生数据库切换时,切换前后的数据库内容应当一致,不会因为数据缺失或者数据不一致而影响业务
1|2*Mysql集群优劣势
优势
-
高可用性:故障检测及迁移,多节点备份
-
可伸缩性:新增数据库节点便利,方便扩容
-
负载均衡:切换某服务访问某节点,分摊单个节点的数据库压力
劣势
-
从库要从 binlog 获取数据并重放,这肯定与主库写入数据存在时间延迟,因此从库的数据总是要滞后主库
-
对主库与从库之间的网络延迟要求较高,若网络延迟太高,将加重上述的滞后,造成最终数据的不一致
-
单一的主节点挂了,将不能对外提供写服务
集群要考虑的风险
-
网络分裂:群集还可能由于网络故障而拆分为多个部分,每部分内的节点相互连接,但各部分之间的节点失去连接
-
脑裂:导致数据库节点彼此独立运行的集群故障称为 “脑裂”。这种情况可能导致数据不一致,并且无法修复,例如当两个数据库节点独立更新同一表上的同一行时
1|3原理图示
集群类型:
-
M //单主
-
M-S //一主一从
-
M-S-S... //一主多从
-
M-M //双主
-
M-M-S-S //双主双从
*原理介绍:
从主库上把数据更改,记录到二进制日志文件(Bin Log)中,从库的I/O线程将主库的二进制日志文件复制到自己的中继日志(Relay Log)中,从库SQL线程读取中继日志中的事件,将中继日志事件重放到从数据库上
******~~~~****~~~~******1|4集群搭建
环境准备
-
全新服务器-互相通信
-
服务器部署ysql5.7
-
配置域名解析
重新安装多台数据库,不要克隆已经安装的数据库因为数据库的ID相同
Master1 | 192.168.23.19 | systemctl start mysqld |
---|---|---|
Master1 | 192.168.23.20 | systemctl start mysqld |
Slave1 | 192.168.23.21 | systemctl start mysqld |
Slave2 | 192.168.23.22 | systemctl start mysqld |
h3交换机地址 192.168.51.254 admin/P@ssw0rd 默认22端口 ssh可以访问
1|5一主一从
主服务器配置
准备数据(验证主从同步使用)
从服务器配置
1|6一主一从GTID
与上一个实验需求基本相同经,master1 作为主mysql,master2 作为从mysql不同之处,使用了“gtid_mode=ON enforce_gtid_consistency=1”该属性自动记录position位置。不需要手动指定了。
-
如果是全新服务器需要按照上一个实验进行主服务器重新配置
主服务器配置
从服务器配置
1|7双主双从
双主
前面配置如果出现主服务器但节点故障那么会影响全局的写入事件,所以搭配双主
目前master1(192.168.23.19)是我们的主服务器,这里打算把master2(192.168.23.20)也配置成主服务器实现互相读写
双从
同步现有的数据库
启动从服务器ID,GTID
设置主服务器
测试
1|8Mysql错误代码解决
错误解决:
错误代码1593:
gtid或者uuid问题
错误代码1062:
SQl:NO
日志位置的问题
reset master;
错误代码2026:
在远程连接mysql时候可能会出现下面的问题:
ERROR 2026 (HY000): SSL connection error: protocol version mismatch
错误2026(hy000):SSL连接错误:协议版本不匹配
解决办法:在你要连接的个mysql的 /etc/my.cnf下添加一行:skip_ssl
错误代码1236:
解决方法:
1.在主库上执行以下命令,查询gtid_purged,记录下改值
mysql> show global variables like '%gtid%'\G
2.在从库上执行以下命令,查询已经执行过的gtid即gtid_executed,记录下主库的值,本机的不需要
show global variables like 'gtid'
;
3.在从库上执行以下命令停止同步线程及重置同步相关信息
mysql> stop slave;
mysql> reset slave;
mysql> reset master;
4.在从库上设置gtid_purged
该值有两个来源,一是在主库上查询的gtid_purged,二是在从库上查询的已经执行过的gtid_executed值(本机的就不需要,主库上gtid)
注意:一定记得加上从库上已经执行过的gtid,若只设置了主库上的gtid_purged,此时从库会重新拉取主库上所有的二进制日志文件,同步过程会出现其他错误,导致同步无法进行
mysql> set @@global.gtid_purged='主库gtid加上从库gtid';
注意:设置gtid_purged值时,gtid_executed值必须为空否则报错,该值清空的方法就是`reset master
命令执行完,再次查看相关信息
5.重新开启同步
mysql> change master to master_host='192.168.1.15',master_port=3306,master_user='repl',master_password='xxx',master_auto_position=1;
mysql> start slave;
当从库追赶上主库,此时测试主从数据是否一致,测试结果一切正常
mk-table-checksum h=192.168.1.15,u=root,p=xxx,P=3306 h=192.168.1.19,u=root,p=xxxx,P=3307 -d 6coursestudychoose_test | mk-checksum-filter
问题解决小技巧
reset slave
如下所示:
mysql> stop slave;
Query OK, 0 rows affected (0.00 sec)
mysql> reset slave ;
Query OK, 0 rows affected (0.01 sec)
mysql> start slave;
Query OK, 0 rows affected (0.01 sec)
Deletes all binary log files listed in the index file, resets the binary log index file to be empty, and creates a new binary log file.
1.
点击查看代码
点击查看代码
点击查看代码
点击查看代码
点击查看代码
点击查看代码
点击查看代码
点击查看代码
点击查看代码
点击查看代码
__EOF__

本文链接:https://www.cnblogs.com/Jqazc/p/16848630.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具