所有由308666696@qq.com发布的文章

web架构总结

web架构总结

读-写
高并发请求-海量数据
缓存、降级、限流

常用架构图
Alt text

Alt text

架构文章

各大互联网公司架构演进之路汇总

网络

并发数、数据量

  • HTTP重定向
    最简单的方式,手写php代码

  • 反向代理负载均衡
    nginx

  • IP负载均衡 lvs

  • DNS负载均衡
    cdn

  • 带宽要够用,网络稳定

  • 安全问题

    • 防刷
    • 防DDOS
    • 防盗链

Linux

系统

  • 配置

进程打开的文件数, TCP并发连接数,内存分配
构建C1000K的服务器-1
构建C1000K的服务器-2

  • 安全检查

私钥、端口、防火墙、【意识】
服务器被黑给我上了一课
工程师追查线上问题(或运维)常用的shell命令

nginx

可以结合lua做些高级功能: 缓存、限流、过滤、监控等
使用Nginx+Lua开发高性能Web应用

限流

秒杀, 评论, 下单

聊聊高并发系统限流特技-1
聊聊高并发系统限流特技-2

  1. 常见限流原理
  • 限制总并发数(比如数据库连接池、线程池)、
  • 限制瞬时并发数(如nginx的limit_conn模块,用来限制瞬时并发连接数)、
  • 限制时间窗口内的平均速率(如Guava的RateLimiter、nginx的limit_req模块,限制每秒的平均速率)、
  • 限制远程接口调用速率、限制MQ的消费速率、
  • 另外还可以根据网络连接数、网络流量、CPU或内存负载等来限流。
  1. 限流算法
  • 令牌桶
  • 像摇号,利用令牌+队列,令牌push 速率固定,pop任意
  • 漏桶
  • 像滴水,利用队列,push 任意,pop速率固定
  • 计数器
  • 数据库连接池、线程池、秒杀的并发数;只要全局总请求数或者一定时间段的总请求数设定的阀值则进行限流,是简单粗暴的总数量限流,而不是平均速率限流。
  1. 应用级限流
  • QPS阀值,过载保护,各类软件都有限制连接数的配置
  • 数据库连接、线程
  • 热点接口
  1. 分布式限流
  • 原子性,redis+lua / nginx+lua
  1. 接入层限流
  • Nginx 最大连接数,IP限制

降级

高并发系统的降级特技

  • 页面全显 ->部分

  • 实时->准实时,同步->异步,DB->cache

  • 异常错误功能->关闭

  • 容错机制

  • 服务连接失败

  • 简单重试

  • 主从互试

  • 动态机器列表,检查机器状态

  • 延迟

  • 服务超时时间设置 – 不同子服务不同超时设置

  • 自服务异步

  • 先返回成功,服务自己在后端尝试

Code

需求分析文档

整理思路,谋定后动,避免边写代码边思考的过程式开发;避免丢项。

  1. 分析
    > 预期目标、当前实现、旧有影响
    新需求的目的、意义是什么;
    先从用户角度理解,再从工程师角度理解;
    分析可实现性;
    对已有业务影响,旧数据影响;
    划分业务功能,画出流程图。

  2. 开发思路
    > 设计功能模块、列出功能点、设计数据表、任务分配

  3. 测试方案
    > 流程测试、功能测试、异常测试、受影响的旧有功能测试

编写代码

测试

  • 编写测试脚本,覆盖全部接口、核心功能、反复出bug的功能,更改数据表的测试要再次查询出数据对比是否正确,不能简单的看返回值

code review

根据实际开发情况选择以下内容:

  • 业务
    开发文档,需求分析是否清晰易懂

  • 代码

    • 使用phabricator review功能;
    • 架构问题,功能分配,模块封装;
    • 代码可读性,可维护性;
    • 注释易懂;
    • 安全性
      • api参数,正确的类型,min,max,url编码、trim、 emoji表情导出的问题, 有error 错误提示
        • 使用了第三方接口,调用失败是否try catch, 请求外部接口 严格要求记录debug日志
        • 纯SQL 是否有未过滤的变量
        • 如表前加密字段(手机号,姓名,证件号,银行卡号,密码等这些敏感字段都需要声明加密)。
  • 数据表
    mysql编码规范、旧数据影响、是否需要回滚方案(不删除、不修改旧字段旧表)

  • 测试
    测试方案有没有问题

  • 性能
    有没有性能问题

上线

walle-web
有整套DevOps当然最好(持续集成、持续交付、持续部署)。

  1. 数据库同步,确认数据回滚方案(不删除字段,不修改字段,只新增,记录废弃字段,上线一段时间后确认没问题再处理)
  2. 代码同步
  3. 执行脚本

Cache

客户端 – 服务器
硬盘 – 内存
文件、memcache、redis、mongodb、kafka

memcache

算法、扩容、复制、预热、集群

  • 一致性hash的概念,解决了什么问题

  • 存储机制
    涉及到page,slab,chunk三个概念

    1. page为内存分配的最小单位,默认是1M,可以通过 -I参数在启动时指定。
    2. slab获得一个page后,划分成一组chunk。
    3. Chunk才是存放缓存数据的单位,chunk块的大小可以为64B,128B,256B…1024KB。
  • 命中率是什么鬼

    1. 分配策略:
    • 如果可以存储这个数据的最佳的chunk大小为128b,那么memcached会把刚申请的slab以128b为单位进行分割成8192块. 之后凡是接近128b大小的数据都可以存到这里(比如80b,如果没有80~128b之间的chunk,就存到128b里);
    • 当这页slab的所有chunk都被用完时,并且继续有数据需要存储在128b的chunk里面时,如果已经申请的内存小于最大可申请内存10MB 时,memcached继续去申请1M内存,继续以128b为单位进行分割再进行存储;
    • 如果已经无法继续申请内存,那么mamcached会先根据LRU 算法把队列里面最久没有被使用到的chunk进行释放后,再将该chunk用于存储。
  1. 提高memcached的命中率:
    • 预估我们的value大小并且适当的调整内存页slab大小和增长因子是必须的。
    • 增大大内存
    • 二级缓存
  • 内存分配

一个Memcache进程设置内存不要太多也不要太少,一般3G,一台服务器按端口分多个memcached,memcache进程实际占用内存要大于设定的内存,所以系统要给每个memcached预留大于3G。

  • 查看状态: telnet 127.0.0.1:11211,stats
  • 热点
  • 单点
  • 运维软件
    [twemproxy,codis,magent,replica,memadmin]

redis

Redis实战:类微博的亿级社交平台

消息队列-kafka

kafka技术分享系列(目录索引)

sphinx

DB-mysql

  • 常见问题
    分库分表常见策略
    主从,读写分离,互备,单点
    数据同步问题 (预防错误,错误修复)
    MySQL自带多线程同步
    自己实现解析binlog,多线程写入

    keepalived + MHA
    zookeeper
    mysql transfer 多线程同步工具
    MariaDB
    amoeba
    Xtrabackup

监控

  • 手工检查

awk,sed,grep,cut,uniq,sort,tr,wc,head,tail

[工程师追查线上问题(或运维)常用的shell命令](http://ww111.iteye.com/blog/2176313)
  • 日志系统

系统日志、程序日志、安全日志

- ELK
	[ELK实战一:架构的选择](http://www.elain.org/2016/02/15/ELK实战一:架构的选择/?hmsr=toutiao.io&utm_medium=toutiao.io&utm_source=toutiao.io)
	[ELK+redis搭建nginx日志分析平台](http://yanliu.org/2015/08/19/ELK-redis搭建nginx日志分析平台/)
	[ELK+kafka构建日志收集系统](http://lx.wxqrcode.com/index.php/post/101.html?utm_source=tuicool&utm_medium=referral)
- rsyslog
	[日志收集利器rsyslog](http://www.elain.org/2016/04/26/ELK实战二:日志收集利器rsyslog/)
  • 服务器集群
    • Zabbix
    • 第三方
      监控宝、

测试【Todo】

  • 自动化测试
  • 压力测试
    wrk – HTTP协议高性能压力测试工具
  • 业务容错
  • 人的失误-录入机器检查

数据分析【Todo】

ELK
Hadoop

其他

重构过程中的过度设计


业务【Todo】

U
用户
登录
权限

G
评论
关注
中文检索

C
12306
双十一

秒杀活动
	
	
	
Web系统大规模并发:电商秒杀与抢购
静态页面 秒杀请求 请求数据包小 流量过载保护(集群负载达到峰值,拒绝请求)

交易
支付
风控

技术职位

程序猿、工程狮、架构狮、技术经理、技术总监、CTO的区别

互联网未来发展趋势【Todo】

整个人类处于互联网发展的哪个阶段?下一个十年,互联网升级的大致方向在哪里?

web 1.0 是信息的高效传递,但应用面积大多扔处于单向的,点对点的方式。

web2.0

web3.0

服务器的常见安全问题

一、真的被黑了?

确认问题

查看最近谁登录了服务器?

Bash
> last | more

vagrant  pts/0        172.16.156.37    Fri Jul  1 15:27   still logged in
vagrant pts/4        192.154.200.61   Mon May 18 12:39   still logged in
vagrant  pts/0        172.16.5.5       Fri May 13 15:18 - 16:00  (00:41)
vagrant  pts/0        172.16.5.5       Fri May 13 15:18 - 16:00  (00:41)

所有用户最近的一次登录时间

Bash
> lastlog

ssh用户登录日志

tail -f /var/log/secure

Google一下 ip地址来源即可,经常是一些非大陆的ip

二、真的被黑了!

排雷
先看看有没有留下什么后门

排查端口

Bash
> netstat -nl

tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:1723            0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:48988         0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:52732         0.0.0.0:*               LISTEN

看看端口号是什么进程启动

> lsof -i :9000

COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
php-fpm 1132 root    7u  IPv4  11517      0t0  TCP localhost:cslistener (LISTEN)
php-fpm 1135  www    0u  IPv4  11517      0t0  TCP localhost:cslistener (LISTEN)

查看有无异常进程

>ps aux
>top

有没有新增异常用户

>cat /etc/passwd

root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
.
.
.
vagrant:x:500:500:vagrant:/home/vagrant:/bin/bash
www:x:501:501::/home/www:/bin/false

查看了root用户的命令历史记录,

>history

注意:某些命令要用root权限才可使用
其实任何记录都是可以被root用户清理的

修改root及我当前用户的用户名密码

Bash
> passwd

如果黑客正在线呢?

#踢掉在线终端
 > pkill -kill -t pts/4
# 监控登录日志
> tail -f /var/log/secure

封ip

>vi /etc/hosts.deny

ALL:110.164.67.47
ALL:222.89.166.12

禁止root ssh登录

> vi /etc/ssh/sshd_config
#把PermitRootLogin 属性 yes 改为 no
PermitRootLogin no

三、嘿嘿嘿

如何预防

  • 禁止 root 登录,每次用普通账号登录,然后切换到root
  • 禁止密码登陆, 然后指定一台机器公钥和私钥的方式进行登陆(推荐!弊端是这台机器被攻击了就完蛋了,并且要)
  • 指定白名单ip
  • 设置用户名密码一定要大小写字母数字及一些特殊符号的组合,增加暴力破解的难度,有可能的话可以定期更换密码。
  • 为了避免骇客扫描已知服务器程序端口漏洞,修改服务程序的默认端口好,比如ssh服务不使用22端口
  • 设置 iptables 开启一些通用的防火墙规则
  • 局域网访问,禁止外网
  • 配置每次登录,自动发送email,注意被邮箱服务器列到垃圾邮件中,设置非垃圾邮件!
  • fail2ban第三方监控软件
  • 备份数据!!!

四、白天不懂夜的黑

Web 入口安全

  1. 数据通道安全
    • http协议下的网络连接都是基于明文的
    • https
      解决了点到点的安全问题和身份认证问题,
      需要购买,找官方机构,测试访问速度怎样
    • AES 加密
  1. 浏览器安全
    2.1 同源策略

    • 什么是同源?
      相同的协议,相同的HOST,相同的端口

    • js只能访问当前源的资源
      通过AJAX请求的网络资源
      Cookie
      WebStorage,webSql

    • 跨域JSONP,CORS

    2.2 XSS
    跨站脚本攻击

    • 原理:恶意代码添加到网页中,并让受害者执行这段脚本。
    • 预防:
      代码转义 htlmspechalchars;
      html5 带来的CSP策略等
  1. http服务
    3.1 DDOS
    大量访问,耗尽服务器资源。

    • 配置nginx,Apache
      限制请求速度,
      限制连接数量,
      关闭慢连接,
      设置IP黑名单、白名单,
      使用缓存进行流量削峰
      屏蔽特定的请求

    • 海量服务器
      土豪玩法

  2. 不断完善