From 993b16471e5aba4f6f481f9cac56b6cac0dea7b9 Mon Sep 17 00:00:00 2001 From: Sameer Naik Date: Mon, 27 Jul 2015 15:02:04 +0530 Subject: [PATCH] added master/slave replication support Example, Start master: ```bash docker run -it --rm --name mariadb-master \ -e 'MARIADB_USER=root' -e 'MARIADB_PASSWORD=password' \ -e 'MARIADB_DATABASE=newdatabase' \ -e 'REPLICATION_MODE=master' -e 'REPLICATION_USER=slave' -e 'REPLICATION_PASSWORD=slavepassword' \ bitnami/mariadb ``` Start Slave: ```bash docker run -it --rm --name mariadb-slave \ --link mariadb-master:mariadb-master \ -e 'MARIADB_USER=root' -e 'MARIADB_PASSWORD=password' \ -e 'MARIADB_DATABASE=newdatabase' -e 'REPLICATION_MODE=slave' \ bitnami/mariadb ``` --- bitnami/mariadb/bitnami-utils-custom.sh | 42 +++++++++++++++++++++++++ bitnami/mariadb/entrypoint.sh | 2 ++ 2 files changed, 44 insertions(+) diff --git a/bitnami/mariadb/bitnami-utils-custom.sh b/bitnami/mariadb/bitnami-utils-custom.sh index 02a5c6dcab36..3fa48ec9b87e 100644 --- a/bitnami/mariadb/bitnami-utils-custom.sh +++ b/bitnami/mariadb/bitnami-utils-custom.sh @@ -1,6 +1,14 @@ # MariaDB Utility functions PROGRAM_OPTIONS="--defaults-file=$BITNAMI_APP_DIR/my.cnf --log-error=$BITNAMI_APP_DIR/logs/mysqld.log --basedir=$BITNAMI_APP_DIR --datadir=$BITNAMI_APP_DIR/data --plugin-dir=$BITNAMI_APP_DIR/lib/plugin --user=$BITNAMI_APP_USER --socket=$BITNAMI_APP_DIR/tmp/mysql.sock --lower-case-table-names=1" +if [ "$REPLICATION_MODE" ]; then + SERVER_ID=${SERVER_ID:-$RANDOM} + PROGRAM_OPTIONS+=" --server-id=$SERVER_ID --log-bin=mysql-bin --binlog-format=ROW" + if [ "$REPLICATION_MODE" = "slave" ]; then + PROGRAM_OPTIONS+=" --relay-log=mysql-relay-bin ${MARIADB_DATABASE:+--replicate-do-db=$MARIADB_DATABASE}" + fi +fi + initialize_database() { echo "==> Initializing MySQL database..." echo "" @@ -46,6 +54,40 @@ create_mysql_user() { echo "DROP DATABASE IF EXISTS test ; " >> /tmp/init_mysql.sql } +configure_replication() { + case "$REPLICATION_MODE" in + master) + if [ "$REPLICATION_USER" ]; then + echo "==> Creating replication user $REPLICATION_USER..." + echo "" + + echo "GRANT REPLICATION SLAVE ON *.* TO '$REPLICATION_USER'@'%' IDENTIFIED BY '$REPLICATION_PASSWORD';" >> /tmp/init_mysql.sql + echo "FLUSH PRIVILEGES ;" >> /tmp/init_mysql.sql + fi + ;; + slave) + echo "" + echo "==> Setting up MariaDB slave..." + + echo "==> Trying to fetch MariaDB master connection parameters from the mariadb-master link..." + MASTER_HOST=${MASTER_HOST:-$MARIADB_MASTER_PORT_3306_TCP_ADDR} + MASTER_USER=${MASTER_USER:-$MARIADB_MASTER_ENV_MARIADB_USER} + MASTER_PASSWORD=${MASTER_PASSWORD:-$MARIADB_MASTER_ENV_MARIADB_PASSWORD} + REPLICATION_USER=${REPLICATION_USER:-$MARIADB_MASTER_ENV_REPLICATION_USER} + REPLICATION_PASSWORD=${REPLICATION_PASSWORD:-$MARIADB_MASTER_ENV_REPLICATION_PASSWORD} + + echo "==> Creating a data snapshot..." + mysqldump -u$MASTER_USER ${MASTER_PASSWORD:+-p$MASTER_PASSWORD} -h $MASTER_HOST $MARIADB_DATABASE --master-data >> /tmp/init_mysql.sql + + echo "==> Setting the master configuration..." + echo "CHANGE MASTER TO MASTER_HOST='$MASTER_HOST', MASTER_USER='$REPLICATION_USER', MASTER_PASSWORD='$REPLICATION_PASSWORD'" >> /tmp/init_mysql.sql + + echo "==> Starting the slave..." + echo "START SLAVE ;" >> /tmp/init_mysql.sql + ;; + esac +} + print_mysql_password() { if [ -z $MARIADB_PASSWORD ]; then echo "**none**" diff --git a/bitnami/mariadb/entrypoint.sh b/bitnami/mariadb/entrypoint.sh index 72e59afda1bf..92a685f10733 100755 --- a/bitnami/mariadb/entrypoint.sh +++ b/bitnami/mariadb/entrypoint.sh @@ -32,6 +32,8 @@ if [ "$1" = 'mysqld.bin' ]; then create_mysql_user + configure_replication + print_app_credentials $BITNAMI_APP_NAME $MARIADB_USER `print_mysql_password` `print_mysql_database` else print_container_already_initialized $BITNAMI_APP_NAME