summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorroot <root@vps-18a7a2b7.vps.ovh.ca>2024-01-21 11:44:18 -0500
committerroot <root@vps-18a7a2b7.vps.ovh.ca>2024-01-21 11:44:18 -0500
commitf7a4cd6b4bf04269a675c8856fe9625a1b7817c1 (patch)
treeb6de079c7dad21344442b460751c726b41aa2181
parent1e6869e7730389e64fd70b8aa30034758a4fe392 (diff)
move hosting-tools config into /etc/hosting-tools
-rwxr-xr-xsrc/mariadb-push-replica.sh2
-rwxr-xr-xwip/mariadb-push-replica.sh211
2 files changed, 1 insertions, 212 deletions
diff --git a/src/mariadb-push-replica.sh b/src/mariadb-push-replica.sh
index c8e1e0a..69b9edf 100755
--- a/src/mariadb-push-replica.sh
+++ b/src/mariadb-push-replica.sh
@@ -3,7 +3,7 @@ set -e
3PATH=$(dirname "$0"):$PATH 3PATH=$(dirname "$0"):$PATH
4source rpc.bash 4source rpc.bash
5 5
6datadir=data 6datadir=/etc/hosting-tools
7default_replica_host_file=$datadir/default-replica-host 7default_replica_host_file=$datadir/default-replica-host
8replication_password_file=$datadir/replication-password 8replication_password_file=$datadir/replication-password
9 9
diff --git a/wip/mariadb-push-replica.sh b/wip/mariadb-push-replica.sh
deleted file mode 100755
index c4df851..0000000
--- a/wip/mariadb-push-replica.sh
+++ /dev/null
@@ -1,211 +0,0 @@
1#!/bin/bash
2set -e
3PATH=./src:$PATH
4source rpc.bash
5
6default_replica_host_file=data/default-replica-host
7replication_password_file=data/replication-password
8
9if [ -r "$default_replica_host_file" ]
10then
11 read default_replica_host < "$default_replica_host_file"
12fi
13
14gen_password()
15{
16 generated_password_length=32
17 generated_password=$(tr -cd a-zA-Z0-9 < /dev/urandom | head -c "$generated_password_length")
18 [ "${#generated_password}" -eq "$generated_password_length" ]
19 printf '%s\n' "$generated_password"
20}
21
22if ! [ -e "$replication_password_file" ]
23then
24 gen_password > "$replication_password_file"
25fi
26
27if [ -r "$replication_password_file" ]
28then
29 read replication_password < "$replication_password_file"
30 [ "${#replication_password}" -ge 30 ]
31fi
32
33primary_host=$(hostname --fqdn)
34replica_host=${1:-$default_replica_host}
35replication_user=replication
36
37[ "$primary_host" ]
38[ "$replica_host" ]
39[ "$replication_password" ]
40
41run_primary()
42{
43 (set -x
44 : primary : $1 $2 ${3:+ ...})
45 BASH_RPC_REMOTE_DEST=$primary_host remote_run_function "$@"
46}
47
48run_replica()
49{
50 (set -x
51 : replica : $1 $2 ${3:+ ...})
52 BASH_RPC_REMOTE_DEST=$replica_host remote_run_function "$@"
53}
54
55show_hostnames()
56{
57 printf \
58 "==> %s %s <==\n %s\n" \
59 "$(hostname -A)" \
60 "$(hostname -I)" \
61 "$(uptime)"
62}
63
64check_db()
65{
66 show_hostnames
67 mariadb --skip-reconnect -t <<END
68select @@hostname, @@server_id, @@gtid_slave_pos, @@sql_log_bin;
69END
70}
71
72create_backup()
73{
74 set -e
75 mariabackup_target_dir=/var/mariadb/backup
76 binlog_info_file=$mariabackup_target_dir/xtrabackup_binlog_info
77 [ -e "$binlog_info_file" ] && return
78 mkdir -p "$mariabackup_target_dir"
79 marialog=$(mktemp)
80 e=0
81 (set -- \
82 -u root \
83 --target-dir="$mariabackup_target_dir"
84 exec >"$marialog" 2>&1
85 set -x
86 mariabackup --backup --rsync "$@"
87 mariabackup --prepare "$@") || e=$?
88 if [ "$e" = 0 -a -e "$binlog_info_file" ]
89 then
90 tail -v -n2 "$marialog" >&2
91 rm "$marialog"
92 else
93 cat "$marialog" >&2
94 false
95 fi
96}
97
98delete_backup()
99{
100 set -x
101 rm -r /var/mariadb/backup
102}
103
104send_backup()
105{
106 mariabackup_target_dir=/var/mariadb/backup
107 set -x
108 rsync -zaR -- /./"${mariabackup_target_dir#/}" "$1":/
109}
110
111restore_from_backup()
112{
113 livedb=/var/lib/mysql
114 mariabackup_target_dir=/var/mariadb/backup
115 set -e
116 if [ -e "$livedb" ]
117 then
118 if [ "$(systemctl is-active mariadb)" = active ]
119 then
120 systemctl stop mariadb
121 fi
122 livedb_backup=$livedb~$(date -Ins)
123 mv -v -T -- "$livedb" "$livedb_backup"
124 mkdir "$livedb"
125 chown --reference="$livedb_backup" "$livedb"
126 chmod --reference="$livedb_backup" "$livedb"
127 fi
128 marialog=$(mktemp)
129 exec >"$marialog" 2>&1
130 set -- \
131 -u root \
132 --target-dir="$mariabackup_target_dir"
133 if mariabackup --move-back "$@"
134 then
135 tail -v -n2 "$marialog" >&2
136 # Can't believe mariabackup
137 # is so primitive as to
138 # recommend this chown in its
139 # documentation
140 chown -R mysql:mysql /var/lib/mysql
141 systemctl start mariadb
142 else
143 cat "$marialog" >&2
144 fi
145
146}
147
148enable_replication()
149{
150 primary_host=$1
151 replication_user=$2
152 replication_password=$3
153 mariabackup_target_dir=/var/mariadb/backup
154 binlog_info_file=$mariabackup_target_dir/xtrabackup_binlog_info
155 set -e
156 read master_log_file master_log_pos gtid_slave_pos < $binlog_info_file
157 tee /dev/stderr <<END | mariadb --skip-reconnect -t
158STOP SLAVE;
159SET GLOBAL gtid_slave_pos = "$gtid_slave_pos";
160CHANGE MASTER TO
161 MASTER_HOST='$primary_host',
162 MASTER_USER='$replication_user',
163 MASTER_PASSWORD='$replication_password',
164 MASTER_USE_GTID=slave_pos;
165START SLAVE;
166SHOW SLAVE STATUS\G
167END
168 set -x
169 rm -r /var/mariadb/backup
170}
171
172create_replication_user()
173{
174 mariadb --skip-reconnect -t <<END
175CREATE OR REPLACE USER '$2'@'$1' IDENTIFIED BY '$3';
176GRANT REPLICATION SLAVE ON *.* TO '$2'@'$1';
177END
178}
179
180showvars()
181{
182 for h in "$@"
183 do
184 run_$h mariadb --skip-reconnect -t <<END
185select VARIABLE_NAME,SESSION_VALUE,GLOBAL_VALUE
186from INFORMATION_SCHEMA.SYSTEM_VARIABLES
187where VARIABLE_NAME LIKE '%SLAVE%' \G
188END
189 done
190}
191
192set -e
193run_primary check_db
194run_replica check_db
195: showvars replica
196: exit
197
198run_primary create_replication_user \
199 "$replica_host" \
200 "$replication_user" \
201 "$replication_password"
202run_primary create_backup
203run_primary send_backup "$replica_host"
204run_replica restore_from_backup
205run_replica enable_replication \
206 "$primary_host" \
207 "$replication_user" \
208 "$replication_password"
209run_replica check_db
210run_primary delete_backup
211run_primary check_db