github.com/percona/percona-xtradb-cluster-operator@v1.14.0/build/pxc-configure-pxc.sh (about) 1 #! /bin/bash 2 3 # Copyright 2016 The Kubernetes Authors. 4 # 5 # Licensed under the Apache License, Version 2.0 (the "License"); 6 # you may not use this file except in compliance with the License. 7 # You may obtain a copy of the License at 8 # 9 # http://www.apache.org/licenses/LICENSE-2.0 10 # 11 # Unless required by applicable law or agreed to in writing, software 12 # distributed under the License is distributed on an "AS IS" BASIS, 13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 # See the License for the specific language governing permissions and 15 # limitations under the License. 16 17 # This script writes out a mysql galera config using a list of newline seperated 18 # peer DNS names it accepts through stdin. 19 20 # /etc/mysql is assumed to be a shared volume so we can modify my.cnf as required 21 # to keep the config up to date, without wrapping mysqld in a custom pid1. 22 # The config location is intentionally not /etc/mysql/my.cnf because the 23 # standard base image clobbers that location. 24 25 set -o errexit 26 set -o xtrace 27 28 function join { 29 local IFS="$1"; shift; echo "$*"; 30 } 31 32 function mysql_root_exec() { 33 local server="$1" 34 local query="$2" 35 { set +x; } 2>/dev/null 36 MYSQL_PWD="${OPERATOR_ADMIN_PASSWORD:-operator}" timeout 600 mysql -h "${server}" -P 33062 -uoperator -s -NB -e "${query}" 37 set -x 38 } 39 40 NODE_IP=$(hostname -I | awk ' { print $1 } ') 41 CLUSTER_NAME="$(hostname -f | cut -d'.' -f2)" 42 SERVER_NUM=${HOSTNAME/$CLUSTER_NAME-/} 43 SERVER_ID=${CLUSTER_HASH}${SERVER_NUM} 44 NODE_NAME=$(hostname -f) 45 NODE_PORT=3306 46 47 while read -ra LINE; do 48 echo "read line $LINE" 49 LINE_IP=$(getent hosts "$LINE" | awk '{ print $1 }') 50 if [ "$LINE_IP" != "$NODE_IP" ]; then 51 LINE_HOST=$(mysql_root_exec "$LINE_IP" 'select @@hostname' || :) 52 if [ -n "$LINE_HOST" ]; then 53 PEERS=("${PEERS[@]}" $LINE_HOST) 54 PEERS_FULL=("${PEERS_FULL[@]}" "$LINE_HOST.$CLUSTER_NAME") 55 else 56 PEERS_FULL=("${PEERS_FULL[@]}" $LINE_IP) 57 fi 58 fi 59 done 60 61 if [ "${#PEERS[@]}" != 0 ]; then 62 DONOR_ADDRESS="$(printf '%s\n' "${PEERS[@]}" "${HOSTNAME}" | sort --version-sort | uniq | grep -v -- '-0$' | sed '$d' | tr '\n' ',' | sed 's/^,$//')" 63 fi 64 if [ "${#PEERS_FULL[@]}" != 0 ]; then 65 WSREP_CLUSTER_ADDRESS="$(printf '%s\n' "${PEERS_FULL[@]}" | sort --version-sort | tr '\n' ',' | sed 's/,$//')" 66 fi 67 68 CFG=/etc/mysql/node.cnf 69 MYSQL_VERSION=$(mysqld -V | awk '{print $3}' | awk -F'.' '{print $1"."$2}') 70 if [ "$MYSQL_VERSION" == '8.0' ]; then 71 grep -E -q "^[#]?admin-address" "$CFG" || sed '/^\[mysqld\]/a admin-address=\n' ${CFG} 1<>${CFG} 72 grep -E -q "^[#]?log_error_suppression_list" "$CFG" || sed '/^\[mysqld\]/a log_error_suppression_list="MY-010055"\n' ${CFG} 1<>${CFG} 73 else 74 grep -E -q "^[#]?extra_max_connections" "$CFG" || sed '/^\[mysqld\]/a extra_max_connections=\n' ${CFG} 1<>${CFG} 75 grep -E -q "^[#]?extra_port" "$CFG" || sed '/^\[mysqld\]/a extra_port=\n' ${CFG} 1<>${CFG} 76 fi 77 78 if [ "$IS_LOGCOLLECTOR" == 'yes' ]; then 79 grep -E -q "^[#]?log-error" "$CFG" || sed "/^\[mysqld\]/a log-error=$LOG_DATA_DIR/mysqld-error.log\n" ${CFG} 1<>${CFG} 80 fi 81 grep -E -q "^[#]?wsrep_sst_donor" "$CFG" || sed '/^\[mysqld\]/a wsrep_sst_donor=\n' ${CFG} 1<>${CFG} 82 grep -E -q "^[#]?wsrep_node_incoming_address" "$CFG" || sed '/^\[mysqld\]/a wsrep_node_incoming_address=\n' ${CFG} 1<>${CFG} 83 grep -E -q "^[#]?wsrep_provider_options" "$CFG" || sed '/^\[mysqld\]/a wsrep_provider_options="pc.weight=10"\n' ${CFG} 1<>${CFG} 84 sed -r "s|^[#]?server_id=.*$|server_id=${SERVER_ID}|" ${CFG} 1<>${CFG} 85 sed -r "s|^[#]?coredumper$|coredumper|" ${CFG} 1<>${CFG} 86 sed -r "s|^[#]?wsrep_node_address=.*$|wsrep_node_address=${NODE_IP}|" ${CFG} 1<>${CFG} 87 sed -r "s|^[#]?wsrep_cluster_name=.*$|wsrep_cluster_name=${CLUSTER_NAME}|" ${CFG} 1<>${CFG} 88 sed -r "s|^[#]?wsrep_sst_donor=.*$|wsrep_sst_donor=${DONOR_ADDRESS}|" ${CFG} 1<>${CFG} 89 sed -r "s|^[#]?wsrep_cluster_address=.*$|wsrep_cluster_address=gcomm://${WSREP_CLUSTER_ADDRESS}|" ${CFG} 1<>${CFG} 90 sed -r "s|^[#]?wsrep_node_incoming_address=.*$|wsrep_node_incoming_address=${NODE_NAME}:${NODE_PORT}|" ${CFG} 1<>${CFG} 91 { set +x; } 2>/dev/null 92 ESCAPED_XTRABACKUP_PASSWORD=$(printf '%s\n' "$XTRABACKUP_PASSWORD" | sed -e 's/[]\|\&\!$*.^[]/\\&/g') 93 sed -r "s|^[#]?wsrep_sst_auth=.*$|wsrep_sst_auth='xtrabackup:$ESCAPED_XTRABACKUP_PASSWORD'|" ${CFG} 1<>${CFG} 94 set -x 95 sed -r "s|^[#]?admin-address=.*$|admin-address=${NODE_IP}|" ${CFG} 1<>${CFG} 96 sed -r "s|^[#]?extra_max_connections=.*$|extra_max_connections=100|" ${CFG} 1<>${CFG} 97 sed -r "s|^[#]?extra_port=.*$|extra_port=33062|" ${CFG} 1<>${CFG} 98 99 CA=/var/run/secrets/kubernetes.io/serviceaccount/ca.crt 100 if [ -f /var/run/secrets/kubernetes.io/serviceaccount/service-ca.crt ]; then 101 CA=/var/run/secrets/kubernetes.io/serviceaccount/service-ca.crt 102 fi 103 SSL_DIR=${SSL_DIR:-/etc/mysql/ssl} 104 if [ -f ${SSL_DIR}/ca.crt ]; then 105 CA=${SSL_DIR}/ca.crt 106 fi 107 SSL_INTERNAL_DIR=${SSL_INTERNAL_DIR:-/etc/mysql/ssl-internal} 108 if [ -f ${SSL_INTERNAL_DIR}/ca.crt ]; then 109 CA=${SSL_INTERNAL_DIR}/ca.crt 110 fi 111 112 KEY=${SSL_DIR}/tls.key 113 CERT=${SSL_DIR}/tls.crt 114 if [ -f ${SSL_INTERNAL_DIR}/tls.key -a -f ${SSL_INTERNAL_DIR}/tls.crt ]; then 115 KEY=${SSL_INTERNAL_DIR}/tls.key 116 CERT=${SSL_INTERNAL_DIR}/tls.crt 117 fi 118 119 if [ -f $CA -a -f $KEY -a -f $CERT ]; then 120 sed "/^\[mysqld\]/a pxc-encrypt-cluster-traffic=ON\nssl-ca=$CA\nssl-key=$KEY\nssl-cert=$CERT" ${CFG} 1<> ${CFG} 121 else 122 sed "/^\[mysqld\]/a pxc-encrypt-cluster-traffic=OFF" ${CFG} 1<> ${CFG} 123 fi 124 125 # don't need a restart, we're just writing the conf in case there's an 126 # unexpected restart on the node.