私たちは proxySQL で MySQL Cluster を使用しており、次のセットアップを行っています:
問題は次のとおりです: サーバー 2 のユーザーが SQL UPDATE、UPDATE クライアント SET name= 'New Name' WHERE id = 123 をトリガーします。 (この更新はサーバー 1 に送信され、次にサーバー 2 に送信されます)
同じコード ブロックで、レコード (SELECT name FROM Customers WHERE id =123) を選択すると、クエリはローカル サーバーに送信され、コードを 1 分間一時停止しない限り、結果は「古い名前」になります。 2 番目 (テスト用) 。
私たちが考えた解決策の 1 つは、接続 (PHP) を変更し、サーバー 1 に直接アクセスして残りのコード ブロックを取得することでした。しかし、それは目的を達成できず、理想とは程遠いものです (静かに大規模なコード ベースは更新が必要です) )。
proxySQL に関する解決策はありますか?
レプリケーション レイテンシが高いスレーブ サーバーにクエリがルーティングされるのを防ぐために、テーブル mysql_server 列に最大レプリケーション レイテンシのしきい値を設定できます。 レプリケーションの最大遅延。参照: max_replication_lag
max_replication_lag – 0 より大きい場合、ProxySQL は レプリケーションの遅延と、設定された制限を超えているかどうかを定期的に監視します。 しきい値に達すると、レプリケーションが追いつくまで一時的にホストが回避されます。
クエリ ルールを作成して、クエリの読み取りと書き込みを分割することもできます。参照: ProxySQL 分割読み取り/書き込み
重要: proxysql-gtid-causal-reads Mysql バージョン 5.7.5 以降を使用している場合は、主にこれで問題が解決される可能性があります。