介绍
作为多机应用程序部署堆栈的一部分的每台服务器都应该像一个好的意大利比萨饼:一个坚实的基础只需要用必要的成分来装饰,不要过度膨胀或负载过重,以保持一切都易于处理(和管理)。
在我们的 Scaling-Rails DigitalOcean 系列文章的第二部分中,我们将了解如何创建一个 droplet 来托管数据库层,以供应用程序服务器连接和使用。 我们的目标是通过为每台服务器 单独委派一个任务 ,最大限度地减少让单点故障 (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 等
为了在继续部署数据库服务器之前做出明确和长期的决定,您可能有兴趣阅读我们关于该主题的文章:
- 数据库简介:
- 关系:
- 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 数据库),我们将在我们的服务器设置中添加第四个元素:
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教程中服务器准备部分的总结。 它解释了如何开始使用 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
,您需要使用 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'
命令,按回车键并继续下一步,回答类似于以下的问题:
# 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 权限:
FLUSH PRIVILEGES;
注意: 要根据需要微调权限,请查看有关该主题的 MySQL 官方文档:MySQL 提供的权限
存在客户端:
exit # Bye
启用远程连接
由于我们需要能够从运行 Rails 应用程序的远程计算机访问 MySQL 服务器,因此必须修改配置文件。
运行以下命令以使用 nano
文本编辑器编辑 MySQL 配置 my.cnf
:
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
为 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 社区关于该主题的文章:如何在两个服务器之间迁移 MySQL 数据库。