• 1. 讲师指导课 ACP11001 全面理解阿里云 阿里云关系型数据库服务RDS产品介绍Your Name Your Title
  • 2. 提纲2RDS架构和功能概述RDS的不同之处RDS产品功能介绍RDS API阿里云RDS控制台演示
  • 3. 提纲3RDS架构和功能概述RDS的不同之处RDS产品功能介绍RDS API阿里云RDS控制台演示
  • 4. RDS功能和架构介绍关系型数据库服务(Relational Database Service,简称RDS)是阿里云提供的一种稳定可靠、可弹性伸缩的在线数据库服务。RDS采用即开即用方式,兼容MySQL、SQL Server两种关系型数据库,并提供数据库在线扩容、备份回滚、性能监控及分析等功能。 简要介绍: ★ RDS的目标是将耗时费力的数据库管理任务承担下来,使用户能够专心于应用开发和业务发展。用户可根据业务需求对RDS进行弹性伸缩,RDS承诺99.95%的服务可用性和99.9999%的数据可靠性。 ★  RDS目前提供MySQL和SQL Server两种关系型数据库,访问协议完全兼容。用户现有的数据库代码、应用等可直接应用在RDS上,减小重新开发成本。 基础架构: ★RDS采用主从备份架构,拥有3份以上数据存储,具备高可用性和数据可靠性。
  • 5. 高可用采用主从热备的架构。主机down机或者出现故障后,备机秒级完成无缝切换,服务可用性承诺:99.95%提供自动多重备份的机制。用户可以自行选择备份周期,也可以根据自身业务特点随时进行临时备份,数据可靠性承诺:99.9999%数据回溯到任意时间点。用户可以选择7天内的任意时间点创建一个临时实例,临时实例生成后验证数据无误,即可将数据迁移到RDS实例,从而完成数据回溯操作。高安全提供白名单访问策略。可自行设置允许访问的IP及IP段,有效防止黑客扫描端口进行服务器攻击。提供阈值报警的功能。支持实例锁定报警、连接数报警、IOPS报警、磁盘空间使用报警、CPU报警等。提供SQL注入告警。将对发往RDS的疑似SQL注入的语句进行记录并展示,供用户进行程序调整,杜绝SQL注入的发生。SQL审计。记录所有发往RDS的SQL语句,系统将记录SQL语句相关的连接IP、访问数据库的名称、执行语句的账号、执行时间、返回记录数等信息。供用户对RDS安全性进行排查。控制台操作日志。记录所有在控制台上进行的修改类操作,便于管理员查看并管理RDS。高性能RDS使用高端服务器来保障每个数据库都拥有良好的性能。针对MySQL类型的RDS,数据库版本融合了阿里巴巴官方数据库补丁,有效的提升了RDS的性能。性能监控。提供多种监控图方便用户跟踪RDS的性能状况。如IOPS、连接数、磁盘使用空间、CPU利用率、QPS\TPS、网络流量以及多种数据库的内部监控指标图慢SQL汇总分析。将数据库中的慢SQL进行相似语句去重,按照指定方式排序后进行展示,为用户排查慢SQL优化数据库性能提供帮助。优化建议。提供多种优化建议方便用户优化数据库性能,如:存储引擎检查、大表检查、无主键检查、索引过多表检查、缺失索引检查等易用性提供向导式迁移服务,使用户能够通过WEB端管理控制台轻松将自建数据库迁移至RDS。快捷查看数据库系统日志,用户能够RDS管理控制台查看数据库级别的系统日志。便捷操作数据库实例。提供完善的WEB端管理控制台,帮助用户操作数据库实例,如重启实例、删除BINLOG、备份等等。轻松升级,按量付费。RDS提供实例配置和数据库版本的在线升级服务,随开随用,按量付费,资源业务轻松拓展。RDS优势
  • 6. 防DDoS攻击:当RDS为公网访问时,阿里云安全体系会自动判断RDS是否正在遭受DDoS攻击,并启动流量清洗的功能,若攻击达到黑洞阈值或清洗失效,将会进行黑洞处理。 SQL注入告警:RDS会通过解析SQL语句,判断是否遭受SQL注入攻击,并提示修改应用程序。 IP访问白名单:白名单可以使RDS实例得到最高级的访问安全保护;建议设置访问源IP地址或者IP段,最多设置100个。 将数据迁移至RDS:RDS for MySQL提供在线迁移数据的方式,可以不停止原有数据库运行的情况下完成数据迁移操作;RDS for SQL Server提供上传备份文件迁移至RDS的迁移方式,可便捷的完成数据的导入操作。 实例在线升级:RDS提供的在线升级服务,包括实例配置的升级和数据库版本的升级,升级过程无需用户介入。 系统性能监控:RDS提供近20个系统性能的监控视图,如磁盘容量、IOPS、连接数、CPU利用率、网络流量等,用户可以轻松查看实例的负载。 优化建议:RDS提供多种优化建议,如存储引擎检查、主键检查、大表检查、索引偏多、缺失索引等,用户可以根据优化建议并结合自身的应用来对数据库进行优化。 备份管理:RDS自动提供多重备份,同时RDS支持用户通过RDS管理控制台或OPEN API灵活变更备份的时间。 数据回溯:RDS通过备份和日志,用户可以选择7天内的任意时间点创建一个临时实例,临时实例生成后验证数据无误,即可将数据迁移到RDS实例,从而完成数据回溯操作。RDS功能特点
  • 7. RDS只读实例概要
  • 8. RDS与自建数据库对比RDS自建数据库服务可用性99.95%双交换机网络环境,电源输入,高配置主机,双机主从复制,故障恢复,VIP漂移,数据备份,自动数据还原等一系配套设施需要自行保障数据可靠性99.9999%自行搭建主从复制,自建RAID,MySQL Patch维护等均需自行保障系统安全性防DDoS攻击,流量清洗;及时修复各种数据库安全漏洞自行部署,价格高昂;自行修复数据库安全漏洞数据库备份自动备份自行实现,但需要寻找备份存放空间以及定期验证备份是否可恢复基础运维无需基础运维(如安装机器、部署数据库软件、机器损坏等维护工作)需聘请运维工程师进行维护,花费大量人力成本数据库优化提供资源报警、性能监控图、数据库优化建议、SQL运行报告、慢查询分析等数据库优化功能需招聘专职DBA来维护,花费大量人力成本部署扩容即时开通,快速部署,弹性扩容,按需开通需硬件采购、机房托管、部署机器等工作,周期较长资源利用率按实际结算,100%利用率需考虑峰值,资源利用率较低
  • 9. RDS典型使用场景RDS除了可单独使用外网进行连接外,还可与阿里云的其它云产品配合使用,以提供高IO、低时延、高可用和高可靠性的整体解决方案。云服务器ECS。RDS与ECS结合使用,可以利用内网流量免费和低时延的特性。开放缓存服务OCS。为了提高系统整体性能,降低RDS压力,可采用OCS缓存方案。开放存储服务OSS。可以在OSS存储二进制或非结构化资源,然后在RDS中存储资源链接
  • 10. 提纲10RDS架构和功能概述RDS的不同之处RDS产品功能介绍RDS API阿里云RDS控制台演示
  • 11. RDS关键技术:任务调度系统调度系统中最为核心的部分: 全面负责整个系统中所有任务的调度,以前各大组件之间的协调工作; 处理各个任务之间的互斥关系,防止并发任务带来的任务之间冲突; 处理自身体系的高可用以及稳定性; 支持多服务节点任务抢占模式进行工作,并在服务节点之间的健康检查和任务接管,使得整个系统更安全可靠。 单调度节点支持每秒200个并发事务调度
  • 12. RDS关键技术:备份系统备份系统主要负责所有集群内所有数据库实例的数据备份 ,并进行集中存储; 系统自身有高可用保护,在多个备份管理机之间有健康检查;发现有成员不健康会自动接管其任务; 备份任务可以并发地进行,并发度可以受到精确控制,这样可以防止IO资源,网络资源撑满。 单备份节点1天可完成备份6TB数据,可完成1000个用户实例轮循备份
  • 13. RDS关键技术:高可用控制系统高可用控制系统主要负责所有数据库实例主备之间的健康检查以及实时切换,以保证数据库高可用性达到99.99%; 3秒轮循一次,实例轮询并发进行,当发现有节点不健康时,需要完成秒级切换; 高可用控制系统是作为第三方身份去判断数据库实例是否在正常运行,不会出现脑裂现象; 可模拟应用去做更新,这样对故障点的判断更为准确; 高可用系统集群本身也是一个高可用的环境,集群内所有节点相互检查和任务接管。 可以支持20000个用户实例监控,HA节点在5秒内完成切换。
  • 14. RDS关键技术:在线迁移系统在线迁移系统主要负责数据库实例在不同主机之间的迁移工作。 迁移原因: 物理机达到压力上线,需要将部分实例迁移到另外主机上; 用户想要申请更多的资源,在不能终止用户业务的前提下,只能把实例迁移到另外的主机上; 用户需要做实例恢复,系统不能直接对当前实例进行恢复,而是在向另外的主机做迁移,最后再做切换。 迁移任务分成很多个原子操作, 系统把每一步完成的状态记录下来,如果在某一步操作发生异常,经管理员修复后,迁移系统会继续把后面的工作完成; 迁移系统本身是一个HA集群,拥有集群内节点心跳检测和任务接管的功能; 它依赖于备份系统,在进行迁移操作时,首先要获得一个备份集,若无备份,可下发备份指令, 产生一个备份集。 1000MB用户数据在10分钟内完成迁移,对用户完全透明。
  • 15. RDS关键技术:监控系统监控系统 主要负责整个系统内事务正常运转的检查,以及实例相关状态数据和性能数据的收集,包括: 所有主机和实例状态数据的收集等 主机和数据库实例性能收集 用户实例空间使用情况检查 系统一致性检查 网络流量信息收集汇总 异常报警 监控系统可以支持10000个设备,平均每个设备10个监控点的监控能力。
  • 16. 提纲16RDS架构和功能概述RDS的不同之处RDS产品功能介绍RDS API阿里云RDS控制台演示
  • 17. RDS功能总揽轻松使用RDS简单购买 按量计费 快速升级 数据库多引擎支持 专业参数配置 管理控制台备份/恢复自动备份 临时备份日志管理 数据回溯 数据转移实例间复制数据库 数据迁入/迁出RDS 备份文件下载 全面监控性能监控SQL审计阈值报警 WEB操作日志 安全保障IP访问白名单 防DDoS攻击 SQL注入告警 数据库升级完美使用慢SQL汇总SQL报告 性能优化 专业工具支持DRC iDB Cloud售后无忧5天无理由退款7*24小时服务支持
  • 18. RDS使用约束操作RDS使用约束创建数据库/数据库账号RDS不支持标准的SQL语句或客户端工具进行数据库账号的创建, 必须使用OPEN API或RDS管理控制台进行操作修改数据库参数设置大部分数据库参数须使用RDS管理控制台或OPEN API进行修改,具体可修改参数可参看RDS管理控制台。小部分参数无法修改数据库的root权限用户不具备数据库的root(SUPER)权限数据库备份可使用命令行或图形界面进行逻辑备份 必须通过RDS管理控制台或OPEN API进行物理备份,不支持第三方工具进行物理备份数据库还原可使用命令行或图形界面进行逻辑数据还原 必须通过RDS管理控制台或OPEN API进行物理还原数据迁入可使用命令行或图形界面进行逻辑导入 MySQL用户可以使用mysqldump、RDS管理控制台或在阿里云官网上下载DRC导入工具进行物理导入。SQL Server则需要使用RDS管理控制台或OPEN API进行操作MySQL存储引擎目前仅支持MyISAM、InnoDB两种。出于性能和安全性考虑建议尽量采用InnoDB存储引擎搭建数据库复制系统自动搭建了MySQL主备复制和SQL Server镜像,用户无须也不能手工搭建MySQL复制或SQL Server镜像。MySQL Slave节点和SQL Server镜像节点对用户不可见,不能直接用于访问SQL Server功能支持约束出于安全考虑,某些SQL Server功能不能够使用,如:分布式事务、Windows域账号登陆、邮件功能、BI分析功能、报表功能、数据库级别的DDL触发器(触发器中含有修改表结构、创建表、增删索引等DDL语句)、程序集、Service Broker、分区、全文索引、复制功能、策略管理、代理启动停止功能等重启RDS实例必须通过RDS管理控制台或OPEN API操作重启实例日志查看必须通过RDS管理控制台查看,11月底可通过OPEN API查看
  • 19. RDS可用性/安全性特性故障恢复双机热备,30秒内自动完成切换 应用透明Host-AHost-BFailoverV-Host:3306容灾备份恢复安全防御HostA:3306HostB:3306同城容灾 两地三中心(异地容灾) 自定义备份策略,自动备份 即时手工备份 备份集查看、还原、下载 Binlog 开放下载 数据回溯(临时实例)HostA:3306OSS集群 白名单设置(100个) 防DDoS攻击、清洗、黑洞 密码暴力攻击检测 SQL审计 SQL注入检测
  • 20. RDS性能/扩展性特性通用硬件配置: 24C 192G 3T SSD(已经做的RAID 01) ,12个内置SSD盘,单盘480G性能: 单实例最大 14000 IOPS,25000 QPS,承载1T数据量分布式RDS: 分布式架构,可线性扩展 数据按分布键均衡分布,对应用层透明 在淘宝经历长期的实践验证性能扩展性
  • 21. RDS运维支持特性迁移工具(愚公) Oracle->MySQL 迁移服务 全量+增量 的数据同步 (最小化停机影响) 工具级的支持; SQLServer 迁移服务运维支撑 慢SQL统计以及各种优化建议 SQL运行报告:某个时间段,执行频率TOP 100 享受专业的数据库优化待遇 360 实例诊断; RDS可用率99.95%(业界领先) RDS数据可靠性99.9999%
  • 22. RDS与自建数据库的对比RDS自建数据库服务可用性99.95%需自行保障,自行搭建主从复制,RAID等数据库备份自动备份自行实现,但需要寻找备份存放空间以及定期验证备份是否可恢复硬件成本无托管费用,无软硬件投入,按需付费数据库服务器成本相对较高;每台服务器每年托管费超过5000元;对于MS SQL Server需支付许可证费用部署扩容即时开通,快速部署,弹性扩容,按需选购需硬件采购与,机房托管,部署机器,周期较长资源利用率按实际结算,利用率很高考虑峰值,资源利用率很低无需基础运维需要招聘专职责DBA
  • 23. OSSOTSRDS数据模型无结构结构/半结构强结构目标数据量10PB100TB1TB事务支持无有限支持完整事务支持编程接口RESTful APIRESTful APISQL语句OSS-OTS-RDS比较
  • 24. 五大基本功能RDS日常操作 数据库管理、帐号权限管理 报警:并发连接、磁盘空间、IOPS报警、CPU 监控:RDS实例各类性能指标 自定义数据库参数
  • 25. 五大基本功能备份恢复管理 自定义备份策略,自动备份 即时手工备份 备份集查看、还原、下载 Binlog 开放下载 数据回溯HostA:3306OSS集群
  • 26. 五大基本功能实例规格弹性升级 聚石塔 On 双11 安全设置 白名单设置(100个) 防DDoS攻击、清洗、黑洞 密码暴力攻击检测 SQL审计 SQL注入检测
  • 27. 迁移工具 MySQL 迁移服务 全量+增量 的数据同步 (最小化停机影响) 工具级的支持; SQLServer 迁移服务五大基本功能
  • 28. 四大高级功能故障恢复 双机热备,30秒内自动完成切换 应用透明Host-AHost-BFailoverV-Host:3306
  • 29. HostA:3306在线迁移 数据不丢失,业务中断<30秒 迁移耗时取决于数据量 四大高级功能
  • 30. 四大高级功能性能优化 慢SQL统计以及各种优化建议 SQL运行报告:某个时间段,执行频率TOP 100 享受专业的数据库优化待遇 360 实例诊断;
  • 31. 容灾 同城容灾 两地三中心(异地容灾) HostA:3306HostB:3306四大高级功能
  • 32. RDS只读实例介绍简要介绍 在对数据库有少量写请求,但有大量的读请求的应用场景下,单个实例可能无法抵抗读取压力, 甚至对主流程业务产生影响。 为了实现读取能力的弹性扩展,分担数据库压力,阿里云RDS支持在某个地域中创建一个或多个只读实例,利用多个只读实例满足大量的数据库读取工作负载,以此增加应用的吞吐量。   公测申请须知:RDS只读实例需要从主实例同步数据,且目前只支持杭州地域,所以请您确保已经购买过杭州专享RDS实例后再进行申请,否则申请会不通过。   基础架构 只读实例采用 MySQL 的原生复制功能,将源数据库实例(或称主实例)的更改同步到所有相关的只读节点。只读节点采用单个物理节点的架构,只读节点down机后,阿里云承诺将在24小时内恢复。 功能特点  一个主实例(限MySQL 5.6)最多可以创建5个只读实例; 只读实例的规格大小可以与主实例不一致,可以更方便的弹性升降级; 根据业务压力,在需要时可以随时将实例规格升级,并在业务低峰降级(没有时间限制); 过程对用户透明; 支持按小时计费 ; 只读实例不需要维护帐号与数据库,全部通过主实例同步; 独立的白名单配置; 系统性能监控:RDS提供近20个系统性能的监控视图,如磁盘容量、IOPS、连接数、CPU利用率、网络流量等,用户可以轻松查看实例的负载; 优化建议:RDS提供多种优化建议,如存储引擎检查、主键检查、大表检查、索引偏多、缺失索引等,用户可以根据优化建议并结合自身的应用来对数据库进行优化; 
  • 33. RDS只读实例介绍使用注意事项   只读节点只支持MySQL5.6,在主实例(A)升级版本前,请最好做一下兼容性测试;或者新建一个实例(B),将数据从A实例复制到B实例,然后在B实例上面生成只读实例; 只读实例的规格配置(内存)不要太小 ,建议大于等于主实例配置; 由于只读实例的设计是“单节点”(没有主备),所以请购买多个只读实例来完成高可用目标;       功能限制  由于只读实例的数据均由源数据库实例同步而来,以下功能只读实例将无法使用。  备份设置:不支持备份设置以及临时备份的功能; 数据迁移:不支持数据迁移至只读实例; 数据库管理:不支持创建\删除数据库; 帐号管理:不支持创建、删除帐号;不支持为帐号授权以及修改帐号密码功能; 实例恢复 : 不支持通过备份文件或任意时间点创建临时实例,不支持通过备份集覆盖实例,绑定了只读实例的主实例不支持通过备份集覆盖实例(但可以创建临时实例);
  • 34. RDS性能介绍一. 简介   通过该性能测试报告,让用户了解到在sysbench标准测试模型下,每种规格的RDS的性能表现,供用户做容量选型参考。     二. 名词解释   规格:RDS为用户提供的不同性能的套餐,以内存大小为衡量标准,比如240M内存的RDS实例。 工作集数据:测试的数据量大小,并且在测试中这些数据都会频繁被使用。 并发数:测试线程的数量 行数:测试模型下,该实例所拥有的所有表格的总行数。 表数量:该测试模型下表的总数,每表行数=行数/表数 QPS:  表示每秒执行的SQL语句的次数包括select,insert,delete等。  async(Asynchronous Replication,异步):MySQL复制中传输日志的一种模式,MySQL默认支持的就是这种模式,最为通用,在不影响主库性能的前提下尽可能地保证数据的安全。 semi-sync(Semisynchronous Replication,半同步): 跟async一样,是MySQL复制中传输日志的另外一种模式,叫半同步复制,在RDS (MySQL5.5)中引入并支持。在这种模式下数据的安全性得到了最大保障,但会损失一定的写入性能。
  • 35. RDS性能介绍三. 测试模型   测试工具:sysbench 0.5 测试流程:通过对每种规格的实例进行压测,得出每种规格的RDS实例的性能表现 测试模型:采用OLTP模型(读写比例为7:3)和InnoDB引擎。大致命令如下:常用命令参数: /usr/local/sysbench-0.5/bin/sysbench       --mysql-host=test.mysql.rds.aliyuncs.com           #数据库host      --mysql-port=3306                                              #数据库端口      --mysql-user=your_username                             #数据库用户名      --mysql-password=your_password                      #数据库密码      --mysql-db=your_db_for_test                              #数据库名      --oltp-tables-count=10                        #模拟的表的个数,规格越高该值越大      --oltp-table-size=6000000                  #模拟的每张表的行数,规格越高该值越大      --num-threads=50                              #模拟的并发数量,规格越高该值越大      --max-requests=100000000               #最大请求次数      --max-time=20                           #最大测试时间(与--max-requests只要有一个超过,则退出)      --report-interval=1                     #每1秒打印一次当前的QPS等值      --test=/tmp/sysbench-0.5/sysbench/tests/db/oltp.lua    #选用的测试脚本(lua),此脚本可以从sysbench-0.5源代码文件目录下找      [prepare | run | cleanup]           #prepare准备数据,run执行测试,cleanup清理数据
  • 36. RDS性能介绍四. 每种RDS for MySQL规格的资源配额 
  • 37. RDS性能介绍五. 每种规格的测试数据 
  • 38. RDS性能介绍六. 测试结果
  • 39. 提纲39RDS架构和功能概述RDS的不同之处RDS产品功能介绍RDS API阿里云RDS控制台演示
  • 40. 示例: 创建RDS实例,https://rds.aliyuncs.com/?Action=CreateDB&<公共请求参数> 删除RDS实例, https://rds.aliyuncs.com/?Action=DeleteDB&<公共请求参数> 重启RDS实例, https://rds.aliyuncs.com/?Action=RestartDBInstance&<公共请求参数> 查看RDS实例列表, https://rds.aliyuncs.com/?Action=DescribeDBInstanceList&<公共请求参数> 修改RDS帐号密码https://rds.aliyuncs.com/?Action=ModifyAccountPassword&<公共请求参数> 修改RDS帐号权限https://rds.aliyuncs.com/?Action=ModifyAccountPrivilege&<公共请求参数> …1.RDS基本功能 1)实例管理 2)数据库管理 3)帐号管理RDS API2 RDS扩展功能 1)安全设置 2)参数设置 3)备份恢复 4)日志查询 5)监控查询 6)优化方案
  • 41. 示例: https://rds.aliyuncs.com/? Action=CreateDBInstance &AccountName=testacc01 &AccountPassword=pw1234 &BackupRetentionPeriod=7 &CharacterSetName=gbk &ConnectionString=testconn01 &DBName=testdb01 &DBInstanceName=testinst01 &DBInstanceClass=rds.mys2.small &Engine=mysql &Port=3306 &PreferredBackupTime=12:20Z &Region=cn-hangzhou &SecurityIPList=127.0.0.1,127.0.0.2 &<公共请求参数> 名称类型必须描述ActionString是系统规定参数,取值:CreateDBInstanceBackupRetentionPeriodInteger是备份保留天数,参数大小为1~30CharacterSetNameString是字符集,取值范围:utf8|gbk|latin1RegionString是数据中心,长度不超过50个字符PortString否应用访问连接端口,参数值为3001~3999。MySQL默认值为3306;SQLServer默认值为3433AccountNameString是数据库的操作帐号,需要做惟一性检查,由小写字母,数字、下划线组成,字母开头,长度不超过16个字符。其他非法字符:见禁用关键字表AccountPasswordString是操作帐号的密码,由字母、数字或下划线组成,长度为6~32位ConnectionStringString是用户连接数据库的地址前辍,需检查其惟一性,由小写字母,数字,中划线组成,字母开头,长度不超过30个字符DBNameString是每个实例在创建时必须同时创建一个数据库,该参数表示这个数据库的名称,需检查其惟一性(所在实例中惟一),由小写字母,数字、下划线组成,字母开头,长度不超过64个字符。其他非法字符:见禁用关键字表DBDescriptionString否数据库的描述或备注。长度为256个字符EngineString是数据库类型,取值范围为MySQL|SQLServer DBInstanceNameString是实例名,需检查其惟一性,可由小写字母,数字,下划线组成,字母开头,长度不超过30个字符DBInstanceClassString是实例级别,可选值:见实例规格附表DBInstanceDescriptionString否实例的描述或备注信息,不超过256个字符DBInstanceNetTypeString否实例IP的网络类型:0 代表公网,1代表私网;默认为0;PreferredBackupTimeString是备份时间,格式:hh:mmZPreferredBackupPeriodString否设置备份期间,由7位0、1组成的字符串,每一位表示对应的星期几,从左至右依次为星期一至星期日;1表示在这天备份,0表示不备份。默认值为1111100,即星期一至星期五每天备份,星期六、星期日两天不备份。 注意:如果取值为0000000,则下一次备份时间取默认值2100-01-01T00:00Z,只备份一次创建数据库实例
  • 42. 提纲42RDS架构和功能概述RDS的不同之处RDS产品功能介绍RDS API阿里云RDS控制台演示
  • 43. 演示七阿里云RDS控制台演示
  • 44. Thanks!44