EC2 连接 RDS
EC2 连接 RDS
接下来我们要演练的是如何将 EC2 实例连上 RDS,规格如下
EC2 实例
- AMI 版本 : Amazon Linux 2 - amzn2-ami-hvm-2.0.20200904.0-x86_64-gp2 (ami-0b1e534a4ff9019e0)
- Linux Version: 4.14.193-149.317.amzn2.x86_64
- Web server : Apache 2.4.43, PHP 5.4.16, mysqlnd 5.0.10
- 安全组 : ithome_web_SG
- 子网 : 公有子网 1
RDS 实例
- MySQL Server : 8.0.17 Community
测试 RDS 联机
开启一个 EC2 实例,规格如上所示,务必记得安全组跟子网一定要对,不然网络不会通,设定好 key pair 后,使用 PuTTY 连上 EC2 实例,如果忘记的话可以参考前面相关文章 Amazon Relational Database Service (Amazon RDS) 笔记,登入成功后请键入
# 安装需要的软件:网站服务器 httpd 、程序语言 PHP、MySQL 客户端联机套件 mysql、php联机MySQL数据库套件 php-mysql
sudo yum -y install httpd php mysql php-mysql
# 透过 MySQL 客户端联机到 RDS
# 需指定 -h 主机、 -u 用户、 -p 密码(密码选项跟密码间没有空白)、 数据库名称
mysql -h ithomedbid.clbfxibs3qbv.ap-southeast-1.rds.amazonaws.com -u ithomeDbuser -pithome-password ithomeDB
如果联机成功会看到如下图所示,接着新增表格 ec2_metadata 到 RDS 的数据库中,这个表格会记录 EC2 实例ID (instanceId)、实例所在的可用区(availabilityZone)、远程主机的 IP 地址(remoteIp)、以及浏览时的时间(ct)
CREATE TABLE ec2_metadata (
id INT(4) NOT NULL AUTO_INCREMENT PRIMARY KEY,
instanceId VARCHAR(30),
availabilityZone VARCHAR(30),
remoteIp VARCHAR(50),
ct TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
图 1 、联机至 RDS 并新增表格
EC2 实例网页首页
接着我们以Elastic Load Balancing (ELB) 笔记的首页程序为模板,在新增一个程序用来将 EC2 实例ID (instanceId)、实例所在的可用区 (availabilityZone)、远程主机的 IP 地址 (remoteIp)、以及浏览时的时间 (ct) 写入 RDS 的数据库中。
首页程序 index.php
<center>
<table class='table table-bordered'>
<tr><th>Meta-Data</th><th>Value</th></tr>
<?php
#The URL root is the AWS meta data service URL where metadata
# requests regarding the running instance can be made
$urlRoot="http://169.254.169.254/latest/meta-data/";
$instanceId = file_get_contents($urlRoot . 'instance-id');
$availabilityZone = file_get_contents($urlRoot . 'placement/availability-zone');
# Get the instance ID from meta-data and print to the screen
echo "<tr><td>InstanceId</td><td><i>" . $instanceId . "</i></td><tr>";
# Availability Zone
echo "<tr><td>Availability Zone</td><td><i>" . $availabilityZone . "</i></td><tr>";
include("rds_write.php");
?>
</table>
</center>
存取 RDS 的程序 rds_write.php
<?php
//This is a simple EC2_metadata example for testing with RDS
// RDS configuration
$rdsURL = "ithomedbid.clbfxibs3qbv.ap-southeast-1.rds.amazonaws.com";
$rdsDB = "ithomeDB";
$rdsUser = "ithomeDbuser";
$rdsPwd = "ithome-password";
// Get remote IP
$remoteIp = isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : "";
// Connect to the RDS database
$mysqli = new mysqli($rdsURL, $rdsUser, $rdsPwd, $rdsDB);
// Set mysql connection character set
if (!$mysqli->set_charset('utf8')) {
printf("Error loading character set utf8: %s\n", $mysqli->error);
exit;
}
// Insert data into ec2_metadata tbale in RDS
$sql = "INSERT INTO ec2_metadata (instanceId, availabilityZone, remoteIp)
VALUES ('${instanceId}', '${availabilityZone}', '${remoteIp}')";
if (!$mysqli->query( $sql))
echo "<div>Error: " . $sql . "<br>" . $mysqli->error . "</div>";
$mysqli->close();
?>
浏览 EC2 实例网页
在准备打开 Chrome 浏览器浏览成果之前请先确认以下步骤
EC2 实例
- 已安装完该有的套件: httpd php mysql php-mysql,如果没有,请输入下列指令并确认有执行成功
sudo yum -y install httpd php mysql php-mysql
- 已启动 Web Server,若不确定那记得检查一下
# 启动 Web Server
sudo systemctl start httpd
# 检查 Web Server状态
sudo systemctl status httpd
- 已将上述的两个档案 (index.php, rds_write.php) 放入首页目录 /var/www/html,可以用以下指令确认
ls -la /var/www/html
如果正确应该会看到
[aaa@qq.com ~]$ ls -la /var/www/html
total 12
drwxr-xr-x 2 root root 63 Sep 11 05:53 .
drwxr-xr-x 4 root root 33 Sep 10 12:59 ..
-rw-r--r-- 1 root root 775 Sep 10 14:08 index.php
-rw-r--r-- 1 root root 973 Sep 10 15:14 rds_write.php
- 确认 RDS 已经启动,请组态都正确(endpoint, master名称、密码、数据库),检查方式就是用第一点所提到的
mysql -h ithomedbid.clbfxibs3qbv.ap-southeast-1.rds.amazonaws.com -u ithomeDbuser -pithome-password ithomeDB
确认了上述讯息后,接着只要把 EC2 实例的 IPv4 Public IP 贴上浏览器应该就可以看到我们所期待的画面
图 2 、EC2 实例 结合 RDS
RDS MySQL 调整设定
很抱歉的,人生不如意事十有八九,写系统的人从来不会那么顺风顺水的,出现了 Server sent charset unknown to the client 这样的错误,谷哥大神这时候总是可以及时救援的,找了半小时后,开始后悔为什么要用 Amazon RDS, WAMP (Windows, Apache, MySQL, PHP)不是很好吗? LAMP (Linux, Apache, MySQL, PHP)也不差啊,每一篇都说是 MySQL 服务器设定问题,要求修改 MySQL 服务器的设定,并重开服务器。 RDS 去哪设定啊?这时候,最棒的还是 stack overflow 总是可以在濒临绝望时出现曙光,详细内容请参阅 References。
步骤如下:
- 新增 Parameter groups
到 RDS 控制台,选择左边选单中的 Parameter groups,再按下右手边的 Create parameter group,接下来设定相关内容
Parameter group family : mysql8.0
Group name : ithomepara
Description : ithome parameter
图 3 、新增 Parameter group
- 修改 ithomepara 的字符集
到 RDS 控制台,选择左边选单中的 Parameter groups,再选择右手边的ithomepara,对 ithomepara 进行内部参数的修改。在 Parameters 下方的文本框输入 character_set 后,按下 Edit Parameters ,将这四个参数 character_set_client, character_set_connection, character_set_database, character_set_server 的值改为utf8(预设是空白的),修改完毕后记得勾选要修改的项目,并按下 Save changes 以储存结果,可参考下图
图 4 、修改 Parameter group 的字符集设定
- 修改数据库设定
回到 RDS控制台,选择左边选单中的 Databases ,按下数据库实例 ithomedbid 后,再按右上角的 Modify 来修改数据库 ithomedbid 的内容
图 5 、修改数据库 ithomedbid 的设定
找到 Database Options 完成以下设定
DB Parameter group : ithomepara
图 6 、修改DB Parameter group 的设定
接下来要特别注意,因为数据库的设定默认并非立即生效,所以必须要强制立即套用,并重开数据库实例,这个过程有点久,可以透过观察 RDS 实例的 status 字段来了解目前状态
图 7 、立即套用修改
图 8 、重开数据库
再次确认 RDS 的存取
接着再回到浏览器,再次输入 EC2 实例的 IPv4 Public IP,看到网页的响应后,使用 PuTTy 连到 EC2 实例 使用mysql客户端程序连到 RDS 查询数据是否写入,如下图所示
图 9 、EC2 实例 结合 RDS
# MySQL 客户端联机到 RDS,这是 linux 的指令
mysql -h ithomedbid.clbfxibs3qbv.ap-southeast-1.rds.amazonaws.com -u ithomeDbuser -pithome-password ithomeDB
# 查询数据表的内容,这是 MySQL 客户端的指令
select * from ec2_metadata;
图 10 、查询 RDS 内的数据
References
- PDO::__construct(): Server sent charset (255) unknown to the client. Please, report to the developers, https://*.com/questions/43437490/pdo-construct-server-sent-charset-255-unknown-to-the-client-please-rep
- PHP连接操作MySQL数据库出错Server sent charset unknown to the client. Please, report to the developers解决, https://blog.csdn.net/caixuanji/article/details/107433268
上一篇: Hadoop好友推荐系统-HDFS的文件上传和下载
下一篇: Set