forked from miklos-szel/Ansible-MHA-ProxySQL-Docker
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdamp_create_cluster.sh
executable file
·120 lines (96 loc) · 3.83 KB
/
damp_create_cluster.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
#!/bin/bash
#brew install gnu-sed
currdir=`pwd`
servers="$currdir/damp/hostfile"
touch $servers
#server1 will be the initial master
numargs=$#
if [ $numargs -lt 2 ]; then
echo "usage $0 clustername num_of_servers_including_master"
exit 1
fi
server_name=damp_server_$1
num_of_servers=$2
replication_type=${3:-gtid}
last_hostgroup=$(grep "hostgroup" $servers |tail -n 1 |cut -d":" -f 2 |sed 's/ //' )
if [[ -z "$last_hostgroup" ]]
then
hostgroup=1
echo -e "[proxysql]\nlocalhost\n\n" >>$servers
else
hostgroup=$(( $last_hostgroup + 2 ))
fi
list=$(docker ps -a --format '{{.Names}}'|grep -E "^${server_name}[0-9]{1,2}$")
if [[ "$list" != "" ]]
then
echo "Containers with name: $server_name are already running, quit!"
exit 1
fi
docker-ip() {
local ip=$(docker inspect --format '{{ .NetworkSettings.IPAddress }}' "$@")
echo $ip
}
echo "Starting the following containers in $server_name cluster:"
for i in $(seq 1 $num_of_servers)
do
mkdir -p $currdir/mysql_hosts/${server_name}${i}/conf.d $currdir/mysql_hosts/${server_name}${i}/log_mysql
if [ $i == "1" ]
then
sed -e "s/server-id=/server-id=1/" -e "s/read_only=1/read_only=0/" $currdir/my.cnf> $currdir/mysql_hosts/${server_name}${i}/conf.d/my.cnf
else
sed -e "s/server-id=/server-id=${i}/" $currdir/my.cnf> $currdir/mysql_hosts/${server_name}${i}/conf.d/my.cnf
fi
if [ "$replication_type" == "gtid" ]
then
echo "gtid-mode=ON" >>$currdir/mysql_hosts/${server_name}${i}/conf.d/my.cnf
echo "enforce-gtid-consistency" >>$currdir/mysql_hosts/${server_name}${i}/conf.d/my.cnf
fi
cid=$(docker run --name ${server_name}${i} -h ${server_name}${i} -d -v $currdir/mysql_hosts/${server_name}${i}/conf.d:/etc/mysql/conf.d -v $currdir/mysql_hosts/${server_name}${i}/log_mysql:/var/log/mysql -e MYSQL_ROOT_PASSWORD=mysecretpass -d mysql:5.6)
server_ip=$( docker-ip $cid )
echo "${server_name}${i} $cid($server_ip)"
serverlist=("${serverlist[@]}" "$server_ip" )
if [ $i == "1" ]
then
master_ip=$server_ip
fi
done
#waiting for the last server to be available
isup=0
until [ $isup -eq "1" ]
do
isup=$(docker exec -ti ${server_name}${num_of_servers} 'mysql' -NB -uroot -pmysecretpass -e"select(234);" |grep "234" |wc -l )
sleep 3
echo "waiting for the ${server_name}${num_of_servers} to be available"
done
echo "add replication user to the master (${server_name})"
docker exec -ti ${server_name}1 'mysql' -uroot -pmysecretpass -vvv -e "select @@version;"
docker exec -ti ${server_name}1 'mysql' -uroot -pmysecretpass -vvv -e "GRANT REPLICATION SLAVE ON *.* TO repl@'%' IDENTIFIED BY 'slavepass'\G"
#configure replication on all hosts
for i in $(seq 2 $num_of_servers)
do
if [ "$replication_type" == "gtid" ]
then
docker exec -ti ${server_name}${i} 'mysql' -uroot -pmysecretpass -e"change master to master_host='$master_ip',master_user='repl',master_password='slavepass',master_auto_position = 1;" -vvv
else
docker exec -ti ${server_name}${i} 'mysql' -uroot -pmysecretpass -e"change master to master_host='$master_ip',master_user='repl',master_password='slavepass',master_log_file='mysqld-bin.000004',master_log_pos=120;" -vvv
fi
echo "start replication"
docker exec -ti ${server_name}${i} 'mysql' -uroot -pmysecretpass -e"START SLAVE\G" -vvv
echo "show slave status"
docker exec -ti ${server_name}${i} 'mysql' -uroot -pmysecretpass -e"SHOW SLAVE STATUS\G" -vvv
done
#update the ansible yml file with this cluster's data
echo -e "[${server_name}]" >>$servers
for item in ${serverlist[*]}
do
if [ "$item" == "$master_ip" ]
then
echo "$item mysql_role=master" >>$servers
else
echo "$item mysql_role=slave" >>$servers
fi
done
echo -e "\n[${server_name}:vars]
cluster=${server_name}
hostgroup=$hostgroup
\n" >>$servers