WordPress是一种非常流行的博客网站平台,也可以当作一个内容管理系统(CMS)来使用, 是世界上使用最广泛的博客系统之一。WordPress有非常多优秀的插件,使得这个开源产品变得非常容易扩展,满足不同的需求。
我准备利用一个系列的文章,来展示如果利用阿里云的各种产品(弹性计算,数据库,安全等等),搭建一个完整的WordPress网站。内容包括:
- 一、 搭建基础网站应用
- 二、 域名,短信和邮箱
- 三、 动静分离和CDN加速
- 四、 数据库缓存和管理
- 五、 服务器横向扩展
- 六、 网站安全
四、数据库缓存和管理
当网站业务量逐渐增加,数据库往往是整个系统中第一个遇到性能瓶颈的组件。这个时候需要通过对数据库进行优化和管理,来提高数据库的吞吐能力。
针对网站类应用,读多写少是常态,因此针对性地进行数据库读写分离往往是一个好办法。阿里云RDS数据提供的读写分离功能可以对外提供一个单一的数据库读写入口,对系统的侵入性很小,是个非常理想的解决方案。除此之外,业界最常用的方法应该是在整个架构中增加内存数据库来进行数据缓存,一般来说会选用Redis数据库来进行实施。由此,系统的数据部分变得越来越复杂,因此还需要利用DMS这种管理工具来进行方便的运维。
这个部分的架构图如下,基于上一个版本增加了:
- MySQL数据库读写分离:存放用户向WordPress上传的附件
- CDN:通过CDN边缘节点的缓存机制加速附件静态文件的读取
用DMS管理后台数据
阿里云的DMS数据管理产品(https://www.aliyun.com/product/dms)在官网上的口号是“比phpMyAdmin更强大,比Navicat更易用”,还是挺霸气的。其主要作用当然是聚合所有数据库的管理(无论在不在阿里云上),方便DBA对库表进行各种操作和维护。此外比较讨喜的功能是利用DSQL(通过Dlink)进行跨库查询,在微服务架构应用中进行数据验证的时候常常会用到。这里简单演示一下免费版本的基本功能,专业版和企业版需要额外购买,同时也去除掉一些限制并提供一些额外功能,详见:https://help.aliyun.com/document_detail/48109.html
最简单登陆DMS的方法是在RDS上面点击“登陆数据库”,输入用户名和密码即可。为了演示方便,我就直接用了之前设置的高权限账号root。
在界面的昨天可以看到数据库选择和数据表列表,通过这里我们可以发现WordPress的数据结构还是很简单的,基本上可以通过表名猜测到该表的用途,比如“wp_posts”自然就是存储帖子啦。注意“wp_”这个前缀是可以定制的哦,如果不知道怎么做的同学注意回看这个系列的第一篇。
试着写个SELECT语句看看里面的内容,很容易可以找到WordPress在安装时默认po的第一篇hello world的帖子。
回到页面上修改内容一下,保存,然后再回到DMS重跑一次SQL,可以看到新的内容已经写入了数据表中。
MySQL读写分离
MySQL读写分离这个功能,如果是自建数据库的话,需要利用Mycat做主从同步,做心跳检测,还得自己运维,还是比较麻烦的。阿里云MySQL直接提供这个功能还是很贴心,在数据库实例的“数据库代理”标签就可以打开了。首先选择添加只读实例,稍等一会儿,一个新的只读实例就创建好了。创建只读实例时会从备实例复制数据,数据与主实例一致,主实例的数据更新也会在主实例完成操作后立即自动同步到所有只读实例,完美。
在实例列表中会发现增加了一个打着“R”标的数据库实例。只读实例数量有限制,<64GB的主实例最多挂5个,≥64GB的主实例最多挂10个,一般中小网站挂3个就差不多了。
只读实例有自己的内网地址,可以用程序控制什么时候使用主实例,什么时候使用只读实例。当然大多数情况下,让MySQL自己决定就好了。我们回到主实例中,设置读写分离,将所有的读权重都给只读实例好了。这样就可以得到主实例的读写分离地址啦。
获得读写分离地址后,我们需要回到WordPress的配置文件wp-content/wp-config.php中,将之前填写的主库内网地址替换成刚刚获得的读写分析地址,并重启。
完成后在网页上浏览一下,从后端只读实例的监控可以看到IOPS和连接数等数据的变化,可以确定读写分离已经起作用了。
MySQL读写分离
Redis数据库(https://www.aliyun.com/product/kvstore)作为一种最常用的缓存数据库,几乎在各行各业的应用中都可以看到。为了将Redis利用起来,系统程序需要有一定的改造,WordPress则是通过插件来支持。一般来说还需要做高可用,以避免Redis失效而造成的雪崩效应,拖垮整个系统。因此大多数情况下都应该选择集群版多节点,以确保缓存的高可用。实际购买的时候注意VPC并设置密码。
和MySQL一样,使用之前要开白名单。这种安全机制在阿里云数据库基本是标配,配置方法也基本一样,把ECS服务器加进去就可以了。
白名单配置完成后,记录下内网地址,后面会用到。
然后在WordPress中安装插件Redis Object Cache。安装后打开配置项,可以发现这个插件需要修改配置才可以使用。但是这个插件的配置居然不是可视化的,还需要从后台修改配置文件,差评。
插件的配置信息是放在配置文件wp-content/wp-config.php中的。需要增加/修改以下代码(其中WP_REDIS_PASSWORD需要设置成创建Redis实例时设置的密码):
/** setup for Redis Object Cache **/
define('WP_REDIS_CLIENT', 'pecl');
define('WP_REDIS_SCHEME', 'tcp');
define('WP_REDIS_HOST', 'Redis实例的内网地址');
define('WP_REDIS_DATABASE', '0');
define('WP_REDIS_PASSWORD', '创建Redis实例时候设置的密码');
define('WP_CACHE_KEY_SALT', 'wp_');
define('WP_REDIS_MAXTTL', '86400');
配置完成后,再回到页面上的插件配置项上看一下Redis的配置,如果正确无误的话,选择“Enable Object Cache”,在状态栏应该显示“Connected”就表示配置完成了。
试着使用一下WordPress,然后我们利用DMS数据管理再看看Redis的效果。同样也是在Redis实例页面上方选择“登陆数据库”,然后应该可以看到许多Key-Value对和CPU、内存、命中率等指标,这就表示Redis已经开始为网站提供缓存服务啦。