読者です 読者をやめる 読者になる 読者になる

shucreamTech

web系エンジニアが意識低く書くブログ

CentOS7でmysqld_multiを使ってMariaDBを複数立ち上げるメモ

これは何

  • CentOS7 (systemctl) で
  • MariaDB を
  • 複数立ち上げたい!

開発用VMでmasterとslaveの2インスタンスを立てたい時があって、そのメモ。

まずMariaDBをインストール

$ sudo vim /etc/yum.repos.d/MariaDB.repo
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.1/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
$ sudo yum install MariaDB-server MariaDB-client

my.cnfを編集

[mysqld_multi]
mysqld = /usr/bin/mysqld_safe
mysqladmin = /usr/bin/mysqladmin
user = root
password = password
# 共通の設定
[mysqld]
expire_logs_days = 14
# default_password_lifetime = 0
character-set-server = utf8mb4
# validate-password = OFF

 # master
[mysqld1]
server-id = 1
datadir = /var/lib/mysql
socket = /var/lib/mysql/mysql.sock
pid-file = /var/run/mysqld/mysqld.pid
log-error = /var/log/mysqld/mysqld1.log
general_log = ON
general-log-file = /var/run/mysqld/mysqld1.log
port = 3306
log-bin = mysql-bin
 
[mysqld2]
server-id = 2
datadir = /var/lib/mysql2
socket = /var/lib/mysql2/mysql.sock
pid-file = /var/run/mysqld/mysqld2.pid
log-error = /var/log/mysqld/mysqld2.log
general_log = ON
general-log-file = /var/run/mysqld/mysqld2.log
port = 3307

初期化

$ sudo mysql_install_db --datadir=/var/lib/mysql
$ sudo mysql_install_db --datadir=/var/lib/mysql2

# 権限とか
$ sudo chown -R mysql:mysql /var/lib/{mysql,mysql2}
$ sudo chmod 755 /var/lib/{mysql,mysql2}
$ sudo mkdir /var/log/mysqld
$ sudo chown mysql:mysql /var/log/mysqld
$ sudo mkdir /var/run/mysqld
$ sudo chown mysql:mysql /var/run/mysqld

# スタート
$ sudo -u mysql mysqld_multi start

# 起動を確認
$ mysqld_multi report
# => MariaDB server from group: mysqld1 is running
# => MariaDB server from group: mysqld2 is running

# 各mysqlにログインする
$ sudo mysql -u root -p -P 3306
# slaveの方socketを明示的に指定する必要があった
$ sudo mysql -u root -p -P 3307 --socket=/var/lib/mysql2/mysql.sock

# ここまででとりあえずオッケー。
# 必要ならパスワード変更したりする
# SET PASSWORD FOR `root`@`localhost` = PASSWORD('password');

レプリケーション設定

masterのみで実行

レプリケーション用ユーザ作成

CREATE USER `repl`@`localhost` IDENTIFIED BY 'hogehoge';
GRANT REPLICATION SLAVE ON *.* TO `repl`@`localhost`;

slaveのみで実行

masterを設定し、自身をslaveとしてレプリケーション開始する。

CHANGE MASTER TO 
MASTER_HOST='localhost',
MASTER_PORT=3306,
MASTER_USER='repl',
MASTER_PASSWORD='hogehoge',
MASTER_LOG_FILE='mysql-bin.000016', -- ← master側で SHOW MASTER STATUS で確認
MASTER_LOG_POS=2103; -- ← master側で SHOW MASTER STATUS で確認

START SLAVE;

自動起動の設定

参考=> http://d.hatena.ne.jp/yk5656/20140618/1404312714

起動スクリプト

$ sudo vim /etc/mysqld_multi.sh
#!/bin/sh

MYSQLID=1,2

case "$1" in
start)
echo -n "Starting mysqld: "
RUN_DIR=/var/run/mysqld
if [ ! -e $RUN_DIR ]; then
    sudo mkdir $RUN_DIR
    sudo chown mysql:mysql $RUN_DIR
fi

LOG_DIR=/var/log/mysqld
if [ ! -e $LOG_DIR ]; then
    sudo mkdir $LOG_DIR
    sudo chown mysql:mysql $LOG_DIR
fi

sudo -u mysql /usr/bin/mysqld_multi start $MYSQLID
echo
;;
stop)
echo -n "Shutting down mysqld: "
sudo -u mysql /usr/bin/mysqld_multi stop $MYSQLID
echo
;;
status)
/usr/bin/mysqld_multi report $MYSQLID
;;
restart)
$0 stop
$0 start
;;
*)
echo "Usage: $0 {start|stop|restart|status}"
exit 1
esac

exit 0
$ sudo chmod a+x /etc/mysqld_multi.sh

service登録

$ sudo vim /etc/systemd/system/mysqld_multi.service
[Unit]
Description = mysqld_multi
After=syslog.target
After=network.target

[Service]
ExecStart = /etc/mysqld_multi.sh start
ExecStop = /etc/mysqld_multi.sh stop
Restart = always
Type = forking
PrivateTmp=true

[Install]
WantedBy = multi-user.target
$ sudo chmod a+x /etc/systemd/system/mysqld_multi.service

serviceとして認識されているか確認

$ sudo systemctl list-unit-files --type=service | grep mysqld_multi
# => mysqld_multi.service                          disabled

自動起動on

$ sudo systemctl enable mysqld_multi
$ sudo chkconfig mysql off # 素のmysqlの自動起動は止める1
$ sudo systemctl disable mysql # 素のmysqlの自動起動は止める2
# 起動
$ sudo systemctl start mysqld_multi

status確認

$ sudo systemctl status mysqld_multi
# => Active: active (running) 

おしまい。