アプリケーションを変更せずにSpring Bootアプリケーションの負荷を分散するために、さまざまなソフトウェアを検討してきました.これが最良の解決策であるように見えます.コードを1行も変更する必要はありません. OOB。ただし、クエリ ルールを機能させることはできません。
いくつかのスプリング ブート アプリケーションがあります。これが私のセットアップです: (ProxySQL は最新バージョンで、Spring ブートも最新バージョンです)
- 1 つの mysql 8.0.22 マスターと 2 つのスレーブ、すべてが異なるコンテナーで実行されます
- 3 つの proxysql コンテナ
- 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アプリケーションに正常に接続した人はいますか?
ありがとう