1

dbcp の basicDatasource にラップされている jdbc mysql ドライバーを介して mysql クラスターに接続しようとしています。

これが私のBean設定です:

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">  
      <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
      <property name="url" value="jdbc:mysql:loadbalance://slave1:3306,slave2:3306/mobile_detection"/>
      <property name="username" value="username"/>
      <property name="password" value=""/>
      <property name="initialSize" value="10" />
      <property name="maxActive" value="100" />
      <property name="maxIdle" value="50" />
      <property name="minIdle" value="10" />
    </bean>

私のmysqlログファイルでは、両方のサーバーがサーバーの起動時に接続要求を受信して​​いることがわかりますが、最初のslave1のみがREADクエリを受信して​​います。スレーブ 2 は、スレーブ 1 がダウンしている場合にのみフェイルオーバーとして使用されます。

負荷分散オプションを適切に機能させるために何か不足していますか?

4

1 に答える 1

0

どうやら注意する必要があることが複数あります。

最初に、負荷分散ポリシーを指定しないようにする必要があります。これがどこから来たのかはわかりませんが、それ以外の場合は機能しません。

次に、DBCP はデフォルトで 1 つの接続のみで開始し、極端な要求に応じて他の接続を作成します。これが意味することは、常に再利用される 1 つの MySQL ホストのみに関連付けられた 1 つの接続のみがあり (特にトランザクションが小さい場合)、すべてのトラフィックがそこに集中することを意味します。より大きな初期プール サイズを指定することで、これを打ち負かすことができます。これにより、各サーバーへの複数の接続が作成されます。私は個人的に 3 つのサーバー間で負荷を分散し、36 接続の固定プールを使用しています。その場合にのみ、DBCP はさまざまな MySQL ホストに関連付けられた接続をやや公平に取得しようとします。3 つの接続のみを指定すると、接続が 1 つのホストに負荷分散される可能性があり、依然として不公平な分散が発生します。私の推測では、彼らが roundRobin ポリシーを修正すれば、これは問題なく機能するでしょうが、今のところ機能していません。

DBCP はプール内の接続を負荷分散し、非常に長い時間 (または永久に) 存続することに注意してください。最初に割り当てられたものは何でも、このままになります。プールは、動的負荷分散には適していません。再起動せずに新しい MySQL ホストを追加するために MySql J Connection が提供する JMX Bean は、うまく機能しません。

于 2013-03-05T16:39:16.503 に答える