社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  DATABASE

MySQL MGR"一致性读写"特性解读

老叶茶馆 • 5 年前 • 534 次点击  

MySQL 8.0.14版本增加了一个新特性:MGR读写一致性;有了此特性,“妈妈”再也不用担心读MGR非写节点数据会产生不一致啦。

有同学会疑问:“MGR不是'全同步'么,也会产生读写不一致?”,在此肯定的告诉大家MGR会产生读写不一致,原因如下:

MGR相对于半同步复制,在relay log前增加了冲突检查协调,但是binlog回放仍然可能延时,也就是跟我们熟悉的半同步复制存在io线程的回放延迟情况类似。当然关于IO线程回放慢的原因,跟半同步也类似,比如大事务!!

所以MGR并不是全同步方案,关于如何处理一致性读写的问题,MySQL 在8.0.14版本中加入了“读写一致性”特性,并引入了参数:group_replication_consistenc,下面将对读写一致性的相关参数及不同应用场景进行详细说明。



参数group_replication_consistenc的说明



可选配置值




  • EVENTUAL 默认值,开启该级别的事务(T2),事务执行前不会等待先序事务(T1)的回放完成,也不会影响后序事务等待该事务回放完成。

  • BEFORE 开启了该级别的事务(T2),在开始前首先要等待先序事务(T1)的回放完成,确保此事务将在最新的数据上执行。

  • AFTER,开启该级别的事务(T1),只有等该事务回放完成。其他后序事务(T2)才开始执行,这样所有后序事务都会读取包含其更改的数据库状态,而不管它们在哪个成员上执行。

  • BEFORE_AND_AFTER 开启该级别等事务(T2),需要等待前序事务的回放完成(T1);同时后序事务(T3)等待该事务的回放完成;


  • BEFORE_ON_PRIMARY_FAILOVER,在发生切换时,连到新主的事务会被阻塞,等待先序提交的事务回放完成;这样确保在故障切换时客户端都能读取到主服务器上的最新数据,保证了一致性


group_replication_consistency 参数可以用法SESSION,GLOBAL去进行更改。

官方说明请参考:

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



MGR读写一致性的优缺点



官方引入的MGR读写一致性既有它自身的天然优势,也不可避免的存在相应的不足,其优缺点如下:

  • 优点:MGR配合中间件,比如DBLE这类有读写分离功能的中间件,在MGR单主模式下,可以根据业务场景进行读写分离,不用担心会产生延迟,充分利用了MGR主节点以外的节点。

  • 缺点:使用读写一致性会对性能有极大影响,尤其是网络环境不稳定的场景下。

在实际应用中需要大家因地制宜,根据实际情况选择最适配的方案。



MGR读写一致性的方案



针对不同应用场景应当如何选择MGR读写一致性的相关方式,官方提供了几个参数以及与其相对应的应用场景:



AFTER



适用场景1: 写少读多的场景进行读写分离,担心读取到过期事务,可选择AFTER。

适用场景2:只读为主的集群,有RW的事务需要保证提交的事务能被其他后序事务读到最新读数据,可选择AFTER。



BEFORE



适用场景1:应用大量写入数据,偶尔进行读取一致性数据,应当选择BEFORE。

适用场景2:有特定事务需要读写一致性,以便对敏感数据操作时,始终读取最新的数据;应当选择BEFORE。



BEFORE_AND_AFTER



适用场景:有一个读为主的集群,有RW的事务既要保证读到最新的数据,又要保证这个事务提交后,被其他后序事务读到;在这种情况下可选择BEFORE_AND_AFTER。



在特定会话上设置一致性



举例1:某一事务语句,需要其他节点的数据强一致性。可以使用SET@@SESSION.group_replication_consistency= ‘AFTER’进行设置。

举例2:跟例1相似,在每天执行分析语句事务并且需要获得读取新数据的情况下。

可以使用SET @@SESSION.group_replication_consistency= ‘BEFORE’ 进行设置


END






扫码加入QQ技术交流群

(群号:793818397)

   



Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/49390
 
534 次点击