负载均衡
本章节主要介绍,ShopWind系统一主多从数据库的配置方式,以及数据读写分离、负载均衡的实现方法。
负载均衡SLB(Server Load Balancer)是一种对流量进行按需分发的服务,通过将流量分发到不同的后端服务来扩展应用系统的服务吞吐能力,并且可以消除系统中的单点故障,提升应用系统的可用性。
要实现负载均衡的能力,无法单靠编写和优化系统代码来实现,它需要依靠第三方云端服务以及部署多台服务器,系统需要做的就是对接这些服务与整合数据, 在ShopWind系统中,我们推荐使用阿里云负载均衡方案,与传统的硬件型负载均衡自建方案相比,阿里云负载均衡具备按量付费和弹性伸缩能力,无需大额一次性投入。同时,与开源的负载均衡自建方案相比,阿里云负载均衡稳定可靠,配备专业的运维团队,免费提供7×24小时不间断技术支持服务,彻底摆脱运维烦恼。
一、读写分离
要处理高并发业务,实现负载均衡,我们首先要做的就是配置主从数据库,在一般项目中,我们的网站项目的读写请求都是操作同一个数据库,当请求量比较大 的时候,数据库超负荷运转,导致项目访问异常缓慢,甚至数据插入有误的情况。
在ShopWind系统中,支持配置一主多从数据库,主数据库负责写请求,从数据库负责读请求,系统自动把业务分发到读写服务器上,由于读请求往往占据了一个项目80%的 请求,所以我们可以配置多个从数据库来完成读业务,这样大大提高了业务处理能力。此外,在配置多个从数据库之后,即便其中一个从数据库发生了故障,无法正常处理业务,比如裸机了、网络断了,那么ShopWind系统可以自动切换到其他从数据库获取数 据,从而实现异步多活的效果,而业务将不受任何影响。

要配置主从数据库,我们需要修改配置文件@shopwind\common\config\main.phpcomponents节点下增加以下配置项(但在实际项目中,我们安装好站点后,应该修改这个配置文件@shopwind/public/data/config.php,该配置文件会直接覆盖main.php里面的db配置项。

'db' => [
    'class' => 'yii\db\Connection',
    // 主数据库
    'dsn' => 'mysql:host=127.0.0.1;port=3306;dbname=shopwind',
    'username' => 'root',
    'password' => 'root',
    'charset' => 'utf8',
    'tablePrefix' => 'swd_',
    // 从数据库列表
    'slaves' => [
        [
            'username' => 'root',
            'password' => 'root',
            'attributes' => [
                // use a smaller connection timeout
                \PDO::ATTR_TIMEOUT => 10,
            ],
            'dsn' => 'mysql:host=server1;port=3306;dbname=shopwind1',
        ],
        [
            'username' => 'root',
            'password' => 'root',
            'attributes' => [
                // use a smaller connection timeout
                \PDO::ATTR_TIMEOUT => 10,
            ],
            'dsn' => 'mysql:host=server2;port=3306;dbname=shopwind2',
        ]
    ]
]
slaves表示的是从数据库的配置列表,您可以配置多个从数据库。但请注意:从数据库不应该是与主数据库在同一个服务器下的不同的数据库, 虽然是两个不同的数据库,但起不到任何效果,因为多个数据库都是在同一个服务器,服务器处理业务的能力并没有得到提升,正确的做法是购买第三方的云数据库(当然自己购买一台服务器然后配置为数据库服务器也行, 但这样的成本更大,投入的时间和精力更多)。我们推荐您使用阿里云的【云数据库RDS MySQL】产品。 上例配置文件中的server1server2就是填写云数据库的访问地址。
当我们部署了多个数据库之后,还需要处理数据库之间的数据同步问题,由于主数据库负责写操作,从数据库负责读操作,所以我们只需要监听主数据库,如果有更新就把数据同步到所有从数据库中。MySQL的Master(主数据库)/Slave(从数据库)同步原理为:

1、MySQL master启动binlog机制,将数据变更写入二进制日志(binary log, 其中记录叫做二进制日志事件binary log events,可以通过show binlog events进行查看)

2、MySQL slave(I/O thread)将master的binary log events拷贝到它的中继日志(relay log)

3、MySQL slave(SQL thread)重放relay log中事件,将数据变更反映它自己的数据中

要实现数据库主备复制,数据同步策略,配置起来会有一定的困难,如果您的从数据库使用的是阿里云的RDS产品,那么您需要用阿里云的产品来实现同步策略,而不是自己配置。 阿里云的【数据传输服务DTS】产品支持MySQL、SQL Server等数据库的增量数据的实时同步,配置也不复杂,是解决该问题最佳办法。 如果是自己部署从数据库服务器,请自行解决数据同步问题,这里不再讨论。
在ShopWind系统中,虽然您也可以配置多个主数据库,这个是完全支持的,有需要的可以参阅Yii2的多主多从数据库配置。但值得注意的是:多主多从数据库在处理数据同步上会相当复杂,您需要考虑时间和成本的投入。
二、OSS云存储
任何一个网站项目,都会涉及到文件/图片的上传,而文件上传/读取又会占用很多服务器资源,当一个页面需要加载很多图片的时候,就会变得异常缓慢,严重时会阻碍正常的业务请求,特别是数据库请求。
我们可以把这部分的资源业务请求部署到另外的服务器,与应用服务器分开,这样就可以减轻应用服务器的负担,这个解决方案使用的的就是OSS对象存储服务。 在ShopWind系统中,我们已经完美的集成了这个能力(可以在后台->插件中找到),并且支持多个OSS存储服务,您可以使用阿里云的OSS,也可以使用七牛云的OSS,只需要在后台一键配置就能使用,并且可以自有切换使用的OSS服务。 有关OSS云存储的使用,可以参阅:OSS云存储
三、服务器集群
当一个项目访问量足够大的时候,可以考虑服务器集群部署,即将一个应用部署到多个服务器上,并且通过服务器来完成最优化调度,比如杭州的服务器,处理杭州附近的用户请求,广州的服务器处理 广州附近的用户访问请求,创建服务器集群需要比较大的投入和运维能力,如果有此需要的可以先了解阿里云的集群产品:服务器集群
对于一个项目来说,要完美的处理高并发业务需要做大量的工作,不光的是系统层面的,还有服务器层面的,硬件层面的,不光要做负载均衡,还需要做分布式、CDN加速、集群化部署等等,需要根据业务的发展来不断推进的。
更多问题,可以访问我们的 开发者社区反馈,我们会有官方技术人员在线解答。