Project

General

Profile

Sympaの冗長化(active-active)

SympaをActive-Active構成で冗長化する。
リストデータと各種認証要求のみ共有し、キュー処理は各ノードで個別に行う。

設定変更

概要

  • 次のディレクトリを共有フォルダ(/mnt/nfs/{元のパス名}に仮定)に移動する
    • /var/lib/sympa 以下の次のディレクトリ
      • arc
        アーカイブ(投稿保管庫)
      • list_data
        リストデータ(設定ファイル)
      • bounce
        バウンスメール
    • /var/spool/sympa 以下の次のディレクトリ
      • auth
        保留メールスプール
      • digest
        ダイジェストスプール
      • moderation
        モデレーション待ちスプール
      • subscribe
        購読要求スプール
      • tmp
        一時ファイル
      • topic
        トピック
    • /etc/sympa
      設定ファイル

設定作業

  • ディレクトリの作成・移動
    mkdir -p /mnt/nfs/var/lib/sympa
    chown sympa.sympa /mnt/nfs/var/lib/sympa
    
    mkdir -p /mnt/nfs/var/spool/sympa
    chown sympa.sympa /mnt/nfs/var/spool/sympa
    
    mkdir -p /mnt/nfs/etc
    
    mv /var/lib/sympa/list_data /mnt/nfs/var/lib/sympa
    mv /var/lib/sympa/bounce /mnt/nfs/var/lib/sympa
    mv /var/lib/sympa/arc /mnt/nfs/var/lib/sympa
    
    mv /var/spool/sympa/moderation /mnt/nfs/var/spool/sympa
    mv /var/spool/sympa/digest /mnt/nfs/var/spool/sympa
    mv /var/spool/sympa/auth /mnt/nfs/var/spool/sympa/auth
    mv /var/spool/sympa/subscribe /mnt/nfs/var/spool/sympa
    mv /var/spool/sympa/topic /mnt/nfs/var/spool/sympa
    mv /var/spool/sympa/tmp /mnt/nfs/var/spool/sympa
    
    mv /etc/sympa /mnt/nfs/etc
    
  • 元のパスにリンクを作成する
    ln -s /mnt/nfs/var/lib/sympa/list_data /var/lib/sympa/list_data
    ln -s /mnt/nfs/var/lib/sympa/bounce /var/lib/sympa/bounce
    ln -s /mnt/nfs/var/lib/sympa/arc /var/lib/sympa/arc
    
    ln -s /mnt/nfs/var/spool/sympa/moderation /var/spool/sympa/moderation
    ln -s /mnt/nfs/var/spool/sympa/digest /var/spool/sympa/digest
    ln -s /mnt/nfs/var/spool/sympa/auth /var/spool/sympa/auth
    ln -s /mnt/nfs/var/spool/sympa/subscribe /var/spool/sympa/subscribe
    ln -s /mnt/nfs/var/spool/sympa/topic /var/spool/sympa/topic
    ln -s /mnt/nfs/var/spool/sympa/tmp /var/spool/sympa/tmp
    
    ln -s /mnt/nfs/etc/sympa /etc/sympa
    
  • 上記設定ファイルのパスを変更
    vi /etc/sympa/sympa.conf
    --------------------
    home    /mnt/nfs/var/lib/sympa/list_data
    queuemod        /mnt/nfs/var/spool/sympa/moderation
    queuedigest     /mnt/nfs/var/spool/sympa/digest
    queueauth       /mnt/nfs/var/spool/sympa/auth
    queuesubscribe  /mnt/nfs/var/spool/sympa/subscribe
    queuetopic      /mnt/nfs/var/spool/sympa/topic
    tmpdir          /mnt/nfs/var/spool/sympa/tmp
    bounce_path     /mnt/nfs/var/lib/sympa/bounce
    arc_path        /mnt/nfs/var/lib/sympa/arc
    
  • 上記を変更後、サービスをリスタートする。
    systemctl restart sympa
    systemctl restart wwsympa
    

共有ディスクにファイルを置くことによる問題

共有ディスクにファイルを配置することにより、(ローカルディスクに比べると)ファイルの読み書きが遅くなったり
NFSキャッシュを参照してしまうことで、両ノードから高頻度で書き換えられる次のファイルで問題が起きる可能性がある。

  • リストごとのシーケンス番号ファイル
  • リストへのエイリアスが書かれた配送テーブルファイル

リストごとのシーケンス番号ファイルに関する問題

  • list_data/stats
    リストごとのシーケンスファイル
    • 読み取り時のファイルロックがタイムアウトして、Subjectに付加するシーケンス番号が欠損する可能性がある
    • 読み取り時のファイルロックがタイムアウトして、Subjectに付加するシーケンス番号が重複する可能性がある
    • 書込み時のファイルロックがタイムアウトして、シーケンス番号が更新されない可能性がある
    • ファイルロックが短く両ノードからのアクセスが衝突して、ファイルが破損する可能性がある
  • 対策
    • 次のファイルにパッチをあてて、シーケンスファイルの読み書きのタイムアウトを伸ばす。
      ※アップデート時に元に戻ってしまうため注意が必要
      vi /usr/share/sympa/lib/Sympa/List.pm
      --------------------
      sub get_stats {
          my $self = shift;
      
          my @stats;
          my $lock_fh = Sympa::LockedFile->new($self->{'dir'} . '/stats', 20, '<'); ←20に伸ばす
          if ($lock_fh) {
              @stats = split /\s+/, do { my $line = <$lock_fh>; $line };
              $lock_fh->close;
          }
      …
      …
      sub update_stats {
          $log->syslog('debug2', '(%s, %s, %s, %s, %s)', @_);
          my $self  = shift;
          my @diffs = @_;
      
          my $lock_fh = Sympa::LockedFile->new($self->{'dir'} . '/stats', 40, '+>>'); ←40に伸ばす
          unless ($lock_fh) {
              $log->syslog('err', 'Could not create new lock');
              return;
          }
      …
      …
      
  • サービスの再起動を行う
    systemctl restart sympa
    

リストへのエイリアスが書かれた配送テーブルファイルに関する問題