我正在将Mysql / MariaDB与Innodb存储引擎版本10.x一起使用。
我想使用主从配置来设置集群。有一个选项可以使用--innodb-read-only或--read-only从从设备读取数据。
但是,除了上述内容之外,客户端还需要在且仅当最大从属延迟小于x秒时,才需要从从属读取数据。
由于网络拥塞,磁盘吞吐量低,运行时间长等原因,从服务器可能会落后于主服务器。具有“最大允许的陈旧性”选项的读取首选项应使应用程序为从中读取数据指定最大复制滞后或“陈旧性”。奴隶。当辅助节点的估计过期时间超过时,客户端将停止使用该节点进行从节点的读取操作,而开始从主节点读取数据。
我想知道MySql / InnoDB中是否有一个选项?
答案 0 :(得分:1)
没有自动选项可用于将查询切换到主数据库。这由应用程序逻辑处理。
您可以运行查询SHOW SLAVE STATUS
,返回的字段之一是Seconds_Behind_Master
。您必须编写应用程序代码来进行检查,如果滞后时间大于阈值,请查询主服务器。
您可能会找到某种可以为您执行此逻辑的代理。参见https://mydbops.wordpress.com/2018/02/19/proxysql-series-mysql-replication-read-write-split-up/
将滞后X秒的奴隶视为不可用并非总是最佳选择。不管延迟如何,某些查询都可以。几年前,我写了一篇有关此的演示文稿,其中包括一些示例查询。 Read / Write Splitting with MySQL and PHP
答案 1 :(得分:0)
总而言之,我不喜欢尝试将查询移至主服务器的想法;我将致力于解决潜在的问题。
答案 2 :(得分:0)
MariaDB MaxScale有多种处理复制延迟的方法。
最简单的方法是使用max_slave_replication_lag
参数来限制最大允许复制滞后。这完全按照您描述的方式工作:如果一个从属设备比主设备落后太多秒,则其他从属设备将作为主设备使用。这是在MaxScale中处理复制滞后的最常用方法。
另一种选择是使用causal_reads
功能,该功能利用了MASTER_GTID_WAIT
和MariaDB 10.2及更高版本中的其他功能。这样就可以保持读取一致性,而不会增加主服务器上的额外负载。这确实以等待时间为代价:如果服务器落后读取几秒钟,则可能需要更长的时间。当数据一致性至关重要但请求延迟不是那么重要时,使用此选项。
第三个选项是在写入发生后,使用CCRFilter强制对主机进行读取。与causal_reads
相比,这是一种更简单的方法,但是它以增加主服务器负载为代价提供了数据一致性。