0

アプリケーションを変更せずにSpring Bootアプリケーションの負荷を分散するために、さまざまなソフトウェアを検討してきました.これが最良の解決策であるように見えます.コードを1行も変更する必要はありません. OOB。ただし、クエリ ルールを機能させることはできません。

いくつかのスプリング ブート アプリケーションがあります。これが私のセットアップです: (ProxySQL は最新バージョンで、Spring ブートも最新バージョンです)

  1. 1 つの mysql 8.0.22 マスターと 2 つのスレーブ、すべてが異なるコンテナーで実行されます
  2. 3 つの proxysql コンテナ
  3. 3 人の mysql ビジネス ユーザー

私のproxysql confファイルで、すべてのユーザーのデフォルトグループを書き込みグループ(10)に設定しました。これは、レプリケーショングループの唯一のマスターです。スレーブは read_only=1 です。

私のスプリング ブート アプリケーションには、initSql コマンドがあります。

SET NAMES 'utf8mb4' COLLATE 'utf8mb4_unicode_ci';

したがって、アプリケーションに上記の initSql ステートメントがある場合、次のエラーが発生します。

ProxySQL Error: connection is locked to hostgroup 10 but trying to reach hostgroup 20

initSql ステートメントを削除すると、すべてが機能します (すべての SQL ステートメントがマスターにルーティングされるため)。

ルールを追加すると、SQL はSelect ?そのルールを読み取りグループにルーティングし、アプリケーションは起動しません。

[WARN ] 2021-01-04 11:08:08.913 [main] SqlExceptionHelper - SQL Error: 0, SQLState: null
[ERROR] 2021-01-04 11:08:08.913 [main] SqlExceptionHelper - Failed to validate a newly established connection.

さらにトレースを下ると、次のようになります。

nested exception is org.springframework.orm.jpa.JpaSystemException: Unable to acquire JDBC Connection; nested exception is org.hibernate.exception.GenericJDBCException: Unable to acquire JDBC Connection

そのルールを無効にして、別のルールを有効にすると:

select organizati0_.org_id as org_id1_14_, organizati0_.org_desc as org_desc2_14_, organizati0_.org_name as org_name3_14_, organizati0_.org_type as org_type4_14_ from ems_org organizati0_ where organizati0_.org_name=? and organizati0_.org_type=?

次に、次と同じエラーが発生しますSET NAMES 'utf8mb4' COLLATE 'utf8mb4_unicode_ci';

ProxySQL Error: connection is locked to hostgroup 10 but trying to reach hostgroup 20

(上記はどのコマンドとも関係ありませんがSET、まだ失敗しています)

これも試してみました

set mysql-set_query_lock_on_hostgroup=0;
load mysql variables to runtime;

それでも同じエラー。

そのため、これをまったく機能させることができません。私はproxysqlを初めて使用するので、proxysqlをSpring Bootアプリケーションに正常に接続した人はいますか?

ありがとう

4

1 に答える 1