介绍
作为多机器应用程序部署的一部分的每个服务器应该像一个好的意大利比萨饼:一个坚实的基础需要只用必要的成分装饰,没有过度膨胀或重负载,以保持一切容易处理(和管理)。
在我们的第二部分缩放-Rails的 DigitalOcean系列文章中,我们将看到如何创建一个Droplet承载数据库层,应用程序服务器连接到和工作用。 在这里我们的目标是鲜明的委托每台服务器一个单任务,以尽量减少失败,让一个单点(SPOF)的机会脱颖而出,成为停机(或亏损)的罪魁祸首可能。
词汇表
选择数据库
2.服务器设置结构
- 负载平衡多个应用程序服务器
- 数据库服务器层
3.将数据库服务器添加到部署设置
- 准备服务器
4.安装MySQL
- 下载数据库服务器
- 执行初始设置
- 连接到数据库服务器
- 创建新数据库
- 创建新的数据库用户
- 授予权限
- 启用远程连接
5.配置Rails应用程序
- 安装数据库服务器库
- 配置
database.yml
钢轨 - 获得
mysql
Gem - 在服务器之间迁移数据
选择数据库
Ruby on Rails应用程序开发框架为数据库服务器提供了大量的支持。 对于大多数应用程序,关系数据库管理系统是要走的路。 但是,一些可能需要一个非关系的,无模式的NoSQL数据库服务器 - 而不是关系型数据库服务器或两者一起运行。
当您开始在自己的开发计算机上使用Rails时,最简单也可能是最合理的方法是使用一个有能力但基本的数据库实现,例如SQLite库。 然而,对于真实部署,机会是SQLite将不足以处理您的应用程序负载,因此需要一个成熟的RDBMS。
根据您的需求和应用类型,你需要在数据库管理系统 (如数据库服务器)决定创建您的应用程序部署建立数据库层 。
对于关系数据库,一些更流行的选择是:
- MySQL和衍生:
最流行和常用的RDBMS和相关的,分叉项目。
- PostgreSQL:
最先进的,SQL兼容和开源的目标RDBMS。
对于非关系数据库服务器:
- 基于列:
Cassandra,HBase等
- 文件:
MongoDB,Couchbase等
- 图形:
OrientDB,Neo4J等
为了在继续部署数据库服务器之前做出明确和长期的决定,您可能有兴趣阅读我们关于此主题的文章:
- 数据库简介:
- 关系:
- 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数据库。
让我们开始!
准备服务器
注:这部分是从我们的服务器准备部分的摘要缩放-Rails的教程。 它解释了如何开始使用CentOS VPS。 如果你想在Ubuntu主机上部署MySQL实例,检查部署Sinatra教程来看看如何使用安装MySQL,或任何其他数据库服务器,然后再继续准备Ubuntu的服务器。
运行以下命令更新基于CentOS的虚拟服务器的默认工具:
yum -y update
通过执行以下命令安装包含多个开发工具的应用程序包:
yum groupinstall -y 'development tools'
添加EPEL软件存储库供YUM软件包管理器使用。
# 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
,您需要安装mysql-client
和libmysqlclient-dev
使用包aptitude
(或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'
命令,按回车并继续下一步,回答类似以下问题的问题:
# 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服务器,因此必须修改配置文件。
运行以下命令来编辑MySQL配置my.cnf
使用nano
文本编辑器:
nano /etc/my.cnf
我们想告诉MySQL监听来自分配给我们的Droplet的IP地址的连接,所以让我们添加以下行:
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
配置database.yml
钢轨
对于Rails应用程序数据库设置都保存在里面database.yml
文件/config
目录。
运行以下命令来编辑database.yml
使用文件nano
文本编辑器:
# 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
Gem
使用nano使用以下命令开始编辑Gemfile:
nano Gemfile
将以下行添加到文件:
gem 'mysql'
按CTRL + X并用Y确认保存并退出。
安装使用新的Gembundle
:
bundle install
就这样! 从现在开始,您的Rails应用程序服务器将为所有操作使用您的全新数据库服务器。
在服务器之间迁移数据
如果你已经在你的开发机器上的数据,你想迁移到您的VPS,检查出DigitalOcean社区文章的主题: 如何迁移两个服务器之间的MySQL数据库 。