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ロールはこの機能を使用しつつ、以下のような (役立つことを願って)機能を追加しています:
- 異なるオペレーティングシステム用の自動インストール
- proxysql.cnfの(事前)生成
- ProxySQL-Clusterを管理(ProxySQLサーバーを構成する機能を追加するカスタムモジュールを使用)
- 動的と静的な
global_variables
を区別 - 必要に応じてProxySQLを再起動
この文書の"既知の問題または:知っておくべきこと"のセクションもご覧ください。
必要条件
この役割は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_repo
がFalse
に設定されています)。
これは基本的に(いくつかの小さな変更を加えた)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_repo
がTrue
に設定されています)。
ProxySQL自体は、Ubuntu 16.04以上のリリースのためのパッケージを提供していません。
新しいUbuntuリリースについては、proxysql_use_official_repo
をFalse
に設定するか、
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_repo
がTrue
に設定されています)。
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_repo
と
proxysql_use_percona_repo
をFalse
に設定してください。
- 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_change
をFalse
に設定する必要があります。
この場合、既知の問題に直面することになりますが、大したことではありません。この場合、冪等性テストが失敗します。
手動再起動後に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.literal
はConnection
クラスの一部で、単一オブジェクトを文字列として
返し、複数オブジェクトの場合はシーケンスとして返します。
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++6
とlibssl1.0.0
のパッケージ依存関係があります。
(これは自動的に解決されます)。
3) 非動的グローバル変数
ProxySQLには、ランタイム中に変更できないglobal_variables
があります(詳細は
[vars/main.yml](vars/main.yml)
のproxysql_non_dynamic_variables
を
参照してください)。これを考慮に入れると、ProxySQLロールは
(proxysql.cnf
を生成することによって)問題に対処し、静的変数が変更される場合は
自動再起動の可能性を提供しています(proxysql_restart_on_static_variables_change
を
True
に設定)。
このロールは、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-python
とmysql
のパッケージ依存関係が
競合します。
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-python
はPercona-Server-shared-56
に依存していますが、
mysql
はPercona-Server-shared-57
に依存しています。
テスト
テストはDockerと docker_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)
依存関係
- proxysql_proxysql_servers.py これはこの役割のライブラリフォルダに追加されています。
ライセンス
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