序章


マルチマシンアプリケーション展開スタックの一部である各サーバーは、優れたイタリアンピザのようなものである必要があります。すべてを扱いやすくするために、堅固なベースには、過剰な膨満感や大きな負荷をかけずに、必要な材料だけを飾る必要があります。 (そして管理する)。

Scaling-Rails DigitalOceanの記事シリーズのこの第2部では、アプリケーションサーバーが接続して動作するために、データベースレイヤーをホストするドロップレットを作成する方法を説明します。 ここでの目的は、サーバーごとに1つのタスク を明確に委任することにより、単一障害点(SPoF)がダウンタイム(または損失)の原因として現れる可能性を最小限に抑えることです。

用語集


1. データベースの選択


2. サーバーのセットアップ構造


  1. 複数のアプリケーションサーバーの負荷分散
  2. データベースサーバーレイヤー

3. デプロイメントセットアップへのデータベースサーバーの追加


  1. サーバーの準備

4. MySQLのインストール


  1. データベースサーバーのダウンロード
  2. 初期設定の実行
  3. データベースサーバーに接続する
  4. 新しいデータベースを作成する
  5. 新しいデータベースユーザーを作成する
  6. 特権の付与
  7. リモート接続の有効化

5. Railsアプリケーションの構成


  1. データベースサーバーライブラリのインストール
  2. Railsのdatabase.ymlの構成
  3. mysqlジェムの入手
  4. サーバー間でのデータの移行

データベースの選択


Ruby on Railsアプリケーション開発フレームワークは、データベースサーバーにさまざまなサポートを提供します。 ほとんどのアプリケーションでは、リレーショナルデータベース管理システムが最適です。 ただし、リレーショナルサーバーまたは両方を一緒に実行する代わりに、非リレーショナルのスキーマレスNoSQLデータベースサーバーが必要になる場合があります。

自分の開発用コンピューターでRailsの操作を開始する場合、最も簡単でおそらく最も論理的な方法は、SQLiteライブラリなどの機能的で基本的なデータベース実装を使用することから始めることです。 ただし、実際の展開では、SQLiteではアプリケーションの負荷を処理するには不十分である可能性があるため、本格的なRDBMSが必要になります。

ニーズとアプリケーションの種類に応じて、データベース管理システム(つまり、 データベースサーバー)を使用して、アプリケーション展開セットアップのデータベースレイヤーを作成します。

リレーショナルデータベースの場合、より一般的な選択肢のいくつかは次のとおりです。

  • MySQLと派生物:

最も人気があり、一般的に使用されているRDBMSおよび関連するフォークプロジェクト。

  • PostgreSQL:

最も高度なSQL準拠のオープンソース目標-RDBMS。

非リレーショナルデータベースサーバーの場合:

  • 列ベース:

Cassandra、HBaseなど。

  • 書類:

MongoDB、Couchbaseなど

  • グラフ:

OrientDB、Neo4Jなど。

データベースサーバーの展開を続行する前に明確で長期的な決定を下すために、このテーマに関する記事を読むことに興味があるかもしれません。

  • データベースの概要:

SQLおよびNoSQLデータベースとさまざまなデータベースモデルを理解する

  • 関連した:

リレーショナルデータベース管理システムの比較

  • 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データベースを移行する方法を確認してください。

投稿者: https ://twitter.com/ostezer