ProxySQL是一个高性能的MySQL中间件,能够代理数百台MySQL服务器,支持数十万的并发连接。ProxySQL代理MySQL并提供读写分离,查询重写和数据分片等功能。
这篇文章主要介绍用Docker Compose编排用ProxySQL实现MySQL集群上读写分离的实践过程。
Docker Compose编排中使用了一个现有镜像,就是breeze2/proxysql。
本次实践源码上传在GitHub的breeze2/mysql-proxy-docker。
OAuth2.0的授权模式和应用
OAuth(开放授权)是一个标准协议,为用户资源的鉴权问题提供了一个安全、开放而又简易的解决方案。OAuth 2.0定义了四种鉴权模式:
- 授权码准许(Authorization Code Grant)
- 隐式准许(Implicit Grant)
- 客户端准许(Client Credentials Grant)
- 密码准许(Resource Owner Password Credentials Grant)
这里只介绍这四种鉴权模式,即获取有效令牌(Token)的四种过程,关于OAuth 2.0的其他更多内容建议阅读《理解OAuth 2.0》及 The OAuth 2.0 Authorization Framework。
单点登录的实现
单点登录(Single Sign-On),是指一次登录,多站复用登录态。这里主要讲解一下基于共享session实现的单点登录。
对于大多数B/S结构(浏览器/服务器结构)的Web网站,用户登录态都是存储在session中的,而sessionID(session的唯一识别号)记录在前端的cookie中,只要同步各个网站的sessionID,各个网站便能共享同一个session,进而共用用户的登录态。需要共享session的情况主要有三种:
- 同域名下不同路径;
- 同父域名下不同子域名;
- 不同域名;
下面会根据这三种情况,借用Laravel和JQuery代码,逐一实现单点登录(共享session)。
Swoole连接池在Laravel中的使用
Swoole php-cp
php-cp是Swoole组织开发的一个PHP扩展,可以本地代理MySQL、Redis连接,提供连接池,读写分离,负载均衡,慢查询日志,大数据块日志等功能。相比原生PHP的数据库连接,php-cp连接池可以缓存连接,免去一些重复新建、回收数据库连接带来的时间消耗和IO消耗;并且php-cp连接定时ping数据库,使得连接不会太久没活动而被回收;在连接数超过限额时,php-cp提供了排队机制,而不是直接拒绝,所以php-cp是值得高并发的PHP项目引入使用的。
php-cp提供了代替PDO的类:pdoProxy,所以在主流PHP框架中引入php-cp是十分简便的。在php-cp的README中,提供了Yii、CI和ThinkPHP等框架的集成样例,但是少了Laravel,所以这里介绍一下在Laravel项目中怎样集成php-cp。
自动化工具Nightmare的一次实践
事情是这样的,一个线上的参赛活动网站要收集参赛选手提交的微云分享链接,但是普通微云账号的分享链接只有7天期效。那该怎么办呢?只好把所有选手的微云分享链接转存到一个高级微云账号上,再由高级微云账号分享出来,以此增长分享时间。如果靠人工操作,那工作量太大,也难免会出错,所以写了一个自动化脚本来执行这个工作。(后来微云取消了分享期效限制,这个脚本没有正式用上😊)
关于LNMP的优化
线上有一个用LNMP构架的网站,有一天看到它出现了“502 Bad Gateway”错误,于是就开始思考优化问题了。
首先,明确一下HTTP各个状态码的含义:
- 1XX 临时消息
- 2XX 返回成功
- 3XX 重新定向
- 4XX 客户端错误
- 5XX 服务端错误
基于LNMP的网站上,当HTTP请求返回的状态码是5XX
的时候,说明是服务端出了问题;但问题不一定是出在NginX,因为NginX本身十分轻量,不做太多的复杂逻辑处理,所以很少会出错;除了静态资源的请求,其他大部分请求NginX都会转给PHP-FPM来处理,所以一般问题是更多地出在PHP。比如,开篇说那个网站出现的502
错误,查看NginX日志发现大量的connect() to unix:/PATH/TO/PHP-FPM-SOCK failed (11: Resource temporarily unavailable)
,其实原因是系统最大连接数过小。
腾讯云COS的一次实践
很多网站都会需要文件上传、下载的功能,但是服务器本身配置(如容量、带宽等等)可能扛不住大量的上传、下载,这时候,利用一些现成的云存储服务来分担一下服务器的压力。这里主要介绍一下腾讯云COS的使用,大概的功能流程是:
- 前端(JS)实现文件上传功能;
- 后端(PHP)给前端发放签名,使前端可以直接访问COS;
- 根据COS生成的文件链接访问文件。
HTTP文件上传的一个后端完善方案(NginX)
关于用户多标签的更新
在项目开发中,经常要现实这样的一个功能——关系表更新。比如,一个用户可以设置多个标签,而一个标签下又可以有多个用户,两者是多对多的关系,用一张关系表记录用户的标签数据,那么,当更新用户标签的时候,怎样安排执行流程,才是最优的呢?
数据关系
假设数据库中有三张表,user,tag,user_tag:
假设数据库中有三张表,
user:
id | name |
---|---|
1 | user1 |
2 | user2 |
3 | user3 |
… | … |
tag:
id | title |
---|---|
1 | tag1 |
2 | tag2 |
3 | tag3 |
… | … |
user_tag:
| id | user_id | tag_id | deleted_at|
| — | — | — | — | — |
| 1 | 1 | 1 | null |
| 2 | 2 | 1 | null |
| 3 | 3 | 1 | null |
| … | … | … | null |
user_tag表记录了user表和tag表之间的关系,并且user_tag表内使用软删除。