Ruby on Railsのスケーリング:専用MySQLサーバーのセットアップ(パート2)
序章
マルチマシンアプリケーション展開スタックの一部である各サーバーは、優れたイタリアンピザのようなものである必要があります。すべてを扱いやすくするために、堅固なベースには、過剰な膨満感や大きな負荷をかけずに、必要な材料だけを飾る必要があります。 (そして管理する)。
Scaling-Rails DigitalOceanの記事シリーズのこの第2部では、アプリケーションサーバーが接続して動作するために、データベースレイヤーをホストするドロップレットを作成する方法を説明します。 ここでの目的は、サーバーごとに1つのタスク を明確に委任することにより、単一障害点(SPoF)がダウンタイム(または損失)の原因として現れる可能性を最小限に抑えることです。
用語集
1. データベースの選択
2. サーバーのセットアップ構造
- 複数のアプリケーションサーバーの負荷分散
- データベースサーバーレイヤー
3. デプロイメントセットアップへのデータベースサーバーの追加
- サーバーの準備
4. MySQLのインストール
- データベースサーバーのダウンロード
- 初期設定の実行
- データベースサーバーに接続する
- 新しいデータベースを作成する
- 新しいデータベースユーザーを作成する
- 特権の付与
- リモート接続の有効化
5. Railsアプリケーションの構成
- データベースサーバーライブラリのインストール
- Railsの
database.yml
の構成 mysql
ジェムの入手- サーバー間でのデータの移行
データベースの選択
Ruby on Railsアプリケーション開発フレームワークは、データベースサーバーにさまざまなサポートを提供します。 ほとんどのアプリケーションでは、リレーショナルデータベース管理システムが最適です。 ただし、リレーショナルサーバーまたは両方を一緒に実行する代わりに、非リレーショナルのスキーマレスNoSQLデータベースサーバーが必要になる場合があります。
自分の開発用コンピューターでRailsの操作を開始する場合、最も簡単でおそらく最も論理的な方法は、SQLiteライブラリなどの機能的で基本的なデータベース実装を使用することから始めることです。 ただし、実際の展開では、SQLiteではアプリケーションの負荷を処理するには不十分である可能性があるため、本格的なRDBMSが必要になります。
ニーズとアプリケーションの種類に応じて、データベース管理システム(つまり、 データベースサーバー)を使用して、アプリケーション展開セットアップのデータベースレイヤーを作成します。
リレーショナルデータベースの場合、より一般的な選択肢のいくつかは次のとおりです。
- MySQLと派生物:
最も人気があり、一般的に使用されているRDBMSおよび関連するフォークプロジェクト。
- PostgreSQL:
最も高度なSQL準拠のオープンソース目標-RDBMS。
非リレーショナルデータベースサーバーの場合:
- 列ベース:
Cassandra、HBaseなど。
- 書類:
MongoDB、Couchbaseなど
- グラフ:
OrientDB、Neo4Jなど。
データベースサーバーの展開を続行する前に明確で長期的な決定を下すために、このテーマに関する記事を読むことに興味があるかもしれません。
- データベースの概要:
SQLおよびNoSQLデータベースとさまざまなデータベースモデルを理解する
- 関連した:
- NoSQL:
サーバーのセットアップ構造
データベースレイヤーの構築を開始する前に、最終的な展開のセットアップがどのようになるかを見てみましょう。
複数のアプリケーションサーバーの負荷分散
以前は、複数のアプリケーションサーバーでロードバランサー/リバースプロキシを作成した後、これが最終的に得られたものです。
Three droplets with each having a distinct role:
------------------------------------------------
1 x Load-Balancer / Reverse-Proxy
2 x Application Servers Running Your Rails Web-Application / API
---
DEPLOYMENT STRUCTURE
+-------------------------------+
| |
| LOAD-BALANCER / REVERSE PROXY |
| |
+-------------------------------+
+
|
|
+---------------+ | +---------------+
| APP SERVER | | | APP SERVER |
|---------------| | |---------------|
| | | | |
| RAILS |<---+--->| RAILS |
| | | |
+---------------+ +---------------+
データベースサーバーレイヤー
一元的にアクセス可能なデータベースサーバーを使用するため(例: RDBMSおよび/またはNoSQLデータベース)、サーバー設定に4番目の要素を追加します。
Four droplets:
------------------------------------------------
1 x Load-Balancer / Reverse-Proxy
2 x Application Servers Running Your Rails Web-Application / API
1 x Database Server (e.g. MySQL, PostgreSQL, MongoDB etc.)
+-------------------------------+
| |
| LOAD-BALANCER / REVERSE PROXY |
| |
+-------------------------------+
+
|
|
+---------------+ | +---------------+
| APP SERVER | | | APP SERVER |
|---------------| | |---------------|
| | | | |
| RAILS |<---+--->| RAILS |
| | | |
+---------------+ +---------------+
+ +
| |
| +-------------------+ |
| | DATABASE SERVER | |
| |-------------------| |
| | | |
| | MySQL, | |
+->| PostgreSQL, |<-+
| etc. |
| |
+-------------------+
デプロイメントセットアップへのデータベースサーバーの追加
この記事では、デモンストレーションの目的で、MySQLデータベースを作成および構成します。
さぁ、始めよう!
サーバーの準備
注:このパートは、Scaling-Railsチュートリアルのサーバー準備セクションの概要です。 CentOSVPSの使用を開始する方法について説明します。 MySQLインスタンスをUbuntuマシンにデプロイする場合は、 Deploying Sinatra チュートリアルをチェックして、MySQLまたはその他のデータベースサーバーのインストールを続行する前にUbuntuサーバーを準備する方法を確認してください。
次のコマンドを実行して、CentOSベースの仮想サーバーのデフォルトツールを更新します。
yum -y update
次のコマンドを実行して、いくつかの開発ツールを含むアプリケーションバンドルをインストールします。
yum groupinstall -y 'development tools'
YUMパッケージマネージャーが使用するEPELソフトウェアリポジトリを追加します。
# Enable EPEL Repository
sudo su -c 'rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm'
# Update everything, once more.
yum -y update
追加のライブラリをいくつかインストールします。
yum install -y curl-devel nano sqlite-devel libyaml-devel
MySQLのインストール
データベースサーバーのダウンロード
MySQLをインストールするには、次のコマンドを実行します。
yum install mysql-server mysql-devel
MySQLサーバーデーモンを起動します。
service mysqld start
注: Ubuntuを使用している場合は、mysql-devel
の代わりに、aptitude
を使用してmysql-client
およびlibmysqlclient-dev
パッケージをインストールする必要があります(またはapt-get
)を使用して、RailsがMySQLと連携できるようにします。
初期設定の実行
次のコマンドを実行して、MySQLの初期セットアッププロセスを開始します。
/usr/bin/mysql_secure_installation
上記のコマンドを実行すると、次のようなウェルカム画面が表示されます。
NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MySQL
SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY!
In order to log into MySQL to secure it, we'll need the current
password for the root user. If you've just installed MySQL, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.
Enter current password for root (enter for none):
以下を使用してパスワードをすでに作成していない場合:
/usr/bin/mysqladmin -u root password 'new-password'
/usr/bin/mysqladmin -u root -h myt password 'new-password'
コマンドを入力し、Enterキーを押して次の手順に進み、次のように質問に答えます。
# Set root password? --> Y
# Remove anonymous users? --> Y
# Disallow root login remotely? --> Y
# Remove test database and access to it? --> Y
# Reload privilege tables now? --> Y
データベースサーバーに接続する
MySQLクライアントを使用してデータベースに接続します。
mysql -u root -p
前の手順で設定したrootパスワードを入力します。
# Enter password:
# ..
# .
mysql>
新しいデータベースを作成する
Railsアプリケーションのデフォルトデータベースの作成から始めましょう。
次のコマンドを実行して、新しいMySQLデータベースを作成します。
# Usage: create database [database_name];
# Example:
create database rails_myapp;
新しいデータベースユーザーを作成する
セキュリティ上の理由から、Railsアプリケーションがリモートアクセスできるデータベースユーザーを作成してみましょう。
ローカルアクセスとリモートアクセスの両方を持つ新しいユーザーを追加します。
# Usage:
# CREATE USER '[user name]'@'localhost' IDENTIFIED BY '[password]';
# CREATE USER '[user name]'@'%' IDENTIFIED BY '[password]';
# Example:
CREATE USER 'rails_myapp_user'@'localhost' IDENTIFIED BY 'pwd';
CREATE USER 'rails_myapp_user'@'%' IDENTIFIED BY 'pwd';
ユーザーが作成されたことを確認するには、以下を実行します。
SELECT User,host FROM mysql.user;
# Example:
# +------------------+-----------+
# | User | host |
# +------------------+-----------+
# | rails_myapp_user | % |
# | root | 127.0.0.1 |
# | rails_myapp_user | localhost |
# | root | localhost |
# +------------------+-----------+
特権の付与
次のコマンドを実行して、特定のユーザーに特権を付与します。
# Usage:
# GRANT ALL ON [database name].* TO '[user name]'@'localhost';
# GRANT ALL ON [database name].* TO '[user name]'@'%';
# Example:
GRANT ALL ON rails_myapp.* TO 'rails_myapp_user'@'localhost';
GRANT ALL ON rails_myapp.* TO 'rails_myapp_user'@'%';
およびフラッシュ特権:
FLUSH PRIVILEGES;
注:必要に応じて特権を微調整するには、このテーマに関する公式のMySQLドキュメントを確認してください:MySQLによって提供される特権
クライアントが存在します:
exit
# Bye
リモート接続の有効化
Railsアプリケーションを実行しているリモートコンピューターからMySQLサーバーにアクセスできるようにする必要があるため、構成ファイルを変更する必要があります。
次のコマンドを実行して、nano
テキストエディタを使用してMySQL構成my.cnf
を編集します。
nano /etc/my.cnf
ドロップレットに割り当てられたIPアドレスからの接続をリッスンするようにMySQLに指示したいので、次の行を追加しましょう。
bind-address = 0.0.0.0
[mysqld]
ブロックの最後:
[mysqld]
..
.
bind-address = 0.0.0.0
CTRL + Xを押し、Yで確定して、保存して終了します。
次のコマンドでMySQLデーモンを再起動します。
service mysqld restart
# Stopping mysqld: [ OK ]
# Starting mysqld: [ OK ]
Railsアプリケーションの構成
このセクションでは、Railsアプリケーションサーバーを変更して、セットアップしたばかりのデータベースサーバーで動作を開始します。
データベースサーバーライブラリのインストール
最初に行うことは、必要なデータベースライブラリをインストールすることです。 私たちの場合、それはMySQLの開発パッケージです。
以下を実行して、MySQL開発パッケージmysql-devel
をインストールします。
yum install -y mysql-devel
Railsのdatabase.yml
の構成
Railsアプリケーションのデータベース設定は、/config
ディレクトリのdatabase.yml
ファイル内に保持されます。
次のコマンドを実行して、nano
テキストエディタを使用してdatabase.yml
ファイルを編集します。
# Make sure to enter your application deployment directory
# Example:
# cd /var/www/my_app
nano config/database.yml
このファイルを開くと、データベース設定が環境名で分割されて表示されます。 アプリケーションはproduction
環境を使用して実行する必要があるため、その構成を編集してみましょう。
production:
YML
コードブロックを次のコードブロックに置き換え、必要なビットを独自のセットアップ構成に合わせて変更します。 IPアドレスなど。
# Example:
# production:
# adapter: mysql
# encoding: utf8
# database: [database name]
# username: [user name]
# password: [password]
# host: [server IP address]
# port: [port number]
# protocol: [protocol]
# pool: [connection pool]
production:
adapter: mysql
encoding: utf8
database: rails_myapp
username: rails_myapp_user
password: pwd
host: 128.199.233.36
port: 3306
pool: 10
注:上記の例で提供されているように、プロトコルを指定する必要がある場合があります。
注: pool
引数には、最大同時データベース接続スロットの数が含まれます(つまり、 プール)利用可能。 あなたはあなたのニーズを評価し、それに応じて数を設定する必要があります。
CTRL + Xを押し、Yで確定して、保存して終了します。
mysql
ジェムの入手
以下を使用して、nanoを使用してGemfileの編集を開始します。
nano Gemfile
次の行をファイルに追加します。
gem 'mysql'
CTRL + Xを押し、Yで確定して、保存して終了します。
bundle
を使用して新しいgemをインストールします。
bundle install
以上です! 今後、Railsアプリケーションサーバーはすべての操作に新しいデータベースサーバーを使用します。
サーバー間でのデータの移行
VPSに移行したい開発マシン上のデータがすでにある場合は、このテーマに関するDigitalOceanコミュニティの記事2台のサーバー間でMySQLデータベースを移行する方法を確認してください。