Initial commit
This commit is contained in:
parent
871f8267ec
commit
db8abb89d8
12 changed files with 328 additions and 0 deletions
15
hosts.yml
Normal file
15
hosts.yml
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
---
|
||||||
|
# file: hosts
|
||||||
|
|
||||||
|
mariadb_cluster:
|
||||||
|
hosts:
|
||||||
|
db01:
|
||||||
|
ansible_host: 10.10.10.11
|
||||||
|
db02:
|
||||||
|
ansible_host: 10.10.10.12
|
||||||
|
|
||||||
|
vars:
|
||||||
|
mariadb_cluster_wsrep_cluster_name: "CustomCluster1"
|
||||||
|
mariadb_cluster_access_ip: "10.10.10.253"
|
||||||
|
ansible_user: ansible
|
||||||
|
|
7
mariadb_cluster.yml
Normal file
7
mariadb_cluster.yml
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
---
|
||||||
|
# file: mariadb_cluster.yml
|
||||||
|
|
||||||
|
- hosts: mariadb_cluster
|
||||||
|
become: true
|
||||||
|
roles:
|
||||||
|
- mariadb_cluster
|
5
roles/mariadb_cluster/defaults/main.yml
Normal file
5
roles/mariadb_cluster/defaults/main.yml
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
# file: roles/mariadb_cluster/defaults/main.yml
|
||||||
|
|
||||||
|
mariadb_cluster_wsrep_cluster_name: "my_wsrep_cluster"
|
||||||
|
mariadb_cluster_access_ip: ""
|
19
roles/mariadb_cluster/handlers/main.yml
Normal file
19
roles/mariadb_cluster/handlers/main.yml
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
---
|
||||||
|
# file: roles/mariadb_cluster/handlers/main.yml
|
||||||
|
|
||||||
|
- name: Daemon Reload
|
||||||
|
systemd:
|
||||||
|
daemon_reload: yes
|
||||||
|
|
||||||
|
- name: Restart mariadb
|
||||||
|
service:
|
||||||
|
name: mariadb
|
||||||
|
state: restarted
|
||||||
|
|
||||||
|
- name: Reload firewalld
|
||||||
|
service:
|
||||||
|
name: firewalld
|
||||||
|
state: reloaded
|
||||||
|
|
||||||
|
- name: Bootstrap Galera
|
||||||
|
include_tasks: tasks/bootstrap-galera.yml
|
14
roles/mariadb_cluster/tasks/bootstrap-galera.yml
Normal file
14
roles/mariadb_cluster/tasks/bootstrap-galera.yml
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
---
|
||||||
|
# file: roles/mariadb_cluster/tasks/bootstrap-galera.yml
|
||||||
|
|
||||||
|
- name: Stop MariaDB on first MariaDB Galera cluster node
|
||||||
|
service: name=mariadb state=stopped
|
||||||
|
when: inventory_hostname == groups['mariadb_cluster'][0]
|
||||||
|
|
||||||
|
- name: Bootstrap first MariaDB Galera cluster node
|
||||||
|
command: galera_new_cluster
|
||||||
|
when: inventory_hostname == groups['mariadb_cluster'][0]
|
||||||
|
|
||||||
|
- name: Restart the other MariaDB Galera cluster nodes
|
||||||
|
service: name=mariadb state=restarted
|
||||||
|
when: inventory_hostname != groups['mariadb_cluster'][0]
|
76
roles/mariadb_cluster/tasks/main.yml
Normal file
76
roles/mariadb_cluster/tasks/main.yml
Normal file
|
@ -0,0 +1,76 @@
|
||||||
|
---
|
||||||
|
# file: roles/mariadb_cluster/tasks/main.yml
|
||||||
|
|
||||||
|
- name: Create variable of other members IPs to be included into the cluster
|
||||||
|
set_fact: nodelist={%for host in groups['mariadb_cluster']|difference([inventory_hostname])%}{{hostvars[host].ansible_host}}{% if not loop.last %},{% endif %}{% endfor %}
|
||||||
|
|
||||||
|
- name: Install prereq packages
|
||||||
|
package:
|
||||||
|
name:
|
||||||
|
- mariadb-server-galera
|
||||||
|
- mariadb-server
|
||||||
|
- galera
|
||||||
|
state: latest
|
||||||
|
|
||||||
|
- name: Update galera config
|
||||||
|
template:
|
||||||
|
src: "galera.cnf.j2"
|
||||||
|
dest: "/etc/my.cnf.d/galera.cnf"
|
||||||
|
notify: Bootstrap Galera
|
||||||
|
|
||||||
|
- name: Enable firewall rule for MySQL access
|
||||||
|
firewalld:
|
||||||
|
port: 3306/tcp
|
||||||
|
permanent: yes
|
||||||
|
immediate: yes
|
||||||
|
state: enabled
|
||||||
|
notify: Reload firewalld
|
||||||
|
when: mariadb_cluster_access_ip == ""
|
||||||
|
|
||||||
|
- name: "Enable firewall rule for MySQL access to Access IP"
|
||||||
|
firewalld:
|
||||||
|
rich_rule: 'rule family="ipv4" source address="{{ mariadb_cluster_access_ip }}" port port="3306" protocol="tcp" accept'
|
||||||
|
permanent: yes
|
||||||
|
state: enabled
|
||||||
|
immediate: yes
|
||||||
|
notify: Reload firewalld
|
||||||
|
when: mariadb_cluster_access_ip != ""
|
||||||
|
|
||||||
|
- name: Setup access for other servers
|
||||||
|
include_tasks: setup-server.yml
|
||||||
|
loop: "{{ groups['mariadb_cluster']|difference([inventory_hostname]) }}"
|
||||||
|
loop_control:
|
||||||
|
extended: yes
|
||||||
|
|
||||||
|
- name: Place mariadb-fail script
|
||||||
|
template:
|
||||||
|
src: "mariadb-fail.j2"
|
||||||
|
dest: "/usr/local/sbin/mariadb-fail"
|
||||||
|
owner: root
|
||||||
|
mode: 755
|
||||||
|
|
||||||
|
- name: Deploy mariadb-fail service
|
||||||
|
template:
|
||||||
|
src: mariadb-fail.service.j2
|
||||||
|
dest: /etc/systemd/system/mariadb-fail.service
|
||||||
|
notify: Daemon Reload
|
||||||
|
|
||||||
|
- name: Create directory for mariadb override
|
||||||
|
file:
|
||||||
|
path: "/etc/systemd/system/mariadb.service.d"
|
||||||
|
state: directory
|
||||||
|
|
||||||
|
- name: Deploy mariadb override
|
||||||
|
template:
|
||||||
|
src: mariadb-override.conf.j2
|
||||||
|
dest: /etc/systemd/system/mariadb.service.d/override.conf
|
||||||
|
notify: Daemon Reload
|
||||||
|
|
||||||
|
- name: Flush handlers
|
||||||
|
meta: flush_handlers
|
||||||
|
|
||||||
|
- name: Start and enable mariadb
|
||||||
|
service:
|
||||||
|
name: mariadb
|
||||||
|
state: started
|
||||||
|
enabled: yes
|
34
roles/mariadb_cluster/tasks/setup-server.yml
Normal file
34
roles/mariadb_cluster/tasks/setup-server.yml
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
---
|
||||||
|
# file: roles/mariadb_cluster/tasks/setup-server.yml
|
||||||
|
|
||||||
|
- name: "{{ hostvars[item]['ansible_hostname'] }} - Enable firewall rule for Galera cluster replication traffic (TCP)"
|
||||||
|
firewalld:
|
||||||
|
rich_rule: 'rule family="ipv4" source address="{{ hostvars[item]["ansible_host"] }}" port port="4567" protocol="tcp" accept'
|
||||||
|
permanent: yes
|
||||||
|
state: enabled
|
||||||
|
immediate: yes
|
||||||
|
notify: Reload firewalld
|
||||||
|
|
||||||
|
- name: "{{ hostvars[item]['ansible_hostname'] }} - Enable firewall rule for Galera cluster replication traffic (UDP)"
|
||||||
|
firewalld:
|
||||||
|
rich_rule: 'rule family="ipv4" source address="{{ hostvars[item]["ansible_host"] }}" port port="4567" protocol="udp" accept'
|
||||||
|
permanent: yes
|
||||||
|
state: enabled
|
||||||
|
immediate: yes
|
||||||
|
notify: Reload firewalld
|
||||||
|
|
||||||
|
- name: "{{ hostvars[item]['ansible_hostname'] }} - Enable firewall rule for Incremental State Transfer"
|
||||||
|
firewalld:
|
||||||
|
rich_rule: 'rule family="ipv4" source address="{{ hostvars[item]["ansible_host"] }}" port port="4568" protocol="tcp" accept'
|
||||||
|
permanent: yes
|
||||||
|
state: enabled
|
||||||
|
immediate: yes
|
||||||
|
notify: Reload firewalld
|
||||||
|
|
||||||
|
- name: "{{ hostvars[item]['ansible_hostname'] }} - Enable firewall rule for State Snapshot Transfer"
|
||||||
|
firewalld:
|
||||||
|
rich_rule: 'rule family="ipv4" source address="{{ hostvars[item]["ansible_host"] }}" port port="4444" protocol="tcp" accept'
|
||||||
|
permanent: yes
|
||||||
|
state: enabled
|
||||||
|
immediate: yes
|
||||||
|
notify: Reload firewalld
|
125
roles/mariadb_cluster/templates/galera.cnf.j2
Normal file
125
roles/mariadb_cluster/templates/galera.cnf.j2
Normal file
|
@ -0,0 +1,125 @@
|
||||||
|
# This file contains wsrep-related mysqld options. It should be included
|
||||||
|
# in the main MySQL configuration file.
|
||||||
|
#
|
||||||
|
# Options that need to be customized:
|
||||||
|
# - wsrep_provider
|
||||||
|
# - wsrep_cluster_address
|
||||||
|
# - wsrep_sst_auth
|
||||||
|
# The rest of defaults should work out of the box.
|
||||||
|
|
||||||
|
##
|
||||||
|
## mysqld options _MANDATORY_ for correct opration of the cluster
|
||||||
|
##
|
||||||
|
[mysqld]
|
||||||
|
|
||||||
|
# (This must be substituted by wsrep_format)
|
||||||
|
binlog_format=ROW
|
||||||
|
|
||||||
|
# Currently only InnoDB storage engine is supported
|
||||||
|
default-storage-engine=innodb
|
||||||
|
|
||||||
|
# to avoid issues with 'bulk mode inserts' using autoinc
|
||||||
|
innodb_autoinc_lock_mode=2
|
||||||
|
|
||||||
|
# Override bind-address
|
||||||
|
# In some systems bind-address defaults to 127.0.0.1, and with mysqldump SST
|
||||||
|
# it will have (most likely) disastrous consequences on donor node
|
||||||
|
bind-address={{ ansible_host }}
|
||||||
|
|
||||||
|
##
|
||||||
|
## WSREP options
|
||||||
|
##
|
||||||
|
|
||||||
|
# Enable wsrep
|
||||||
|
wsrep_on=1
|
||||||
|
|
||||||
|
# Full path to wsrep provider library or 'none'
|
||||||
|
wsrep_provider=/usr/lib64/galera/libgalera_smm.so
|
||||||
|
|
||||||
|
# Provider specific configuration options
|
||||||
|
#wsrep_provider_options=
|
||||||
|
|
||||||
|
# Logical cluster name. Should be the same for all nodes.
|
||||||
|
wsrep_cluster_name="{{ mariadb_cluster_wsrep_cluster_name }}"
|
||||||
|
|
||||||
|
# Group communication system handle
|
||||||
|
wsrep_cluster_address="gcomm://{{ nodelist }}"
|
||||||
|
|
||||||
|
# Human-readable node name (non-unique). Hostname by default.
|
||||||
|
#wsrep_node_name=
|
||||||
|
|
||||||
|
# Base replication <address|hostname>[:port] of the node.
|
||||||
|
# The values supplied will be used as defaults for state transfer receiving,
|
||||||
|
# listening ports and so on. Default: address of the first network interface.
|
||||||
|
#wsrep_node_address=
|
||||||
|
|
||||||
|
# Address for incoming client connections. Autodetect by default.
|
||||||
|
#wsrep_node_incoming_address=
|
||||||
|
|
||||||
|
# How many threads will process writesets from other nodes
|
||||||
|
wsrep_slave_threads=1
|
||||||
|
|
||||||
|
# DBUG options for wsrep provider
|
||||||
|
#wsrep_dbug_option
|
||||||
|
|
||||||
|
# Generate fake primary keys for non-PK tables (required for multi-master
|
||||||
|
# and parallel applying operation)
|
||||||
|
wsrep_certify_nonPK=1
|
||||||
|
|
||||||
|
# Maximum number of rows in write set
|
||||||
|
wsrep_max_ws_rows=0
|
||||||
|
|
||||||
|
# Maximum size of write set
|
||||||
|
wsrep_max_ws_size=2147483647
|
||||||
|
|
||||||
|
# to enable debug level logging, set this to 1
|
||||||
|
wsrep_debug=0
|
||||||
|
|
||||||
|
# convert locking sessions into transactions
|
||||||
|
wsrep_convert_LOCK_to_trx=0
|
||||||
|
|
||||||
|
# how many times to retry deadlocked autocommits
|
||||||
|
wsrep_retry_autocommit=1
|
||||||
|
|
||||||
|
# change auto_increment_increment and auto_increment_offset automatically
|
||||||
|
wsrep_auto_increment_control=1
|
||||||
|
|
||||||
|
# retry autoinc insert, which failed for duplicate key error
|
||||||
|
wsrep_drupal_282555_workaround=0
|
||||||
|
|
||||||
|
# enable "strictly synchronous" semantics for read operations
|
||||||
|
wsrep_causal_reads=0
|
||||||
|
|
||||||
|
# Command to call when node status or cluster membership changes.
|
||||||
|
# Will be passed all or some of the following options:
|
||||||
|
# --status - new status of this node
|
||||||
|
# --uuid - UUID of the cluster
|
||||||
|
# --primary - whether the component is primary or not ("yes"/"no")
|
||||||
|
# --members - comma-separated list of members
|
||||||
|
# --index - index of this node in the list
|
||||||
|
wsrep_notify_cmd=
|
||||||
|
|
||||||
|
##
|
||||||
|
## WSREP State Transfer options
|
||||||
|
##
|
||||||
|
|
||||||
|
# State Snapshot Transfer method
|
||||||
|
wsrep_sst_method=rsync
|
||||||
|
|
||||||
|
# Address which donor should send State Snapshot to.
|
||||||
|
# Should be the address of THIS node. DON'T SET IT TO DONOR ADDRESS!!!
|
||||||
|
# (SST method dependent. Defaults to the first IP of the first interface)
|
||||||
|
#wsrep_sst_receive_address=
|
||||||
|
|
||||||
|
# SST authentication string. This will be used to send SST to joining nodes.
|
||||||
|
# Depends on SST method. For mysqldump method it is root:<root password>
|
||||||
|
wsrep_sst_auth=root:
|
||||||
|
|
||||||
|
# Desired SST donor name.
|
||||||
|
#wsrep_sst_donor=
|
||||||
|
|
||||||
|
# Reject client queries when donating SST (false)
|
||||||
|
#wsrep_sst_donor_rejects_queries=0
|
||||||
|
|
||||||
|
# Protocol version to use
|
||||||
|
# wsrep_protocol_version=
|
16
roles/mariadb_cluster/templates/mariadb-fail.j2
Normal file
16
roles/mariadb_cluster/templates/mariadb-fail.j2
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
if tail /var/log/mariadb/mariadb.log | grep -xq ".*\[ERROR\] WSREP\: wsrep\:\:connect.* failed: 7"
|
||||||
|
then
|
||||||
|
if grep -Fxq "safe_to_bootstrap: 1" /var/lib/mysql/grastate.dat
|
||||||
|
then
|
||||||
|
echo "Running bootstrap"
|
||||||
|
systemctl reset-failed mariadb
|
||||||
|
galera_new_cluster
|
||||||
|
else
|
||||||
|
echo "Not safe to bootstrap waiting to restart mariadb"
|
||||||
|
sleep 120
|
||||||
|
systemctl reset-failed mariadb
|
||||||
|
systemctl restart mariadb
|
||||||
|
fi
|
||||||
|
fi
|
5
roles/mariadb_cluster/templates/mariadb-fail.service.j2
Normal file
5
roles/mariadb_cluster/templates/mariadb-fail.service.j2
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
[Unit]
|
||||||
|
Description=MariaDB Fail Service
|
||||||
|
[Service]
|
||||||
|
Type=oneshot
|
||||||
|
ExecStart="/usr/local/sbin/mariadb-fail"
|
8
roles/mariadb_cluster/templates/mariadb-override.conf.j2
Normal file
8
roles/mariadb_cluster/templates/mariadb-override.conf.j2
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
[Unit]
|
||||||
|
OnFailure=mariadb-fail.service
|
||||||
|
StartLimitIntervalSec=120s
|
||||||
|
StartLimitBurst=2
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Restart=on-failure
|
||||||
|
RestartSec=10s
|
4
site.yml
Normal file
4
site.yml
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
---
|
||||||
|
## This playbook deploys the whole application stack in this site.
|
||||||
|
|
||||||
|
- import_playbook: mariadb_cluster.yml
|
Loading…
Reference in a new issue