ラベル MySQL の投稿を表示しています。 すべての投稿を表示
ラベル MySQL の投稿を表示しています。 すべての投稿を表示

2026年3月2日月曜日

すべての PXC ノードに XtraBackup をインストールする必要があるか?

Perconaフォーラムで定期的に浮上する質問:Percona XtraDB Cluster (PXC)のすべてのノードにXtraBackupをインストールする必要がありますか? これは混合環境を管理している場合や特定のノードのソフトウェアフットプリントを最小限に抑えようとする場合に特に妥当な質問です。実際の仕組みとテストが確認する内容を以下に示します。

簡潔な回答(ただし読み進めてください)

そのノードに何をさせたいかによります。 ここでのニュアンスがかなり重要なので、PXCにおけるState Snapshot Transfer (SST)の仕組みと、特定のノードにXtraBackupが存在する — または存在しない — ことがなぜ重要かを詳しく説明する価値があります。

PXCにおけるSSTの簡単なおさらい

新しいノードがPercona XtraDB Clusterに参加する場合、または既存のノードが十分に長時間ダウンしてIncremental State Transfer (IST)がもはや不可能になった場合、クラスタはState Snapshot Transfer (SST)を実行します。これは基本的に、ドナーノードからジョイナーノードへの完全なデータコピーです。

PXCはmy.cnfで設定される複数のSST方法をサポートしています:

[mysqld]
wsrep_sst_method = xtrabackup-v2

利用可能なSST方法には以下が含まれます:

  • xtrabackup-v2 — PXC向けの推奨方法で、Percona XtraBackupを使用;ドナーを長時間ロックせずにSSTを実行します
  • clone — PXC 8.0.22+で利用可能で、MySQLの組み込みClone Pluginを使用;SSTのためのXtraBackup依存を除去します
  • mysqldump — 転送中にドナーをロックし遅い;本番環境では推奨されません
  • rsync — 転送中にドナーを読み取り専用に要求し、書き込みをブロック;ライブクラスタでも推奨されません

xtrabackup-v2方法は歴史的にデフォルトのアプローチであり、転送中にドナーノードを書き込み可能に保つため、既存のデプロイメントで広く使用されています。他のレガシーメソッドはドナーの書き込みをブロックする可能性があり、本番クラスタでは一般的に受け入れられません。PerconaはPXC 8.0.22以降の新規インストールに対して、SST層での外部ツール依存を除去するため、clone方法をますます推奨しています。

XtraBackupはどこにインストールする必要がありますか?

xtrabackup-v2を使用したSSTがトリガーされると、ドナーとジョイナーの両方にXtraBackupがインストールされ、アクセス可能である必要があります。両方が関与する理由は以下の通りです:

``````html
  • donor(提供元)は XtraBackup を実行してスナップショットデータをアウトバウンドでストリーミングします
  • joiner(参加元)は XtraBackup — 具体的には xbstream および xbcrypt ユーティリティ — を実行して、そのストリーミングされたデータを受信し適用します

joiner ノードに XtraBackup がインストールされていない場合、xtrabackup-v2 を使用してクラスタに追加しようとすると、SST が失敗します。joiner のエラーログには通常、次のような内容が表示されます:

[ERROR] WSREP: Failed to read 'ready <addr>' from: wsrep_sst_xtrabackup-v2
...
wsrep_sst_xtrabackup-v2: line 522: xbstream: command not found
[ERROR] WSREP: SST failed: 2 (No such file or directory)

これは明確で曖昧さのない失敗モードです。xbstream が joiner に存在しない場合、SST は完了しません。

参加元になることのないノードはどうでしょうか?

技術的には、ノードが常に donor(提供元)として動作し、ゼロからクラスタに再参加する必要がない場合、donor としての機能のみで XtraBackup が必要だと主張できます。しかし実際には、クラッシュ後、計画メンテナンス後、またはネットワークパーティションからの回復後、どのノードでも joiner になる可能性があります。ノードが SST を受信する必要が決してないことを確実に保証する方法はありません。

ここでの実際的な指針はシンプルです:PXC ノードすべてに例外なく XtraBackup をインストールしてください。 インストールのオーバーヘッドは無視できるほど小さく、計画外障害時の SST 失敗のコストはそうではありません。

Clone プラグインの代替手段(PXC 8.0.22+)

PXC 8.0.22 以降、Percona は MySQL Clone Plugin を SST 方式としてサポートするようになりました。これは SST 目的での XtraBackup 依存関係を完全に排除するため、知っておく価値があります:

[mysqld]
wsrep_sst_method = clone

clone 方式を使用する場合、すべてのノードで Clone Plugin をロードする必要があります:

INSTALL PLUGIN clone SONAME 'mysql_clone.so';
SHOW PLUGINS WHERE Name = 'clone';
+-------+--------+-------+----------------+---------+
| Name  | Status | Type  | Library        | License |
+-------+--------+-------+----------------+---------+
| clone | ACTIVE | CLONE | mysql_clone.so | GPL     |
+-------+--------+-------+----------------+---------+

clone 方式は XtraBackup を SST 依存関係とせずに標準化するための堅実な選択肢です。ただし、選択する SST 方式に関わらず、XtraBackup は外部バックアップ戦略において依然として実用的な価値があります。SST はクラスタ同期メカニズムであり、バックアップではなく、決してバックアップとして扱ってはなりません。

現在の SST 設定の確認

現在の SST 方式と Galera 関連の設定を確認するには:

SHOW VARIABLES LIKE 'wsrep_sst_method';
+------------------+---------------+
| Variable_name    | Value         |
+------------------+---------------+
| wsrep_sst_method | xtrabackup-v2 |
+------------------+---------------+

クラスタ状態を確認し、どのノードが donor(提供元)として動作しているかを確認するには:

SHOW STATUS LIKE 'wsrep_local_state_comment';
+---------------------------+--------+
| Variable_name             | Value  |
+---------------------------+--------+
| wsrep_local_state_comment | Synced |
+---------------------------+--------+
SHOW STATUS LIKE 'wsrep_connected';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| wsrep_connected | ON    |
+-----------------+-------+
SHOW STATUS LIKE 'wsrep_cluster_size';
+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| wsrep_cluster_size | 3     |
+--------------------+-------+

実際の観察事項

PXC 環境を直接扱った経験から注目すべきいくつかの点:

``````html
  • XtraBackup のバージョンは PXC バージョンと一致する必要があります。XtraBackup 2.x を PXC 8.0 で使用すると SST が失敗します。PXC 8.0 には Percona XtraBackup 8.0 を使用し、アップグレード後はバージョン一致を確認してください。
  • <clone SST メソッドに切り替えても、スケジュールされたバックアップのために XtraBackup をインストールしたままにしてください。バックアップ戦略と SST メソッドは別々の懸念事項であり、それぞれ独立して扱うべきです。
  • <wsrep_sst_donor 変数は、好みのドナーノードを指定でき、最も忙しいかレイテンシに敏感なメンバーに SST を向けないようにするのに便利です。
  • PXC とともに Percona Toolkit を実行している場合、特定の PXC バージョンでの DDL レプリケーションの動作に注意してください — Total Order Isolation (TOI) と Rolling Schema Upgrade (RSU) の動作が異なり、本番環境でスキーマ変更を実行する前に専用に確認する価値があります。

まとめ

質問に直接答えると:<xtrabackup-v2 を SST メソッドとして使用している場合 — これは多くの既存の PXC デプロイメントでデフォルトのままです — はい、すべてのクラスターメンバーに XtraBackup をインストールする必要があります。状況によっては任意のノードがドナーまたはジョイナーとなり、このメソッドを使用する際は両方の役割で XtraBackup が必要です。

PXC 8.0.22 以降を使用しており、SST レイヤーでの依存関係を排除したい場合、Clone Plugin メソッドは実行可能な代替手段であり、新規デプロイメントに対する Percona の推奨選択肢となっています。新規インストールの場合、PXC 8.4 LTS が現在の長期サポートリリースであり、新規インストールの推奨ターゲットです。SST に clone を使用していても、実際のバックアップジョブには XtraBackup が最適なツールです。

選択したノードで XtraBackup をスキップして数メガバイトのディスク容量を節約しようとしないでください。その決定が最終的に引き起こす SST 失敗は、犠牲にする価値のないトレードオフです。

リソース

2026年2月22日日曜日

AI ワークロードのための MySQL + Neo4j:なぜリレーショナルデータベースが今なお重要か

This article was originally published in English at AnotherMySQLDBA.

AIエージェント用の永続メモリを構築する方法を、既にお使いのデータベースを使って文書化する時期が来たと考えました。ベクトルデータベースではありません - MySQLとNeo4jです。

これは理論ではありません。私はこのアーキテクチャを日常的に使用し、複数のプロジェクトでAIエージェントのメモリを管理しています。実際に機能するスキーマとクエリパターンを紹介します。

アーキテクチャ

AIエージェントには2種類のメモリが必要です:

  • 構造化メモリ - 何が起こったか、いつ、なぜ(MySQL)
  • パターンメモリ - 何が何に繋がっているか(Neo4j)

ベクトルデータベースは類似性検索用です。ワークフローの状態や決定履歴を追跡するには適していません。それにはACIDトランザクションと適切なリレーションシップが必要です。

MySQLスキーマ

AIエージェントの永続メモリのための実際のスキーマはこちらです:

-- Architecture decisions the AI made
CREATE TABLE architecture_decisions (
    id INT AUTO_INCREMENT PRIMARY KEY,
    project_id INT NOT NULL,
    title VARCHAR(255) NOT NULL,
    decision TEXT NOT NULL,
    rationale TEXT,
    alternatives_considered TEXT,
    status ENUM('accepted', 'rejected', 'pending') DEFAULT 'accepted',
    decided_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    tags JSON,
    INDEX idx_project_date (project_id, decided_at),
    INDEX idx_status (status)
) ENGINE=InnoDB;

-- Code patterns the AI learned
CREATE TABLE code_patterns (
    id INT AUTO_INCREMENT PRIMARY KEY,
    project_id INT NOT NULL,
    category VARCHAR(50) NOT NULL,
    name VARCHAR(255) NOT NULL,
    description TEXT,
    code_example TEXT,
    language VARCHAR(50),
    confidence_score FLOAT DEFAULT 0.5,
    usage_count INT DEFAULT 0,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    updated_at DATETIME ON UPDATE CURRENT_TIMESTAMP,
    INDEX idx_project_category (project_id, category),
    INDEX idx_confidence (confidence_score)
) ENGINE=InnoDB;

-- Work session tracking
CREATE TABLE work_sessions (
    id INT AUTO_INCREMENT PRIMARY KEY,
    session_id VARCHAR(255) UNIQUE NOT NULL,
    project_id INT NOT NULL,
    started_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    ended_at DATETIME,
    summary TEXT,
    context JSON,
    INDEX idx_project_session (project_id, started_at)
) ENGINE=InnoDB;

-- Pitfalls to avoid (learned from mistakes)
CREATE TABLE pitfalls (
    id INT AUTO_INCREMENT PRIMARY KEY,
    project_id INT NOT NULL,
    category VARCHAR(50),
    title VARCHAR(255) NOT NULL,
    description TEXT,
    how_to_avoid TEXT,
    severity ENUM('critical', 'high', 'medium', 'low'),
    encountered_count INT DEFAULT 1,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    INDEX idx_project_severity (project_id, severity)
) ENGINE=InnoDB;

外部キー。チェック制約。適切なインデックス。これはリレーショナルデータベースが得意とするところです。

クエリパターン

AIエージェントのメモリを実際にクエリする方法はこちらです:

-- Get recent decisions for context
SELECT title, decision, rationale, decided_at
FROM architecture_decisions
WHERE project_id = ?
  AND decided_at > DATE_SUB(NOW(), INTERVAL 30 DAY)
ORDER BY decided_at DESC
LIMIT 10;

-- Find high-confidence patterns
SELECT category, name, description, code_example
FROM code_patterns
WHERE project_id = ?
  AND confidence_score >= 0.80
ORDER BY usage_count DESC, confidence_score DESC
LIMIT 20;

-- Check for known pitfalls before implementing
SELECT title, description, how_to_avoid
FROM pitfalls
WHERE project_id = ?
  AND category = ?
  AND severity IN ('critical', 'high')
ORDER BY encountered_count DESC;

-- Track session context across interactions
SELECT context
FROM work_sessions
WHERE session_id = ?
ORDER BY started_at DESC
LIMIT 1;

これらはストレートフォワードなSQLクエリです。EXPLAINで期待通りのインデックス使用が確認できます。サプライズはありません。

Neo4jレイヤー

MySQLが構造化データを扱い、Neo4jがリレーションシップを扱います:

// Create nodes for decisions
CREATE (d:Decision {
  id: 'dec_123',
  title: 'Use FastAPI',
  project_id: 1,
  embedding: [0.23, -0.45, ...]  // Vector for similarity
})

// Create relationships
CREATE (d1:Decision {id: 'dec_123', title: 'Use FastAPI'})
CREATE (d2:Decision {id: 'dec_45', title: 'Used Flask before'})
CREATE (d1)-[:SIMILAR_TO {score: 0.85}]->(d2)
CREATE (d1)-[:CONTRADICTS]->(d3:Decision {title: 'Avoid frameworks'})

// Query: Find similar past decisions
MATCH (current:Decision {id: $decision_id})
MATCH (current)-[r:SIMILAR_TO]-(similar:Decision)
WHERE r.score > 0.80
RETURN similar.title, r.score
ORDER BY r.score DESC

// Query: What outcomes followed this pattern?
MATCH (d:Decision)-[:LEADS_TO]->(o:Outcome)
WHERE d.title CONTAINS 'Redis'
RETURN d.title, o.type, o.success_rate

それらが連携して動作する仕組み

フローは以下のようになります:

  1. AIエージェントがコンテンツを生成するか決定を下す
  2. MySQLに構造化データを保存(何、いつ、なぜ、完全なコンテキスト)
  3. エンベディングを生成し、類似アイテムとのリレーションシップ付きでNeo4jに保存
  4. 次のセッション:Neo4jが関連する類似決定を見つけ出す
  5. MySQLがその決定の詳細情報を提供

MySQLが真実の源です。Neo4jがパターン発見者です。

なぜベクトルデータベースだけではダメなのか?

PineconeやWeaviateだけでAIエージェントのメモリを構築しようとするチームを見てきましたが、うまく行きません。理由は:

ベクトルDBが得意なこと:

  • クエリに似たドキュメントを見つける
  • セマンティック検索(RAG)
  • "これに似たもの"

ベクトルDBが苦手なこと:

  • "3月15日に何を決定したか?"
  • "障害を引き起こした決定を表示"
  • "このワークフローの現在の状態は?"
  • "confidence > 0.8 AND usage_count > 10のパターンはどれ?"

これらのクエリには構造化フィルタリング、結合、トランザクションが必要です。それはリレーショナルデータベースの領域です。

MCPと未来

Model Context Protocol (MCP)は、AIシステムがコンテキストを扱う方法を標準化しています。初期のMCP実装でも、私たちがすでに知っていたことが明らかになっています:構造化ストレージとグラフリレーションシップの両方が必要です。

``````html

MySQL は MCP の「resources」と「tools」カタログを扱います。Neo4j はコンテキスト項目間の「relationships」を扱います。ベクター埋め込みはパズルの一部に過ぎません。

Production Notes

このアーキテクチャを実行している現在のシステム:

  • MySQL 8.0, 48 tables, ~2GB data
  • Neo4j Community, ~50k nodes, ~200k relationships
  • Query latency: MySQL <10ms, Neo4j <50ms
  • Backup: Standard mysqldump + neo4j-admin dump
  • Monitoring: Same Percona tools I've used for years

運用上の複雑さは低いです。これらは成熟したデータベースで、よく理解された運用パターンを持っています。

When to Use What

Use CaseDatabase
Workflow state, decisions, audit trailMySQL/PostgreSQL
Pattern detection, similarity, relationshipsNeo4j
Semantic document search (RAG)Vector DB (optional)

状態には MySQL から始めましょう。パターン認識が必要になったら Neo4j を追加します。セマンティックドキュメント検索を実際にしている場合にのみ、ベクターデータベースを追加してください。

Summary

AI エージェントには永続的なメモリが必要です。単なるベクターデータベースの埋め込みではなく、構造化された、リレーショナルで、時間的なメモリにパターン認識を備えたものです。

MySQL は構造化された状態を扱います。Neo4j はグラフリレーションシップを扱います。これらを組み合わせることで、ベクターデータベース単独では提供できないものを提供します。

AI ワークロードのためにリレーショナルデータベースを放棄しないでください。それぞれの仕事に適したツールを使用し、それは両方を一緒に使うことです。

このアーキテクチャに関する AI エージェントの視点の詳細については、3k1o の関連投稿をご覧ください。

2025年7月4日金曜日

MySQL解析:AI搭載CLIツールによる

MySQL解析:AI搭載CLIツールによる

本記事は https://anothermysqldba.blogspot.com/2025/07/mysql-analysis-with-ai-powered-cli-tool.html の翻訳版です。

MySQLのDBAとして、私たちはLinuxターミナルウィンドウでの作業が多いです。また、利用可能な無料オプションを好みます。この投稿では、ターミナルウィンドウにとどまりながらAI搭載ツールを使用できるアプローチを紹介します。他の直接AIプロバイダーを使用するよう更新することもできますが、この例ではaimlapi.comを使用するよう設定しました。これは、限定的な使用では無料で、より多くのテスト用には非常に低コストで複数のAIモデルをターミナルに提供するためです。

注:私はAIMLAPIの有料スポークスマンでも何でもありません - これはアイデアを強調するための簡単な例に過ぎません。

問題

数百のテーブルを持つレガシーデータベースを見ています。それぞれに複雑な関係と、何年も前に行われた疑わしい設計決定があります。通常のプロセスには以下が含まれます:

  • 手動のスキーマ検査
  • ドキュメントの相互参照(存在する場合)
  • 複数のEXPLAINクエリの実行
  • ベストプラクティスガイドの参照
  • 同僚のセカンドオピニオンを求める

これは時間がかかり、しばしば見落としがあります。

CLIベースのアプローチ

CLIから直接AIを活用し、多くのことを行うことができます。MySQL解析の支援は、このアプローチが日常のデータベースタスクでどのように機能するかの一例に過ぎません。MySQLのネイティブ機能とAIモデルを組み合わせ、すべてシンプルなコマンドラインインターフェースを通じてアクセスできることで、ターミナルを離れることなく洞察を得ることができます。AIMLAPIは限定使用で100以上のAIモデルへの無料アクセスを提供し、このアプローチをアクセス可能にしています。より集中的なテストでも、コストは非常に合理的なままです。

ツール:AIMLAPI CLI

では、単一のインターフェースを通じて100以上のAIモデルへのアクセスを提供するbashスクリプトをご紹介します:

#!/bin/bash
# 100以上のAIモデルにアクセスできるAIMLAPI CLIツール
# ファイル: ~/.local/bin/aiml

# 設定
DEFAULT_MODEL=${AIMLAPI_DEFAULT_MODEL:-"gpt-4o"}
MAX_TOKENS=${AIMLAPI_MAX_TOKENS:-2000}
TEMPERATURE=${AIMLAPI_TEMPERATURE:-0.7}
BASE_URL="https://api.aimlapi.com"
ENDPOINT="v1/chat/completions"

# 出力用カラーコード
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
PURPLE='\033[0;35m'
CYAN='\033[0;36m'
NC='\033[0m' # カラーなし

# カラー出力を印刷する関数
print_info() { echo -e "${BLUE}[情報]${NC} $1"; }
print_success() { echo -e "${GREEN}[成功]${NC} $1"; }
print_warning() { echo -e "${YELLOW}[警告]${NC} $1"; }
print_error() { echo -e "${RED}[エラー]${NC} $1"; }
print_model() { echo -e "${PURPLE}[モデル]${NC} $1"; }

# 人気のモデルショートカット
declare -A MODEL_SHORTCUTS=(
    # OpenAIモデル
    ["gpt4"]="gpt-4o"
    ["gpt4o"]="gpt-4o"
    ["gpt4mini"]="gpt-4o-mini"
    ["o1"]="o1-preview"
    ["o3"]="openai/o3-2025-04-16"
    
    # Claudeモデル  
    ["claude"]="claude-3-5-sonnet-20241022"
    ["claude4"]="anthropic/claude-sonnet-4"
    ["opus"]="claude-3-opus-20240229"
    ["haiku"]="claude-3-5-haiku-20241022"
    ["sonnet"]="claude-3-5-sonnet-20241022"
    
    # DeepSeekモデル
    ["deepseek"]="deepseek-chat"
    ["deepseek-r1"]="deepseek/deepseek-r1"
    ["reasoner"]="deepseek-reasoner"
    
    # Googleモデル
    ["gemini"]="gemini-2.0-flash"
    ["gemini2"]="gemini-2.0-flash"
    ["gemini15"]="gemini-1.5-pro"
    
    # Meta Llamaモデル
    ["llama"]="meta-llama/Meta-Llama-3.1-70B-Instruct-Turbo"
    ["llama405b"]="meta-llama/Meta-Llama-3.1-405B-Instruct-Turbo"
    
    # Qwenモデル
    ["qwen"]="qwen-max"
    ["qwq"]="Qwen/QwQ-32B"
    
    # Grokモデル
    ["grok"]="x-ai/grok-beta"
    ["grok3"]="x-ai/grok-3-beta"
    
    # 専門モデル
    ["coder"]="Qwen/Qwen2.5-Coder-32B-Instruct"
)

# モデルショートカットを解決する関数
resolve_model() {
    local model="$1"
    if [[ -n "${MODEL_SHORTCUTS[$model]}" ]]; then
        echo "${MODEL_SHORTCUTS[$model]}"
    else
        echo "$model"
    fi
}

# 適切なエスケープのためjqを使用してJSONペイロードを作成する関数
create_json_payload() {
    local model="$1"
    local prompt="$2"
    local system_prompt="$3"
    
    local temp_file=$(mktemp)
    echo "$prompt" > "$temp_file"
    
    if [ -n "$system_prompt" ]; then
        jq -n --arg model "$model" \
              --rawfile prompt "$temp_file" \
              --arg system "$system_prompt" \
              --argjson max_tokens "$MAX_TOKENS" \
              --argjson temperature "$TEMPERATURE" \
              '{
                model: $model,
                messages: [{role: "system", content: $system}, {role: "user", content: $prompt}],
                max_tokens: $max_tokens,
                temperature: $temperature
              }'
    else
        jq -n --arg model "$model" \
              --rawfile prompt "$temp_file" \
              --argjson max_tokens "$MAX_TOKENS" \
              --argjson temperature "$TEMPERATURE" \
              '{
                model: $model,
                messages: [{role: "user", content: $prompt}],
                max_tokens: $max_tokens,
                temperature: $temperature
              }'
    fi
    
    rm -f "$temp_file"
}

# AIMLAPIを呼び出す関数
call_aimlapi() {
    local prompt="$1"
    local model="$2"
    local system_prompt="$3"
    
    if [ -z "$AIMLAPI_API_KEY" ]; then
        print_error "AIMLAPI_API_KEYが設定されていません"
        return 1
    fi
    
    model=$(resolve_model "$model")
    
    local json_file=$(mktemp)
    create_json_payload "$model" "$prompt" "$system_prompt" > "$json_file"
    
    local response_file=$(mktemp)
    local http_code=$(curl -s -w "%{http_code}" -X POST "${BASE_URL}/${ENDPOINT}" \
        -H "Content-Type: application/json" \
        -H "Authorization: Bearer $AIMLAPI_API_KEY" \
        --data-binary @"$json_file" \
        -o "$response_file")
    
    if [ "$http_code" -ne 200 ] && [ "$http_code" -ne 201 ]; then
        print_error "HTTPエラー $http_code"
        cat "$response_file" >&2
        rm -f "$json_file" "$response_file"
        return 1
    fi
    
    local content=$(jq -r '.choices[0].message.content // empty' "$response_file" 2>/dev/null)
    
    if [ -z "$content" ]; then
        content=$(jq -r '.choices[0].text // .message.content // .content // empty' "$response_file" 2>/dev/null)
    fi
    
    if [ -z "$content" ]; then
        local error_msg=$(jq -r '.error.message // .error // empty' "$response_file" 2>/dev/null)
        if [ -n "$error_msg" ]; then
            echo "APIエラー: $error_msg"
        else
            echo "エラー: APIレスポンスを解析できません"
        fi
    else
        echo "$content"
    fi
    
    rm -f "$json_file" "$response_file"
}

# 引数解析を伴うメイン関数
main() {
    local model="$DEFAULT_MODEL"
    local system_prompt=""
    local prompt=""
    local piped_input=""
    
    if [ -p /dev/stdin ]; then
        piped_input=$(cat)
    fi
    
    # 引数を解析
    while [[ $# -gt 0 ]]; do
        case $1 in
            -m|--model)
                model="$2"
                shift 2
                ;;
            -s|--system)
                system_prompt="$2"
                shift 2
                ;;
            *)
                prompt="$*"
                break
                ;;
        esac
    done
    
    # 入力を処理
    if [ -n "$piped_input" ] && [ -n "$prompt" ]; then
        prompt="$prompt

分析するデータは以下です:
$piped_input"
    elif [ -n "$piped_input" ]; then
        prompt="このデータを分析してください:

$piped_input"
    elif [ -z "$prompt" ]; then
        echo "使用法: aiml [オプション] \"プロンプト\""
        echo "       コマンド | aiml [オプション]"
        exit 1
    fi
    
    local resolved_model=$(resolve_model "$model")
    print_info "$resolved_model に問い合わせ中..."
    
    local response=$(call_aimlapi "$prompt" "$model" "$system_prompt")
    
    echo ""
    print_model "$resolved_model からの応答:"
    echo "----------------------------------------"
    echo "$response" 
    echo "----------------------------------------"
}

# 依存関係をチェック
check_dependencies() {
    command -v curl >/dev/null 2>&1 || { print_error "curlが必要ですがインストールされていません。"; exit 1; }
    command -v jq >/dev/null 2>&1 || { print_error "jqが必要ですがインストールされていません。"; exit 1; }
}

check_dependencies
main "$@"

このスクリプトは、claude4、gpt4、grok3などのシンプルなショートカットを通じて、さまざまなAIモデルへのアクセスを提供します。AIMLAPIは、限定使用ですべてのモデルへの無料アクセスを提供し、追加テスト用の合理的なコストを提供しています。予算を破ることなく実験したいDBAに適しています。

スクリプトの機能

スクリプトには包括的なヘルプが含まれています。aiml --helpで表示される内容は以下の通りです:

AIMLAPI CLIツール - 100以上のAIモデルへのアクセス
===============================================
使用法: aiml [オプション] "プロンプト"
        コマンド | aiml [オプション]
コアオプション:
  -m, --model モデル        使用するモデル (デフォルト: gpt-4o)
  -t, --tokens 数値         最大トークン数 (デフォルト: 2000)
  -T, --temperature 浮動小数点  温度 0.0-2.0 (デフォルト: 0.7)
  -s, --system プロンプト    モデル動作用システムプロンプト
入力/出力オプション:
  -f, --file ファイル       ファイルからプロンプトを読み込む
  -o, --output ファイル     応答をファイルに保存
  -r, --raw                生出力 (フォーマット/色なし)
情報オプション:
  -l, --list               人気のモデルショートカットをリスト
  --get-models             APIから利用可能な全モデルを取得
  -c, --config             現在の設定を表示
  -v, --verbose            詳細出力を有効化
  -d, --debug              デバッグ情報を表示
  -h, --help               このヘルプを表示
基本例:
  aiml "量子コンピューティングを説明して"
  aiml -m claude "このコードをレビューして"
  aiml -m deepseek-r1 "この数学問題を段階的に解いて"
  aiml -m grok3 "AIの最新動向は何ですか?"
  aiml -m coder "このPython関数を最適化して"
パイプ例:
  ps aux | aiml "これらのプロセスを分析して"
  netstat -tuln | aiml "これらのネットワーク接続を説明して"
  cat error.log | aiml -m claude "これらのエラーを診断して"
  git diff | aiml -m coder "これらのコード変更をレビューして"
  df -h | aiml "ディスク使用量を分析してクリーンアップを提案して"
ファイル操作:
  aiml -f prompt.txt -o response.txt
  aiml -f large_dataset.csv -m llama405b "このデータを分析して"
  cat script.py | aiml -m coder -o review.md "コードレビュー"
モデルカテゴリとショートカット:
  OpenAI:     gpt4, gpt4mini, o1, o3
  Claude:     claude, opus, haiku, sonnet, claude4
  DeepSeek:   deepseek, deepseek-r1, reasoner
  Google:     gemini, gemini2, gemma
  Meta:       llama, llama3, llama4, llama405b
  Qwen:       qwen, qwen2, qwq
  Grok:       grok, grok3, grok3mini
  コーディング: coder, codestral
高度な使用法:
  aiml -m claude -s "あなたはセキュリティエキスパートです" "このコードを監査して"
  aiml -m deepseek-r1 -t 3000 "複雑な推論タスク"
  aiml -v -m grok3 "詳細ログ付きの詳細クエリ"
  aiml -d "API問題をトラブルシューティングするためのデバッグモード"
モデル発見:
  aiml -l                   # 人気のショートカットを表示
  aiml --get-models         # APIから利用可能な全モデルを取得
  aiml --config             # 現在の設定を表示
環境変数:
  AIMLAPI_API_KEY          - あなたのAIMLAPIキー (必須)
  AIMLAPI_DEFAULT_MODEL    - デフォルトモデル (オプション)
  AIMLAPI_MAX_TOKENS       - デフォルト最大トークン数 (オプション)
  AIMLAPI_TEMPERATURE      - デフォルト温度 (オプション)
プロのヒント:
  • プログラミングタスクとコードレビューには coder を使用
  • 複雑な推論と数学問題には deepseek-r1 を使用
  • 詳細分析と長文コンテンツには claude4 を使用
  • 最新イベントとリアルタイム情報には grok3 を使用
  • APIコストを節約するための簡単な質問には gpt4mini を使用
  • コマンド出力を直接パイプ: コマンド | aiml "これを分析して"
  • 使用中のモデルを確認するには -v を使用
  • 100以上の利用可能モデルを確認するには --get-models を使用

シンプルなインターフェースを通じて100以上のAIモデルへのアクセス!

例:Cityテーブル

実際のMySQLテーブル解析でこれがどのように機能するかを示します。クラシックなWorldデータベース(https://dev.mysql.com/doc/index-other.html サンプルデータベースより)のCityテーブルを3つの異なるAIモデルを使用して解析します。

コマンド

mysql --login-path=klarson world -e "show create table City\G" | \
aiml --model claude4 "MySQLエキスパートの観点からこのテーブルを分析してください"

このコマンドは:

  1. MySQLからテーブル構造を抽出
  2. AIツールにパイプで送信
  3. Claude Sonnet 4から解析を取得

結果

Claude Sonnet 4の解析

Claude 4は整理された解析を提供しました:

強み:

  • InnoDBの効率性のための適切なAUTO_INCREMENT主キー
  • 参照整合性を保つ外部キー制約
  • 一般的なクエリに適したインデックス戦略

発見された問題:

  • ストレージ非効率性: 可変長都市名にCHAR(35)を使用するとスペースが無駄になる
  • 文字セット制限: latin1文字セットは国際的な都市名には不適切
  • 最適でないインデックス: name_keyインデックスは最初の5文字のみをカバー

提案された改善:

-- Claudeの提案による最適化構造
CREATE TABLE `City` (
  `ID` int NOT NULL AUTO_INCREMENT,
  `Name` VARCHAR(35) NOT NULL,
  `CountryCode` CHAR(3) NOT NULL,
  `District` VARCHAR(20) NOT NULL,
  `Population` int UNSIGNED NOT NULL DEFAULT '0',
  PRIMARY KEY (`ID`),
  KEY `CountryCode` (`CountryCode`),
  KEY `name_idx` (`Name`),
  KEY `country_name_idx` (`CountryCode`, `Name`),
  KEY `population_idx` (`Population`),
  CONSTRAINT `city_ibfk_1` FOREIGN KEY (`CountryCode`) 
    REFERENCES `Country` (`Code`) ON DELETE RESTRICT ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=4080 
  DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

Grok 3 Betaの解析

mysql --login-path=klarson world -e "show create table City\G" | \
aiml --model grok3 "MySQLエキスパートの観点からこのテーブルを分析してください"

Grok 3は詳細で包括的な解析を提供しました:

技術的深堀り:

  • パフォーマンス影響解析: 部分インデックス制限を詳細に評価
  • ストレージエンジンの利点: トランザクション整合性のためのInnoDB選択を確認
  • データ型最適化: 例付きの詳細なスペース節約推奨事項

高度な考慮事項:

  • 都市名検索のためのフルテキストインデックス推奨事項
  • 特定のコマンドを含む文字セット移行手順
  • 大きなデータセットのための分割戦略

実装ガイドライン:

-- Grokの文字セット移行提案
ALTER TABLE City CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- フルテキストインデックス推奨事項
ALTER TABLE City ADD FULLTEXT INDEX name_fulltext (Name);

GPT-4oの解析

mysql --login-path=klarson world -e "show create table City\G" | \
aiml --model gpt4 "MySQLエキスパートの観点からこのテーブルを分析してください"

GPT-4oは実用的で直接実行可能な改善に焦点を当てました:

実用的評価:

  • AUTO_INCREMENT主キー設計を検証
  • データ整合性のための外部キー制約の利点を確認
  • グローバルアプリケーションのための文字セット制限を特定

実装準備完了の提案:

  • 即座の最適化のための特定のALTER TABLEコマンド
  • クエリパターン解析推奨事項
  • インデックス効果評価基準

マルチモデル解析の力

このアプローチが価値あるものとなる理由は、3つの異なる視点を得ることです:

  1. Claude 4: 具体的なコードソリューションを含む詳細で構造化された解析を提供
  2. Grok 3: 高度な最適化戦略を含む包括的なカバレッジを提供
  3. GPT-4o: 実用的で直接実行可能な推奨事項を提供

各モデルは独自の強みをもたらします:

  • 異なる焦点: ストレージ最適化 vs パフォーマンス vs 保守性
  • さまざまな深度レベル: 迅速な勝利からアーキテクチャ改善まで
  • 多様な解析スタイル: 構造化 vs 包括的 vs 実用的

MySQL以外:その他のCLI例

任意のコマンド出力をAIツールにパイプできるため、他の有用な例をいくつか示します:

システム管理

# システムプロセスを分析
ps aux | aiml "どのプロセスが最もリソースを使用していますか?"

# ディスク使用量をチェック
df -h | aiml "ディスク使用量を分析してクリーンアップを提案してください"

# ネットワーク接続
netstat -tuln | aiml "これらのネットワーク接続を説明してください"

# システムログ
tail -50 /var/log/syslog | aiml "これらのログに気になるエラーはありますか?"

ファイルとディレクトリの解析

# 大きなファイル
find /var -size +100M | aiml "これらの大きなファイルをタイプ別に整理してください"

# 権限の問題
ls -la /etc/mysql/ | aiml "セキュリティのためにこれらのファイル権限をチェックしてください"

# 設定レビュー
cat /etc/mysql/my.cnf | aiml "このMySQL設定をレビューしてください"

ログ解析

# Apacheログ
tail -100 /var/log/apache2/error.log | aiml "これらのWebサーバーエラーを要約してください"

# 認証ログ
grep "Failed password" /var/log/auth.log | aiml "これらの失敗したログイン試行を分析してください"

要点は、ターミナルを離れることなく迅速な解析を得るために、ほぼ何でもパイプできることです。

ワークフローの実装

セットアップ手順

1. 依存関係のインストール:

# 必要なツールをインストール
sudo apt install curl jq mysql-client

# スクリプトディレクトリを作成
mkdir -p ~/.local/bin

# スクリプトを実行可能にする
chmod +x ~/.local/bin/aiml

2. APIアクセスの設定:

# https://aimlapi.com から無料のAIMLAPIキーを取得(限定使用の無料ティア)
export AIMLAPI_API_KEY="あなたの無料APIキーここ"
echo 'export AIMLAPI_API_KEY="あなたの無料APIキーここ"' >> ~/.bashrc

3. セットアップのテスト:

# 設定を確認
aiml --config

# 基本機能をテスト
echo "SELECT VERSION();" | aiml "このSQLを説明してください"

実用的な使用パターン

迅速なテーブル解析

# 特定のテーブルを解析
mysql -e "SHOW CREATE TABLE users\G" mydb | \
aiml -m claude4 "このMySQLテーブル構造を解析してください"

異なるモデルの視点を比較

# 同じテーブルに対する複数の視点を取得
TABLE_DDL=$(mysql -e "SHOW CREATE TABLE orders\G" ecommerce)

echo "$TABLE_DDL" | aiml -m claude4 "MySQLテーブル解析"
echo "$TABLE_DDL" | aiml -m grok3 "パフォーマンス最適化レビュー" 
echo "$TABLE_DDL" | aiml -m gpt4 "実用的改善提案"

複数テーブルの解析

# データベース内の全テーブルの迅速解析
mysql -e "SHOW TABLES;" mydb | \
while read table; do
  echo "=== $table を解析中 ==="
  mysql -e "SHOW CREATE TABLE $table\G" mydb | \
  aiml -m gpt4mini "このテーブルの迅速評価"
done

インデックス解析

# インデックス使用と最適化をレビュー
mysql -e "SHOW INDEX FROM tablename;" database | \
aiml -m deepseek "このMySQLテーブルのインデックス最適化を提案してください"

クエリパフォーマンス解析

# 遅いクエリを解析
mysql -e "SHOW PROCESSLIST;" | \
aiml -m grok3 "これらのMySQLプロセスで潜在的なパフォーマンス問題を特定してください"

なぜAIMLAPIがDBAにとってこれを可能にするのか

合理的なコストでの無料アクセス: AIMLAPIは100以上のAIモデルへの限定使用での無料アクセスを提供し、追加テスト用の非常に合理的な価格設定を行っています。これは、高価なサブスクリプションにコミットすることなく実験したいDBAに最適です。

モデルの多様性: 異なるプロバイダー(OpenAI、Anthropic、Google、Metaなど)のモデルへのアクセスは、多様な視点と専門分野を得ることを意味します。

ベンダーロックインなし: 長期的なコミットメントなしに、特定のニーズに最適なモデルを見つけるために異なるモデルで実験できます。

ターミナルネイティブ: すでにMySQLの作業を行っている快適なLinux環境にとどまります。

モデル選択ガイド

異なるモデルはMySQL解析の異なる側面で優れています:

# 詳細な構造解析のため
aiml -m claude4 "包括的なテーブル構造レビュー"

# パフォーマンス重視の解析のため  
aiml -m grok3 "パフォーマンス最適化推奨事項"

# 迅速で実用的な提案のため
aiml -m gpt4 "即座に実行可能な改善"

# トレードオフに関する複雑な推論のため
aiml -m deepseek-r1 "複雑な最適化トレードオフ解析"

# コスト効果的な迅速チェックのため
aiml -m gpt4mini "テーブルの簡単評価"

高度なテクニック

カスタムシステムプロンプト

特定のコンテキストに解析を合わせる:

# eコマース重視
aiml -m claude4 -s "あなたは高トラフィックeコマースサイトのテーブルを解析しています" \
"スケーラビリティについてこのテーブルをレビューしてください"

# セキュリティ重視
aiml -m grok3 -s "あなたはセキュリティ重視のデータベースアナリストです" \
"このテーブル構造のセキュリティ評価"

# レガシーシステム重視
aiml -m gpt4 -s "あなたはレガシーシステムを現代のMySQLに移行するのを支援しています" \
"このテーブルの現代化推奨事項"

自動レポート

# 包括的なデータベース解析レポートを生成
DB_NAME="production_db"
REPORT_FILE="analysis_$(date +%Y%m%d).md"

echo "# $DB_NAME のデータベース解析レポート" > "$REPORT_FILE"
echo "$(date) に生成" >> "$REPORT_FILE"

for table in $(mysql -Ns -e "SHOW TABLES;" "$DB_NAME"); do
  echo "" >> "$REPORT_FILE"
  echo "## テーブル: $table" >> "$REPORT_FILE"
  
  mysql -e "SHOW CREATE TABLE $table\G" "$DB_NAME" | \
  aiml -m claude4 "このMySQLテーブルの簡潔な解析を提供してください" >> "$REPORT_FILE"
done

パフォーマンス最適化ワークフロー

# 包括的なパフォーマンス解析
mysql -e "SHOW CREATE TABLE heavy_table\G" db | \
aiml -m grok3 "パフォーマンスボトルネック解析"

# インデックス提案でフォローアップ
mysql -e "SHOW INDEX FROM heavy_table;" db | \
aiml -m deepseek "インデックス最適化戦略"

# 実装計画を取得
aiml -m gpt4 "これらの最適化のためのステップバイステップ実装計画を作成してください"

このアプローチの実際の利点

速度: 時間ではなく秒でエキスパートレベルの解析を取得
複数の視点: 異なるモデルが異なる問題をキャッチ
学習ツール: 各解析でMySQL最適化について新しいことを学ぶ
コスト効果的: AIMLAPIの無料ティアと合理的な価格により、この強力な解析がアクセス可能
一貫性: 異なるテーブルとデータベース間での再現可能な解析
ドキュメント: レポートを生成し、チームと発見を共有するのが簡単

最良の結果のためのヒント

  1. 構造から始める: 包括的な解析のため常に SHOW CREATE TABLE から開始
  2. 具体的なプロンプトを使用: リクエストが具体的であるほど、解析が良くなる
  3. モデルを比較: 異なるモデルは異なる側面で優れている - 複数の視点を使用
  4. 提案を検証: 本番環境の前に常に開発環境でAI推奨事項をテスト
  5. 反復: 特定の推奨事項をより深く掘り下げるためのフォローアップ質問を使用

今日から始める

このアプローチの美しさは、そのシンプルさとコスト効果です。わずかなコマンドで、次のことができます:

  1. https://aimlapi.com から無料のAIMLAPIキーを取得(無料ティアを含む)
  2. スクリプトをインストール(5分)
  3. すぐにMySQLテーブルの解析を開始
  4. ニーズに最適なモデルを見つけるために異なるモデルで実験
  5. 通常の解析には無料ティアを使用し、集中的なテストにのみ支払い

Windowsユーザー(クイックオプション)

私はWindowsの人間ではありませんが、Windowsでこれを実行する必要がある場合、最も簡単なアプローチは:

  1. WSL2をインストール(Windows Subsystem for Linux)
  2. Ubuntuをインストール Microsoft Storeから
  3. WSL2内で上記のLinuxセットアップに従う

これにより、スクリプトが設計通りに正確に動作する適切なLinux環境が提供されます。

これはDBAの専門知識を置き換えることではありません - ターミナル環境にとどまりながらそれを強化することです。AIは迅速な解析を提供し、見逃しがちなことをキャッチし、あなたがコンテキストを提供し、最終的な決定を下します。

単一のテーブルで作業するか、数百のテーブルを持つ複雑なデータベースで作業するかに関わらず、このワークフローはニーズに合わせてスケールします。AIMLAPIが追加使用に対して合理的なコストで無料アクセスを提供するため、予算の心配なしに特定の使用ケースに最適な組み合わせを実験し、見つけることができます。


MySQLの強力な内省機能とAI解析の組み合わせは、DBAにとって実用的でコスト効果的なワークフローを作成します。次のデータベース最適化プロジェクトでこれを試してみてください - 快適なターミナル環境にとどまりながら、どのような洞察が現れるかに驚くかもしれません。

2020年3月16日月曜日

MySQL&Dockers ...簡単なセットアップ

MySQL&Dockers ...は新しい概念ではなく、人々はしばらくの間Dockersに移行しています。 開発のためにこれに移行しようとしている人にとっては、いくつかのハードルがあります。

MySQLはローカルで正常に動作しますが、MySQLの異なるバージョン間でコードをテストする場合は、いくつかのバージョンを簡単に入手できると便利です。

長年の選択肢の1つは、もちろんGiuseppe Maxiaによるhttps://mysqlsandbox.net/です。 これは、複数のインスタンスを起動し、レプリケーションなどをテストできる非常に有効なソリューションです。

ドッカーは、MySQLのさまざまなバージョンでのテストに関して、よく使用される別のシナリオにもなりました。 以下は、いくつかのバージョンを簡単にインストールするためのいくつかのステップについて説明します。 私はOSXを使用しているため、これらの例はOSX用です。

起動するにはDockerが必要です。もちろんDocker Desktopは、簡単にアクセスできる便利なツールです。

Dockerをセットアップしたら、MySQLの環境を整えることができます。

ここでは、MySQLデータディレクトリ、構成ファイル、および必要に応じてmysql-filesディレクトリを含むDockerフォルダーを作成しました。

mkdir ~/Docker ;

mkdir ~/Docker/mysql_data;
mkdir ~/Docker/mysql-files;
mkdir ~/Docker/cnf;

今mysql_data内


cd ~/Docker/mysql_data;
mkdir 8.0;
mkdir 5.7;
mkdir 5.6;
mkdir 5.5;


次に、この例の簡単なcnfファイルを設定します。 主な注意事項は、バインドアドレスです。 これは、Dockerの外部でMySQLにアクセスできるようにするために設定されています。 また、これらのファイルを使用して、MySQL Dockerインスタンスごとに適切な追加の構成情報を設定できることにも気付くことができます。



cd ~/Docker/cnf;

cat my.8.0.cnf
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
secure-file-priv= /var/lib/mysql-files
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
bind-address = 0.0.0.0
port=3306
server-id=80


# Custom config should go here
!includedir /etc/mysql/conf.d/

cat my.5.7.cnf
[mysqld]
bind-address = 0.0.0.0
server-id=57
max_allowed_packet=32M

$ cat my.5.6.cnf
[mysqld]
bind-address = 0.0.0.0
server-id=56

$ cat my.5.5.cnf
[mysqld]
bind-address = 0.0.0.0
server-id=55


設定ファイルがセットアップされたので、ドッカーを構築する必要があります。 ビルドコマンドに関して注意すべきいくつかの点。

--nameドッカーの名前付き参照を設定します。

ここでは、構成ファイル、データディレクトリ、およびmysql-filesディレクトリをdockerにマッピングしています。 これにより、my.cnfファイルなどを簡単に調整できます。
-v〜/ Docker / cnf / my.8.0.cnf:/etc/mysql/my.cnf
-v〜/ Docker / mysql_data / 8.0:/ var / lib / mysql
-v〜/ Docker / mysql-files:/ var / lib / mysql-files

Dockerの外部でこれらのMySQLインスタンスに到達できるようにしたいので、それに応じてポートを公開およびマップする必要があります。
-p 3306:3306これは、ドッカー内の3306に対して3306ローカル
-p 3307:3306これは、ドッカー内の3306に対してローカルな3307を意味します。
-p 3308:3306これは、ドッカー内の3306にローカルな3308を意味します。
-p 3309:3306これは、3309がdocker内部の3306に対してローカルであることを意味します。

次に、いくつかの環境変数も渡します。
-e MYSQL_ROOT_HOST =%-e MYSQL_ROOT_PASSWORD = <ここにパスワードを設定>

まとめて...


docker run --restart always --name mysql8.0 -v ~/Docker/cnf/my.8.0.cnf:/etc/mysql/my.cnf -v ~/Docker/mysql_data/8.0:/var/lib/mysql -v ~/Docker/mysql-files:/var/lib/mysql-files -p 3306:3306 -d -e MYSQL_ROOT_HOST=% -e MYSQL_ROOT_PASSWORD=<set a password here> mysql:8.0

docker run --restart always --name mysql5.7 -v ~/Docker/cnf/my.5.7.cnf:/etc/mysql/my.cnf -v ~/Docker/mysql_data/5.7:/var/lib/mysql -v ~/Docker/mysql-files:/var/lib/mysql-files -p 3307:3306 -d -e MYSQL_ROOT_HOST=% -e MYSQL_ROOT_PASSWORD=<set a password here> mysql:5.7

docker run --restart always --name mysql5.6 -v ~/Docker/cnf/my.5.6.cnf:/etc/mysql/my.cnf -v ~/Docker/mysql_data/5.6:/var/lib/mysql -v ~/Docker/mysql-files:/var/lib/mysql-files -p 3308:3306 -d -e MYSQL_ROOT_HOST=% -e MYSQL_ROOT_PASSWORD=<set a password here> mysql:5.6

docker run --restart always --name mysql5.5 -v ~/Docker/cnf/my.5.5.cnf:/etc/mysql/my.cnf -v ~/Docker/mysql_data/5.5:/var/lib/mysql -v ~/Docker/mysql-files:/var/lib/mysql-files -p 3309:3306 -d -e MYSQL_ROOT_HOST=% -e MYSQL_ROOT_PASSWORD=<set a password here> mysql:5.5

上記のコマンドを実行するたびに、IDが返されます。
例:3cb07d7c21476fbf298648986208f3429ec664167d8eef7fed17bf9ee3ce6316

Docker Desktopを使用して各Dockerターミナルを簡単に起動/再起動してアクセスするか、関連するIDをメモしてターミナルから実行できます。

Docker Desktopには、渡したすべての変数も表示されるため、検証できます。
もちろん、ここからCLIにアクセスして、簡単に停止および開始または破棄することもできます。


$ docker exec -it 3cb07d7c21476fbf298648986208f3429ec664167d8eef7fed17bf9ee3ce6316 /bin/sh; exit
# mysql -p

Dockerコンテナーが既に実行されている場合は、ローカルホスト端末経由でMySQLにアクセスできます。

$ mysql --host=localhost --protocol=tcp --port=3306 -p -u root

アクセスの問題がある場合は、MySQLアカウントが正しいこと、ポートとマッピングが正しいことを確認してください。
  • 「初期通信パケットの読み取り」でMySQLサーバーへの接続が失われました
  • エラー1045(28000):ユーザー 'root'@'192.168.0.5'のアクセスが拒否されました(パスワードを使用:YES)

これで、すべてが稼働しており、サーバーIDがcnfファイル初期化機能ごとに設定したものと一致していることがわかります。

$ mysql --host=localhost --protocol=tcp --port=3306 -e "Select @@hostname, @@version, @@server_id "
+--------------+-----------+-------------+
| @@hostname | @@version | @@server_id |
+--------------+-----------+-------------+
| 58e9663afe8d | 8.0.19 | 80 |
+--------------+-----------+-------------+
$ mysql --host=localhost --protocol=tcp --port=3307 -e "Select @@hostname, @@version, @@server_id "
+--------------+-----------+-------------+
| @@hostname | @@version | @@server_id |
+--------------+-----------+-------------+
| b240917f051a | 5.7.29 | 57 |
+--------------+-----------+-------------+
$ mysql --host=localhost --protocol=tcp --port=3308 -e "Select @@hostname, @@version, @@server_id "
+--------------+-----------+-------------+
| @@hostname | @@version | @@server_id |
+--------------+-----------+-------------+
| b4653850cfe9 | 5.6.47 | 56 |
+--------------+-----------+-------------+
$ mysql --host=localhost --protocol=tcp --port=3309 -e "Select @@hostname, @@version, @@server_id "
+--------------+-----------+-------------+
| @@hostname | @@version | @@server_id |
+--------------+-----------+-------------+
| 22e169004583 | 5.5.62 | 55 |
+--------------+-----------+-------------+


2019年6月17日月曜日

MySQLグループレプリケーション

そのため、MySQLのグループレプリケーションはMySQL 5.7で生まれました。 人々がそれについてもっと質問し始めている間今それは少し出ています。
以下は、これを設定する方法の例と、それをつついたときのいくつかの問題点の例です。
3種類のサーバーを使用しています

サーバーCENTOSA

mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so';
Query OK, 0 rows affected (0.02 sec)

vi my.cnf
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
server_id=1
gtid_mode=ON
enforce_gtid_consistency=ON
binlog_checksum=NONE

log_bin=binlog
log_slave_updates=ON
binlog_format=ROW
master_info_repository=TABLE
relay_log_info_repository=TABLE

transaction_write_set_extraction=XXHASH64
group_replication_group_name="90d8b7c8-5ce1-490e-a448-9c8d176b54a8"
group_replication_start_on_boot=off
group_replication_local_address= "192.168.111.17:33061"
group_replication_group_seeds= "192.168.111.17:33061,192.168.111.89:33061,192.168.111.124:33061"
group_replication_bootstrap_group=off

mysql> SET SQL_LOG_BIN=0;
mysql> CREATE USER repl@'%' IDENTIFIED BY 'replpassword';
mysql> GRANT REPLICATION SLAVE ON *.* TO repl@'%';
mysql> FLUSH PRIVILEGES;
mysql> SET SQL_LOG_BIN=1;


CHANGE MASTER TO
MASTER_USER='repl',
MASTER_PASSWORD='replpassword'
FOR CHANNEL 'group_replication_recovery';


mysql> SET GLOBAL group_replication_bootstrap_group=ON;
Query OK, 0 rows affected (0.00 sec)


mysql> START GROUP_REPLICATION;
Query OK, 0 rows affected (3.11 sec)


mysql> SET GLOBAL group_replication_bootstrap_group=OFF;
Query OK, 0 rows affected (0.00 sec)


mysql> SELECT * FROM performance_schema.replication_group_members \G

*************************** 1. row ***************************
CHANNEL_NAME: group_replication_applier
MEMBER_ID: 1ab30239-5ef6-11e9-9b4a-08002712f4b1
MEMBER_HOST: centosa
MEMBER_PORT: 3306
MEMBER_STATE: ONLINE
MEMBER_ROLE: PRIMARY
MEMBER_VERSION: 8.0.15
だから今私たちはもっとサーバーを追加することができます。
サーバーCENTOSB

vi my.cnf
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
server_id=2
gtid_mode=ON
enforce_gtid_consistency=ON
binlog_checksum=NONE

log_bin=binlog
log_slave_updates=ON
binlog_format=ROW
master_info_repository=TABLE
relay_log_info_repository=TABLE


transaction_write_set_extraction=XXHASH64
group_replication_group_name="90d8b7c8-5ce1-490e-a448-9c8d176b54a8"
group_replication_start_on_boot=off
group_replication_local_address= "192.168.111.89:33061"
group_replication_group_seeds= "192.168.111.17:33061,192.168.111.89:33061,192.168.111.124:33061"
group_replication_bootstrap_group=off

mysql> CHANGE MASTER TO
MASTER_USER='repl',
MASTER_PASSWORD='replpassword'
FOR CHANNEL 'group_replication_recovery';
Query OK, 0 rows affected, 2 warnings (0.02 sec)

mysql> CHANGE MASTER TO GET_MASTER_PUBLIC_KEY=1;
Query OK, 0 rows affected (0.02 sec)

mysql> START GROUP_REPLICATION;
Query OK, 0 rows affected (4.03 sec)

mysql> SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION |
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+
| group_replication_applier | 1ab30239-5ef6-11e9-9b4a-08002712f4b1 | centosa | 3306 | ONLINE | PRIMARY | 8.0.15 |
| group_replication_applier | 572ca2fa-5eff-11e9-8df9-08002712f4b1 | centosb | 3306 | RECOVERING | SECONDARY | 8.0.15 |
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+
2 rows in set (0.00 sec)


サーバーCENTOSC

vi my.cnf
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
server_id=3
gtid_mode=ON
enforce_gtid_consistency=ON
binlog_checksum=NONE
log_bin=binlog
log_slave_updates=ON
binlog_format=ROW
master_info_repository=TABLE
relay_log_info_repository=TABLE

transaction_write_set_extraction=XXHASH64
group_replication_group_name="90d8b7c8-5ce1-490e-a448-9c8d176b54a8"
group_replication_start_on_boot=off
group_replication_local_address= "192.168.111.124:33061"
group_replication_group_seeds= "192.168.111.17:33061,192.168.111.89:33061,192.168.111.124:33061"
group_replication_bootstrap_group=off

mysql> CHANGE MASTER TO
-> MASTER_USER='repl',
-> MASTER_PASSWORD='replpassword'
-> FOR CHANNEL 'group_replication_recovery';
Query OK, 0 rows affected, 2 warnings (0.02 sec)

mysql> CHANGE MASTER TO GET_MASTER_PUBLIC_KEY=1;
Query OK, 0 rows affected (0.02 sec)

mysql> START GROUP_REPLICATION;
Query OK, 0 rows affected (3.58 sec)
mysql> SELECT * FROM performance_schema.replication_group_members \G
*************************** 1. row ***************************
CHANNEL_NAME: group_replication_applier
MEMBER_ID: 1ab30239-5ef6-11e9-9b4a-08002712f4b1
MEMBER_HOST: centosa
MEMBER_PORT: 3306
MEMBER_STATE: ONLINE
MEMBER_ROLE: PRIMARY
MEMBER_VERSION: 8.0.15

*************************** 2. row ***************************
CHANNEL_NAME: group_replication_applier
MEMBER_ID: 572ca2fa-5eff-11e9-8df9-08002712f4b1
MEMBER_HOST: centosb
MEMBER_PORT: 3306
MEMBER_STATE: ONLINE
MEMBER_ROLE: SECONDARY
MEMBER_VERSION: 8.0.15

*************************** 3. row ***************************
CHANNEL_NAME: group_replication_applier
MEMBER_ID: c5f3d1d2-8dd8-11e9-858d-08002773d1b6
MEMBER_HOST: centosc
MEMBER_PORT: 3306
MEMBER_STATE: ONLINE
MEMBER_ROLE: SECONDARY
MEMBER_VERSION: 8.0.15
3 rows in set (0.00 sec)


だからこれはすべて素晴らしいですが、それは常に彼らがオンラインになることを意味するわけではなく、彼らはしばしば回復モードで座ることができます。
私はこれまでのところMySQLがクラッシュして失敗するのを見てきましたので、安定性を保証する必要があります。
mysql> create database testcentosb;<br> ERROR 1290 (HY000): The MySQL server is running with the --super-read-only option so it cannot execute this statement<br>
これらの要因のいくつかに対処するためのサイドノート -
mysql> START GROUP_REPLICATION;
ERROR 3094 (HY000): The START GROUP_REPLICATION command failed as the applier module failed to start.

mysql> reset slave all;
Query OK, 0 rows affected (0.03 sec)
- それからChange masterコマンドからやり直す
mysql> START GROUP_REPLICATION;
ERROR 3092 (HY000): The server is not configured properly to be an active member of the group. Please see more details on error log.

[ERROR] [MY-011735] [Repl] Plugin group_replication reported: '[GCS] Error on opening a connection to 192.168.111.17:33061 on local port: 33061.'
[ERROR] [MY-011526] [Repl] Plugin group_replication reported: 'This member has more executed transactions than those present in the group. Local transactions: c5f3d1d2-8dd8-11e9-858d-08002773d1b6:1-4 >
[ERROR] [MY-011522] [Repl] Plugin group_replication reported: 'The member contains transactions not present in the group. The member will now exit the group.'

https://ronniethedba.wordpress.com/2017/04/22/this-member-has-more-executed-transactions-than-those-present-in-the-group/


[ERROR] [MY-011620] [Repl] Plugin group_replication reported: 'Fatal error during the recovery process of Group Replication. The server will leave the group.'
[ERROR] [MY-013173] [Repl] Plugin group_replication reported: 'The plugin encountered a critical error and will abort: Fatal error during execution of Group Replication'

SELECT * FROM performance_schema.replication_connection_status\G


私の考え...
グループレプリケーションはシングルプライマリモードまたはマルチノードで設定できることに注意してください。
mysql> select @@group_replication_single_primary_mode\G
*************************** 1. row ***************************
@@group_replication_single_primary_mode: 1

mysql> create database testcentosb;
ERROR 1290 (HY000): The MySQL server is running with the --super-read-only option so it cannot execute this statement
プライマリノードに何も書き込まないと、もちろんエラーになります。


group-replication-single-primary-mode = off < - cnfファイルに追加されました。
mysql> SELECT * FROM performance_schema.replication_group_members;
+ --------------------------- + --------------------- ----------------- + ------------- + ------------- + ---- ---------- + ------------- + ---------------- +
| CHANNEL_NAME               | メンバーID                             | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION |
+ --------------------------- + --------------------- ----------------- + ------------- + ------------- + ---- ---------- + ------------- + ---------------- +
| group_replication_applier | 1ab30239-5ef6-11e9-9b4a-08002712f4b1 | セントーサ     |         3306 | 回復   | 一次     | 8.0.15         |
| group_replication_applier | 572ca2fa-5eff-11e9-8df9-08002712f4b1 | 572ca2fa-5eff-11e9-8df9-08002712f4b1 | centosb     |         3306 | オンライン       | 一次     | 8.0.15         |
| group_replication_applier | c5f3d1d2-8dd8-11e9-858d-08002773d1b6 | centosc     |         3306 | 回復   | 一次     | 8.0.15         |
+ --------------------------- + --------------------- ----------------- + ------------- + ------------- + ---- ---------- + ------------- + ---------------- +

3行セット(0.00秒)


ただし、フェイルオーバーの場合に自動的にロールオーバーするようにトラフィックを処理するために、Keepalived、MySQLルーター、ProxySQLなどを使用しているのが今です。 私がプライマリを停止したときに、すぐ下からフェイルオーバーしているのがわかります。

mysql> SELECT * FROM performance_schema.replication_group_members ;
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION |
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+
| group_replication_applier | 1ab30239-5ef6-11e9-9b4a-08002712f4b1 | centosa | 3306 | ONLINE | PRIMARY | 8.0.15 |
| group_replication_applier | 572ca2fa-5eff-11e9-8df9-08002712f4b1 | centosb | 3306 | ONLINE | SECONDARY | 8.0.15 |
| group_replication_applier | c5f3d1d2-8dd8-11e9-858d-08002773d1b6 | centosc | 3306 | ONLINE | SECONDARY | 8.0.15 |
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+
3 rows in set (0.00 sec)

[root@centosa]# systemctl stop mysqld

mysql> SELECT * FROM performance_schema.replication_group_members ;
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION |
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+
| group_replication_applier | 572ca2fa-5eff-11e9-8df9-08002712f4b1 | centosb | 3306 | ONLINE | PRIMARY | 8.0.15 |
| group_replication_applier | c5f3d1d2-8dd8-11e9-858d-08002773d1b6 | centosc | 3306 | ONLINE | SECONDARY | 8.0.15 |
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+
2 rows in set (0.00 sec)

[root@centosa]# systemctl start mysqld
[root@centosa]# mysql
mysql> START GROUP_REPLICATION;
Query OK, 0 rows affected (3.34 sec)

mysql> SELECT * FROM performance_schema.replication_group_members ;
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION |
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+
| group_replication_applier | 1ab30239-5ef6-11e9-9b4a-08002712f4b1 | centosa | 3306 | RECOVERING | SECONDARY | 8.0.15 |
| group_replication_applier | 572ca2fa-5eff-11e9-8df9-08002712f4b1 | centosb | 3306 | ONLINE | PRIMARY | 8.0.15 |
| group_replication_applier | c5f3d1d2-8dd8-11e9-858d-08002773d1b6 | centosc | 3306 | ONLINE | SECONDARY | 8.0.15 |
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+
3 rows in set (0.00 sec)


回復はまだ問題になっていました。単純に参加し直すことはできないからです。 すべてのアカウントと手順をもう一度確認する必要がありましたが、最終的には元に戻しました。

mysql> SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION |
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+
| group_replication_applier | 1ab30239-5ef6-11e9-9b4a-08002712f4b1 | centosa | 3306 | ONLINE | SECONDARY | 8.0.15 |
| group_replication_applier | 572ca2fa-5eff-11e9-8df9-08002712f4b1 | centosb | 3306 | ONLINE | PRIMARY | 8.0.15 |
| group_replication_applier | c5f3d1d2-8dd8-11e9-858d-08002773d1b6 | centosc | 3306 | ONLINE | SECONDARY | 8.0.15 |
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+
3 rows in set (0.00 sec)


私はまだ100%売れていないので、これをもっと試してみる必要があります。私はまだGaleraの複製に傾いているのでこれを必要としています。

興味のあるURL


  • https://dev.mysql.com/doc/refman/8.0/en/group-replication.html
  • https://dev.mysql.com/doc/refman/8.0/en/group-replication-deploys-in-single-primary-mode.html
  • http://datacharmer.blogspot.com/2017/01/mysql-group-replication-vs-multi-source.html
  • https://dev.mysql.com/doc/refman/8.0/en/group-replication-launching.html
  • https://dev.mysql.com/doc/refman/8.0/en/group-replication-configuring-instances.html
  • https://dev.mysql.com/doc/refman/8.0/en/group-replication-adding-instances.html
  • https://ronniethedba.wordpress.com/2017/04/22/how-to-setup-mysql-group-replication/
  • https://www.digitalocean.com/community/tutorials/how-to-configure-mysql-group-replication-on-ubuntu-16-04
  • https://dev.mysql.com/doc/refman/8.0/en/group-replication-options.html#sysvar_group_replication_group_seeds
  • https://bugs.mysql.com/bug.php?id=90534
  • https://www.percona.com/blog/2017/02/24/battle-for-synchronous-replication-in-mysql-galera-vs-group-replication/
  • https://lefred.be/content/mysql-group-replication-is-sweet-but-can-be-sour-if-you-misunderstand-it/
  • https://www.youtube.com/watch?v=IfZK-Up03Mw
  • https://mysqlhighavailability.com/mysql-group-replication-a-quick-start-guide/

  • 2019年6月4日火曜日

    最大接続数214 4.15.0-46-ジェネリック#49-Ubuntu

    そのため、max_connectionsがmy.cnfファイルで設定されている値から214に低下するという問題は、Ubuntuでしばらくの間発生しています。

    例として、それは2015年に戻ってここで指摘されました



    私は最近これに再び遭遇し、次のステップで解決しました。


    # cp /lib/systemd/system/mysql.service /etc/systemd/system/
    # cd /etc/systemd/system/
    # vi mysql.service

    LimitNOFILE=infinity
    LimitMEMLOCK=infinity

    # systemctl daemon-reload
    # systemctl restart mysql


    これらのステップが完了すると、MySQL接続はmy.cnfファイル内の指定されたパラメータで安定しました。

    2019年4月15日月曜日

    簡易キープアライブの設定

    キープアライブはしばらく前から存在していましたが、それでも多くの人にとって謎です。
    したがって、これはkeepalivedがMySQLでどのように機能するかを示す非常に単純な例です。 うまくいけば、これは質問がある人を助けることができます。

    Simple master to slaveをセットアップします。 意味..あるイベントで2番目にフェイルオーバーしない限り、1つに書き込みます。

    1日 - インストールkeepalived


    #yum検索キープアライブ
    keepalived .x86_64:ロードバランサと高可用性サービス

      名前と要約の一致のみ 。すべてを "search all"で検索してください。
    #yum -y install keepalived

    これで設定ファイルができました

    #ls -ltr /etc/keepalived/keepalived.conf  

    あなたがいつもバックアップしているようにオリジナルを保存してください..正しい....
    #cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.orig

    だからあなたはあなたの仮想IPアドレスに使用できるIPアドレスを把握する必要があります。 この例では192.168.0.123を選びました。

    次に、新しい設定ファイルに使用するスクリプトを設定します。

    ここで私がしたことがいくつかあります。
    keepalived用の.cnfファイルと/ etc / keepalived内のログをすべて残しました。
    これは例のためにそれを簡単にする従ってあなたがこれをするかまたはあなた自身のcnfファイルを使用することができる。

    スクリプト:

    cat /etc/keepalived/keepalived_check.sh  
    #!/ bin / bash

    #MySQLの状態を監視する

    #このノードmysqlが停止している場合

    #そしてその奴隷は生きている、それからそのキープアライブを止めなさい。 もう一方のノードがIPをバインドします。



    export MYSQL_HOME = / etc / keepalived /

    export PATH = $ MYSQL_HOME / bin:$ PATH



    mysql = "/ usr / bin / mysql"

    mysqladmin = "/ usr / bin / mysqladmin"

    delay_file = "$ MYSQL_HOME / slave_delay_second.log"

    slave_host = $ 1





    ALIVE = $($ mysqladmin --defaults-file = $ MYSQL_HOME / .my.localhost.cnf   ping | 生きてる wc -l);

    REMOTEALIVE = $($ mysqladmin --defaults-file = $ MYSQL_HOME / .my.remotehost.cnf   ping | 生きてる wc -l);



    if [[$ ALIVE -ne 1]]

    それから

    #echo「MySQLがダウンしています」

            if [[$ REMOTEALIVE -eq 1]]

            それから

    #         エコー「シャットダウンキープアライブ」

                systemctl stopキープアライブ  

    #       エコー「keepalived stop」

            fi

    #その他

    #echo「MySQLは稼働しています」

    #日付

    fi



    終了0#すべて終了

    新しい設定ファイル

    cat /etc/keepalived/keepalived.conf
    global_defs {



          notification_email {

            anothermysqldba@gmail.com  

          }



          notification_email_from anothermysqldba@gmail.com  

          smtp_server localhost

          smtp_connect_timeout 30



          }







    vrrp_script check_mysql {

       スクリプト "/etc/keepalived/keepalived_check.sh"

       間隔2

       重さ2

    }







    vrrp_instance VI_1 {



          州マスター

          インタフェースenp0s8   #<---インターフェース名があなたの本当のIP / sbin / ifconfigを保持するもの

            #ip link showで見つかった

          virtual_router_id 51

          優先度101

          advert_int 1

          いらない   #優先順位の高いノードでのみ必要

          認証{

            auth_type PASS

            auth_pass 1111

          }





          track_script {

            check_mysql

          }



          virtual_ipaddress {

            192.168.0.123  

          }




    }



    これはすべて素晴らしいことですが、うまくいきますか。

    2人のホストがいます

    [root @ centosa keepalived]#ホスト名

    セントーサ

    [root @ centosb keepalived]#ホスト名
    centosb

    キープアライブを開始

    [root @ centosa keepalived]#systemctl statusキープアライブ
    ●keepalived.service - LVSおよびVRRPハイアベイラビリティモニタ
       ロード済み:ロード済み(/usr/lib/systemd/system/keepalived.service;無効、ベンダーのプリセット:無効)
       アクティブ:非アクティブ(デッド)
    [root @ centosa keepalived]#systemctl restartキープアライブ
    [root @ centosa keepalived]#systemctl statusキープアライブ
    ● keepalived.service - LVSおよびVRRPハイアベイラビリティモニタ
       ロード済み:ロード済み(/usr/lib/systemd/system/keepalived.service;無効、ベンダーのプリセット:無効)
        アクティブ: アクティブ(実行中)

    [root @ centosa keepalived]#ssh 192.168.0.123 'hostname'
    root@192.168.0.123のパスワード:  

    セントーサ

    接続が既に機能していることを証明する

    [root @ centosa keepalived]#mysql - デフォルトファイル= .my.remotehost.cnf --host = 192.168.0.101   -e "select @@ hostname"
    + ------------ +
    | @@ hostname |
    + ------------ +
    | centosb     |
    + ------------ +
    [root @ centosa keepalived]#mysql - デフォルトファイル= .my.remotehost.cnf --host = 192.168.0.102   -e "select @@ hostname"
    + ------------ +
    | @@ hostname |
    + ------------ +
    | セントーサ     |
    + ------------ +

    実行されていることを再確認してください。

    [root @ centosa keepalived]#systemctl statusキープアライブ| grep active
        アクティブ: アクティブ  

    [root @ centosb keepalived]#systemctl statusキープアライブ| grep active
        アクティブ: アクティブ  

    現在のVIPをテストします。mysqlを停止し、同じVIPがホストを変更するのを見ます...

    [root @ centosa keepalived]#mysql - デフォルトのファイル= .my.remotehost.cnf --host = 192.168.0.123   -e "select @@ hostname"
    + ------------ +
    | @@ hostname |
    + ------------ +
    | セントーサ     |
    + ------------ +
    [root @ centosa keepalived]#systemctl stop mysqld  
    [root @ centosa keepalived]#mysql - デフォルトのファイル= .my.remotehost.cnf --host = 192.168.0.123   -e "select @@ hostname"
    + ------------ +
    | @@ hostname |
    + ------------ +
    | centosb     |
    + ------------ +