vdzhorov.proxysql

proxysql


この役割は、RHEL 8を使用している場合、ProxySQLのバージョンがv2.0.1以上と互換性があります。 ProxySQL 1.4.xシリーズをインストールしたい場合は、RHEL 7以下を使用する必要があります。

この役割は、MySQLdbからPyMySQLへの移行に関するバグのため、 Ansible 2.7.9以上と互換性があります (#40123)。

リリース0.3.0は、Ansible 2.7.0以下と互換性があります。


この役割は、MySQL用の高性能で高可用性なプロトコル対応プロキシである ProxySQLをインストールおよび構成します。

バージョン2.3.0以降、Ansibleは ProxySQLを構成するモジュールを提供しており、 このAnsibleロールはこの機能を使用しつつ、以下のような (役立つことを願って)機能を追加しています:

この文書の"既知の問題または:知っておくべきこと"のセクションもご覧ください。

必要条件

この役割はAnsible 2.5.0以上が必要です。

安定版をインストール(および定義)するには、pipを簡単に使用できます:

pip install ansible==2.7.9

すべてのプラットフォーム要件はメタデータファイルに記載されています。

インストール

ansible-galaxy install vdzhorov.proxysql

ロール変数

この役割に渡すことができる変数。すべての変数についてはdefaults/main.ymlをご覧ください。

# ProxySQLをサービスとして有効/無効にします。
# タイプ:Bool
proxysql_service_enabled: True

# 静的変数が変更される場合、ProxySQLを再起動します。
# 静的変数の一覧は、`vars/main.yml`の`proxysql_non_dynamic_variables`を参照してください。
# タイプ:Bool
proxysql_restart_on_static_variables_change: True

# リポジトリ

# `proxysql_use_official_repo`と`proxysql_use_percona_repo`の両方が
# `False`に設定されている場合、モジュールは自動的に定義された
# `proxysql_version`をGithubからパッケージとしてダウンロードしてインストールします。

# 公式ProxySQLリポジトリを使用します。
# タイプ:Bool
proxysql_use_official_repo: True

# Perconaリポジトリを使用します。
# タイプ:Bool
proxysql_use_percona_repo: False

# Perconaリポジトリのバージョンを定義します。
# タイプ:Str
proxysql_percona_release: latest

# ProxySQLリポジトリを使用しない場合にインストールされるProxySQLのバージョン。
# タイプ:Int
proxysql_version: 1.4.15

# 設定

# ProxySQLがデータベースとログを保存するパス。
# タイプ:Str
proxysql_datadir: /var/lib/proxysql

# proxysql.cnfのテンプレートを定義します。
# タイプ:Str
proxysql_proxysql_cnf_template: proxysql.cnf.j2

# proxysql-admin.cnfのテンプレートを定義します。
# タイプ:Str
proxysql_proxysql_admin_cnf_template: proxysql-admin.cnf.j2

# ProxySQL自体の設定に使用されるログイン変数。
# これらは`main.yml`ファイル内で使用され、設定を簡素化するためにここにあります。
# タイプ:Str
proxysql_login_admin_host: 127.0.0.1
proxysql_login_admin_password: admin
proxysql_login_admin_port: 6032
proxysql_login_admin_user: admin

# グローバル変数
# `proxysql_global_variables_kv`内の`admin_variables`: 管理インターフェースの機能を制御するグローバル変数。
# `admin_variables`は`admin-`でプレフィックスが付けられます。
# `mysql_variables`: `proxysql_global_variables_kv`内の、受信する
# MySQLトラフィックの処理機能を制御するグローバル変数。
# `mysql_variables`は`mysql-`でプレフィックスが付けられます。

# 変数は文字列または整数である必要があります。真偽値は文字列としてマークする必要があります。
# 例:"True"または"False"。

# 詳細なリファレンスについては、
# https://github.com/sysown/proxysql/wiki/Global-variablesをご覧ください。

# フォーマット:
# タイプ:Dict
# proxysql_global_variables:
#   load_to_runtime: "True"
#   save_to_disk: "True"
#   login_host: "{{ proxysql_login_admin_host }}"
#   login_password: "{{ proxysql_login_admin_password }}"
#   login_port: "{{ proxysql_login_admin_port }}"
#   login_user: "{{ proxysql_login_admin_user }}"
proxysql_global_variables:
  login_host: "{{ proxysql_login_admin_host }}"
  login_password: "{{ proxysql_login_admin_password }}"
  login_port: "{{ proxysql_login_admin_port }}"
  login_user: "{{ proxysql_login_admin_user }}"

# フォーマット:
# タイプ:Dict
# proxysql_global_variables_kv:
#   key: value
# 例:
# proxysql_global_variables_kv:
#   admin-admin_credentials: "{{ proxysql_login_admin_user }}:{{ proxysql_login_admin_password }}"
#   admin-mysql_ifaces: "{{ proxysql_login_admin_host }}:{{ proxysql_login_admin_port }}"
#   mysql-interfaces: 0.0.0.0:6033
#   mysql-commands_stats: "True"
#   mysql-threads: 4
proxysql_global_variables_kv: {}

# バックエンドサーバー
# `proxysql_backend_servers`: 管理インターフェースからのmysql_serversテーブルの行を含む。
# これらは基本的に、受信するMySQLトラフィックがルーティングされる
# バックエンドサーバーを定義します。

# 詳細なリファレンスについては:
# https://docs.ansible.com/ansible/latest/modules/proxysql_backend_servers_module.html
# 重要:このモジュールは、`hostgroup`(データベース内での正しい名前)を
# 使用していますが、`hostgroup_id`(Ansibleモジュールのデフォルト)ではありません!

# フォーマット:
# タイプ:Dict
# proxysql_backend_servers:
#   mysql-srv1-hg1:
#     comment: mysql-srv1-hg1
#     hostgroup: 1
#     hostname: 172.16.77.101
#     login_host: "{{ proxysql_login_admin_host }}"
#     login_password: "{{ proxysql_login_admin_password }}"
#     login_port: "{{ proxysql_login_admin_port }}"
#     login_user: "{{ proxysql_login_admin_user }}"
#     max_connections: 1000
#     max_replication_lag: 0
#     status: ONLINE
#     weight: 1
#   mysql-srv1-hg2:
#     comment: mysql-srv1-hg2
#     hostgroup: 2
#     hostname: 172.16.77.101
#     login_host: "{{ proxysql_login_admin_host }}"
#     login_password: "{{ proxysql_login_admin_password }}"
#     login_port: "{{ proxysql_login_admin_port }}"
#     login_user: "{{ proxysql_login_admin_user }}"
#     max_connections: 1000
#     max_replication_lag: 0
#     status: ONLINE
#     weight: 1
proxysql_backend_servers: {}

# ProxySQLサーバー
# `proxysql_proxysql_servers`: 管理インターフェースからのproxysql_serversテーブルの行を含む。
# これらは基本的に、クラスタリングに使用されるProxySQLサーバーを定義します。

# 詳細なリファレンスについては:
# `library/proxysql_proxysql_servers.py`をご覧ください。これは公式Ansibleパッケージの一部ではありません。

# フォーマット:
# タイプ:Dict
# proxysql_proxysql_servers:
#   proxysql-srv-1:
#     comment: proxysql-srv-1
#     hostname: 172.16.77.201
#     login_host: "{{ proxysql_login_admin_host }}"
#     login_password: "{{ proxysql_login_admin_password }}"
#     login_port: "{{ proxysql_login_admin_port }}"
#     login_user: "{{ proxysql_login_admin_user }}"
#     weight: 0
#   proxysql-srv-2:
#     comment: proxysql-srv-2
#     hostname: 172.16.77.202
#     login_host: "{{ proxysql_login_admin_host }}"
#     login_password: "{{ proxysql_login_admin_password }}"
#     login_port: "{{ proxysql_login_admin_port }}"
#     login_user: "{{ proxysql_login_admin_user }}"
#     weight: 0
proxysql_proxysql_servers: {}

# レプリケーショングループ
# `proxysql_replication_hostgroups`: writer_hostgroupとreader_hostgroupのペアを表します。
# ProxySQLは、指定されたホストグループ内のすべてのサーバーのread_onlyの値を監視し、
# read_onlyの値に基づいてサーバーをwriterまたはreaderホストグループに割り当てます。

# 詳細なリファレンスについては:
# https://docs.ansible.com/ansible/latest/modules/proxysql_replication_hostgroups_module.html

# フォーマット:
# タイプ:Dict
# proxysql_replication_hostgroups:
#   Cluster:
#     comment: Cluster
#     login_host: "{{ proxysql_login_admin_host }}"
#     login_password: "{{ proxysql_login_admin_password }}"
#     login_port: "{{ proxysql_login_admin_port }}"
#     login_user: "{{ proxysql_login_admin_user }}"
#     reader_hostgroup: 2
#     writer_hostgroup: 1
proxysql_replication_hostgroups: {}

# ユーザー
# `proxysql_mysql_users`: 管理インターフェースからのmysql_usersテーブルの行を含む。
# これらは基本的に、プロキシに接続できるユーザーと、
# プロキシがバックエンドサーバーに接続できるユーザーを定義します。

# 詳細なリファレンスについては:
# http://docs.ansible.com/ansible/latest/proxysql_mysql_users_module.html

# フォーマット:
# タイプ:Dict
# proxysql_mysql_users:
#   user1:
#     active: 1
#     backend: 1
#     default_hostgroup: 1
#     fast_forward: 0
#     frontend: 1
#     login_host: "{{ proxysql_login_admin_host }}"
#     login_password: "{{ proxysql_login_admin_password }}"
#     login_port: "{{ proxysql_login_admin_port }}"
#     login_user: "{{ proxysql_login_admin_user }}"
#     max_connections: 10000
#     password: Passw0rd
#     transaction_persistent: 1
#     username: user1
#   user2:
#     active: 1
#     backend: 1
#     default_hostgroup: 2
#     fast_forward: 0
#     frontend: 1
#     login_host: "{{ proxysql_login_admin_host }}"
#     login_password: "{{ proxysql_login_admin_password }}"
#     login_port: "{{ proxysql_login_admin_port }}"
#     login_user: "{{ proxysql_login_admin_user }}"
#     max_connections: 1000
#     password: dr0wssaP
#     transaction_persistent: 1
#     username: user2
proxysql_mysql_users: {}

# クエリルール
# `proxysql_query_rules`は、管理インターフェースのmysql_query_rulesテーブルの行を含みます。
# これらは基本的に、受信するMySQLトラフィックを分類およびルーティングするためのルールを定義します。

# 詳細なリファレンスについては:
# http://docs.ansible.com/ansible/latest/proxysql_query_rules_module.html

# フォーマット:
# タイプ:Dict
# proxysql_query_rules:
#   catchall:
#     active: 1
#     apply: 1
#     destination_hostgroup: 1
#     flagIN: 0
#     login_host: "{{ proxysql_login_admin_host }}"
#     login_password: "{{ proxysql_login_admin_password }}"
#     login_port: "{{ proxysql_login_admin_port }}"
#     login_user: "{{ proxysql_login_admin_user }}"
#     match_pattern: .*@.*
#     negate_match_pattern: 0
#     rule_id: 1
#   selectforupdate:
#     active: 1
#     apply: 1
#     destination_hostgroup: 1
#     flagIN: 0
#     login_host: "{{ proxysql_login_admin_host }}"
#     login_password: "{{ proxysql_login_admin_password }}"
#     login_port: "{{ proxysql_login_admin_port }}"
#     login_user: "{{ proxysql_login_admin_user }}"
#     match_pattern: ^SELECT.*FOR UPDATE
#     negate_match_pattern: 0
#     rule_id: 2
#   select:
#     active: 1
#     apply: 0
#     destination_hostgroup: 2
#     flagIN: 0
#     login_host: "{{ proxysql_login_admin_host }}"
#     login_password: "{{ proxysql_login_admin_password }}"
#     login_port: "{{ proxysql_login_admin_port }}"
#     login_user: "{{ proxysql_login_admin_user }}"
#     match_pattern: ^SELECT.*
#     negate_match_pattern: 0
#     rule_id: 3
proxysql_query_rules: {}

# Percona ProxySQL管理
# ProxySQL Admin(proxysql-admin)ソリューションは、Percona
# XtraDBクラスターノードをProxySQLに設定します。

# 詳細なリファレンスについては:
# https://github.com/percona/proxysql-admin-tool

# フォーマット:
# タイプ:Dict
# proxysql_percona_admin_tool:
#   PROXYSQL_DATADIR: "{{ proxysql_datadir }}"
#   PROXYSQL_USERNAME: "{{ proxysql_login_admin_user }}"
#   PROXYSQL_PASSWORD: "{{ proxysql_login_admin_password }}"
#   PROXYSQL_HOSTNAME: "{{ proxysql_login_admin_host }}"
#   PROXYSQL_PORT: "{{ proxysql_login_admin_port }}"
#   CLUSTER_USERNAME: admin
#   CLUSTER_PASSWORD: admin
#   CLUSTER_HOSTNAME: localhost
#   CLUSTER_PORT: 3306
#   MONITOR_USERNAME: monitor
#   MONITOR_PASSWORD: monit0r
#   CLUSTER_APP_USERNAME: proxysql_user
#   CLUSTER_APP_PASSWORD: passw0rd
#   WRITE_HOSTGROUP_ID: 10
#   READ_HOSTGROUP_ID: 11
#   MODE: singlewrite
proxysql_percona_admin_tool:
  PROXYSQL_DATADIR: "{{ proxysql_datadir }}"
  PROXYSQL_USERNAME: "{{ proxysql_login_admin_user }}"
  PROXYSQL_PASSWORD: "{{ proxysql_login_admin_password }}"
  PROXYSQL_HOSTNAME: "{{ proxysql_login_admin_host }}"
  PROXYSQL_PORT: "{{ proxysql_login_admin_port }}"

1) フル構成例

ここでは、ProxySQLの構成のフル例を示します。この場合、役割は1.4.15パッケージを直接ダウンロードし、リポジトリを使用しません(proxysql_use_official_repoFalseに設定されています)。

これは基本的に(いくつかの小さな変更を加えた)test.ymlファイルで、テストに使用されます。

- hosts: proxysql
  gather_facts: True
  vars:
    proxysql_version: 1.4.15
    proxysql_service_enabled: True
    proxysql_use_official_repo: True
    proxysql_login_admin_host: 127.0.0.1
    proxysql_login_admin_password: admin
    proxysql_login_admin_port: 6032
    proxysql_login_admin_user: admin
    proxysql_global_variables:
      login_host: "{{ proxysql_login_admin_host }}"
      login_password: "{{ proxysql_login_admin_password }}"
      login_port: "{{ proxysql_login_admin_port }}"
      login_user: "{{ proxysql_login_admin_user }}"
    proxysql_global_variables_kv:
      admin-admin_credentials: "{{ proxysql_login_admin_user }}:{{ proxysql_login_admin_password }}"
      admin-mysql_ifaces: "{{ proxysql_login_admin_host }}:{{ proxysql_login_admin_port }}"
      mysql-commands_stats: "True"
      mysql-connect_retries_on_failure: 10
      mysql-connect_timeout_server: 3000
      mysql-default_charset: utf8
      mysql-default_query_delay: 0
      mysql-default_query_timeout: 300000
      mysql-default_schema: information_schema
      mysql-interfaces: 127.0.0.1:6033
      mysql-max_connections: 8192
      mysql-monitor_read_only_interval: 1500
      mysql-monitor_read_only_timeout: 500
      mysql-ping_timeout_server: 500
      mysql-poll_timeout: 2000
      mysql-query_retries_on_failure: 1
      mysql-sessions_sort: "True"
      mysql-threads: 4
    proxysql_backend_servers:
      mysql-srv1-hg1:
        comment: mysql-srv1-hg1
        hostgroup: 1
        hostname: 172.16.77.101
        login_host: "{{ proxysql_login_admin_host }}"
        login_password: "{{ proxysql_login_admin_password }}"
        login_port: "{{ proxysql_login_admin_port }}"
        login_user: "{{ proxysql_login_admin_user }}"
        max_connections: 1000
        max_replication_lag: 0
        status: ONLINE
        weight: 1
      mysql-srv1-hg2:
        comment: mysql-srv1-hg2
        hostgroup: 2
        hostname: 172.16.77.101
        login_host: "{{ proxysql_login_admin_host }}"
        login_password: "{{ proxysql_login_admin_password }}"
        login_port: "{{ proxysql_login_admin_port }}"
        login_user: "{{ proxysql_login_admin_user }}"
        max_connections: 1000
        max_replication_lag: 0
        status: ONLINE
        weight: 1
      mysql-srv2-hg2:
        comment: mysql-srv2-hg2
        hostgroup: 2
        hostname: 172.16.77.102
        login_host: "{{ proxysql_login_admin_host }}"
        login_password: "{{ proxysql_login_admin_password }}"
        login_port: "{{ proxysql_login_admin_port }}"
        login_user: "{{ proxysql_login_admin_user }}"
        max_connections: 2000
        max_replication_lag: 5
        status: ONLINE
        weight: 1
      mysql-srv3-hg2:
        comment: mysql-srv3-hg2
        hostgroup: 2
        hostname: 172.16.77.103
        login_host: "{{ proxysql_login_admin_host }}"
        login_password: "{{ proxysql_login_admin_password }}"
        login_port: "{{ proxysql_login_admin_port }}"
        login_user: "{{ proxysql_login_admin_user }}"
        max_connections: 2000
        max_replication_lag: 5
        status: OFFLINE_HARD
        weight: 1
    proxysql_proxysql_servers:
      proxysql-srv-1:
        comment: proxysql-srv-1
        hostname: 172.16.77.201
        login_host: "{{ proxysql_login_admin_host }}"
        login_password: "{{ proxysql_login_admin_password }}"
        login_port: "{{ proxysql_login_admin_port }}"
        login_user: "{{ proxysql_login_admin_user }}"
        port: 6032
        weight: 0
      proxysql-srv-2:
        comment: proxysql-srv-2
        hostname: 172.16.77.202
        login_host: "{{ proxysql_login_admin_host }}"
        login_password: "{{ proxysql_login_admin_password }}"
        login_port: "{{ proxysql_login_admin_port }}"
        login_user: "{{ proxysql_login_admin_user }}"
        port: 6032
        weight: 0
    proxysql_replication_hostgroups:
      Cluster:
        comment: Cluster
        login_host: "{{ proxysql_login_admin_host }}"
        login_password: "{{ proxysql_login_admin_password }}"
        login_port: "{{ proxysql_login_admin_port }}"
        login_user: "{{ proxysql_login_admin_user }}"
        reader_hostgroup: 2
        writer_hostgroup: 1
    proxysql_mysql_users:
      user1:
        active: 1
        backend: 1
        default_hostgroup: 1
        fast_forward: 0
        frontend: 1
        login_host: "{{ proxysql_login_admin_host }}"
        login_password: "{{ proxysql_login_admin_password }}"
        login_port: "{{ proxysql_login_admin_port }}"
        login_user: "{{ proxysql_login_admin_user }}"
        max_connections: 10000
        password: Passw0rd
        transaction_persistent: 1
        username: user1
      user2:
        active: 1
        backend: 1
        default_hostgroup: 1
        fast_forward: 0
        frontend: 1
        login_host: "{{ proxysql_login_admin_host }}"
        login_password: "{{ proxysql_login_admin_password }}"
        login_port: "{{ proxysql_login_admin_port }}"
        login_user: "{{ proxysql_login_admin_user }}"
        max_connections: 1000
        password: dr0wssaP
        transaction_persistent: 1
        username: user2
    proxysql_query_rules:
      catchall:
        active: 1
        apply: 1
        destination_hostgroup: 1
        flagIN: 0
        login_host: "{{ proxysql_login_admin_host }}"
        login_password: "{{ proxysql_login_admin_password }}"
        login_port: "{{ proxysql_login_admin_port }}"
        login_user: "{{ proxysql_login_admin_user }}"
        match_pattern: .*@.*
        negate_match_pattern: 0
        rule_id: 1
      selectforupdate:
        active: 1
        apply: 1
        destination_hostgroup: 1
        flagIN: 0
        login_host: "{{ proxysql_login_admin_host }}"
        login_password: "{{ proxysql_login_admin_password }}"
        login_port: "{{ proxysql_login_admin_port }}"
        login_user: "{{ proxysql_login_admin_user }}"
        match_pattern: ^SELECT.*FOR UPDATE
        negate_match_pattern: 0
        rule_id: 2
      select:
        active: 1
        apply: 0
        destination_hostgroup: 2
        flagIN: 0
        login_host: "{{ proxysql_login_admin_host }}"
        login_password: "{{ proxysql_login_admin_password }}"
        login_port: "{{ proxysql_login_admin_port }}"
        login_user: "{{ proxysql_login_admin_user }}"
        match_pattern: ^SELECT.*
        negate_match_pattern: 0
        rule_id: 3
  roles:
    - timorunge.proxysql

2) 公式リポジトリからのインストール

ProxySQLリポジトリを使用します(proxysql_use_official_repoTrueに設定されています)。 ProxySQL自体は、Ubuntu 16.04以上のリリースのためのパッケージを提供していません。

新しいUbuntuリリースについては、proxysql_use_official_repoFalseに設定するか、 Perconaリポジトリを使用してください。

公式リポジトリのカバレッジについては、テストセクションを参照してください。

- hosts: proxysql
  vars:
    proxysql_use_official_repo: True
    proxysql_use_percona_repo: False
    proxysql_login_admin_host: 127.0.0.1
    proxysql_login_admin_password: admin
    proxysql_login_admin_port: 6032
    proxysql_login_admin_user: admin
    ...

3) Perconaリポジトリからのインストール

Perconaリポジトリを使用します(proxysql_use_percona_repoTrueに設定されています)。

Perconaリポジトリのカバレッジについては、テストセクションを参照してください。

- hosts: proxysql
  vars:
    proxysql_use_official_repo: False
    proxysql_use_percona_repo: True
    proxysql_login_admin_host: 127.0.0.1
    proxysql_login_admin_password: admin
    proxysql_login_admin_port: 6032
    proxysql_login_admin_user: admin
    ...

4) debまたはrpmパッケージからのインストール

GitHubリリースからProxySQLを直接インストールできます。proxysql_versionを定義するだけです。proxysql_use_official_repoproxysql_use_percona_repoFalseに設定してください。

- hosts: proxysql
  vars:
    proxysql_version: 1.4.15
    proxysql_use_official_repo: False
    proxysql_use_percona_repo: False
    proxysql_login_admin_host: 127.0.0.1
    proxysql_login_admin_password: admin
    proxysql_login_admin_port: 6032
    proxysql_login_admin_user: admin
    ...

5) 静的変数の変更後にProxySQLを再起動しない

静的変数の設定変更後に自分でProxySQLを再起動したい場合は、proxysql_restart_on_static_variables_changeFalseに設定する必要があります。

この場合、既知の問題に直面することになりますが、大したことではありません。この場合、冪等性テストが失敗します。

手動再起動後にAnsibleを再適用する必要はありません。

- hosts: proxysql
  vars:
    proxysql_use_official_repo: False
    proxysql_restart_on_static_variables_change: False
    proxysql_login_admin_host: 127.0.0.1
    proxysql_login_admin_password: admin
    proxysql_login_admin_port: 6032
    proxysql_login_admin_user: admin
    ...

既知の問題または:知っておくべきこと

1) Ubuntu 16.04でのProxySQL > 1.4.7(修正済み)

Ubuntu 16.04では、Ansible(バージョンは問わず)/ ProxySQL > 1.4.7が mysql-python / python-mysqldbを介して正しく通信できない問題があります。

例として、エラーメッセージ:

"serverを変更できません.. (1045, 'unrecognized token: \"\\'\\n  AND compression = 0\\n  AND weight = 1\\n  AND use_ssl = 0\\n  AND max_connections = 2000\\n  AND max_latency_ms = 0\\n  AND max_replication_lag = 5\"')"

注:

私は、Ubuntu 16.04でpipを使用してインストールした mysql-pythonで少し調査しましたが、python-mysqldbでも同様に失敗します。


MySQLdbのPythonライブラリでは、executeメソッド(クラスBaseCursor)が 次のようにクエリを生成します。

query = query % tuple([db.literal(item) for item in args])

db.literalConnectionクラスの一部で、単一オブジェクトを文字列として 返し、複数オブジェクトの場合はシーケンスとして返します。

def literal(self, o):
  # ...
  return self.escape(o, self.encoders)

self.escapeは 与えられたオブジェクト内のすべての特殊文字をエスケープする必要があり、 各タイプのクォート関数を提供するマッピング辞書を使用しています。 これはデフォルトで設定されているself.encodersで、MySQLdb.convertersを使用します。

文字列のマッピングはStringType: Thing2Literalです。したがって、文字列は Thing2Literalメソッドでエスケープされます。

def Thing2Literal(o, d):
  # ...
  return string_literal(o, d)

string_literalは 文字列オブジェクトをSQL文字列リテラルに変換する必要があります。 つまり、特殊なSQL文字はエスケープされ、シングルクォート内に囲まれます。 つまり、次のように処理されます:

"'%s'" % escape_string(str(obj))

エスケープ中に文字列が削除され、ただのシングルクォート(')を返します。

テストの間にProxySQLのバージョン以外は変更がなかったため、ProxySQLでの 変更(diff 1.4.7 vs. 1.4.8) がAnsibleの失敗を引き起こしていると考えられます。Ansible経由で起動されない ProxySQL自体は完全に正常に動作しています。


最後に...

この問題は、mysqlclient(MySQLdbのフォーク)をpipでインストールすることで解決されます。

2) Ubuntu > 16.04向けパッケージ(修正済み)

ProxySQL自体は、Ubuntu > 16.04向けの「最新」のパッケージを提供していません。 このAnsibleロールは、Ubuntu > 16.04向けに16.04リリースをダウンロードしてインストールすることで この問題を回避しています(この動作は将来的に変更される可能性があります)。

Ubuntu >= 18.04からは、libcrypto++6libssl1.0.0のパッケージ依存関係があります。 (これは自動的に解決されます)。

3) 非動的グローバル変数

ProxySQLには、ランタイム中に変更できないglobal_variablesがあります(詳細は [vars/main.yml](vars/main.yml)proxysql_non_dynamic_variablesを 参照してください)。これを考慮に入れると、ProxySQLロールは (proxysql.cnfを生成することによって)問題に対処し、静的変数が変更される場合は 自動再起動の可能性を提供しています(proxysql_restart_on_static_variables_changeTrueに設定)。

このロールは、ProxySQLデータベース内でもこの値を設定していますが、ここで問題が発生します:

1つ以上の静的変数を変更する場合、技術的にはすべてが正常に機能します。 ProxySQLは再起動し、新しい値をproxysql.cnfから取得します。ただし、データベース内で 変更されるのは最初の値だけです。

ProxySQL自体が構成ファイルから正しく値を取得するため、大きな問題ではありませんが、 次回のAnsible実行時に変更セットが表示され、以下を実行します:

  • 再びProxySQLを再起動
  • 冪等性テストが失敗します(最初からブートストラップしない場合)。

潜在的な解決策としては、ProxySQLデータベース内で proxysql_non_dynamic_variablesを設定しないことが考えられます。

4) ProxySQLクラスタリング

ProxySQLクラスタリングはまだ実験的です。クラスタリングのドキュメントからの引用:“この機能はまだ実験的であるため、テーブルは自動的にディスクから読み込まれません。”

proxysql.cnfから初期化するためには、hostname(明らかに)と port(デフォルト値を取らない)が定義されていることが重要です。

5) CentOS上のProxySQLとPerconaリポジトリ...

...依存関係の問題のために機能していません。

技術的には、Ansibleを正しく適用するために次のパッケージが必要です。

proxysql_dependency_pkgs:
  - MySQL-python
  - mysql

Perconaリポジトリが有効化されていると、MySQL-pythonmysqlのパッケージ依存関係が 競合します。

yum install MySQL-python
...
============================================================================================
 パッケージ                    アーキテクチャ  バージョン                 リポジトリ                サイズ
============================================================================================
 インストール中:
  MySQL-python              x86_64   1.2.5-1.el7             base                      90 k
  依存関係のインストール:
  Percona-Server-shared-56  x86_64   5.6.43-rel84.3.el7      percona-release-x86_64   619 k

トランザクション要約
============================================================================================
インストール  1 パッケージ(+1 依存パッケージ)
yum install mysql
...

============================================================================================
 パッケージ                          アーキテクチャ  バージョン             リポジトリ               サイズ
============================================================================================
 インストール中:
  Percona-Server-client-57         x86_64  5.7.24-27.1.el7    percona-release-x86_64  6.8 M
  依存関係のインストール:
  Percona-Server-shared-57         x86_64  5.7.24-27.1.el7    percona-release-x86_64  748 k
  Percona-Server-shared-compat-57  x86_64  5.7.24-27.1.el7    percona-release-x86_64  1.2 M

トランザクション要約
============================================================================================
インストール  1 パッケージ(+2 依存パッケージ)

ご覧のように、MySQL-pythonPercona-Server-shared-56に依存していますが、 mysqlPercona-Server-shared-57に依存しています。

テスト

Build Status

テストはDockerdocker_test_runnerで行われており、さまざまな 環境設定を持つ以下のコンテナが立ち上げられます:

  • CentOS 7
  • Debian 9 (Stretch)
  • Ubuntu 16.04 (Xenial Xerus)
  • Ubuntu 18.04 (Bionic Beaver)

すべてのコンテナにはAnsible 2.7.9がインストールされており、テストプレイブック が適用されます。

さらなる詳細と追加のチェックには、docker_test_runnerの設定Dockerエントリポイントをご覧ください。 次の表に高レベルの概要を示します:

ディストリビューション バージョン 公式リポジトリ Perconaリポジトリ パッケージ
CentOS 7 はい いいえ 1.4.15
Debian 9 はい はい 1.4.15
Ubuntu 16.04 はい はい 1.4.15
Ubuntu 18.04 いいえ はい 1.4.15
# ローカルでのテスト:
curl https://raw.githubusercontent.com/timorunge/docker-test-runner/master/install.sh | sh
./docker_test_runner.py -f tests/docker_test_runner.yml

Travisのビルド時間が公開リポジトリについて制限されているため、 自動テストは以下の環境に制限されています:

  • CentOS 7
  • Debian 8 (Jessie)
  • Debian 9 (Stretch)
  • Ubuntu 16.04 (Xenial Xerus)
  • Ubuntu 18.04 (Bionic Beaver)

依存関係

ライセンス

BSD 3-Clause "New"または"Revised" License

作者情報

  • Timo Runge
プロジェクトについて

This role is a fork from timorunge.proxysql. The role installs and configures ProxySQL - the high performance, high availability, protocol aware proxy for MySQL.

インストール
ansible-galaxy install vdzhorov.proxysql
ライセンス
bsd-3-clause
ダウンロード
114
所有者
Sysadmin and DevOps enthusiast.