
この記事では、Railsアプリケーションのシャーディングとレプリケーションに使用されるタコのgemをさらに使用するためにMySQLを構成する方法を示したいと思います。
したがって、3台のサーバーを展開するタスクに直面していることを想像してみましょう(最初のアプリケーションでレールが回転し、2番目はマスターに必要で、3番目はスレーブとして機能します)、サーバー間のレプリケーションを構成し、タコを動作させます。
ステップ1-プリセットサーバーこの手順で説明するアクションは、マスターマシンとスレーブの両方で実行する必要があります。
MySQLをインストールします。
sudo apt-get install mysql-server
次に、MySQLコンソールに移動します。
mysql -u root -p
データベースと、このデータベースを操作するすべての権限を持つユーザーを作成しましょう。
create database rails_myapp; GRANT ALL ON rails_myapp.* TO 'rails_myapp_user'@'localhost'; GRANT ALL ON rails_myapp.* TO 'rails_myapp_user'@'%'; FLUSH PRIVILEGES; EXIT;
ステップ2-マスターの構成マスターサーバーでMySQL構成ファイルを開きます。
sudo nano /etc/mysql/my.cnf
このファイル内で、いくつかの変更を行います。 まず、次の行を見つけます。
bind-address = 127.0.0.1
Railsアプリケーションがサーバーに到達できるように、標準IPアドレスを0.0.0.0に置き換えます。
bind-address = 0.0.0.0
次のステップは、サーバーIDの値を変更することです。設定ファイルの[mysqld]セクションでサーバーIDを探します。 サーバーIDとして任意の番号を選択できますが、簡単にするために1を指定することをお勧めします。この番号は、レプリケーションに参加するサーバーのグループに対して一意でなければならないことに注意してください。
もう一度、この行がコメント化されていることを確認してください。
server-id = 1
ここで、log_binの値を持つ行に移動します。 スレーブは、記録されるすべての変更をコピーします。 繰り返しますが、log_binを含む行をコメントアウトする方が良いでしょう:
log_bin = /var/log/mysql/mysql-bin.log
最後に、スレーブサーバーによって複製されるデータベースの名前を指定する必要があります。 複製するすべてのデータベースに対してこの行を繰り返すことにより、複数のデータベースを指定できます。
binlog_do_db = rails_myapp
すべての変更が行われました! ファイルを保存して閉じることができます。
MySQLを再起動します。
sudo service mysql restart
MySQLを開きましょう-シェル。
mysql -u root -p
スレーブに特権を提供する必要があります。 これを行うには、次のコマンドを使用します。
GRANT REPLICATION SLAVE ON *.* TO 'slave_user'@'%' IDENTIFIED BY 'password'; FLUSH PRIVILEGES;
次に、ベースに切り替える必要があります。
USE rails_myapp;
データベースをロックして、次の手順で役立つデータを確認します。
FLUSH TABLES WITH READ LOCK;
次に入力します:
SHOW MASTER STATUS;
以下で説明するコマンドを入力すると、このようなものが表示されます。
mysql> SHOW MASTER STATUS;
ファイル | 役職 | Binlog_Do_db |
---|
mysql-bin.000001 | 107 | rails_myapp |
セット内の1行(0.00秒)
重要! ファイル名と位置番号を書き留めるか覚えておいてください。これらの値は後で使用されます。
データベースがロックされている間、rails_myappデータベースをエクスポートする必要があります。 新しいウィンドウで2番目のターミナルを開き、MySQLコンソールではなく、bashシェルでこのコマンドを入力してください。
mysqldump -u root -p --opt rails_myapp > rails_myapp.sql
MySQLコンソールに戻り、データベースのロックを解除します(書き込み可能)。
UNLOCK TABLES; QUIT;
それだけです! マスターのセットアップが完了しました。
ステップ3-スレーブを構成します。MySQLサーバーに移動し、MySQLを開いてデータベースを作成します(名前はウィザードとまったく同じです)。
CREATE DATABASE rails_myapp; EXIT;
ウィザードでエクスポートしたSQLコマンドを使用してファイルを転送し、インポートします。
mysql -u root -p rails_myapp< /path/to/rails_myapp.sql
次に、MySQL構成ファイルをわずかに修正する必要があります。
sudo nano /etc/mysql/my.cnf
最初に変更するのはサーバーIDです。 覚えているように、この番号はグループ内で一意でなければなりません(Master'a configで1を指定)。
server-id = 2
次の3行を追加(またはコメントアウト)します。
relay-log = /var/log/mysql/mysql-relay-bin.log log_bin = /var/log/mysql/mysql-bin.log binlog_do_db = newdatabase
新しいバインドアドレス値を設定します。
bind-address = 0.0.0.0
MySQLを再起動します。
sudo service mysql restart
次のステップは、レプリケーションを直接開始することです。 覚えて! MASTER_LOG_FILEおよびMASTER_LOG_POSの代わりに、以前に書き留めた値を入力する必要があります。
CHANGE MASTER TO MASTER_HOST='12.34.56.789',MASTER_USER='slave_user', MASTER_PASSWORD='password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS= 107; START SLAVE;
スレーブが正常に起動したかどうかを確認する方法は? 以下で説明するコマンドを入力し、ログを表示する必要があります。
SHOW SLAVE STATUS\G
4番目のステップ-タコを構成します。Railsアプリケーションで、Gemfileに次の行を追加します。
gem 'ar-octopus'
config /ディレクトリ内で、shards.ymlファイルを作成する必要があります。このファイルは、スレーブサーバーの構成を担当します。 覚えて! database.ymlファイルはマスター設定を担当し、スレーブの設定用に作成されたばかりのshards.ymlは、YMLではスペースとタブが重要であることを忘れないでください。
shards.ymlファイルは、入力後、次のようになります。
octopus: replicated: true fully_replicated: true environments: - development - test development: slave: adapter: mysql2 encoding: utf8 database: rails_myapp username: rails_myapp_user password: qwerty host: 130.111.11.111 port: 3306 pool: 10 test: slave: adapter: mysql2 encoding: utf8 database: rails_myapp username: rails_myapp_user password: qwerty host: 130.111.111.111 port: 3306 pool: 10
それだけです! モデルにreplicated_model()であることを登録し、Railsアプリケーションを実行する必要があります。 コンソールにPOSTリクエストを送信すると、次のようなものが表示されます。
[Shard: slave] OurModel Load (1.0ms) SELECT `model`.* FROM `model` WHERE `chats`.`id` = 'gkjhgfhd' LIMIT 1
素敵な設定をしてください!