在AWS上创建一个PostgreSQL服务器

最新消息:自2013年11月起,Amazon RDS 支持 PostgreSQL。
以下信息仅适用于那些仍然希望自己构建、学习或者想要最低成本的人。

使用AWS EC2创建PostgreSQL服务器。虽然有MySQL的相关信息,但很难找到PostgreSQL的信息,所以自己创建了。预计使用m2.xlarge和m3.xlarge这样的规模进行操作。

将EC2作为PostgreSQL服务器运行

EC2和EBS的配置设置

使用AWS的经典向导进行创建。对于每个项目进行如下设置。

サーバー:Ubuntuの64ビット (CentOSが好きならAmazonLinuxを選ぶ)
Availability Zone:好きなのを選ぶ (最悪AMIを通して移動できる)
EBS: データ用、WALログ用、LOG用をスタンダードボリュームで3つ作っておく 
    (サイズの拡大は頑張ればできるが、料金は10Gで1ヶ月1$ほどなので、すぐには満杯にならない程度の大きさで作る)
Tag:後から付けられるので無視。区別する名前が必要なら付ける感じ
KeyPair:必要なら新しく作る
SecurityGroup:新しくDB用のを作る(後から付け替えられない)

由于EBS的费用取决于所保留的磁盘数量和IO量,所以将写入内容分别进行分离会更经济合算。因此,为了适应数据库的写入需求,我们创建了三个EBS。
其中用于数据的EBS大小是当前数据库大小的数倍,而其他方面只需要5G就足够了。

制作完成后, (zuò zhì

    • 間違ってTerminateしないように、Termination ProtectionをOnにしておくと良い。

 

    • ElasticIPでIPを指定しておくと、インスタンスを立ち上げ直した時に同じIPでssh等することが出来て良い。無料。(http://aws.amazon.com/jp/ec2/#elastic-ip)

 

    CloudWatchも、とりあえずディスクがいっぱいになりそうな部分の指定だけしておくと良い。基本指標の5分毎のチェックなら無料。(http://aws.amazon.com/jp/cloudwatch/)

请说明:是应该使用EBS的标准还是IOPS设置。

    • スタンダードのIOPSは平均100

 

    • ボリューム課金:Standardは10Gで1$、IOPSプロビジョンドは8Gで1$

 

    IO課金:Standardは月間1000万IOにつき1$、IOPSプロビジョンドは100IOPSで1月使って10$

如果每秒I/O(即IOPS)为100,只有在每月发生1亿次I/O(写入)后,标准存储才能超过IOPS。对于访问量不是很大的服务来说,标准存储已经足够。

尝试使用SSH登录到已创建的EC2实例

使用在KeyPair部分指定的pem文件以用户名ubuntu登录

ssh -i ~/.ssh/hogehoge.pem ubuntu@ec2-1-234-56-78.compute-1.amazonaws.com

EC2服务器的环境配置

我想因为每个人都有自己的喜好,所以可以随意做。但是以下的项目,暂时可以先做一下,不是吗?

表达语言的设置

暂时尝试将其汉化。虽然也可以用英语,但在这种情况下最好对每个内容直接指定为en_US.UTF-8,以免出现问题。

LANGUAGE="ja_JP:ja"
LC_ALL="ja_JP.UTF-8"
LC_CTYPE="ja_JP.UTF-8"
LANG="ja_JP.UTF-8"

在进行这项设置之前,根据环境来决定。

sudo apt-get install --reinstall locales
sudo apt-get install language-pack-ja-base

可能需要的。

更改时区

$ date
2013年 2月 20日 水曜日 11:31:36 UTC
$ sudo mv /etc/localtime /etc/localtime.default
$ sudo ln -s /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
$  date
2013年 2月 20日 水曜日 20:31:51 JST

创建个人用户

sudo adduser hoge
sudo passwd hoge
sudo visudo  # hogeユーザーでsudo可能に
su - hoge

为了能够立即通过SSH登录,最好先将id_rsa.pub作为authorize_key放置好。详情可参考:http://d.hatena.ne.jp/torazuka/20110420/ssh

使用apt-get命令安装所需的内容。

首先,将apt更新至最新版本。

sudo apt-get upgrade
sudo apt-get update

我认为之后只需要放入喜欢的东西就可以了,但我暂时只放了这些。

sudo apt-get install build-essential emacs git screen zsh

我认为在服务器上运行时,使用screen或tmux是必要的。

安装PostgreSQL

sudo apt-get install postgresql
sudo apt-get install libpq-dev  # rubyやpython等から使うときに必要になるだろうから入れておく
sudo apt-get install sysv-rc-conf  # chkconfigの代わり
sudo sysv-rc-conf postgresql on  # 起動時にpostgresqlサーバーが起動するようにする

让我们尝试连接到PostgreSQL数据库

安装PostgreSQL时,会自动创建一个postgres用户。要使用此用户登录,可以按以下步骤进行操作。

sudo su - postgres

趁着成为postgres用户的机会,我们也可以创建一个用于测试的数据库。

createdb testdb

本条回答提供中文的重述,仅提供一种选项:
使用psql命令连接数据库

psql testdb

完成表后,您可以选择查看pg_shadow或pg_user,随意操作。

附加:从其他用户以postgres身份访问psql。

将 ph_hba.conf 文件如下修改

- local     all     postgres     peer
+ local     all     postgres     trust

http://www.postgresql.org/docs/9.1/static/auth-pg-hba-conf.html – PostgreSQL官方文档9.1版本中关于auth-pg-hba-conf的说明。

http://www.hizlab.net/app/pgsec.html – Hizlab网站上有关pgsec应用的详细信息。

这样做,可以从我的账户上操作。

psql -U postgres testdb

可以实现以上提到的效果。
顺便提一下,为了安全起见,最好不要在这里进行操作,只有本地主机是安全的,也只有对于懒惰的人才做这件事。但是,了解可以通过pg_hba.conf进行各种访问控制是很重要的。

将Postgresql以便可以从外部进行访问进行配置。

host all all 0.0.0.0/0 md5
listen_addresses = '*'

那么,

sudo /etc/init.d/postgresql restart

在安全组的配置中还需要设置防火墙。
在AWS控制台上,通过添加配置,将端口号5432(用于Postgres的默认端口号)设置为0.0.0.0/0。

当然,如果想要更安全,应该做以下的事情。

0.0.0.0/0を事前にわかっているアクセス元のIPアドレスに変更する。
ポート番号をデフォルトの5432から変える。

额外:尝试将Heroku用作数据库。

以下是给出的一种在中文中的翻译方式:
Heroku的DATABASE_URL是什么?

postgres://用户名:密码@DB服务器URL/数据库名

该系统由若干部分组成。因此,只需创建数据库并按照此指示进行设置即可正常使用。

heroku config:set DATABASE_URL=postgres://user:pass@hogehoge-xxx.amazonaws.com/dbname

对PostgreSQL进行调优

请参考一下我在m3.xlarge实例上进行调优时的信息。我认为/etc/sysctl.conf的设置是必需的。

根据角色的不同,将数据分割为不同的写入位置。

到现在为止,应该已经可以将AWS用作Postgres服务器。接下来,根据不同的角色将数据库的写入分割,以提高速度和容错能力。

最后的组成

最终设定将如下所示。

マウント先FileSystem用途//dev/xvda1EC2のデフォルト/ebs/dev/xvdbPostgresのData用/ebs2/dev/xvdcPostgresのWALログ用(pg_xlog)/ebs3/dev/xvddPostgresのsyslog用(pg_log)

另外,您需要使用`postgres`用户在每个卷上创建以下目录。目录名没有特定意义,您可以随意更改。

sudo su - postgres
umask u=rwx,g=,o=
mkdir -p /ebs/postgresql/data
mkdir -p /ebs2/postgresql/wal/pg_xlog
mkdir -p /ebs3/postgresql/log/pg_log

EBS的格式与挂载方式

要将EBS用作为磁盘,必须先进行适当的格式化并进行挂载。

首先,确认EBS磁盘是否被识别。如果EBS连接正常,那么应该存在/dev/xvdb等文件。

sudo fdisk -l

设置分区。按住回车键,最后按下w键保存设置应该就可以了。

sudo fdisk /dev/xvdb

在 ext4 上进行文件格式化。虽然也调查了 ext3 和 xfs,但最终 ext4 似乎更好。EC2 上的 EBS 原本就是用 ext4 格式化的。

$ sudo mkfs.ext4 /dev/xvdb
mke2fs 1.42.5 (29-Jul-2012)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
655360 inodes, 2621440 blocks
131072 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=2684354560
80 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks: 
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done 

我們決定掛載。我們在這裡選擇在/ebs目錄下進行掛載。

sudo mkdir /ebs
sudo chmod 777 /ebs
sudo mount /dev/xvdb /ebs
mount (マウント状況を確認)

只需这样,它在重新启动时将不再被挂载。
如果想要在启动时自动挂载,请做如下设置。

LABEL=cloudimg-rootfs / ext4 defaults 0 0
/dev/xvda3 none swap sw,comment=cloudconfig 0 0
/dev/xvdb /ebs ext4 defaults 0 0

在/dev/xvdb/字段中写入,并应用配置。

sudo mount -a

对其他两个EBS卷执行相同的操作。

将Postgres的数据目录迁移

停止数据库

sudo /etc/init.d/postgresql stop

将原始数据的内容复制到/ebs下的新位置

sudo su - postgres
cp -r /var/lib/postgresql/9.1/main /ebs/postgresql/data

请按以下方式更改postgresql.conf文件。

- data_directory = '/var/lib/postgresql/9.1/main' # use data in another directory
+ data_directory = '/ebs/postgresql/data' # use data in another directory

启动数据库

sudo /etc/init.d/postgresql start

将WAL日志(pg_xlog)和系统日志(pg_log)的写入位置更改

日志文件的写入位置是无法通过配置文件修改的,所以需要通过符号链接来进行对应。

sudo /etc/init.d/postgresql stop
mv /ebs/postgresql/data/pg_xlog /ebs2/postgresql/wal/
ln -s /ebs2/postgresql/wal/pg_xlog /ebs/postgresql/data/pg_xlog

mv /ebs/postgresql/data/pg_log /ebs3/postgresql/log/
ln -s /ebs3/postgresql/log/pg_log /ebs/postgresql/data/pg_log
sudo /etc/init.d/postgresql start

就是这样。

系统日志无关紧要,但更改WAL日志的写入位置是必要的,只要WAL日志(加上归档日志)仍然存在,即使Data目录损坏,只要日志保留,就能恢复到最新状态或指定的点或时间。

搭建备份环境

当数据库损坏时,可以考虑以下两种恢复方法。

    1. 使用PostgreSQL的恢复功能,从恢复点、归档日志和WAL日志进行恢复

 

    从数据库的转储文件进行恢复

前者可以在手续繁琐的情况下,以接近于损坏前的状态进行再现。后者则较为简单,但只能在备份时刻进行恢复(通常在深夜进行,每天一次,因此最多可能会有一天的数据丢失)。

请分别写出以下方法,用于实现1和2。
对于备份数据的存储位置,假设使用亚马逊S3。

1. 在S3上创建恢复点和存档日志

Heroku开发的WAL-E非常容易使用。由于内容较长,我已将其整理到另一篇文章中。
使用Heroku开发的WAL-E,在AWS上进行PostgreSQL的备份非常简单。

顺便提一句,“存档博客”是指在S3上备份的WAL日志,可以从pg_xlog中删除的内容。

将数据库的转储发送到S3。

安装s3cmd,以便能够通过命令行访问s3。

sudo apt-get install s3cmd

设置访问密钥、秘密密钥等。

s3cmd --configure

如果.s3cfg文件已在主目录中创建,则表示OK。

接下来创建一个使用s3cmd的备份脚本。
将所有过去的dump保存在dumps/目录下,并将最新的dump保存在dumb/db.dump中。

DUMPTIME=`date +%Y%m%d_%H%M%S`
pg_dump -Fc --no-acl --no-owner your-db-name > /data/db.dump
s3cmd put /data/db.dump s3://your-s3-bucket/dumps/db_${DUMPTIME}.dump
s3cmd cp s3://your-s3-bucket/dumps/db_${DUMPTIME}.dump s3://your-s3-bucket/dump/db.dump

使用postgres用户执行”crontab -e”命令来设置cron job。

30 3 * * * /usr/local/bin/s3pgbackup.sh > /dev/null
bannerAds