diff --git a/.gitignore b/.gitignore index 1fc694ba9..f09357900 100644 --- a/.gitignore +++ b/.gitignore @@ -29,9 +29,6 @@ oldcode/tests/connect_speed *.swp -# CTags -.tags -.tags_sorted_by_file # SQLITE files *.db diff --git a/Makefile b/Makefile index a66fe8f6d..9f3632308 100644 --- a/Makefile +++ b/Makefile @@ -168,7 +168,7 @@ cleanall: rm binaries/*deb || true rm binaries/*rpm || true -install: src/proxysql install-proxysql-consul +install: src/proxysql install -m 0755 src/proxysql /usr/local/bin install -m 0600 etc/proxysql.cnf /etc install -m 0755 etc/init.d/proxysql /etc/init.d @@ -176,20 +176,10 @@ install: src/proxysql install-proxysql-consul update-rc.d proxysql defaults .PHONY: install -install-proxysql-consul: - install -m 0755 integrations/consul/proxysql-consul /usr/local/bin - install -m 0600 integrations/consul/proxysql-consul.cnf /etc -.PHONY: install-proxysql-consul - -uninstall: uninstall-proxysql-consul +uninstall: rm /etc/init.d/proxysql rm /etc/proxysql.cnf rm /usr/local/bin/proxysql rmdir /var/lib/proxysql 2>/dev/null || true update-rc.d proxysql remove .PHONY: uninstall - -uninstall-proxysql-consul: - rm /usr/local/bin/proxysql-consul - rm /etc/proxysql-consul.cnf -.PHONY: uninstall-proxysql-consul \ No newline at end of file diff --git a/include/proxysql_admin.h b/include/proxysql_admin.h index 1c30d069b..1039b1219 100644 --- a/include/proxysql_admin.h +++ b/include/proxysql_admin.h @@ -112,16 +112,12 @@ class ProxySQL_Admin { void flush_mysql_servers__from_memory_to_disk(); void flush_mysql_servers__from_disk_to_memory(); void flush_mysql_query_rules__from_memory_to_disk(); - void flush_mysql_query_rules__from_disk_to_memory(); - bool save_mysql_query_rules_to_cluster(); + void flush_mysql_query_rules__from_disk_to_memory(); void load_mysql_servers_to_runtime(); void save_mysql_servers_from_runtime(); - bool save_mysql_servers_to_cluster(); char * load_mysql_query_rules_to_runtime(); void save_mysql_query_rules_from_runtime(bool); - int save_config_to_cluster(char *tablename); - void load_admin_variables_to_runtime() { flush_admin_variables___database_to_runtime(admindb, true); } void save_admin_variables_from_runtime() { flush_admin_variables___runtime_to_database(admindb, true, true, false); } diff --git a/integrations/consul/consul.cfg b/integrations/consul/consul.cfg deleted file mode 100644 index 15724e3c6..000000000 --- a/integrations/consul/consul.cfg +++ /dev/null @@ -1,9 +0,0 @@ -{ - "watches": [ - { - "type": "keyprefix", - "prefix": "proxysql/", - "handler": "proxysql-consul update" - } - ] -} diff --git a/integrations/consul/consul_data_format.md b/integrations/consul/consul_data_format.md deleted file mode 100644 index 1476dc11d..000000000 --- a/integrations/consul/consul_data_format.md +++ /dev/null @@ -1,51 +0,0 @@ -proxysql-consul writes table contents read from ProxySQL's admin interface to Consul's key/value store. proxysql-consul uses one key for each table and each key is prefixed with 'proxysql' so that all ProxySQL keys live in their own namespace. - -Example: -``` -key: proxysql/mysql_servers -``` - -The value written is a JSON with multiple fields: -- table - the name of the table. -- uuid - unique identifier of the proxysql-consul instance. -- rows - content of the table as an array of rows. Each row is an array of string values. - -Example: -``` -{ - "table":"mysql_servers", - "rows":[ - [ - "0", - "127.0.0.1", - "3306", - "ONLINE", - "1", - "0", - "1000", - "10" - ], - [ - "0", - "/var/lib/mysql/mysql.sock", - "0", - "ONLINE", - "1", - "0", - "1000", - "0" - ] - ], - "uuid":"aae13abd-2a76-4882-afd3-0b2369e02b07" -} -``` - -The value corresponds to the following mysql_servers dump: -``` -+--------------+---------------------------+------+--------+--------+-------------+-----------------+---------------------+ -| hostgroup_id | hostname | port | status | weight | compression | max_connections | max_replication_lag | -+--------------+---------------------------+------+--------+--------+-------------+-----------------+---------------------+ -| 0 | 127.0.0.1 | 3306 | ONLINE | 1 | 0 | 1000 | 10 | -| 0 | /var/lib/mysql/mysql.sock | 0 | ONLINE | 1 | 0 | 1000 | 0 | -+--------------+---------------------------+------+--------+--------+-------------+-----------------+---------------------+ -``` diff --git a/integrations/consul/proxysql-consul b/integrations/consul/proxysql-consul deleted file mode 100755 index c96cda0c0..000000000 --- a/integrations/consul/proxysql-consul +++ /dev/null @@ -1,217 +0,0 @@ -#!/usr/bin/env python - -""" -Usage: - proxysql-consul put [--config-file=] - proxysql-consul update [--config-file=] - proxysql-consul (-h | --help) - -Options: - -h --help - Show this screen. - --config-file= - Path to config file [default: /etc/proxysql-consul.cnf]. - -""" - -from docopt import docopt -import base64 -import json -import os -import requests -import sys -import uuid - -import MySQLdb - - -CFG_PATH = '/etc/proxysql-consul.cnf' -CFG_UUID_FILE = 'uuid_file' -CFG_UUID = 'uuid' -CFG_CONSUL_IFACE = 'consul_iface' -CFG_CONSUL_PORT = 'consul_port' -CFG_PROXY_IFACE = 'proxysql_admin_iface' -CFG_PROXY_PORT = 'proxysql_admin_port' -CFG_PROXY_USERNAME = 'proxysql_admin_username' -CFG_PROXY_PASSWORD = 'proxysql_admin_password' - -# Proxysql config types to Consul key mapping -TABLE_TO_KEY = { - 'mysql_servers': 'proxysql/mysql_servers', - 'mysql_query_rules': 'proxysql/mysql_query_rules' - } - -SAVE_QUERY_BY_TABLE = { - 'mysql_servers': 'SAVE MYSQL SERVERS TO MEMORY', - 'mysql_query_rules': 'SAVE MYSQL QUERY RULES TO MEMORY' - } - -LOAD_QUERY_BY_TABLE = { - 'mysql_servers': 'LOAD MYSQL SERVERS FROM MEMORY', - 'mysql_query_rules': 'LOAD MYSQL QUERY RULES FROM MEMORY' - } - -config = {} - - -def read_config_from_file(): - global config - with open(CFG_PATH) as config_file: - config_data = config_file.read() - config = json.loads(config_data) - - # TODO(ipruanche) validate config - - -def read_uuid_from_file(): - """ - Reads the UUID identifying this script instance from a file store. If the - file does not exist creates it and writes a new UUID. - - Puts the UUID in the config dictionary. - """ - uuid_file_path = config[CFG_UUID_FILE] - - if not os.path.isfile(uuid_file_path): - _uuid = str(uuid.uuid4()) - with open(uuid_file_path, 'w') as uuid_file: - uuid_file.write(_uuid) - else: - with open(uuid_file_path, 'r') as uuid_file: - _uuid = uuid_file.read() - config[CFG_UUID] = _uuid - -def fetch_proxysql_config(table): - admin_connection = MySQLdb.connect(config[CFG_PROXY_IFACE], - config[CFG_PROXY_USERNAME], - config[CFG_PROXY_PASSWORD], - port=config[CFG_PROXY_PORT], - db='main') - - # save runtime config to memory so we can read them - cursor = admin_connection.cursor() - save_query = SAVE_QUERY_BY_TABLE[table] - cursor.execute(save_query) - cursor.close() - - # read runtime config from memory - cursor = admin_connection.cursor() - cursor.execute('SELECT * FROM %s' % table) - rows = cursor.fetchall() - cursor.close() - admin_connection.close() - return rows - - -def put_config_to_consul(table): - if table not in TABLE_TO_KEY: - print 'Unknown config table. Exiting.' - exit(1) - - rows = fetch_proxysql_config(table) - consul_data = {} - consul_data['table'] = table - consul_data['rows'] = rows - consul_data['uuid'] = config[CFG_UUID] - consul_data_json = json.dumps(consul_data) - - key = TABLE_TO_KEY[table] - consul_iface = config[CFG_CONSUL_IFACE] - consul_port = config[CFG_CONSUL_PORT] - - url = 'http://%s:%s/v1/kv/%s' % (consul_iface, consul_port, key) - r = requests.put(url, data=consul_data_json) - r.raise_for_status() - print 'Configs pushed successfully.' - - -def build_multivalue_insert(table, rows): - # add quotes arround all values to make them strings in the sql query - quoted_values = [['"' + x + '"' for x in row] for row in rows] - # join each row in a values() group - row_join = [','.join(x) for x in quoted_values] - query = 'INSERT INTO %s VALUES(%s)' % (table, '),('.join(row_join)) - return query - -def update_proxysql_runtime_config(table, rows): - admin_connection = MySQLdb.connect(config[CFG_PROXY_IFACE], - config[CFG_PROXY_USERNAME], - config[CFG_PROXY_PASSWORD], - port=config[CFG_PROXY_PORT], - db='main') - - # clear table - cursor = admin_connection.cursor() - cursor.execute('DELETE FROM %s' % table) - cursor.close() - - # insert values from Consul - insert_query = build_multivalue_insert(table, rows) - cursor = admin_connection.cursor() - cursor.execute(insert_query) - cursor.close() - - # commit changes to runtine - load_query = LOAD_QUERY_BY_TABLE[table] - cursor = admin_connection.cursor() - cursor.execute(load_query) - cursor.close() - - admin_connection.close() - - -def update_config(): - """ - Reads all input from stdin that is passed by Consul and extracts the config - that was modified. - - Consul is configured to watch all proxysql keys and returns all their values - when one key is modified. To determine the value that was actually modified - we use the CONSUL_INDEX env var written by Consul. This should match the - 'ModifyIndex' field of the value that triggered the watch. - - Values are returned as a JSON array. The actual value content is stored in - the 'Value' field, base64 encoded. - """ - if 'CONSUL_INDEX' not in os.environ: - print 'Missing consul index on update request' - exit(1) - consul_index = int(os.environ['CONSUL_INDEX']) - consul_data = sys.stdin.read() - - updated_value = None - values = json.loads(consul_data) - for value in values: - if 'ModifyIndex' in value and value['ModifyIndex'] == consul_index: - updated_value = value - break - if not updated_value: - print 'Failed to determine updated config from Consul data' - exit(1) - - proxysql_config_json = base64.b64decode(updated_value['Value']) - proxysql_config = json.loads(proxysql_config_json) - table = proxysql_config['table'] - rows = proxysql_config['rows'] - _uuid = proxysql_config['uuid'] - - if not rows: - print 'Empty config set for table: %s.' % table - return - if _uuid == config[CFG_UUID]: - print 'Ignoring self update.' - return - - update_proxysql_runtime_config(table, rows) - print 'Configs updated successfully.' - -if __name__ == '__main__': - arguments = docopt(__doc__, version='proxysql-consul 1.0') - read_config_from_file() - read_uuid_from_file() - - if arguments['put']: - put_config_to_consul(arguments['
']) - elif arguments['update']: - update_config() - diff --git a/integrations/consul/proxysql-consul.cnf b/integrations/consul/proxysql-consul.cnf deleted file mode 100644 index c761494c4..000000000 --- a/integrations/consul/proxysql-consul.cnf +++ /dev/null @@ -1,9 +0,0 @@ -{ - "uuid_file": "/var/lib/proxysql/proxysql-consul.uuid", - "consul_iface": "127.0.0.1", - "consul_port": "8500", - "proxysql_admin_iface": "127.0.0.1", - "proxysql_admin_port": 6032, - "proxysql_admin_username": "admin", - "proxysql_admin_password": "admin" -} diff --git a/lib/ProxySQL_Admin.cpp b/lib/ProxySQL_Admin.cpp index 651fba19f..21603a533 100644 --- a/lib/ProxySQL_Admin.cpp +++ b/lib/ProxySQL_Admin.cpp @@ -1,13 +1,10 @@ #include "proxysql.h" #include "cpp.h" -#include #include #include #include #include -#include -#include #include #include #include @@ -797,19 +794,6 @@ bool admin_handler_command_load_or_save(char *query_no_space, unsigned int query SPA->send_MySQL_OK(&sess->client_myds->myprot, NULL); return false; } - - if (query_no_space_length==strlen("SAVE MYSQL SERVERS TO CLUSTER") && !strncasecmp("SAVE MYSQL SERVERS TO CLUSTER", query_no_space, query_no_space_length)) { - proxy_info("Received %s command\n", query_no_space); - ProxySQL_Admin *SPA=(ProxySQL_Admin *)pa; - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Pushed mysql servers from RUNTIME to cluster\n"); - bool success = SPA->save_mysql_servers_to_cluster(); - if (success) { - SPA->send_MySQL_OK(&sess->client_myds->myprot, NULL); - } else { - SPA->send_MySQL_ERR(&sess->client_myds->myprot, NULL); - } - return false; - } } if ((query_no_space_length>23) && ( (!strncasecmp("SAVE MYSQL QUERY RULES ", query_no_space, 23)) || (!strncasecmp("LOAD MYSQL QUERY RULES ", query_no_space, 23))) ) { @@ -909,19 +893,6 @@ bool admin_handler_command_load_or_save(char *query_no_space, unsigned int query SPA->send_MySQL_OK(&sess->client_myds->myprot, NULL); return false; } - - if (query_no_space_length==strlen("SAVE MYSQL QUERY RULES TO CLUSTER") && !strncasecmp("SAVE MYSQL QUERY RULES TO CLUSTER", query_no_space, query_no_space_length)) { - proxy_info("Received %s command\n", query_no_space); - ProxySQL_Admin *SPA=(ProxySQL_Admin *)pa; - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Pushed mysql query rules from RUNTIME to cluster\n"); - bool success = SPA->save_mysql_query_rules_to_cluster(); - if (success) { - SPA->send_MySQL_OK(&sess->client_myds->myprot, NULL); - } else { - SPA->send_MySQL_ERR(&sess->client_myds->myprot, NULL); - } - return false; - } } if ((query_no_space_length>21) && ( (!strncasecmp("SAVE ADMIN VARIABLES ", query_no_space, 21)) || (!strncasecmp("LOAD ADMIN VARIABLES ", query_no_space, 21))) ) { @@ -3467,50 +3438,6 @@ void ProxySQL_Admin::load_mysql_servers_to_runtime() { } -// Gets a copy of the runtime mysql servers config and passes is to an external script for distribution -// to other ProxySQL instances. Returns true in case of success and false in case of failure. -bool ProxySQL_Admin::save_mysql_servers_to_cluster() { - char *tablename = (char *)"mysql_servers"; - int status_code = save_config_to_cluster(tablename); - return status_code == 0; -} - -// Gets a copy of the runtime mysql query rules config and passes is to an external script for distribution -// to other ProxySQL instances. Returns true in case of success and false in case of failure. -bool ProxySQL_Admin::save_mysql_query_rules_to_cluster() { - char *tablename = (char *)"mysql_query_rules"; - int status_code = save_config_to_cluster(tablename); - return status_code == 0; -} - -// Runs external config distribution script passing it the given table name. The script will use the admin -// interface to read the contents of the table. -int ProxySQL_Admin::save_config_to_cluster(char *tablename) { - pid_t pid = fork(); - if (pid == 0) { - // child - errno = 0; - int exec_status = execlp("/usr/local/bin/proxysql-consul", "/usr/local/bin/proxysql-consul", "put", tablename, (char *) 0); - if (exec_status == -1) { - proxy_error("Exec failed for config save script with errno: %d.\n", errno); - } - _exit(0); - } else if (pid < 0) { - // failed to fork - proxy_error("Failed to fork for saving config.\n"); - return -1; - } else { - // parent - int status_code; - waitpid(pid, &status_code, 0); - if (!WIFEXITED(status_code)) { - proxy_error("Config save script exited with an error: %d.\n", WEXITSTATUS(status_code)); - } - proxy_info("Config save script exited with status code: %d.\n", status_code); - return status_code; - } -} - char * ProxySQL_Admin::load_mysql_query_rules_to_runtime() { char *error=NULL; int cols=0;