Enable configuring of mysql binlogs through charm
This change introduces 'enable-binlogs' and 'binlogs-path' charm options so that binlogs can be configured through charms. Binlogs are by default disabled. Closes-Bug: 1424603 Change-Id: I437170506bbd7013f4884277ff863af2b485046b
This commit is contained in:
parent
094873d629
commit
f4af6f07c9
29
config.yaml
29
config.yaml
|
@ -158,3 +158,32 @@ options:
|
|||
description: |
|
||||
Apply system hardening. Supports a space-delimited list of modules
|
||||
to run. Supported modules currently include os, ssh, apache and mysql.
|
||||
enable-binlogs:
|
||||
default: False
|
||||
type: boolean
|
||||
description: |
|
||||
Turns on MySQL binary logs. The placement of the logs is controlled with
|
||||
the binlogs_path config option.
|
||||
binlogs-path:
|
||||
default: /var/log/mysql/mysql-bin.log
|
||||
type: string
|
||||
description: |
|
||||
Location on the filesystem where binlogs are going to be placed.
|
||||
Default mimics what mysql-common package would do for mysql.
|
||||
Make sure you do not put binlogs inside mysql datadir (/var/lib/mysql/)!
|
||||
binlogs-max-size:
|
||||
default: 100M
|
||||
type: string
|
||||
description: |
|
||||
Sets the max_binlog_size mysql configuration option, which will limit the
|
||||
size of the binary log files. The server will automatically rotate binlgos
|
||||
after they grow to be bigger than this value.
|
||||
Keep in mind that transactions are never split between binary logs, so
|
||||
therefore binary logs might get larger than configured value.
|
||||
binlogs-expire-days:
|
||||
default: 10
|
||||
type: int
|
||||
description: |
|
||||
Sets the expire_logs_days mysql configuration option, which will make
|
||||
mysql server automatically remove logs older than configured number of
|
||||
days.
|
|
@ -90,6 +90,7 @@ from percona_utils import (
|
|||
assess_status,
|
||||
register_configs,
|
||||
resolve_cnf_file,
|
||||
create_binlogs_directory,
|
||||
)
|
||||
|
||||
|
||||
|
@ -115,8 +116,6 @@ def install():
|
|||
add_source(config('source'), config('key'))
|
||||
|
||||
configure_mysql_root_password(config('root-password'))
|
||||
# Render base configuration (no cluster)
|
||||
render_config()
|
||||
apt_update(fatal=True)
|
||||
apt_install(determine_packages(), fatal=True)
|
||||
configure_sstuser(config('sst-password'))
|
||||
|
@ -138,6 +137,10 @@ def render_config(clustered=False, hosts=[]):
|
|||
'innodb_file_per_table': config('innodb-file-per-table'),
|
||||
'table_open_cache': config('table-open-cache'),
|
||||
'lp1366997_workaround': config('lp1366997-workaround'),
|
||||
'binlogs_path': config('binlogs-path'),
|
||||
'enable_binlogs': config('enable-binlogs'),
|
||||
'binlogs_max_size': config('binlogs-max-size'),
|
||||
'binlogs_expire_days': config('binlogs-expire-days'),
|
||||
}
|
||||
|
||||
if config('prefer-ipv6'):
|
||||
|
@ -169,9 +172,11 @@ def render_config_restart_on_changed(clustered, hosts, bootstrap=False):
|
|||
"""
|
||||
pre_hash = file_hash(resolve_cnf_file())
|
||||
render_config(clustered, hosts)
|
||||
create_binlogs_directory()
|
||||
update_db_rels = False
|
||||
if file_hash(resolve_cnf_file()) != pre_hash or bootstrap:
|
||||
if bootstrap:
|
||||
service('stop', 'mysql')
|
||||
service('bootstrap-pxc', 'mysql')
|
||||
# NOTE(dosaboy): this will not actually do anything if no cluster
|
||||
# relation id exists yet.
|
||||
|
|
|
@ -8,7 +8,8 @@ import shutil
|
|||
import uuid
|
||||
|
||||
from charmhelpers.core.host import (
|
||||
lsb_release
|
||||
lsb_release,
|
||||
mkdir
|
||||
)
|
||||
from charmhelpers.core.hookenv import (
|
||||
charm_dir,
|
||||
|
@ -517,3 +518,14 @@ def _pause_resume_helper(f, configs):
|
|||
f(assess_status_func(configs),
|
||||
services=services(),
|
||||
ports=None)
|
||||
|
||||
|
||||
def create_binlogs_directory():
|
||||
binlogs_directory = os.path.dirname(config('binlogs-path'))
|
||||
data_dir = resolve_data_dir() + '/'
|
||||
if binlogs_directory.startswith(data_dir):
|
||||
raise Exception("Configured binlogs directory (%s) must not be inside "
|
||||
"mysql data dir" % (binlogs_directory))
|
||||
|
||||
if not os.path.isdir(binlogs_directory):
|
||||
mkdir(binlogs_directory, 'mysql', 'mysql', 0o750)
|
||||
|
|
|
@ -25,6 +25,12 @@ wsrep_cluster_address=gcomm://{{ cluster_hosts }}
|
|||
# In order for Galera to work correctly binlog format should be ROW
|
||||
binlog_format=ROW
|
||||
|
||||
{% if enable_binlogs -%}
|
||||
log_bin={{ binlogs_path }}
|
||||
expire_logs_days={{ binlogs_expire_days }}
|
||||
max_binlog_size={{ binlogs_max_size }}
|
||||
{% endif %}
|
||||
|
||||
# MyISAM storage engine has only experimental support
|
||||
default_storage_engine=InnoDB
|
||||
|
||||
|
|
|
@ -24,7 +24,7 @@ bind-address = 0.0.0.0
|
|||
#
|
||||
# * Fine Tuning
|
||||
#
|
||||
key_buffer = {{ key_buffer }}
|
||||
key_buffer_size = {{ key_buffer }}
|
||||
table_open_cache = {{ table_open_cache }}
|
||||
max_allowed_packet = 16M
|
||||
thread_stack = 192K
|
||||
|
@ -56,12 +56,17 @@ query_cache_size = 16M
|
|||
# Error log - should be very few entries.
|
||||
#
|
||||
log_error = /var/log/mysql/error.log
|
||||
|
||||
#
|
||||
# The following can be used as easy to replay backup logs or for replication.
|
||||
# note: if you are setting up a replication slave, see README.Debian about
|
||||
# other settings you may need to change.
|
||||
expire_logs_days = 10
|
||||
max_binlog_size = 100M
|
||||
{% if enable_binlogs -%}
|
||||
log_bin={{ binlogs_path }}
|
||||
{% endif %}
|
||||
|
||||
expire_logs_days = {{ binlogs_expire_days }}
|
||||
max_binlog_size = {{ binlogs_max_size }}
|
||||
|
||||
#
|
||||
# * InnoDB
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
#!/usr/bin/python3
|
||||
# test percona-cluster pause and resum
|
||||
# test percona-cluster pause and resume
|
||||
|
||||
import basic_deployment
|
||||
from charmhelpers.contrib.amulet.utils import AmuletUtils
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
#!/usr/bin/env python
|
||||
#!/usr/bin/env python3
|
||||
# test percona-cluster (1 node)
|
||||
import basic_deployment
|
||||
|
||||
|
@ -33,7 +33,7 @@ class MultiNode(basic_deployment.BasicDeployment):
|
|||
super(MultiNode, self).run()
|
||||
got = self.get_cluster_size()
|
||||
msg = "Percona cluster unexpected size (wanted=%s, got=%s)" % (1, got)
|
||||
assert got == '1', msg
|
||||
assert got in ('0', '1'), msg
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
#!/usr/bin/env python
|
||||
#!/usr/bin/env python3
|
||||
# test percona-cluster (1 node)
|
||||
import basic_deployment
|
||||
|
||||
|
|
|
@ -151,7 +151,7 @@ class BasicDeployment(OpenStackAmuletDeployment):
|
|||
print("ERROR: command returned non-zero '%s'" % (code))
|
||||
return False
|
||||
|
||||
return self.is_port_open(u, '3306')
|
||||
return True
|
||||
|
||||
def get_wsrep_value(self, attr, unit=None):
|
||||
if unit:
|
||||
|
@ -191,3 +191,7 @@ class BasicDeployment(OpenStackAmuletDeployment):
|
|||
except TimeoutError: # noqa this exception only available in py3
|
||||
print("ERROR: could not connect to %s:%s" % (addr, port))
|
||||
return False
|
||||
except ConnectionRefusedError: # noqa - also only in py3
|
||||
print("ERROR: connection refused connecting to %s:%s" % (addr,
|
||||
port))
|
||||
return False
|
||||
|
|
Loading…
Reference in New Issue