web-dev-qa-db-ja.com

MySQL:Pacemakerは失敗したマスターを新しいスレーブとして起動できませんか?

  • ペースメーカー-1.0.12-1
  • corosync-1.2.7-1.1

MySQLレプリケーション(1マスターと1スレーブ)のフェイルオーバーをセットアップします。このガイドに従ってください: https://github.com/jayjanssen/Percona-Pacemaker-Resource-Agents/blob/master/doc/PRM -setup-guide.rst

_crm configure show_の出力は次のとおりです。

_node serving-6192 \
    attributes p_mysql_mysql_master_IP="192.168.6.192"
node svr184R-638.localdomain \
    attributes p_mysql_mysql_master_IP="192.168.6.38"
primitive p_mysql ocf:percona:mysql \
    params config="/etc/my.cnf" pid="/var/run/mysqld/mysqld.pid"
socket="/var/lib/mysql/mysql.sock" replication_user="repl"
replication_passwd="x" test_user="test_user" test_passwd="x" \
    op monitor interval="5s" role="Master" OCF_CHECK_LEVEL="1" \
    op monitor interval="2s" role="Slave" timeout="30s"
OCF_CHECK_LEVEL="1" \
    op start interval="0" timeout="120s" \
    op stop interval="0" timeout="120s"
primitive writer_vip ocf:heartbeat:IPaddr2 \
    params ip="192.168.6.8" cidr_netmask="32" \
    op monitor interval="10s" \
    meta is-managed="true"
ms ms_MySQL p_mysql \
    meta master-max="1" master-node-max="1" clone-max="2"
clone-node-max="1" notify="true" globally-unique="false"
target-role="Master" is-managed="true"
colocation writer_vip_on_master inf: writer_vip ms_MySQL:Master
order ms_MySQL_promote_before_vip inf: ms_MySQL:promote writer_vip:start
property $id="cib-bootstrap-options" \
    dc-version="1.0.12-unknown" \
    cluster-infrastructure="openais" \
    expected-quorum-votes="2" \
    no-quorum-policy="ignore" \
    stonith-enabled="false" \
    last-lrm-refresh="1341801689"
property $id="mysql_replication" \
    p_mysql_REPL_INFO="192.168.6.192|mysql-bin.000006|338"
_

_crm_mon_

_Last updated: Mon Jul  9 10:30:01 2012
Stack: openais
Current DC: serving-6192 - partition with quorum
Version: 1.0.12-unknown
2 Nodes configured, 2 expected votes
2 Resources configured.
============

Online: [ serving-6192 svr184R-638.localdomain ]

 Master/Slave Set: ms_MySQL
     Masters: [ serving-6192 ]
     Slaves: [ svr184R-638.localdomain ]
writer_vip    (ocf::heartbeat:IPaddr2):    Started serving-6192
_

フェイルオーバーをテストするために誤った構文のserve-6192で_/etc/my.cnf_を編集すると、正常に機能します。

  • マスターに昇格されるsvr184R-638.localdomain
  • writer_vipはsvr184R-638.localdomainに切り替えます

現在の状態:

_Last updated: Mon Jul  9 10:35:57 2012
Stack: openais
Current DC: serving-6192 - partition with quorum
Version: 1.0.12-unknown
2 Nodes configured, 2 expected votes
2 Resources configured.
============

Online: [ serving-6192 svr184R-638.localdomain ]

 Master/Slave Set: ms_MySQL
     Masters: [ svr184R-638.localdomain ]
     Stopped: [ p_mysql:0 ]
writer_vip    (ocf::heartbeat:IPaddr2):    Started svr184R-638.localdomain

Failed actions:
    p_mysql:0_monitor_5000 (node=serving-6192, call=15, rc=7,
status=complete): not running
    p_mysql:0_demote_0 (node=serving-6192, call=22, rc=7,
status=complete): not running
    p_mysql:0_start_0 (node=serving-6192, call=26, rc=-2, status=Timed
Out): unknown exec error
_

サービング-6192の_/etc/my.cnf_から間違った構文を削除し、corosyncを再起動します。サービング-6192が新しいスレーブとして開始されているのを見たいのですが、そうではありません:

_Failed actions:
    p_mysql:0_start_0 (node=serving-6192, call=4, rc=1,
status=complete): unknown error
_

ここに私が疑っているログの断片があります:

_Jul 09 10:46:32 serving-6192 lrmd: [7321]: info: rsc:p_mysql:0:4: start
Jul 09 10:46:32 serving-6192 lrmd: [7321]: info: RA output:
(p_mysql:0:start:stderr) Error performing operation: The
object/attribute does not exist

Jul 09 10:46:32 serving-6192 crm_attribute: [7420]: info: Invoked:
/usr/sbin/crm_attribute -N serving-6192 -l reboot --name readable -v 0
_

_/var/log/cluster/corosync.log_http://fpaste.org/AyOZ/

奇妙なことに、手動で起動できます。

_export OCF_ROOT=/usr/lib/ocf
export OCF_RESKEY_config="/etc/my.cnf"
export OCF_RESKEY_pid="/var/run/mysqld/mysqld.pid"
export OCF_RESKEY_socket="/var/lib/mysql/mysql.sock"
export OCF_RESKEY_replication_user="repl"
export OCF_RESKEY_replication_passwd="x"
export OCF_RESKEY_test_user="test_user"
export OCF_RESKEY_test_passwd="x"
_

_sh -x /usr/lib/ocf/resource.d/percona/mysql start_: http://fpaste.org/RVGh/

私は何か間違ったことをしましたか?


@ Patrick Fri Jul 13に返信10:22:10 ICT 2012:

ログにリソーススクリプト(ocf_logコマンド)からのメッセージが含まれていないために失敗する理由がわかりません

すべてを_/var/log/cluster/corosync.log_から取得します。心に理由がありますか?

_/etc/corosync/corosync.conf_

_compatibility: whitetank

totem {
    version: 2
    secauth: off
    threads: 0
    interface {
        member {
            memberaddr: 192.168.6.192
        }
        member {
            memberaddr: 192.168.6.38
        }
        ringnumber: 0
        bindnetaddr: 192.168.6.0
        mcastaddr: 226.94.1.1
        mcastport: 5405
    }
}

logging {
    fileline: off
    to_stderr: yes
    to_logfile: yes
    to_syslog: yes
    logfile: /var/log/cluster/corosync.log
    debug: on
    timestamp: on
    logger_subsys {
        subsys: AMF
        debug: off
    }
}

amf {
    mode: disabled
}
_

また、スクリプトを手動で実行したときにスクリプトが機能するのは、スクリプトにマスター/スレーブリソースを通知する変数を設定していないためです。したがって、スクリプトは実行時に、それが単一のスタンドアロンインスタンスであると見なします。

ありがとう。次の変数を_~/.bash_profile_に追加しました。

_export OCF_RESKEY_CRM_meta_clone_max="2"
export OCF_RESKEY_CRM_meta_role="Slave"
_

_. ~/.bash_profile_を有効にし、mysqlリソースを手動で開始します。

_sh -x /usr/lib/ocf/resource.d/percona/mysql start_: http://fpaste.org/EMwa/

そしてそれはうまくいきます:

_mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.6.38
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000072
          Read_Master_Log_Pos: 1428602
               Relay_Log_File: mysqld-relay-bin.000006
                Relay_Log_Pos: 39370
        Relay_Master_Log_File: mysql-bin.000072
             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: 1428602
              Relay_Log_Space: 39527
              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
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 123
1 row in set (0.00 sec)
_

MySQLを停止し、デバッグをオンにして、corosyncを再起動します。ログは次のとおりです: http://fpaste.org/mZzS/

ご覧のとおり、「不明なエラー」のみです。

_ 1.
    Jul 13 10:48:06 serving-6192 crmd: [3341]: debug:
    get_xpath_object: No match for
    //cib_update_result//diff-added//crm_config in
    /notify/cib_update_result/diff
 2.
    Jul 13 10:48:06 serving-6192 lrmd: [3338]: WARN: Managed
    p_mysql:1:start process 3416 exited with return code 1.
 3.
    Jul 13 10:48:06 serving-6192 crmd: [3341]: info:
    process_lrm_event: LRM operation p_mysql:1_start_0 (call=4,
    rc=1, cib-update=10, confirmed=true) unknown error
_

何かご意見は?


UPDATE 7月14日(土)17:16:03 ICT 2012:

@パトリック:あなたのヒントをありがとう!

Pacemakerが次のように使用する環境変数: http://fpaste.org/92yN/

私があなたとチャットしているときに疑ったように、ノード_serving-6192_は_OCF_RESKEY_CRM_meta_master_max=1_で開始されたため、次のコードが原因です。

_/usr/lib/ocf/resource.d/percona/mysql:_

_if ocf_is_ms; then
    mysql_extra_params="--skip-slave-start"
fi
_

_/usr/lib/ocf//lib/heartbeat/ocf-shellfuncs:_

_ocf_is_ms() {
    [ ! -z "${OCF_RESKEY_CRM_meta_master_max}" ] && [ "${OCF_RESKEY_CRM_meta_master_max}" -gt 0 ]
}
_

追加のパラメーター_--skip-slave-start_が含まれます。

_ps -ef | grep mysql_

_root 18215 1 0 17:12 pts/4 00:00:00 /bin/sh /usr/bin/mysqld_safe --defaults-file=/etc/my.cnf --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/lib/mysql/mysql.sock --datadir=/var/lib/mysql --user=mysql --skip-slave-start_

_mysql 19025 18215 1 17:12 pts/4 00:00:14 /usr/libexec/mysqld --defaults-file=/etc/my.cnf --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --user=mysql --skip-slave-start --log-error=/var/log/mysqld.log --open-files-limit=8192 --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/lib/mysql/mysql.sock --port=3306_

sQLスレッドはまだ実行中です:

_         Slave_IO_Running: Yes
        Slave_SQL_Running: Yes
_

レプリケーションは正常に機能しています。

IFS=$'\n' ENV=( $(cat /tmp/16374.env) ); env -i - "${ENV[@]}" sh -x /usr/lib/ocf/resource.d/percona/mysql starthttp://fpaste.org/x7xE/

私は壁に頭をぶつけています(:-> |

7
quanta

ユーレカ!

私たち二人ともvery非常に重要なログファイルを忘れました、それは... _/var/log/mysqld.log_:

_socket: '/var/lib/mysql/mysql.sock'  port: 3306  MySQL Community Server (GPL) by Atomicorp
[Note] Slave SQL thread initialized, starting replication in log 'mysql-bin.000082' at position 58569, relay log './mysqld-relay-bin.000002' position: 58715
[Note] Slave I/O thread: connected to master '[email protected]:3306',replication started in log 'mysql-bin.000082' at position 58569
[Warning] Aborted connection 10 to db: 'unconnected' user: 'test_user' Host: 'localhost' (init_connect command failed)
[Warning] The MySQL server is running with the --read-only option so it cannot execute this statement
[Note] /usr/libexec/mysqld: Normal shutdown
_

ご想像のとおり、binlogと _init-connect_ を組み合わせてユーザーアクティビティを追跡しました。

init_connect = "INSERT INTO audit.accesslog (connect_time, user_Host, connection_id) VALUES (NOW(), CURRENT_USER(), CONNECTION_ID());"

しかし、_serving-6192_は、スレーブとして開始するとき、およびPacemakerが_test_user_で監視操作を実行するときに読み取り専用に設定されます。

_    # Check for test table
    ocf_run -q $MYSQL $MYSQL_OPTIONS_TEST \
        -e "SELECT COUNT(*) FROM $OCF_RESKEY_test_table"
_

_init_connect_コマンドが上記のエラーで失敗しました:

MySQLサーバーは_--read-only_オプションで実行されているため、このステートメントを実行できません

解決策は、監視アクションを初期化する前に、_init_connect_オプションを空の文字列に設定する必要があることです(ノードをマスターに昇格させるときは、忘れずに元に戻してください)。

event scheduler を使用しているユーザーには、スレーブをマスターに昇格するときにオンにする必要があることにも注意してください。

_set_event_scheduler() {
    local es_val
    if ocf_is_true $1; then
        es_val="on"
    else
        es_val="off"
    fi
    ocf_run $MYSQL $MYSQL_OPTIONS_REPL \
        -e "SET GLOBAL event_scheduler=${es_val}"
}

get_event_scheduler() {
    # Check if event-scheduler is set
    local event_scheduler_state

    event_scheduler_state=`$MYSQL $MYSQL_OPTIONS_REPL \
        -e "SHOW VARIABLES" | grep event_scheduler | awk '{print $2}'`

    if [ "$event_scheduler_state" = "ON" ]; then
        return 0
    else
        return 1
    fi
}

mysql_promote() {
    local master_info

    if ( ! mysql_status err ); then
        return $OCF_NOT_RUNNING
    fi
    ocf_run $MYSQL $MYSQL_OPTIONS_REPL \
        -e "STOP SLAVE"

    # Set Master Info in CIB, cluster level attribute
    update_data_master_status
    master_info="$(get_local_ip)|$(get_master_status File)|$(get_master_status Position)"
    ${CRM_ATTR_REPL_INFO} -v "$master_info"
    rm -f $tmpfile

    set_read_only off || return $OCF_ERR_GENERIC
    set_event_scheduler on || return $OCF_ERR_GENERIC
_

また、降格するときはオフにすることを忘れないでください:

_    'pre-demote')
        # Is the notification for our set
        notify_resource=`echo $OCF_RESKEY_CRM_meta_notify_demote_resource|cut -d: -f1`
        my_resource=`echo $OCF_RESOURCE_INSTANCE|cut -d: -f1`
        if [ $notify_resource != ${my_resource} ]; then
            ocf_log debug "Notification is not for us"
            return $OCF_SUCCESS
        fi

        demote_Host=`echo $OCF_RESKEY_CRM_meta_notify_demote_uname|tr -d " "`
        if [ $demote_Host = ${HOSTNAME} ]; then
            ocf_log info "post-demote notification for $demote_Host"
            set_read_only on
            set_event_scheduler off
_

乾杯、

2
quanta