arinux

Linux サーバー設定備忘録
MySQL (10) - MySQL Cluster (4)


メモ 管理コンソール


ここでは、MySQL Cluster の管理コンソールの操作を説明します。


  1. 起動

  2. 管理コンソールは、管理ノードで以下のように起動します。

     管理ノード
    [root]# /usr/local/mysql/bin/ndb_mgm
    -- NDB Cluster -- Management Client --
    ndb_mgm>
    


  3. 停止

  4. 管理コンソールを抜ける時は、何かコマンドを実行した後では 「quit」 を入力するとコンソールがハングアップします。よって 「^C(Ctrl を押しながら c を押す)」 で抜けます(MySQL の Bug #39679 で報告されています)。

    ndb_mgm> ^C
    


  5. ヘルプ表示
  6. コマンド一覧は、「?」 または 「help」 で表示されます。
    ndb_mgm> ?
    


    各コマンドの詳しいヘルプは、「? <command>」 または 「help <command>」 で表示されます。

    ndb_mgm> ? show
    


  7. ステータス表示
  8. ndb_mgm> show
    


  9. データノード再起動
  10. ndb_mgm> show
    [ndbd(NDB)]     2 node(s)
    id=2    @10.1.1.21  (mysql-5.1.30 ndb-6.3.20, starting, Nodegroup: 0, Master)
    id=3    @10.1.1.22  (mysql-5.1.30 ndb-6.3.20, starting, Nodegroup: 0)
    
    ndb_mgm> 2 restart
    Node 2: Node shutdown initiated
    Node 2: Node shutdown completed, restarting, no start.
    Node 2 is being restarted
    
    ndb_mgm> Node 2: Start initiated (version 6.3.20)
    Node 2: Started (version 6.3.20)
    <Enter> を入力
    
    ndb_mgm> show
    [ndbd(NDB)]     2 node(s)
    id=2    @10.1.1.21  (mysql-5.1.30 ndb-6.3.20, starting, Nodegroup: 0)
    id=3    @10.1.1.22  (mysql-5.1.30 ndb-6.3.20, starting, Nodegroup: 0, Master)
    


    • 「Master」 側を restart すると、残った Active のデータノードに 「Master」 が切り替わります。
    • 「restart」 には、以下のオプションがあります。
    -n停止後に start しません。
    -i停止後の start の際に、データノードをイニシャライズされ、もう片方のデータノードをからコピーされます。
    -aGCP(Global Checkpoint)の sync をせずに、強制 stop します。


  11. データノード停止
  12. ndb_mgm> 3 stop
    Node 3: Node shutdown initiated
    Node 3 has shutdown.
    
    ndb_mgm> Node 3: Node shutdown completed.
    


  13. データノード起動

  14. データノードを管理コンソール上で起動すると、以下のエラーが出ますので、該当のデータノード上で 「ndbd」 を起動します。

    ndb_mgm> 3 start
    Start failed.
    *    22: Error
    *        No contact with the process (dead ?).: Permanent error: Application error
    
     データノード
    [root]# /etc/rc.d/initi.d/ndbd start
    ndbd を起動中:
    


  15. バックアップ
  16. ndb_mgm> START BACKUP <backup_id>
    
    例:
    ndb_mgm> START BACKUP 1
    Waiting for completed, this may take several minutes
    Node 3: Backup 1 started from node 1
    Node 3: Backup 1 started from node 1 completed
     StartGCP: 42022 StopGCP: 42025
     #Records: 93196 #LogRecords: 0
     Data: 7431556 bytes Log: 0 bytes
    


    • 「<backup_id>」 には、何回目のバクアップかの数値を指定します。
    • 以下のものが保存されます。
    メタデータすべてのデータベース・テーブルの名前と定義
    テーブル・レコードバックアップしたときのデータベース・テーブルに保存された実際のデータ
    トランザクション・ログデータがデータベースにどのように何時保存されたを記録したシーケンシャルなレコード


    • 実際のバックアップ・データは、「config.ini」 の 「DataDir」 で指定したディレクトリ下の 「BACKUUP」 ディレクトリに保存されます。
    • バックアップ先のディレクトリは、「config.ini」 に 「BackupDataDir」 を指定することで変更可能です。
    • 以下は、保存されるファイルの説明です。
    BACKUP-backup_id.node_id.ctl コントロール情報およびメタデータを含むコントルール ファイルです。
    BACKUP-backup_id-0.node_id.data テーブルレコードを含むデータファイルで、フラグメント毎に保存されます。
    BACKUP-backup_id.node_id.log 実行されたトランザクションのレコードを含むログ ファイルバックアップで保存されたテーブルのトランザクションのみがログの保存されます。



メモ ユーティリティ・コマンド


ここでは、MySQL Cluster のユーティリティ・コマンドの一部を説明します。


  1. ステータス表示(1)

  2. このコマンドは、管理ノード及びデータノード上で実行可能です。

    [root]# /usr/local/mysql/bin/ndb_mgm -e show
    または
    [root]# /usr/local/mysql/bin/ndb_mgm -e "show"
    Connected to Management Server at: localhost:1186
    Cluster Configuration
    ---------------------
    [ndbd(NDB)]     2 node(s)
    id=2    @10.1.1.21  (mysql-5.1.30 ndb-6.3.20, starting, Nodegroup: 0, Master)
    id=3    @10.1.1.22  (mysql-5.1.30 ndb-6.3.20, starting, Nodegroup: 0)
    
    [ndb_mgmd(MGM)] 1 node(s)
    id=1    @10.1.1.11  (mysql-5.1.30 ndb-6.3.20)
    
    [mysqld(API)]   4 node(s)
    id=4    @10.1.1.21  (mysql-5.1.30 ndb-6.3.20)
    id=5    @10.1.1.22  (mysql-5.1.30 ndb-6.3.20)
    id=6 (not connected, accepting connect from any host)
    id=7 (not connected, accepting connect from any host)
    


  3. 特定の ID のステータス表示(1)

  4. このコマンドは、管理ノード及びデータノード上で実行可能です。

    [root]# /usr/local/mysql/bin/ndb_mgm -e "4 status"
    Connected to Management Server at: localhost:1186
    Node 4: connected (Version 6.3.20)
    


  5. ステータス表示(2)

  6. このコマンドは、管理ノード及びデータノード上で実行可能です。

    [root]# /usr/local/mysql/bin/ndb_waiter
    Connecting to mgmsrv at localhost
    Node 2: STARTED
    Node 3: STARTED
    
    NDBT_ProgramExit: 0 - OK
    


    • このコマンドは、全てのデータノードのステータスが 「STARTED」 になるまでデフォルトで 120秒間待ち続け、その間、メッセージを表示し続けます。
    • [root]# /usr/local/mysql/bin/ndb_waiter
      Connecting to mgmsrv at localhost
      Node 2: STARTED
      Node 3: NO_CONTACT
      Waiting for cluster enter state STARTED
      Node 2: STARTED
      Node 3: NO_CONTACT
      Waiting for cluster enter state STARTED
      (以下、省略)
      


    • 以下のように timeout の時間を指定を指定できます。
      [root]# /usr/local/mysql/bin/ndb_waiter  --timeout=1
      Connecting to mgmsrv at localhost
      Node 2: STARTED
      Node 3: NO_CONTACT
      Waiting for cluster enter state STARTED
      Node 2: STARTED
      Node 3: NO_CONTACT
      Waiting for cluster enter state STARTED
      (省略)
      waitNodeState(STARTED, -1) timeout after 8 attempts
      
      NDBT_ProgramExit: 1 - Failed
      



ここまで

| arinux | MySQL | 11:11 | comments(0) | trackbacks(0) | pookmark |
MySQL (9) - MySQL Cluster (3)


メモ SQLノード設定


  1. mysql グループと mysql ユーザーを作成します。
  2.  SQLノード
    [root]# groupadd -g 401 mysql
    [root]# useradd -g mysql -u 401 mysql -d /nonexistent -s /sbin/nologin
    


  3. インストールスクリプトを実行します。
  4.  SQLノード
    [root]# cd /usr/local/mysql
    [root]# ./scripts/mysql_install_db --user=mysql
    Installing MySQL system tables...
    OK(以下、省略)
    


  5. オーナーとグループを変更します。
  6.  SQLノード
    [root]# cd /usr/local
    [root]# chown -R root:mysql mysql-cluster-gpl-6.3.20-linux-i686-glibc23
    [root]# cd /usr/local/mysql
    [root]# chown -R mysql data
    


  7. 「~/.bash_profile」 に PATH 変数の設定を追加します。
  8.  SQLノード
    # .bash_profile
    
    # Get the aliases and functions
    if [ -f ~/.bashrc ]; then
            . ~/.bashrc
    fi
    
    # User specific environment and startup programs
    
    ENV=$HOME/.bashrc
    USERNAME="root"
    
    #export USERNAME ENV PATH                   #この行はコメントアウト
    export USERNAME ENV                         #この行を追加
    export PATH=$PATH:/usr/local/mysql/bin      #この行を追加
    
    mesg n
    


  9. 「~/.bash_profile」 を実行します。
  10.  SQLノード
    [root]# . ~/.bash_profile
    


  11. もしデータノードとは別のサーバーで SQLノードを動かす場合は、SQLノード側の 「/etc/my.cnf」 を作成します。
  12.  SQLノード
    [root]# vi /etc/my.cnf
    
    #innodb_lock_wait_timeout = 50          # この行はもともとあります
    
    ndbcluster                              # ここから赤字の部分を追加
    ndb-connectstring = 10.1.1.11           # 管理ノードの IP アドレスを指定
    
    [mysql_cluster]
    ndb-connectstring = 10.1.1.11           # 管理ノードの IP アドレスを指定
    
    [mysqldump]                             # ここから下の行も、もともとあります
    quick
    


  13. スタートアップ・スクリプトをコピーします。
  14.  SQLノード
    [root]# cp /usr/local/mysql/support-files/mysql.server /etc/rc.d/init.d/mysql
    


  15. mysqld を起動します。
  16.  SQLノード
    [root]# /etc/rc.d/init.d/mysql start
    Starting MySQL. SUCCESS!
    


  17. 同様に、もう一台のデータノードをセットアップし、mysqld を起動します。

  18. 管理ノードでステータスを確認します。
  19.  管理ノード
    [root]# /usr/local/mysql/bin/ndb_mgm
    -- NDB Cluster -- Management Client --
    ndb_mgm> show
    Connected to Management Server at: localhost:1186
    Cluster Configuration
    ---------------------
    [ndbd(NDB)]     2 node(s)
    id=2    @10.1.1.21  (mysql-5.1.30 ndb-6.3.20, starting, Nodegroup: 0, Master)
    id=3    @10.1.1.22  (mysql-5.1.30 ndb-6.3.20, starting, Nodegroup: 0)
    
    [ndb_mgmd(MGM)] 1 node(s)
    id=1    @10.1.1.11  (mysql-5.1.30 ndb-6.3.20)
    
    [mysqld(API)]   4 node(s)
    id=4    @10.1.1.21  (mysql-5.1.30 ndb-6.3.20)             → これが SQLノード
    id=5    @10.1.1.22  (mysql-5.1.30 ndb-6.3.20)             → これも SQLノード
    id=6 (not connected, accepting connect from any host)
    id=7 (not connected, accepting connect from any host)
    



つづく

| arinux | MySQL | 09:50 | comments(0) | trackbacks(0) | pookmark |
MySQL (8) - MySQL Cluster (2)


メモ データノード設定


  1. 「mysql-cluster」 をインストールします。
    http://download.softagency.net/MySQL/Downloads/MySQL-Cluster-6.3/ から、
    「mysql-cluster-gpl-6.3.20-linux-i686-glibc23.tar.gz」 をダウンロードして、「/usr/local/src」 に置きます。

  2. 「/usr/local」 に解凍します。
  3.  データノード
    [root]# cd /usr/local/src
    [root]# tar zxvf mysql-cluster-gpl-6.3.20-linux-i686-glibc23.tar.gz -C /usr/local
    


  4. シンボリックリンクを張ります。
  5.  データノード
    [root]# cd /usr/local
    [root]# ln -s mysql-cluster-gpl-6.3.20-linux-i686-glibc23 mysql
    


  6. my.cnf ファイルを作成します。
     データノード
    [root]# vi /etc/my.cnf
    
    #innodb_lock_wait_timeout = 50          # この行はもともとあります
    
    ndbcluster                              # ここから赤字の部分を追加
    ndb-connectstring = 10.1.1.11           # 管理ノードの IP アドレスを指定
    
    [mysql_cluster]
    ndb-connectstring = 10.1.1.11           # 管理ノードの IP アドレスを指定
    
    [mysqldump]                             # ここから下の行も、もともとあります
    quick
    


  7. ポート番号 1186 と 63132 を使用しますので、iptables などで制限している場合には、そのポートを開けます。

  8. 「/usr/local/mysql-cluster」を作成します。
     データノード
    [root]# mkdir /usr/local/mysql-cluster
    


  9. 初回のみイニシャライズのオプションを付けて、ndbd を起動します。
     データノード
    [root]# cd /usr/local/mysql/bin
    [root]# ./ndbd --initial
    [root]# ps -ef | grep ndbd
    root     14749     1  0 16:16 ?        00:00:00 ./ndbd --initial
    root     14750 14749  1 16:16 ?        00:00:00 ./ndbd --initial
    


  10. ndbd のスタートアップ・スクリプトを作成します。
     データノード
    [root]# vi /etc/rc.d/init.d/ndbd
    
    #! /bin/bash
    
    # Source function library.
        . /etc/init.d/functions
    RETVAL=0
    
    prog=ndbd
    path=/usr/local/mysql/bin/ndbd
    conf=/etc/my.cnf
    
    start() {
            echo -n $"Starting $prog: "
            $path
            RETVAL=$?
            echo
            [ $RETVAL -eq 0 ] && touch /var/lock/subsys/$prog
            return $RETVAL
    }
    
    stop() {
            echo -n $"Stopping $prog: "
            killproc $path
            RETVAL=$?
            echo
            [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$prog
            return $RETVAL
    }
    
    restart() {
            stop
            sleep 2
            start
    }
    
    case "$1" in
      start)
            start
            ;;
      stop)
            stop
            ;;
      restart)
            restart
            ;;
      status)
            status $path
            ;;
      condrestart)
            [ -f /var/lock/subsys/$prog ] && restart || :
            ;;
      *)
            echo $"Usage: $0 {start|stop|status|reload|restart|condrestart}"
            exit 1
    esac
    
    exit $?
    


  11. パーミッションを設定します。
     データノード
    [root]# chmod 755 /etc/rc.d/init.d/ndbd
    


  12. ndbd を再起動します。
     データノード
    [root]# /etc/rc.d/init.d/ndbd restart
    ndbd を停止中:                                             [  OK  ]
    ndbd を起動中:
    
    [root]# ps -ef | grep ndbd
    root     26148     1  0 11:25 ?        00:00:00 /usr/local/mysql/bin/ndbd
    root     26149 26148 14 11:25 ?        00:00:11 /usr/local/mysql/bin/ndbd
    


  13. 管理ノードでステータスを確認します。
     管理ノード
    [root]# /usr/local/mysql/bin/ndb_mgm
    -- NDB Cluster -- Management Client --
    ndb_mgm> show
    Connected to Management Server at: localhost:1186
    Cluster Configuration
    ---------------------
    [ndbd(NDB)]     2 node(s)
    id=2    @10.1.1.21  (mysql-5.1.30 ndb-6.3.20, starting, Nodegroup: 0)
    id=3 (not connected, accepting connect from 10.1.1.22)
    
    [ndb_mgmd(MGM)] 1 node(s)
    id=1    @10.1.1.11  (mysql-5.1.30 ndb-6.3.20)
    
    [mysqld(API)]   4 node(s)
    id=4 (not connected, accepting connect from 10.1.1.21)
    id=5 (not connected, accepting connect from 10.1.1.22)
    id=6 (not connected, accepting connect from any host)
    id=7 (not connected, accepting connect from any host)
    


  14. 同様に、もう一台のデータノードをセットアップし、ndbd を起動します。


  15. 管理ノードでステータスを表示し、片方のデータノードが 「Master」 になっていることを確認します。
     管理ノード
    [root]# /usr/local/mysql/bin/ndb_mgm
    -- NDB Cluster -- Management Client --
    ndb_mgm> show
    Connected to Management Server at: localhost:1186
    Cluster Configuration
    ---------------------
    [ndbd(NDB)]     2 node(s)
    id=2    @10.1.1.21  (mysql-5.1.30 ndb-6.3.20, starting, Nodegroup: 0, Master)
    id=3    @10.1.1.22  (mysql-5.1.30 ndb-6.3.20, starting, Nodegroup: 0)
    
    [ndb_mgmd(MGM)] 1 node(s)
    id=1    @10.1.1.11  (mysql-5.1.30 ndb-6.3.20)
    
    [mysqld(API)]   4 node(s)
    id=4 (not connected, accepting connect from 10.1.1.21)
    id=5 (not connected, accepting connect from 10.1.1.22)
    id=6 (not connected, accepting connect from any host)
    id=7 (not connected, accepting connect from any host)
    



つづく

| arinux | MySQL | 10:40 | comments(0) | trackbacks(0) | pookmark |
MySQL (7) - MySQL Cluster (1)


メモ サーバー構築環境


用途管理ノードデータノード/SQLノード
機種DELL PE650IBM x336、NEC Express5800
メモリー512MB2GB/台
OSCentOS 5.2
kernel2.6.18-92.el5
glibc2.5-24
mysql5.1.30
mysql-cluster6.3.20



メモ MySQL Cluster の構成


ここでは、以下のように MySQL Cluster を構成します。
MySQL Cluster の構成


  • 点線の部分が、物理的な一台のサーバーを指し、以下の 3台構成にしています。
    • 【10.1.1.11】 管理ノード
    • 【10.1.1.21】 データノードと SQLノード
    • 【10.1.1.22】 データノードと SQLノード
  • 各ノードは、それぞれユニークな id を持ちます。
  • 以下は、各ノードの説明です。


管理ノードクラスターの設定、管理作業を行います。データノードの構成情報も持ちます。クラスターを構築するには、まず最初に管理ノードを起動し、データノード、SQLノードの順に起動します。各データノードや SQLノードのは、自身の起動時に、この管理ノードに対して定義情報を問い合わます。管理ノードの実体は ndb_mgmd というデーモンです。
データノード実態は ndbd です。ndb とは、MySQL のストレージエンジン(MyISAM、InnoDB など)の一つです。ndb が複数のサーバ上で起動している場合、お互いを認識して同期します。クライアントからは、単一ノードとして見えます(つまり、クラスターとして動きます)。テーブルは、このデータノードに格納されます。
SQLノードndb ストレージエンジンを使用した MySQL サーバー。クラスター化されたデータノードにアクセスします。SQL ノードは、実際は単にクラスターデータにアクセスするアプリケーションを意味します。接続方法は、他のストレージエンジンを使用する場合と同じで、クライアントからの接続ポートはデフォルト 3306 を使用します。mysqld を起動する際は、「--ndbcluster」 オプションが必要、また table 作成の際も 「engine=ndbcluster」 を付加する必要があります。



メモ 管理ノード設定


  1. 「mysql-cluster」 をインストールします。
    http://download.softagency.net/MySQL/Downloads/MySQL-Cluster-6.3/ から、
    「mysql-cluster-gpl-6.3.20-linux-i686-glibc23.tar.gz」 をダウンロードして、「/usr/local/src」 に置きます。

  2. 「/usr/local」 に解凍します。
  3.  管理ノード
    [root]# cd /usr/local/src
    [root]# tar zxvf mysql-cluster-gpl-6.3.20-linux-i686-glibc23.tar.gz -C /usr/local
    


  4. シンボリックリンクを張ります。
  5.  管理ノード
    [root]# cd /usr/local
    [root]# ln -s mysql-cluster-gpl-6.3.20-linux-i686-glibc23 mysql
    


  6. クラスターのコンフィグ・ファイルを作成します。
  7.  管理ノード
    [root]# mkdir /usr/local/mysql-cluster
    [root]# cp /usr/local/mysql/support-files/ndb-config-2-node.ini /usr/local/mysql-cluster/config.ini
    [root]# vi /usr/local/mysql-cluster/config.ini
    
    [ndbd default]         #データノード(ndb)が参照する値です。
    NoOfReplicas= 2
    MaxNoOfConcurrentOperations= 10000
    DataMemory= 80M
    IndexMemory= 24M
    TimeBetweenWatchDogCheck= 30000
    DataDir= /usr/local/mysql-cluster
    MaxNoOfOrderedIndexes= 512
    
    [ndb_mgmd default]     #管理ノード(ndb_mgmd)が参照する値です。
    DataDir= /usr/local/mysql-cluster
    
    [ndb_mgmd]
    Id=1
    HostName= 10.1.1.11
    
    [ndbd]
    Id= 2
    HostName= 10.1.1.21
    
    [ndbd]
    Id= 3
    HostName= 10.1.1.22
    
    # TCP/IP Connections     #データノード同士を private LAN で直結する場合に追加。
    [TCP]
    NodeId1=2
    NodeId2=3
    HostName1=192.168.1.2
    HostName2=192.168.1.3
    
    [mysqld]
    Id= 4
    HostName= 10.1.1.21
    
    [mysqld]
    Id= 5
    HostName= 10.1.1.22
    
    [mysqld]
    Id= 6
    
    [mysqld]
    Id= 7
    
    # choose an unused port number
    # in this configuration 63132, 63133, and 63134
    # will be used
    [tcp default]
    PortNumber= 63132
    
    • NoOfReplicas
      • レプリケーション(複製)の数。1〜4 のいずれかを指定します。通常は 「2」 を指定します。「1」 を指定すると複製なしとなり、冗長性がなくなります。データノードは、お互いの複製を持ち合うためにノードグループを形成します。

      • ノードグループに属するデータノードの数は、NoOfReplicas の値と同じです。NoOfReplicas が 2、データノードが 2つの場合は、ノードグループは 1つになります。

      • MySQL Cluster データノードのレプリケーション


      • NoOfReplicas が 2、データノードの id が 2,3,4,5 の 4つの場合は、ノードグループ0 に id 2,3、ノードグループ1 に 4,5 のように、id の小さいものから順にノードグループを形成します。

      • MySQL Cluster データノードのレプリケーション


    • id
      • ノードのアドレスとして使用されるユニークな ID です。1〜63 までの整数で指定します。
    • [TCP]
      • データノード間をプライベートLAN で直結する場合に、各データノードの ID と IPアドレスを指定します。
      • 「NodeIdN」 と 「HostNameN」 の 「N」 の値は、同じ番号であれば、同じデータノードを指します。
      • 「NodeId」 には、該当のデータノードに指定した 「Id」 と同じ番号を指定します。
      • 「HostName」 には、該当のデータノードの IPアドレスを指定します。


  8. ポート番号 1186 を使用しますので、iptables などで制限している場合には、そのポートを開けます。

  9. ndb_mgmd
  10. のスタートアップ・スクリプトを作成します。
     管理ノード
    [root]# vi /etc/rc.d/init.d/ndb_mgmd
    
    #! /bin/bash
    
    # Source function library.
        . /etc/init.d/functions
    RETVAL=0
    
    prog=ndb_mgmd
    path=/usr/local/mysql/bin/ndb_mgmd
    conf=/usr/local/mysql-cluster/config.ini
    
    start() {
            echo -n $"Starting $prog: "
            $path -d -f $conf
            RETVAL=$?
            echo
            [ $RETVAL -eq 0 ] && touch /var/lock/subsys/$prog
            return $RETVAL
    }
    
    stop() {
            echo -n $"Stopping $prog: "
            killproc $path
            RETVAL=$?
            echo
            [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$prog
            return $RETVAL
    }
    
    restart() {
            stop
            sleep 2
            start
    }
    
    case "$1" in
      start)
            start
            ;;
      stop)
            stop
            ;;
      restart)
            restart
            ;;
      status)
            status $path
            ;;
      condrestart)
            [ -f /var/lock/subsys/$prog ] && restart || :
            ;;
      *)
            echo $"Usage: $0 {start|stop|status|reload|restart|condrestart}"
            exit 1
    esac
    
    exit $?
    


  11. ndb_mgmd を起動します。
  12.  管理ノード
    [root]# /etc/rc.d/init.d/ndb_mgmd start
    ndb_mgmd を起動中:
    


  13. 管理コンソールを起動します。
  14.  管理ノード
    [root]# /usr/local/mysql/bin/ndb_mgm
    -- NDB Cluster -- Management Client --
    ndb_mgm>
    


  15. 現在のクラスターの情報を表示します。
     管理ノード
    ndb_mgm> show
    Connected to Management Server at: localhost:1186
    Cluster Configuration
    ---------------------
    [ndbd(NDB)]     2 node(s)
    id=2 (not connected, accepting connect from 10.1.1.21)
    id=3 (not connected, accepting connect from 10.1.1.22)
    
    [ndb_mgmd(MGM)] 1 node(s)
    id=1    @10.1.1.11  (mysql-5.1.30 ndb-6.3.20)
    
    [mysqld(API)]   4 node(s)
    id=4 (not connected, accepting connect from 10.1.1.21)
    id=5 (not connected, accepting connect from 10.1.1.22)
    id=6 (not connected, accepting connect from any host)
    id=7 (not connected, accepting connect from any host)
    



つづく

| arinux | MySQL | 10:17 | comments(1) | trackbacks(0) | pookmark |
MySQL (6) - virtual_alias_maps, virtual_alias_domains


メモ バーチャルドメインによるメール転送


  1. 以下の図のように、自分自身とは違うドメイン宛のメールを受信した際に、エイリアス先のアドレスへ転送します。

  2. バーチャルドメインによるメール転送


  3. この例では、「examples.com」ドメインに対する MX レコードが、「mail.arinux.net」であると仮定しています。
  4. [mail]# dig examples.com MX
    ;; ANSWER SECTION:
    examples.com.           86400   IN      MX      10 mail.arinux.net.
    


  5. 自分自身とは違うドメイン宛のメールを実際のメールサーバーに届けるためには、そのドメインを「virtual_alias_domains」に記述しておきます。ここに書かれていないドメイン宛のメールは、宛先不明として処理されます。
  6. main.cf
    virtual_alias_domains = hash:/usr/local/etc/postfix/valias_domains
    
    valias_domains
    examples.com anything
    


  7. 実際の転送先は、「virtual_alias_maps」に記述します。
    main.cf
    virtual_alias_maps = hash:/usr/local/etc/postfix/virtual_alias_maps
    
    valias_alias_maps
    ari@examples.com ari@mailserver.jp
    
    虫眼鏡 この場合は、以下のように各ファイルを DB化して使用します。


    [mail]# postmap /usr/local/etc/postfix/virtual_alias_domains
    [mail]# postmap /usr/local/etc/postfix/virtual_alias_maps
    


  8. これらの情報を、MySQL DB へ登録して、そこから読み込みます。



メモ MySQL への virtual_alias_maps, virtual_alias_domains の登録


※ 以下の操作は、全てマスターで実施します。


  1. mysql に root でログインします。
  2. [master]# mysql -u root -p
    Enter password:
    


  3. 「virtual_alias」用の DB を作成します。
  4. mysql> CREATE DATABASE valias;
    Query OK, 1 row affected (0.00 sec)
    


  5. DB が作成されたことを確認します。
  6. mysql> SHOW DATABASES;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | usersdb            |
    | mysql              |
    | repldb             |
    | test               |
    | valias             |
    +--------------------+
    5 rows in set (0.00 sec)
    


  7. ローカルから DB へ接続するためのユーザーを作成します。このユーザーには、全ての権限を与えます。
  8. mysql> GRANT ALL PRIVILEGES ON valias.* TO  vaadmin@localhost IDENTIFIED BY '3joTz_Csm7wf';
    Query OK, 0 rows affected (0.00 sec)
    


  9. クライアントから DB へ接続するためのユーザーを作成します。このユーザーには、SELECT 権限のみ与えます。
  10. mysql> GRANT SELECT ON valias.* TO  vauser@'mail.arinux.net' IDENTIFIED BY 'w7f}jTeq4zNe';
    Query OK, 0 rows affected (0.00 sec)
    


  11. ユーザ情報を反映します。
  12. mysql> FLUSH PRIVILEGES;
    Query OK, 0 rows affected (0.00 sec)
    


  13. ユーザーが作成されたことを確認します。
  14. mysql> SELECT * FROM mysql.db ¥G
    (以下、省略)
    mysql> SELECT * FROM mysql.user ¥G
    (以下、省略)
    mysql> SHOW GRANTS for vauser@'mail.arinux.net';
    +----------------------------------------------------------------------------------+
    | Grants for cwuser@test15.arinux.net                                              |
    +----------------------------------------------------------------------------------+
    | GRANT USAGE ON *.* TO 'vauser'@'mail.arinux.net' IDENTIFIED BY PASSWORD
     '*F71855E2C14BA3F48906F7B0AAFB99F172020C19'                                       |
    | GRANT SELECT ON `valias`.* TO 'vauser'@'mail.arinux.net'                         |
    +----------------------------------------------------------------------------------+
    2 rows in set (0.00 sec)
    


  15. valiasmap テーブルを作成します。
  16. 青い旗 以下をコピーして、mysql> プロンプトで貼り付ければ入力できます。
    CREATE TABLE valiasmap (
      valias_id int(11) NOT NULL auto_increment primary key,
      status char(1) DEFAULT 'A',
      mail varchar(80) DEFAULT '' NOT NULL,
      domain varchar(50) DEFAULT '' NOT NULL,
      alias varchar(80) DEFAULT '' NOT NULL
    );
    
    mysql> CREATE TABLE valiasmap (
        ->   valias_id int(11) NOT NULL auto_increment primary key,
        ->   status char(1) DEFAULT 'A',
        ->   mail varchar(80) DEFAULT '' NOT NULL,
        ->   domain varchar(50) DEFAULT '' NOT NULL,
        ->   alias varchar(80) DEFAULT '' NOT NULL
        -> );
    Query OK, 0 rows affected (0.00 sec)
    


  17. valiasmap テーブルが作成されたことを確認します。
  18. mysql> SHOW TABLES;
    +------------------+
    | Tables_in_valias |
    +------------------+
    | valiasmap        |
    +------------------+
    1 row in set (0.00 sec)
    
    mysql> SHOW FIELDS FROM valiasmap;
    +-----------+-------------+------+-----+---------+----------------+
    | Field     | Type        | Null | Key | Default | Extra          |
    +-----------+-------------+------+-----+---------+----------------+
    | valias_id | int(11)     | NO   | PRI | NULL    | auto_increment |
    | status    | char(1)     | YES  |     | A       |                |
    | mail      | varchar(80) | NO   |     |         |                |
    | domain    | varchar(50) | NO   |     |         |                |
    | alias     | varchar(80) | NO   |     |         |                |
    +-----------+-------------+------+-----+---------+----------------+
    5 rows in set (0.00 sec)
    


  19. valiasmap にデータを追加します。
  20. mysql> INSERT INTO valiasmap VALUES (1,'A','ari@examples.com','examples.com','ari@mailserver.jp');
    Query OK, 1 row affected (0.00 sec)
    


  21. 追加されたことを確認します。
  22. mysql> SELECT * FROM valiasmap;
    +-----------+--------+------------------+--------------+--------------------+
    | valias_id | status | mail             | domain       | alias              |
    +-----------+--------+------------------+--------------+--------------------+
    |         1 | A      | ari@examples.com | examples.com | ari@mailserver.jp  |
    +-----------+--------+------------------+--------------+--------------------+
    1 rows in set (0.00 sec)
    


  23. ログアウトします。
  24. mysql> ¥q
    Bye
    
    [master]#
    



メモ virtual_alias_maps, virtual_alias_domains の設定


  1. main.cf に以下を追加します。
  2. [mail]# vi /usr/local/etc/postfix/main.cf
    
    virtual_alias_domains = mysql:/usr/local/etc/postfix/mysql-alias_domains.cf
    virtual_alias_maps = mysql:/usr/local/etc/postfix/mysql-alias_maps.cf
    


  3. 「mysql-alias_domains.cf」を作成します。
  4. [mail]# vi /usr/local/etc/postfix/main.cf/mysql-alias_domains.cf
    
    hosts = slave01.arinux.net slave02.arinux.net   #スペースで区切って複数指定可
    user = vauser
    password = w7f}jTeq4zNe
    dbname = valias
    query = SELECT domain FROM valiasmap WHERE mail='%s' AND status='A'
    


  5. 「mysql-alias_maps.cf」を作成します。
  6. [mail]# vi /usr/local/etc/postfix/main.cf/mysql-alias_maps.cf
    
    hosts = slave01.arinux.net slave02.arinux.net   #スペースで区切って複数指定可
    user = vauser
    password = w7f}jTeq4zNe
    dbname = valias
    query = SELECT alias FROM valiasmap WHERE mail='%s' AND status='A'
    


  7. postfix を再起動します。
  8. [mail]# /etc/rc.d/init.d/postfix restart
    Shutting down postfix:                                     [  OK  ]
    Starting postfix:                                          [  OK  ]
    


  9. 期待通りに値が引けるかをテストします。
  10. [mail]# postmap -q "ari@examples.com" mysql:/usr/local/etc/postfix/mysql-alias_domains.cf
    examples.com
    
    [mail]# postmap -q "ari@examples.com" mysql:/usr/local/etc/postfix/mysql-alias_maps.cf
    ari@mailserver.jp
    


  11. テストメールを送信します。
  12. [mail]# echo "valias test 201" | mail -s "test 201" ari@examples.com
    


  13. 転送先に届いたかを確認します。



つづく

| arinux | MySQL | 10:00 | comments(0) | trackbacks(0) | pookmark |
MySQL (5) - メールアカウント管理 (2)


メモ Dovecot のインストール、設定


  1. http://www.dovecot.org/download.html から、
    「dovecot-1.1.7.tar.gz」 をダウンロードして、「/usr/local/src」 に置きます。


  2. 解凍します。
    [mail]# cd /usr/local/src
    [mail]# tar zxvf dovecot-1.1.7.tar.gz
    


  3. 「dovecot」 ユーザーとグループを作成します(ログインさせないようにします)。
    [mail]# groupadd dovecot
    [mail]# useradd -g dovecot -d /dev/null -s /sbin/nologin dovecot
    


  4. コンフィグします(prefix の default は /usr/local です)。
    [mail]# ./configure --with-sql --with-mysql
    
    虫眼鏡 SSL を使用する場合


    pops や imaps を利用する場合は、以下のように指定して、コンフィグします。なお、「openssl」 「openssl-devel」 パッケージがインストールされている必要があります。

    [mail]# ./configure --with-sql --with-mysql --with-ssl=openssl
    
  5. コンパイル、インストールします。
    [mail]# make
    [mail]# make install
    


  6. 「/usr/local/etc」 以下のコンフィグファイルを 「/usr/local/etc/dovecot」 に移動します。
    [mail]# cd /usr/local/etc
    [mail]# mkdir dovecot
    [mail]# mv dovecot-*.conf dovecot/.
    


  7. dovecot.conf を編集します。
    [mail]# cd /usr/local/etc/dovecot
    [mail]# cp dovecot-example.conf dovecot.conf
    [mail]# vi dovecot.conf
    
    protocols = pop3 imap
    listen = *
    disable_plaintext_auth = no
    log_path = /var/log/dovecot.log
    log_timestamp = "%b %d %H:%M:%S "
    syslog_facility = mail
    ssl_disable = yes
    mail_location = maildir:~/Maildir
    protocol imap {
    }
    protocol pop3 {
      pop3_uidl_format = %u
    }
    protocol lda {
      postmaster_address = postmaster@mail.arinux.net
    }
    auth_debug = no
    auth default {
      mechanisms = plain
      passdb sql {
        args = /usr/local/etc/dovecot/dovecot-mysql.conf
      }
      userdb sql {
        args = /usr/local/etc/dovecot/dovecot-mysql.conf
      }
      user = root
    }
    dict {
    }
    plugin {
    }
    


  8. dovecot-mysql.conf を編集します。
    [mail]# cd /usr/local/etc/dovecot
    [mail]# cp dovecot-sql-example.conf dovecot-mysql.conf
    [mail]# vi dovecot-mysql.conf
    
    driver = mysql
    connect = host=slave01.arinux.net dbname=myusers user=cwuser password=n,V0dX6kjgcd
    default_pass_scheme = MD5
    password_query = SELECT password FROM user WHERE user_name = '%n' and status = 'A' and user.shost = 'mail.arinux.net'
    user_query = SELECT homedir as home, uid, gid FROM user WHERE user_name = '%n'
    
    虫眼鏡 複数のホストを指定する場合


    指定したホストに接続できない場合に、別のホストに接続させることができます。以下は、2つの host を指定した例です(3つ以上指定したテストはしておりません)。

    connect = host=slave01.arinux.net host=localhost dbname=myusers user=cwuser password=n,V0dX6kjgcd
    


  9. スタートアップ・スクリプトを作成します。
    [mail]# vi /etc/rc.d/init.d/dovecot
    
    #! /bin/bash
    
    # Source function library.
        . /etc/init.d/functions
    RETVAL=0
    
    prog=dovecot
    path=/usr/local/sbin/dovecot
    conf=/usr/local/etc/dovecot/dovecot.conf
    
    start() {
            echo -n $"Starting $prog: "
            $path -c $conf
            RETVAL=$?
            echo
            [ $RETVAL -eq 0 ] && touch /var/lock/subsys/$prog
            return $RETVAL
    }
    
    stop() {
            echo -n $"Stopping $prog: "
            killproc $path
            RETVAL=$?
            echo
            [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$prog
            return $RETVAL
    }
    
    restart() {
            stop
            sleep 2
            start
    }
    
    case "$1" in
      start)
            start
            ;;
      stop)
            stop
            ;;
      restart)
            restart
            ;;
      status)
            status $path
            ;;
      condrestart)
            [ -f /var/lock/subsys/$prog ] && restart || :
            ;;
      *)
            echo $"Usage: $0 {start|stop|status|reload|restart|condrestart}"
            exit 1
    esac
    
    exit $?
    


  10. パーミッションを変更します。
    [mail]# chmod 755 dovecot
    


  11. dovecot を起動します。
    [mail]# /etc/rc.d/init.d/dovecot start
    dovecot を起動中:
    


  12. telnet でログイン認証のテストをします。
    [mail]# telnet localtest 110
    Trying 127.0.0.1...
    Connected to localhost.
    Escape character is '^]'.
    +OK Dovecot ready.
    user muser
    +OK
    pass muserpasswd
    +OK Logged in.
    quit
    +OK Logging out.
    Connection closed by foreign host.
    [mail]#
    


  13. メールクライアントを使用して、メール受信ができることを確認します。



つづく

| arinux | MySQL | 17:04 | comments(0) | trackbacks(0) | pookmark |
MySQL (4) - メールアカウント管理 (1)


メールアカウントの認証の際に、MySQL DB を参照させます。POP/IMAP 及び SASL サーバーとして Dovecot を使用します。


※ ここでは、メールサーバーのホスト名を 「mail.arinux.net」 としています。



メモ テスト環境


機種DELL PE750
OSCentOS 5.2
kernel2.6.18-92.1.18.el5
glibc2.5-24
MySQL5.0.67
Postfix2.5.5
Dovecot1.1.7



メモ DB接続ユーザーとデータ追加


※ 以下の操作は、全てマスターで実施します。


  1. openssl を使用して MD5 パスワードを作成します。
    [master]# openssl passwd -1
    Password: muserpasswd
    Verifying - Password: muserpasswd
    $1$GG1PlzmS$bihY9aPaSSVr1vIjSmBoW1
    


  2. MySQL にログインします。
    [master]# mysql -u root -p
    Enter password: 
    


  3. メールサーバーから DB へ接続するためのユーザーを作成します。このユーザーには、SELECT 権限のみ与えます。
    mysql> GRANT SELECT ON usersdb.* TO  cwuser@'mail.arinux.net' IDENTIFIED BY 'n,V0dX6kjgcd';
    Query OK, 0 rows affected (0.00 sec)
    


  4. ユーザ情報を反映します。
    mysql> FLUSH PRIVILEGES;
    Query OK, 0 rows affected (0.00 sec)
    


  5. ユーザーが作成されたことを確認します。
    mysql> SELECT * FROM mysql.db ¥G
    (以下、省略)
    mysql> SELECT * FROM mysql.user ¥G
    (以下、省略)
    mysql> SHOW GRANTS for cwuser@'mail.arinux.net';
    +----------------------------------------------------------------------------------+
    | Grants for cwuser@test15.arinux.net                                              |
    +----------------------------------------------------------------------------------+
    | GRANT USAGE ON *.* TO 'cwuser'@'mail.arinux.net' IDENTIFIED BY PASSWORD
     '*69B3D5081425557A449413DD0FBD59FBE30CC1FF'                                       |
    | GRANT SELECT ON `usersdb`.* TO 'cwuser'@'mail.arinux.net'                     |
    +----------------------------------------------------------------------------------+
    2 rows in set (0.00 sec)
    


  6. user テーブルにデータを追加します。
    mysql> use usersdb;
    mysql> INSERT INTO user VALUES (2,'muser','Muser','/sbin/nologin','$1$GG1PlzmS$bihY9aPaSSVr1vIjSmBoW1',
    'A',1002,511,'/home/muser', '14194', '0', '0', '7', '-1', '-1', 'mail.arinux.net');
    Query OK, 1 row affected (0.00 sec)
    


  7. 追加されたことを確認します。
    mysql> select * from user where user_id='2'¥G
    *************************** 1. row ***************************
       user_id: 2
     user_name: muser
      realname: Muser
         shell: /sbin/nologin
      password: $1$GG1PlzmS$bihY9aPaSSVr1vIjSmBoW1
        status: A
           uid: 1002
           gid: 511
       homedir: /home/muser
    lastchange: 14194
           min: 0
           max: 0
          warn: 7
         inact: -1
        expire: -1
         shost: mail.arinux.net
    1 row in set (0.00 sec)
    




メモ メールサーバーへの nss-mysql のインストール


    MySQL (3) - passwd 管理 (2) を参考に、メールサーバー上に nss-mysql をインストールします。



メモ Postfix のインストール


※ 以下の操作は、全てメールサーバー上で実施します。


  1. http://mirror.postfix.jp/postfix-release/index.html から、
    「postfix-2.5.5.tar.gz」 をダウンロードして、「/usr/local/src」 に置きます。


  2. 解凍します。
    [mail]# cd /usr/local/src
    [mail]# tar zxvf postfix-2.5.5.tar.gz
    


  3. sendmail 関連のコマンドを rename します。
    [mail]# mv /usr/sbin/sendmail /usr/sbin/sendmail.org
    [mail]# mv /usr/bin/newaliases /usr/bin/newaliases.org
    [mail]# mv /usr/bin/mailq /usr/bin/mailq.org
    


  4. sendmail プロセスを停止し、boot 時に自動起動しないようにします。
    [mail]# /etc/rc.d/init.d/sendmail stop
    (停止しない場合は、「killall sendmail」 を実行)
    [mail]# chkconfig sendmail off
    [mail]# chkconfig --list sendmail
    sendmail        0:off   1:off   2:off   3:off   4:off   5:off   6:off
    


  5. postfix ユーザーと、postfix 及び postdrop グループを作成します。postfix ユーザーはログインさせないようにします。
    [mail]# groupadd postfix
    [mail]# groupadd postdrop
    [mail]# useradd -g postfix -d /dev/null -s /sbin/nologin postfix
    


  6. Makefile を作成します。
    [mail]# cd /usr/local/src/postfix-2.5.5
    [mail]# make makefiles CCARGS='-DHAS_MYSQL -DUSE_SASL_AUTH -DDEF_SASL_SERVER=¥"dovecot¥" 
    -I/usr/local/include -I/usr/local/mysql/include -DDEF_CONFIG_DIR=¥"/usr/local/etc/postfix¥"' 
    AUXLIBS="-L/usr/local/mysql/lib -L/usr/local/lib -lmysqlclient -lm -lz"
    
    虫眼鏡 「No <db.h> include file found.」


    このエラーが出る場合は、「db4-devel」 パッケージをインストールしてから、再度 Makefile 作成を実行します。

    [mail]# yum install db4-devel
    
    虫眼鏡 SMTPS 利用の場合


    SMTPS を利用する場合は、以下のように ssl に関するパラメータを追加します。

    [mail]# make makefiles CCARGS='-DHAS_MYSQL -DUSE_SASL_AUTH -DDEF_SASL_SERVER=¥"dovecot¥"
    -I/usr/local/include -I/usr/local/mysql/include -DDEF_CONFIG_DIR=¥"/usr/local/etc/postfix¥"
    -DUSE_TLS -I/usr/local/src/openssl-0.9.7m/include/openssl'
    AUXLIBS="-L/usr/local/mysql/lib -L/usr/local/lib -lmysqlclient -lm -lz  -lssl -lcrypto"
    


  7. コンパイル、インストールを実施します。
    [mail]# make
    [mail]# make install
    (省略)
    install_root: [/] <Enter>
    tempdir: [/usr/local/src/postfix-2.5.1] <Enter>
    config_directory: [/usr/local/etc/postfix] <Enter>
    command_directory: [/usr/sbin] /usr/local/sbin
    daemon_directory: [/usr/libexec/postfix] /usr/local/libexec/postfix
    data_directory: [/var/lib/postfix] /usr/local/var/postfix
    html_directory: [no] <Enter>
    mail_owner: [postfix] <Enter>
    mailq_path: [/usr/bin/mailq] <Enter>
    manpage_directory: [/usr/local/man] <Enter>
    newaliases_path: [/usr/bin/newaliases] <Enter>
    queue_directory: [/var/spool/postfix] <Enter>
    readme_directory: [no] <Enter>
    sendmail_path: [/usr/sbin/sendmail] <Enter>
    setgid_group: [postdrop] <Enter>
    (省略)
    


  8. コンフィグしたパラメータを確認します。
    [mail]# postconf -n -c /usr/local/etc/postfix
    command_directory = /usr/local/sbin
    config_directory = /usr/local/etc/postfix
    daemon_directory = /usr/local/libexec/postfix
    data_directory = /usr/local/var/postfix
    debug_peer_level = 2
    html_directory = no
    mail_owner = postfix
    mailq_path = /usr/bin/mailq
    manpage_directory = /usr/local/man
    newaliases_path = /usr/bin/newaliases
    queue_directory = /var/spool/postfix
    readme_directory = no
    sample_directory = /usr/local/etc/postfix
    sendmail_path = /usr/sbin/sendmail
    setgid_group = postdrop
    unknown_local_recipient_reject_code = 550
    


  9. aliases の root の転送先の設定と、postfix アカウントの記述を確認します。
    [mail] cd /usr/local/etc/postfix
    [mail] vi aliases
    root:           admin   # これを追加(root 以外のメール管理者に転送する場合のみ)。
    postfix:        root    # この行はもともとあります。
    


  10. aliases.db に反映させます。
    [mail]# postalias -c /usr/local/etc/postfix /usr/local/etc/postfix/aliases
    


  11. main.cf を編集します。
    [mail] cd /usr/local/etc/postfix
    [mail] vi main.cf
    
    queue_directory = /var/spool/postfix
    command_directory = /usr/local/sbin
    daemon_directory = /usr/local/libexec/postfix
    data_directory = /usr/local/var/postfix
    mail_owner = postfix
    myhostname = mail.arinux.net
    mydomain = arinux.net
    myorigin = $myhostname
    inet_interfaces = all
    mydestination = $myhostname, localhost.$mydomain, localhost
    unknown_local_recipient_reject_code = 550
    mynetworks = 127.0.0.0/8, 10.1.1.0/24
    alias_maps = hash:/usr/local/etc/postfix/aliases
    alias_database = hash:/usr/local/etc/postfix/aliases
    home_mailbox = Maildir/
    debug_peer_level = 2
    debugger_command =
             PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin
             ddd $daemon_directory/$process_name $process_id & sleep 5
    sendmail_path = /usr/sbin/sendmail
    newaliases_path = /usr/bin/newaliases
    mailq_path = /usr/bin/mailq
    setgid_group = postdrop
    html_directory = no
    manpage_directory = /usr/local/man
    sample_directory = /usr/local/etc/postfix
    readme_directory = no
    smtp_host_lookup = dns
    


  12. スタートアップ・スクリプトを作成します。
    [mail] vi /etc/rc.d/init.d/postfix
    
    #!/bin/sh
    
    # Source function library.
    . /etc/rc.d/init.d/functions
    
    # Check networking
    if [ -r /etc/sysconfig/network ] ; then
            . /etc/sysconfig/network
            [ ${NETWORKING} = "no" ] && exit 0
    fi
    
    RETVAL=0
    
    start() {
            # Start daemons.
            echo -n "Starting postfix: "
            /usr/local/sbin/postfix -c /usr/local/etc/postfix start 2>/dev/null 1>&2 && success || failure
            RETVAL=$?
            [ $RETVAL -eq 0 ] && touch /var/lock/subsys/postfix
            echo
            return $RETVAL
    }
    
    stop() {
            # Stop daemons.
            echo -n "Shutting down postfix: "
            /usr/local/sbin/postfix stop 2>/dev/null 1>&2 && success || failure
            RETVAL=$?
            [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/postfix
            echo
            return $RETVAL
    }
    
    reload() {
            echo -n "Reloading postfix: "
            /usr/local/sbin/postfix reload 2>/dev/null 1>&2 && success || failure
            RETVAL=$?
            echo
            return $RETVAL
    }
    
    abort() {
            /usr/local/sbin/postfix abort 2>/dev/null 1>&2 && success || failure
            return $?
    }
    
    flush() {
            /usr/local/sbin/postfix flush 2>/dev/null 1>&2 && success || failure
            return $?
    }
    
    check() {
            /usr/local/sbin/postfix check 2>/dev/null 1>&2 && success || failure
            return $?
    }
    
    restart() {
            stop
            start
    }
    
    # See how we were called.
    case "$1" in
      start)
            start
            ;;
      stop)
            stop
            ;;
      restart)
            stop
            sleep 2
            start
            ;;
      reload)
            reload
            ;;
      abort)
            abort
            ;;
      flush)
            flush
            ;;
      check)
            check
            ;;
      status)
            status master
            ;;
      condrestart)
            [ -f /var/lock/subsys/postfix ] && restart || :
            ;;
      *)
            echo "Usage: postfix {start|stop|restart|reload|abort|flush|check|status|condrestart}"
            exit 1
    esac
    
    exit $?
    


  13. パーミッションを変更します。
    [mail]# chmod 755 postfix
    


  14. postfix を起動します。
    [mail]# /etc/rc.d/init.d/postfix start
    Starting postfix:                                          [  OK  ]
    


  15. テストメールを送信します。
    [mail]# echo "test 101" | mail -s "test mail 101" muser@mail.arinux.net
    


  16. メールが届いたかを確認します。
    [mail]# ls -l /home/muser/Maildir/new
    -rw------- 1 muser sales 433 Dec 17 17:16 1229501814.V802I1f403M77446.mail.arinux.net
    
    [root]# cat /home/muser/Maildir/new/1229*
    
    Return-Path: 
    X-Original-To: muser@mail.arinux.net
    Delivered-To: muser@mail.arinux.net
    Received: by mail.arinux.net (Postfix, from userid 0)
            id 09EF784D75; Wed, 17 Dec 2008 17:16:54 +0900 (JST)
    To: muser@mail.arinux.net
    Subject: test 101
    Message-Id: <20081217081654.09EF784D75@mail.arinux.net>
    Date: Wed, 17 Dec 2008 17:16:54 +0900 (JST)
    From: root@mail.arinux.net (root)
    
    test 101
    



つづく

| arinux | MySQL | 15:33 | comments(0) | trackbacks(0) | pookmark |
MySQL (3) - passwd 管理 (2)


nss-mysql を利用して、/etc/passwd, /etc/group, /etc/shadow の情報を DB から取得する方法を説明します。


メモ nss-mysql インストール


以下は、クライアントとなるサーバー(ここでは test15.arinux.net)上で実施します。


  1. http://download.savannah.gnu.org/releases/nss-mysql/ から、
    「nss-mysql-1.0.tar.gz」 をダウンロードして、「/usr/local/src」 に置きます。


  2. 解凍します。
    [test15]# cd /usr/local/src
    [test15]# tar zxvf nss-mysql-1.0.tar.gz
    


  3. コンパイルに必要なパッケージを追加インストールします。
    (依存するパッケージも追加されます)
    [test15]# yum install gcc
    [test15]# yum install gcc-c++
    [test15]# yum install yum zlib-devel
    


  4. コンフィグ、コンパイル、インストールします。
    [test15]# ./configure --with-mysql-lib=/usr/local/mysql/lib --with-mysql-include=/usr/local/mysql/include
    [test15]# make
    [test15]# make install
    


  5. /etc/nss-mysql.conf を編集します。このファイルは、group と passwd 情報の取得に使用されます。
    [test15]# vi /etc/nss-mysql.conf
    
    (以下の箇所を編集)
    users.host = inet:slave01.arinux.net:3306;          # 参照先のDBサーバー名
    users.database = usersdb;                           # 接続先のデータベース名
    users.db_user = cwuser;                             # 接続時のユーザー名
    users.db_password = 'n,V0dX6kjgcd;                  # 接続時のパスワード
    users.backup_host = inet:slave02.arinux.net:3306;   # 上記DBサーバーに接続できない時の参照先
    users.backup_database = usersdb;                    # 接続先のデータベース名
    users.backup_db_user = cwuser;                      # 接続時のユーザー名
    users.backup_db_password = n,V0dX6kjgcd;            # 接続時のパスワード
    users.table = user;                                 # 参照先のテーブル名
    users.where_clause = user.status = 'A' AND user.shost = test15.arinux.net';  # 接続元のホスト名
    


  6. /etc/nss-mysql-root.conf を編集します。このファイルは、shadow 情報の取得に使用されます。
    [test15]# vi /etc/nss-mysql-root.conf
    
    (以下の箇所を編集)
    shadow.host = inet:slave01.arinux.net:3306;         # 参照先のDBサーバー名
    shadow.database = usersdb;                          # 接続先のデータベース名
    shadow.db_user = cwuser;                            # 接続時のユーザー名
    shadow.db_password = n,V0dX6kjgcd;                  # 接続時のパスワード
    shadow.backup_host = inet:slave02.arinux.net:3306;  # 上記DBサーバーに接続できない時の参照先
    shadow.backup_database = usersdb;                   # 接続先のデータベース名
    shadow.backup_db_user = cwuser;                     # 接続時のユーザー名
    shadow.backup_db_password = n,V0dX6kjgcd;           # 接続時のパスワード
    shadow.table = user;                                # 参照先のテーブル名
    shadow.where_clause = user.status = 'A' AND user.shost = 'test15.arinux.net';  # 接続元のホスト名
    


  7. mysql モジュールをシンボリックリンクします。
    [test15]# cd /usr/local/mysql/lib
    [test15]# mkdir orgfiles
    [test15]# mv libmysqlclient.so orgfiles/.
    [test15]# mv libmysqlclient.so.15 orgfiles/.
    [test15]# mv libmysqlclient_r.so orgfiles/.
    [test15]# mv libmysqlclient_r.so.15 orgfiles/.
    [test15]# ln -s libmysqlclient.so.15.0.0 libmysqlclient.so
    [test15]# ln -s libmysqlclient.so.15.0.0 libmysqlclient.so.15
    [test15]# ln -s libmysqlclient_r.so.15.0.0 libmysqlclient_r.so
    [test15]# ln -s libmysqlclient_r.so.15.0.0 libmysqlclient_r.so.15
    [test15]# ls -l
    (一部省略)
    lrwxrwxrwx 1 root root        24 Dec  3 14:18 libmysqlclient.so -> libmysqlclient.so.15.0.0*
    lrwxrwxrwx 1 root root        24 Dec  3 14:06 libmysqlclient.so.15 -> libmysqlclient.so.15.0.0*
    -rwxr-xr-x 1 root mysql  5120308 Aug  4 22:51 libmysqlclient.so.15.0.0*
    lrwxrwxrwx 1 root root        26 Dec  3 14:18 libmysqlclient_r.so -> libmysqlclient_r.so.15.0.0*
    lrwxrwxrwx 1 root root        26 Dec  3 14:07 libmysqlclient_r.so.15 -> libmysqlclient_r.so.15.0.0*
    -rwxr-xr-x 1 root mysql  5143389 Aug  4 22:52 libmysqlclient_r.so.15.0.0*
    


  8. 共有ライブラリの検索パスを追加します。
    [test15]# vi /etc/ld.so.conf
    
    include ld.so.conf.d/*.conf
    /usr/local/lib
    /usr/local/mysql/lib    # この行を追加
    


  9. システムに反映させます。
    [test15]# ldconfig
    


  10. MySQL へ接続できるかどうかを確認します。
    [test15]# mysql -h slave01.arinux.net -u cwuser -p usersdb
    Enter password:
    (省略)
    mysql> ¥q
    


  11. /etc/nsswitch.conf を編集します。
    [test15]# vi /etc/nsswitch.conf
    
    (以下の箇所を編集)
    passwd:     files mysql
    shadow:     files mysql
    group:      files mysql
    
    虫眼鏡 編集内容の意味


    「files」 は、/etc/passwd、/etc/shadow、/etc/group のことを指し、これらに該当するユーザー名やパスワードがなかった場合に、「mysql」 を探しに行くことを意味しています。


  12. MySQL DB 上の group, passwd, shadow 情報が参照できるかを確認します。
    [test15]# getent group
    (省略)
    sales:x:512:
    system:x:511:
    
    [test15]# getent passwd
    (省略)
    ari:x:1001:511:Arinux:/home/ari:/bin/bash
    
    [test15]# getent shadow
    (省略)
    ari:$1$UMu5YsKa$XGzhP.p0hk71Y3nQE09iG.:14194:0:99999:7:::
    


  13. ssh ログインのテストをします。
    [test15]# ssh -l ari slave01.arinux.net
    ari@slave01.arinux.net's password:
    Last login: Wed Dec  3 14:46:52 2008 from slave01.arinux.net
    Could not chdir to home directory /home/ari: No such file or directory
    -bash-3.2$
    


  14. ログイン時に自動的にホームディレクトリを作成したい場合は、system-auth-ac を編集します。
    [test15]# vi /etc/pam.d/system-auth-ac
    
    #%PAM-1.0
    # This file is auto-generated.
    # User changes will be destroyed the next time authconfig is run.
    auth        required      pam_env.so
    auth        sufficient    pam_unix.so nullok try_first_pass
    auth        requisite     pam_succeed_if.so uid >= 500 quiet
    auth        required      pam_deny.so
    
    account     required      pam_unix.so
    account     sufficient    pam_succeed_if.so uid < 500 quiet
    account     required      pam_permit.so
    
    password    requisite     pam_cracklib.so try_first_pass retry=3
    password    sufficient    pam_unix.so md5 shadow nullok try_first_pass use_autht ok
    password    required      pam_deny.so
    
    session     optional      pam_keyinit.so revoke
    session     required      /lib/security/pam_mkhomedir.so skel=/etc/skel/ umask=0022  # この行を追加
    session     required      pam_limits.so
    session     [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
    session     required      pam_unix.so
    
    [test15]# ssh -l ari slave01.arinux.net
    ari@slave01.arinux.net's password:
    Creating directory '/home/ari'.
    Last login: Wed Dec  3 15:09:29 2008 from slave01.arinux.net
    [ari@slave02 ~]$
    



つづく

| arinux | MySQL | 17:33 | comments(0) | trackbacks(0) | pookmark |
MySQL (2) - passwd 管理


MySQL を利用して、/etc/passwd, /etc/group, /etc/shadow の管理を DB で行う設定を説明します
(以下の操作は、全てマスターで実施します)。



メモ サーバー構築環境


機種NEC Express5800, IBM x336(OS 変更)
OSVine 4.2CentOS 5.2
kernel2.6.16-76.39vl42.6.18-92.1.18.el5
glibcglibc-2.3.4-2vl3.3glibc-2.5-24
mysqlmysql-5.0.67-linux-i686-glibc23.tar.gzmysql-5.0.67-linux-i686.tar.gz
nss-mysql1.01.0



メモ MySQL インストール


MySQL (1) - レプリケーション を参考に、MySQL をインストールして、mysqld を起動します。



メモ DB 作成


  1. mysql に root でログインします。
    [master]# mysql -u root -p
    Enter password:
    


  2. 新規 DB を作成します。
    mysql> CREATE DATABASE usersdb;
    Query OK, 1 row affected (0.00 sec)
    


  3. DB が作成されたことを確認します。
    mysql> SHOW DATABASES;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | usersdb            |
    | mysql              |
    | repldb             |
    | test               |
    +--------------------+
    5 rows in set (0.00 sec)
    


  4. ローカルから DB へ接続するためのユーザーを作成します。このユーザーには、全ての権限を与えます。
    mysql> GRANT ALL PRIVILEGES ON usersdb.* TO  myadmin@localhost IDENTIFIED BY 'p-yw1naYO4he';
    Query OK, 0 rows affected (0.00 sec)
    


  5. クライアントから DB へ接続するためのユーザーを作成します。このユーザーには、SELECT 権限のみ与えます。
    mysql> GRANT SELECT ON usersdb.* TO  cwuser@'test15.arinux.net' IDENTIFIED BY 'n,V0dX6kjgcd';
    Query OK, 0 rows affected (0.00 sec)
    


  6. ユーザ情報を反映します。
    mysql> FLUSH PRIVILEGES;
    Query OK, 0 rows affected (0.00 sec)
    


  7. ユーザーが作成されたことを確認します。
    mysql> SELECT * FROM mysql.db ¥G
    (以下、省略)
    mysql> SELECT * FROM mysql.user ¥G
    (以下、省略)
    mysql> SHOW GRANTS for cwuser@'test15.arinux.net';
    +----------------------------------------------------------------------------------+
    | Grants for cwuser@test15.arinux.net                                              |
    +----------------------------------------------------------------------------------+
    | GRANT USAGE ON *.* TO 'cwuser'@'test15.arinux.net' IDENTIFIED BY PASSWORD
     '*69B3D5081425557A449413DD0FBD59FBE30CC1FF'                                       |
    | GRANT SELECT ON `usersdb`.* TO 'cwuser'@'test15.arinux.net'                     |
    +----------------------------------------------------------------------------------+
    2 rows in set (0.00 sec)
    


  8. ログアウトします。
    mysql> ¥q
    Bye
    
    [master]#
    



メモ groups テーブル作成


このテーブルは、/etc/group の情報を格納します。


  1. DB 接続ユーザーでログインします。
    [master]# mysql -u myadmin -p usersdb
    Enter password: p-yw1naYO4he
    mysql>
    


  2. groups テーブルを作成します。
    青い旗 以下をコピーして、mysql> プロンプトで貼り付ければ入力できます。
    CREATE TABLE groups (
      group_id int(11) NOT NULL auto_increment primary key,
      group_name varchar(30) DEFAULT '' NOT NULL,
      status        char(1) DEFAULT 'A',
      group_password varchar(64) DEFAULT 'x' NOT NULL,
      gid int(11) NOT NULL
    );
    
    ※ /usr/local/src/nss-mysql-1.0/sample.sql を参考にしています。
    mysql> CREATE TABLE groups (
        -> group_id int(11) NOT NULL auto_increment primary key,
        -> group_name varchar(30) DEFAULT '' NOT NULL,
        -> status        char(1) DEFAULT 'A',
        -> group_password varchar(64) DEFAULT 'x' NOT NULL,
        -> gid int(11) NOT NULL
        -> );
    Query OK, 0 rows affected (0.00 sec)
    


  3. groups テーブルが作成されたことを確認します。
    mysql> show tables;
    +--------------------+
    | Tables_in_usersdb  |
    +--------------------+
    | groups             |
    +--------------------+
    1 row in set (0.00 sec)
    
    mysql> show fields from groups;
    +----------------+-------------+------+-----+---------+----------------+
    | Field          | Type        | Null | Key | Default | Extra          |
    +----------------+-------------+------+-----+---------+----------------+
    | group_id       | int(11)     | NO   | PRI | NULL    | auto_increment |
    | group_name     | varchar(30) | NO   |     |         |                |
    | status         | char(1)     | YES  |     | A       |                |
    | group_password | varchar(64) | NO   |     | x       |                |
    | gid            | int(11)     | NO   |     | NULL    |                |
    +----------------+-------------+------+-----+---------+----------------+
    5 rows in set (0.00 sec)
    


  4. groups テーブルにデータを追加します。
    mysql> INSERT INTO groups VALUES (1,'system','A','x',511);
    Query OK, 1 row affected (0.00 sec)
    
    mysql> INSERT INTO groups VALUES (2,'sales','A','x',512);
    Query OK, 1 row affected (0.00 sec)
    


  5. 追加されたことを確認します。
    mysql> select * from groups;
    +----------+------------+--------+----------------+-----+
    | group_id | group_name | status | group_password | gid |
    +----------+------------+--------+----------------+-----+
    |        1 | system     | A      | x              | 511 |
    |        2 | sales      | A      | x              | 512 |
    +----------+------------+--------+----------------+-----+
    2 rows in set (0.00 sec)
    



メモ user テーブル作成


このテーブルは、/etc/passwd と /etc/shadow の情報を格納します。


  1. user テーブルを作成します。
    青い旗 以下をコピーして、mysql> プロンプトで貼り付ければ入力できます。
    CREATE TABLE user (
      user_id int(11) NOT NULL auto_increment primary key,
      user_name varchar(50) DEFAULT '' NOT NULL,
      realname varchar(32) DEFAULT '' NOT NULL,
      shell varchar(20) DEFAULT '/sbin/nologin' NOT NULL,
      password varchar(40) DEFAULT '' NOT NULL,
      status char(1) DEFAULT 'N' NOT NULL,
      uid int(11) NOT NULL,
      gid int(11) DEFAULT '511' NOT NULL,
      homedir varchar(32) DEFAULT '/home/nologin' NOT NULL,
      lastchange varchar(50) NOT NULL default '',
      min int(11) NOT NULL default '0',
      max int(11) NOT NULL default '0',
      warn int(11) NOT NULL default '7',
      inact int(11) NOT NULL default '-1',
      expire int(11) NOT NULL default '-1',
      shost varchar(50) default NULL
     );
    
    ※ /usr/local/src/nss-mysql-1.0/sample.sql を参考にしています。
    mysql> CREATE TABLE user (
        ->   user_id int(11) NOT NULL auto_increment primary key,
        ->   user_name varchar(50) DEFAULT '' NOT NULL,
        ->   realname varchar(32) DEFAULT '' NOT NULL,
        ->   shell varchar(20) DEFAULT '/sbin/nologin' NOT NULL,
        ->   password varchar(40) DEFAULT '' NOT NULL,
        ->   status char(1) DEFAULT 'N' NOT NULL,
        ->   uid int(11) NOT NULL,
        ->   gid int(11) DEFAULT '511' NOT NULL,
        ->   homedir varchar(32) DEFAULT '/home/nologin' NOT NULL,
        ->   lastchange varchar(50) NOT NULL default '',
        ->   min int(11) NOT NULL default '0',
        ->   max int(11) NOT NULL default '0',
        ->   warn int(11) NOT NULL default '7',
        ->   inact int(11) NOT NULL default '-1',
        ->   expire int(11) NOT NULL default '-1',
        ->   shost varchar(50) DEFAULT '' NOT NULL
        ->  );
    Query OK, 0 rows affected (0.02 sec)
    


  2. user テーブルが作成されたことを確認します。
    mysql> show tables;
    +--------------------+
    | Tables_in_usersdb  |
    +--------------------+
    | groups             |
    | user               |
    +--------------------+
    2 rows in set (0.00 sec)
    
    mysql> show fields from user;
    +------------+-------------+------+-----+---------------+----------------+
    | Field      | Type        | Null | Key | Default       | Extra          |
    +------------+-------------+------+-----+---------------+----------------+
    | user_id    | int(11)     | NO   | PRI | NULL          | auto_increment |
    | user_name  | varchar(50) | NO   |     |               |                |
    | realname   | varchar(32) | NO   |     |               |                |
    | shell      | varchar(20) | NO   |     | /sbin/nologin |                |
    | password   | varchar(40) | NO   |     |               |                |
    | status     | char(1)     | NO   |     | N             |                |
    | uid        | int(11)     | NO   |     | NULL          |                |
    | gid        | int(11)     | NO   |     | 511           |                |
    | homedir    | varchar(32) | NO   |     | /home/nologin |                |
    | lastchange | varchar(50) | NO   |     |               |                |
    | min        | int(11)     | NO   |     | 0             |                |
    | max        | int(11)     | NO   |     | 0             |                |
    | warn       | int(11)     | NO   |     | 7             |                |
    | inact      | int(11)     | NO   |     | -1            |                |
    | expire     | int(11)     | NO   |     | -1            |                |
    | shost      | varchar(50) | NO   |     |               |                |
    +------------+-------------+------+-----+---------------+----------------+
    16 rows in set (0.00 sec)
    
    青い旗] shost


    「shost」 は、接続元のホスト名を入れて、接続元の制限をするために使用します。


  3. 一度 MySQL を抜けて、ログインパスワードを生成します。ここでは openssl を使用して MD5 パスワードを作成します。
    mysql> ¥q
    Bye
    
    [master]# openssl passwd -1
    Password:
    Verifying - Password:
    $1$ZNI4FxIL$AfwYl6rpSg03tvmJnoGFW/
    


  4. MySQL にログインします。
    [master]# mysql -u myadmin -p usersdb
    Enter password: 
    


  5. user テーブルにデータを追加します。
    INSERT INTO user VALUES (1,'ari','Arinux','/bin/bash','$1$ZNI4FxIL$AfwYl6rpSg03tvmJnoGFW/',
    'A',1001,511,'/home/ari', '14194', '0', '0', '7', '-1', '-1', 'test15.arinux.net');
    Query OK, 1 row affected (0.00 sec)
    


  6. 追加されたことを確認します。
    mysql> select * from user¥G
    *************************** 1. row ***************************
       user_id: 1
     user_name: ari
      realname: Arinux
         shell: /bin/bash
      password: $1$ZNI4FxIL$AfwYl6rpSg03tvmJnoGFW/
        status: A
           uid: 1001
           gid: 511
       homedir: /home/ari
    lastchange: 14194
           min: 0
           max: 0
          warn: 7
         inact: -1
        expire: -1
         shost: test15.arinux.net
    1 row in set (0.00 sec)
    



メモ user_group テーブル作成


このテーブルは、補助グループの情報を格納します。


  1. user_group テーブルを作成します。
    青い旗 以下をコピーして、mysql> プロンプトで貼り付ければ入力できます。
    CREATE TABLE user_group (
      user_id int(11) DEFAULT '0' NOT NULL,
      group_id int(11) DEFAULT '0' NOT NULL
      );
    
    mysql> CREATE TABLE user_group (
        ->   user_id int(11) DEFAULT '0' NOT NULL,
        ->   group_id int(11) DEFAULT '0' NOT NULL
        ->   );
    Query OK, 0 rows affected (0.01 sec)
    
    ※ /usr/local/src/nss-mysql-1.0/sample.sql を参考にしています。


  2. user_group テーブルが作成されたことを確認します。
    mysql> show tables;
    +--------------------+
    | Tables_in_usersdb  |
    +--------------------+
    | groups             |
    | user               |
    | user_group         |
    +--------------------+
    3 rows in set (0.00 sec)
    
    mysql> show fields from user_group;
    +----------+---------+------+-----+---------+-------+
    | Field    | Type    | Null | Key | Default | Extra |
    +----------+---------+------+-----+---------+-------+
    | user_id  | int(11) | NO   |     | 0       |       |
    | group_id | int(11) | NO   |     | 0       |       |
    +----------+---------+------+-----+---------+-------+
    2 rows in set (0.00 sec)
    



つづく

| arinux | MySQL | 13:56 | comments(0) | trackbacks(0) | pookmark |
MySQL (1) - レプリケーション


MySQL のマスター/スレーブ型のレプリケーションの設定方法について記述します。ここでは、スレーブ側は read-only として設定します。


メモ サーバー構築環境


機種NEC Express5800, IBM x336(OS 変更)
OSVine 4.2CentOS 5.2
kernel2.6.16-76.39vl42.6.18-92.1.18.el5
glibcglibc-2.3.4-2vl3.3glibc-2.5-24
mysqlmysql-5.0.67-linux-i686-glibc23.tar.gzmysql-5.0.67-linux-i686.tar.gz


メモ MySQL インストール


※マスター及びスレーブの両方で以下を実施します。


  1. http://download.softagency.net/MySQL/Downloads/MySQL-5.0/ から、
    「mysql-5.0.67-linux-i686.tar.gz」 をダウンロードして、「/usr/local/src」 に置きます。


  2. /usr/local に解凍します。
    [root]# tar zxvf mysql-5.0.67-linux-i686.tar.gz -C /usr/local
    


  3. シンボリックリンクを張ります。
    [root]# cd /usr/local
    [root]# ln -s mysql-5.0.67-linux-i686 mysql
    [root]# ls -l
    (一部省略)
    lrwxrwxrwx  1 root root    31 Oct 20 17:01 mysql -> mysql-5.0.67-linux-i686/
    drwxr-xr-x 14  503  503  4096 Aug  5 00:20 mysql-5.0.67-linux-i686/
    


  4. mysql グループと mysql ユーザーを作成します。
    [root]# groupadd -g 401 mysql
    [root]# useradd -g mysql -u 401 mysql -d /nonexistent -s /sbin/nologin
    


  5. インストールスクリプトを実行します。
    [root]# cd /usr/local/mysql
    [root]# ./scripts/mysql_install_db --user=mysql
    Installing MySQL system tables...
    081121 17:12:53 [Warning] option 'thread_stack': unsigned value 126976 adjusted to 131072
    OK
    Filling help tables...
    081121 17:12:54 [Warning] option 'thread_stack': unsigned value 126976 adjusted to 131072
    OK
    (以下、省略)
    


  6. オーナーとグループを変更します。
    [root]# cd /usr/local
    [root]# chown -R root:mysql mysql-5.0.67-linux-i686
    [root]# cd /usr/local/mysql
    [root]# chown -R mysql data
    


  7. 「~/.bash_profile」 に PATH 変数の設定を追加します。
    [root]# vi /root/.bash_profile
    # .bash_profile
    
    # Get the aliases and functions
    if [ -f ~/.bashrc ]; then
            . ~/.bashrc
    fi
    
    # User specific environment and startup programs
    
    ENV=$HOME/.bashrc
    USERNAME="root"
    
    #export USERNAME ENV PATH                   #この行はコメントアウト
    export USERNAME ENV                         #この行を追加
    export PATH=$PATH:/usr/local/mysql-5.0.67-linux-i686/bin     #この行を追加
    
    mesg n
    


  8. 「~/.bash_profile」 を実行します。
    [root]# . ~/.bash_profile
    


  9. mysqld を起動します。
    [root]# cd /usr/local/mysql/bin
    [root]# ./mysqld_safe --user=mysql &
    [1] 3841
    Starting mysqld daemon with databases from /usr/local/mysql/data
    


  10. root ユーザーを作成してテストします。
    [root]# ./mysqladmin -u root password 'bxmbUW0|d8'
    [root]# ./mysqlshow -u root -p
    Enter password: bxmbUW0|d8
    +--------------------+
    |     Databases      |
    +--------------------+
    | information_schema |
    | mysql              |
    | test               |
    +--------------------+
    


  11. mysqld を停止します。
    [root]# ./mysqladmin shutdown -u root -p
    Enter password: bxmbUW0|d8
    STOPPING server from pid file /usr/local/mysql/data/dbmst.arinux.me.pid
    081021 18:00:33  mysqld ended
    
    [1] + Done                 ./mysqld_safe --user=mysql
    



メモ レプリケーション設定


  1. my.cnf の元になるファイルを選択してコピーします。
    ●マスター
    [master]# cp /usr/local/mysql/support-files/my-huge.cnf /etc/my.cnf
    


    虫眼鏡 各 .cnf ファイルの説明


    ファイル名説明
    my-small.cnfメモリーが64MB以下で、MySQLが時々使用されるだけの場合
    my-medium.cnfメモリーが32MB〜64MBでMySQL専用の場合、もしくは 128MBメモリーで webサーバーも同時に稼働する場合
    my-large.cnfメモリーが512MBで、主にMySQLが稼働する場合
    my-huge.cnfメモリーが1GB〜2GBで、主にMySQLが稼働する場合
    my-innodb-heavy-4G.cnfメモリーが4GBで、InnoDB のみのテーブルとわずかな接続で複雑なクエリーを実行する場合


  2. my.cnf を編集します。
    ●マスター
    [master]# vi /etc/my.cnf
    
    [mysqld]
    (省略)
    # Replication Master Server (default)
    # binary logging is required for replication
    log-error=/var/log/mysql.log    # 起動、停止、実行時のログを記録
    log-warnings=1                  # 警告メッセージを記録
    log-bin=mysql-bin               # この行はもともとあります
    
    server-id       = 1             # この行はもともとあります
    


  3. スタートアップ・スクリプトをコピーします。
    ●マスター
    [master]# cp /usr/local/mysql/support-files/mysql.server /etc/rc.d/init.d/mysql
    


  4. mysqld を起動します。
    ●マスター
    [master]# /etc/rc.d/init.d/mysql start
    Starting MySQL. SUCCESS!
    


  5. MySQL にログインします。
    ●マスター
    [master]# mysql -u root -p
    Enter password:
    
    mysql>
    


  6. server_id を確認します。
    ●マスター
    master> SHOW VARIABLES LIKE 'server¥_id';
    +---------------+-------+
    | Variable_name | Value |
    +---------------+-------+
    | server_id     | 1     |
    +---------------+-------+
    1 row in set (0.00 sec)
    


  7. スレーブからマスターへ接続するためのユーザーを作成します。このユーザーには 「REPLICATION SLAVE」 を与えます。例として、slave01.arinux.me から接続を許可する repls01 ユーザーを作成します。
    ●マスター
    master> GRANT REPLICATION SLAVE ON *.* TO repls01@'slave01.arinux.me' IDENTIFIED BY 'n8uP9(udIx';
    Query OK, 0 rows affected (0.00 sec)
    


  8. ユーザ情報を反映します。
    ●マスター
    master> FLUSH PRIVILEGES;
    Query OK, 0 rows affected (0.00 sec)
    


  9. マスターのデータベースをスレーブにコピーします。この時、DB が更新されないように書き込みをロックします。
    ●マスター
    master> FLUSH TABLES WITH READ LOCK;
    Query OK, 0 rows affected (0.00 sec)
    


  10. 現在のバイナリログの状態を確認します。
    ●マスター
    master> SHOW MASTER STATUS;
    +------------------+----------+--------------+------------------+
    | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
    +------------------+----------+--------------+------------------+
    | mysql-bin.000001 |      594 |              |                  |
    +------------------+----------+--------------+------------------+
    1 row in set (0.00 sec)
    
    ※ ここに表示された 「File」 と 「Position」 の値を、後ほど使用します。


  11. MySQL にログインしたままの状態で、別のターミナルで操作します。


  12. マスターから 「usr/local/mysql/data」 以下をスレーブにコピーします。
    ●マスター
    [master]# cd /usr/local/mysql/data
    [master]# tar zcvf ../master594.tar.gz .
    [master]# cd ..
    [master]# scp ./master594.tar.gz ari@'slave01.arinux.me':/home/ari
    ari@'slave01.arinux.me''s password:
    master594.tar.gz                              100%  178KB 178.5KB/s   00:00
    


  13. スレーブ側の /usr/local/mysql/data と入れ替えます。
    ●スレーブ
    [slave]# cd /usr/local/mysql
    [slave]# mv data data.save01
    [slave]# mkdir data
    [slave]# chown mysql:mysql data
    [slave]# chmod 750 data
    [slave]# cd data
    [slave]# tar zxvf /home/ari/master594.tar.gz
    


  14. マスターのログは必要ないので削除します。
    ●スレーブ
    [slave]# rm -i ./master.arinux.me.*
    [slave]# rm -i ./mysql-bin.*
    [slave]# rm -i ./ib_logfile*
    [slave]# rm -i ./ibdata*
    


  15. スレーブの my.cnf を編集します。
    ●スレーブ
    [slave]# cp /usr/local/mysql/support-files/my-huge.cnf /etc/my.cnf
    [slave]# vi /etc/my.cnf
    
    [mysqld]
    (省略)
    # Replication Master Server (default)
    # binary logging is required for replication
    log-error=/var/log/mysql.log    # 起動、停止、実行時のログを記録
    log-warnings=1                  # 警告メッセージを記録
    #log-bin=mysql-bin              # コメントアウトします
    
    server-id       = 2             # 2に変更します。
    read_only                       # スレーブは read only にします
    


  16. スタートアップ・スクリプトをコピーします。
    ●スレーブ
    [slave]# cp /usr/local/mysql/support-files/mysql.server /etc/rc.d/init.d/mysql
    


  17. mysqld を起動します。
    ●スレーブ
    [slave]# /etc/rc.d/init.d/mysql start
    Starting MySQL. SUCCESS!
    


  18. マスターのロックを外します。
    ●マスター
    master> UNLOCK TABLES;
    Query OK, 0 rows affected (0.00 sec)
    


  19. スレーブ側で、マスターの情報を指定します。
    ●スレーブ
    [slave]# mysql -u root -p
    Enter password: 
    
    slave> change master to
        -> master_host='master.arinux.me',
        -> master_user='repls01',
        -> master_password='eDniXxgo35r]',
        -> master_log_file='mysql-bin.000001',
        -> master_log_pos=594;
    Query OK, 0 rows affected (0.13 sec)
    


  20. スレーブを開始します。
    ●スレーブ
    slave> START SLAVE;
    Query OK, 0 rows affected (0.00 sec)
    


  21. スレーブのステータスを確認します。
    ●スレーブ
    slave> SHOW SLAVE STATUS¥G
    *************************** 1. row ***************************
                 Slave_IO_State: Waiting for master to send event
                    Master_Host: master.arinux.me
                    Master_User: repls01
                    Master_Port: 3306
                  Connect_Retry: 60
                Master_Log_File: mysql-bin.000001
            Read_Master_Log_Pos: 594
                 Relay_Log_File: slave01-relay-bin.000002
                  Relay_Log_Pos: 235
          Relay_Master_Log_File: mysql-bin.000001
               Slave_IO_Running: Yes
              Slave_SQL_Running: Yes
                Replicate_Do_DB:
            Replicate_Ignore_DB:
             Replicate_Do_Table:
         Replicate_Ignore_Table:
        Replicate_Wild_Do_Table:
    Replicate_Wild_Ignore_Table:
                     Last_Errno: 0
                     Last_Error:
                   Skip_Counter: 0
            Exec_Master_Log_Pos: 594
                Relay_Log_Space: 235
                Until_Condition: None
                 Until_Log_File:
                  Until_Log_Pos: 0
             Master_SSL_Allowed: No
             Master_SSL_CA_File:
             Master_SSL_CA_Path:
                Master_SSL_Cert:
              Master_SSL_Cipher:
                 Master_SSL_Key:
          Seconds_Behind_Master: 0
    1 row in set (0.00 sec)
    


  22. 実際にマスター側で DB を作成して、スレーブに更新されるかを確認します。
    ●マスター
    master> CREATE DATABASE repldb;
    Query OK, 1 row affected (0.01 sec)
    
    master> USE repldb;
    Database changed
    
    master> CREATE TABLE sample (
        -> id INT,
        -> data VARCHAR(100)
        -> );
    Query OK, 0 rows affected (0.01 sec)
    
    master> INSERT INTO sample VALUES(1,'arinux');
    Query OK, 1 row affected (0.00 sec)
    
    master> SELECT * FROM sample;
    +------+--------+
    | id   | data   |
    +------+--------+
    |    1 | arinux |
    +------+--------+
    1 row in set (0.00 sec)
    


  23. スレーブ側で確認します。
    ●スレーブ
    slave> SHOW DATABASES;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    | repldb             |
    | test               |
    +--------------------+
    4 rows in set (0.00 sec)
    
    slave> USE repldb;
    Database changed
    
    slave> SHOW TABLES;
    +------------------+
    | Tables_in_repldb |
    +------------------+
    | sample           |
    +------------------+
    1 row in set (0.00 sec)
    
    slave> SELECT * FROM sample;
    +------+--------+
    | id   | data   |
    +------+--------+
    |    1 | arinux |
    +------+--------+
    1 row in set (0.00 sec)
    



メモ スレーブ停止テスト


スレーブが停止している間の DB 更新が、再開後に反映されるかをテストします。


  1. スレーブの mysqld を停止します。
    ●スレーブ
    [slave]# /etc/rc.d/init.d/mysql stop
    Shutting down MySQL. SUCCESS!
    


  2. マスターでテーブルの内容を更新します。
    ●マスター
    master> INSERT INTO sample VALUES(2,'cweb');
    Query OK, 1 row affected (0.00 sec)
    
    mysql> UPDATE sample SET id='11' where data='arinux';
    Query OK, 1 row affected (0.00 sec)
    Rows matched: 1  Changed: 1  Warnings: 0
    
    mysql> SELECT * FROM sample;
    +------+--------+
    | id   | data   |
    +------+--------+
    |   11 | arinux |
    |    2 | cweb   |
    +------+--------+
    2 rows in set (0.00 sec)
    


  3. スレーブの mysqld を起動します。
    ●スレーブ
    [slave]# /etc/rc.d/init.d/mysql start
    Starting MySQL. SUCCESS!
    


  4. スレーブ側でテーブルが更新されているかを確認します。
    ●スレーブ
    [slave]# mysql -u root -p
    Enter password:
    
    slave> USE repldb;
    Database changed
    
    slave> SELECT * FROM sample;
    +------+--------+
    | id   | data   |
    +------+--------+
    |   11 | arinux |
    |    2 | cweb   |
    +------+--------+
    2 rows in set (0.00 sec)
    



ここまで

| arinux | MySQL | 16:51 | comments(0) | trackbacks(0) | pookmark |
1234567
891011121314
15161718192021
22232425262728
293031    
<< October 2017 >>
+ SELECTED ENTRIES
+ RECENT COMMENTS
+ RECENT TRACKBACK
+ CATEGORIES
+ ARCHIVES
+ 掲載予定のタイトル
  • Wordpress
  • Pukiwiki
  • SMTPs/POPs/IMAPs
  • fml
  • Tips
+ CSS Nite
+ MOBILE
qrcode
+ LINKS
+ RECOMMEND
+ PROFILE