Alvin Liu

  • Home
  • About
  • Privacy Policy
High Performance

亿级流量网站架构读书笔记

感谢张开涛先生为我们分享了互联网高并发场景的经典问题和解决方案。阅读后深有感触,故整理读书笔记于此。感兴趣的小伙伴请在这里购买 https://item.jd.com/12153914.html 系统设计基本方法 高并发 高可用 服务降级 限流 切流量 业务设计 高可用 负载均衡与反向代理 负载均衡分层 负载均衡可以应用在OSI(Open System Interconnection)网络模型的不同层. 层级 层级名 实现方案 产品 二层 链路层 修改MAC地址 LVS DR 四层 传输层 修改IP地址和端口 LVS NATHaProxyNginx 七层 应用层 URL转发到IP:端口 Nginx 越底层性能越好, 因为不用拆包 越高层功能越强, 因为有更多信息可以设置转发条件 负载均衡算法 长连接 Nginx可配置和后端(上游upstream)服务器保持长连接 动态配置上游服务器 Nginx集成服务发现(Consul + etcd)自动添加新的上游服务器 对应到K8s就是Ingress OpenResty OpenResty是Nginx的一个module, 主要功能是运行Lua脚本 所有Nginx的Lua脚本都需要使用OpenResty module执行. OpenResty本身也是web服务器, 可以响应http请求 服务隔离 线程隔离 读写隔离 各机房都有只读存储, 提高性能还可以备份 静态资源隔离CDN 静态资源不论大小都要上CDN. js/css发布时应该带有版本号, 这样出问题不需要刷CDN和浏览器缓存. 直接修改网页回退js版本号就可以了. 爬虫隔离 爬虫流量可达到1/5, 一般情况给爬虫返回简单数据, 比如缓存数据 可以通过这些方法过滤爬虫请求 热点隔离 秒杀, 促销等可预测的热点访问, 应该放在独立服务器上. 读热点: 多级缓存 使用一致性哈希优化缓存命中率可能会产生热点, 进而击垮单点产生雪崩效应(连续击垮后续节点). 解决办法是通过虚拟节点把每个服务器拆分后交错插入哈希环. 写热点: 缓存+队列, 最终一致性 硬件资源隔离 服务资源隔离 独立的Redis, DB很常见, 对其它服务依赖性强也可以独立提供, 绑定部署 Hystrix线程池隔离 Hystrix使用独立的线程池来隔离失败操作. Hystrix还可以用来实现服务降级, 熔断. Servlet 3异步请求线程池 Servlet 3支持AsycContex和AsyncResponse. 可以用来自建线程池, 这样Tomcat线程池只用来把请求放到自有线程池. 请求限流 限流分类 限流算法 限流技术方案 分布式限流 核心是共享流量计数器, 原子计数CAS. 一般用Cache, 比如Redis配合Lua脚本实现原子操作. Coherence有类似功能 应用层和接入层都可以集成Redis实现根据业务逻辑的限流. 接入层限流 这里讲的是脱离业务逻辑, 根据请求特征进行限流, 比如IP rate limiter 服务降级 降级预案 降级分类 自动降级 人工开关降级 读写降级 尽早降级 在链路的前端降级可以保护更多后续服务 页面应设计降级框架, 各个部分都可以动态配置只读, 隐藏, 异步获取, 显示静态兜底数据等功能. Nginx直接降级返回请求, 处理速度比应用服务器快几十倍. Hystrix降级熔断 超时重试注意事项 回滚机制 分布式事务回滚 分布式事务回滚的错误处理 部署版本回滚 数据版本回滚 静态文件按版本发布 压力测试 应急预案 高并发 独立缓存 缓存位置 JVM对象引用 回收算法 本地缓存 4. 本地缓存的问题: 分布式缓存 多级缓存 有些缓存支持内存+磁盘分级缓存, 比如MapDB Cache-Aside 业务代码显式调用缓存, 比如读时先读缓存, 写后更新/失效缓存这种代码都写在应用程序里. Cache-Through 业务代码只读写缓存, 数据库的读取和写入由缓存代理. 一般实现缓存的读写接口. 分为直读, 直写和异步写三种. 代理写盘听起来很不靠谱. Guava支持Read-Through, Ehcache支持各种. 引用复制 缓存直接引用原始堆数据, 如果原始数据被修改, 缓存记录也被修改. Ehcache提供copier接口deep copy缓存数据防止这种错误. Guava不支持. HTTP缓存 浏览器会把服务器返回的网页缓存在本地, 下次请求时会带上上次返回的时间. 如果服务器返回304代表内容没有改变, 浏览器会直接显示本地缓存的页面. 关键的header 代理层静态缓存 Nginx Proxy Cache 清理缓存 如果需要紧急清理Nginx缓存可以使用ngx_cache_purge插件. 使用经验 多级缓存 多级缓存架构 构建缓存式网站 对高频读取的内容服务, 大量请求都是在缓存层处理的. 如果应用层能及时把变化发布到缓存,Nginx可以只从缓存读取数据(设置缓存不过期) 这就是运行在缓存上的网站. 应用要能够主动监听数据变更来更新缓存. 主要依靠订阅消息队列来实现. 如果数据量不大, 也可以考虑定期全量更新缓存. 应用场景: 商品, 订单, 用户, 分类, 价格等访问频率高, 允许一定更新延迟的页面. 缓存优化 缓存更新原子性 缓存崩溃的修复 大流量网站的读操作高度依赖缓存, 缓存崩溃对可用性影响很大. 池化 本部分包括线程池, 连接池等. 也包括通用的容器池框架apache commons-pool 2. 合理池化可以节省构建资源, 创建连接的时间. 池化的主要优势是保留长期存活的资源, 主要问题是退出程序时一定要通知远端取消对长期资源的占用. HTTP连接池 线程池 Tomcat线程池 Tomcat使用线程池来处理请求, 默认200. 可以修改配置或在自己的线程池异步处理HTTP请求. 异步/并发 在应用程序内, 同时调用多个外部服务以节省时间. 在这里使用线程池和client的方式管理和包装请求 扩容 系统演化路径 单机 -> 负载均衡 + 集群 -> 微服务 + 缓存 + 队列 扩容顺序 数据库拆分 数据库拆分的问题 Redis集群使用经验 分库分表实现方案 分布式事务错误处理 数据异构 队列 消息队列可以用来: 异步处理, 系统解耦, 数据同步, 流量削峰, 排队限流 数据同步/系统解耦 排队限流 数据库总线队列 通过订阅数据库的binlog, 对数据更改选择性同步到其它数据库, 比如异构库. 防止消息堆积 为防止消息队列被撑爆,…

2023-02-27 0comments 1870hotness 1likes Alvin Liu Read all
Architect

Java Cloud Service Architecture JCS

Each Oracle Java Cloud Service instance is comprised of several cloud services and middleware components. Each service instance has a single Oracle WebLogic Server domain that consists of one WebLogic Administration Server and a cluster of Managed Servers to host your Java application deployments. When Oracle Coherence is enabled for a service instance, there is a second cluster of Managed Servers that provide an in-memory data grid for your applications. Optionally, you can configure a load balancer, particularly if you have configured more than one Managed Server. This figure illustrates the components that make up a typical service instance:

2023-02-26 0comments 760hotness 0likes Alvin Liu Read all
Frontend

TypeScript学习笔记

类型定义 tsconfig.json webpack webpack.config.js package.json Babel npm i -D @babel/core @babel/preset-env babel-loader core-js webpack.config.js

2023-02-26 0comments 518hotness 0likes Alvin Liu Read all
Management

8020法则和长尾理论

马太效应: 因为人和事件之间的相互影响产生正反馈, 形成强者越强, 弱者越弱的现象. 80/20法则: 原名帕累托法则, 约20%的变量操纵着80%的局面. 这是由于复杂局面中的人和事件由于马太效应导致两极分化. 正态分布: 又名高斯分布, 之随机事件趋向中间值出现次数最多的情况. 主要作用于无法相互影响的事物, 比如人类的身高 长尾理论: 在80/20法则中80%产生20%效益的低值部分就是长尾. 在注重效率的情况下, 人们关注20%重点部分. 但是这部分的竞争也更加激烈. Costco少量优质的策略就是面向前20%的客户. 互联网电商则利用在线销售可以低成本覆盖大量客户的条件, 赚取长尾利润.长尾也适用于下沉市场和垂直细分领域.

2023-02-26 0comments 608hotness 0likes Alvin Liu Read all
JVM

JVM内存调优实战经验

JVM内存分配 内存分析常用命令 shift+m按MEM排序. 如果想按RES排序: shfit+f在RES上按s再按esc 内存分析常用工具 参考资料

2023-02-26 0comments 14890hotness 0likes Alvin Liu Read all
Management

管理咨询 逻辑思维工具框架方法

T字图 一张纸分成两栏,左边列举优点、右边列举缺点。 SWOT分析法 从更全面的维度分析某件事情,帮助我们决策 矩阵分析法 从两个维度,更全面的思考问题,比如时间管理中的四象限法 空雨伞模型 麦肯锡咨询公司的「空雨伞」模型,一种行动导向的思维方式 思辨训练 A4 笔记术,可以说是最轻量级的思辨训练 金字塔结构 BCG三四规则矩阵(Gartner魔力象限) https://zhuanlan.zhihu.com/p/352043982 三四规则矩阵是由波士顿咨询集团(BCG)提出的。这个模型用于分析一个成熟市场中企业的竞争地位。"三四规则"只是从经验中得出的一种假设,它并没有经过严格的证明。但是这个规则的意义非常重要,那就是在经验曲线的效应下,成本是市场份额的函数。 在一个稳定的竞争市场中,参与市场竞争的参与者一般分为三类,领先者、参与者、生存者。 在有影响力的领先者之中,企业的数量绝对不会超过三个,而在这三个企业之中,最有实力的竞争者的市场份额又不会超过最小者的四倍。 在任何两个竞争者之间,2:1的市场份额似乎是一个均衡点。在这个均衡点上,无论哪个竞争者要增加或减少市场份额,都显得不切实际而且得不偿失。市场份额小于最大竞争者的1/2,就不可能有效参与竞争。这也是经验性结论,但是不难从经验曲线的关系中推断出来。

2023-02-26 0comments 612hotness 0likes Alvin Liu Read all
Frontend

ES6 - ES13 新特性列表

ES 6 (2015) ES 7 (2016) ES 8 (2017) ES 9 (2018) ES 10 (2019) ES 11 (2020) ES 12 (2021) ES 13 (2022)

2023-02-26 1comments 2221hotness 0likes Alvin Liu Read all
Linux

Use Lens to connect Kubernetes through SSH Tunnel

Lens is a light weight client to manage remote Kubernetes cluster. It has Windows and Mac version to provide rich cluster management features. Following steps introduced how to use Lens connect to remote Kubernetes cluster through SSH tunnel.

2023-02-26 1comments 4129hotness 0likes Alvin Liu Read all
Linux

Kubernetes 1.26 部署方案

方案概述 服务版本 安装Kubernetes 参考文档: 中文步骤, 包括配置国内镜像服务器 http://www.cdyszyxy.cn/cwtj/616625.html 官方文档 https://kubernetes.io/zh-cn/docs/setup/production-environment/container-runtimes/ containerd, runc和CNI插件安装步骤 https://github.com/containerd/containerd/blob/main/docs/getting-started.md crictl安装文档: https://github.com/kubernetes-sigs/cri-tools/blob/master/docs/crictl.md 在VM执行下列命令 转发 IPv4 并让 iptables 看到桥接流量 依次在服务器直行下列命令 下面的命令只在主VM执行 下面命令在其它VM执行加入集群 启用crictl 本地使用kubectl 复制服务器.kube/config的内容到本地相同目录, 安装kubectl后就可以访问了. 本地通过TLS Tunnel使用kubectl 修改~.kube/config 开启tunnel 使用Lens图形化管理Kubernetes集群 下载后注册为免费用户https://k8slens.dev/desktop.html 首页Catalog -> Cluster -> 点击加号, 打开.kube/config文件添加集群. 在Cluster里点击右侧三个点选择Connect就可以使用了. 安装Helm 安装Traefik 安装Traefik后会自动生成service, 查看80端口对应的node port就是外网端口. kubectl get svc -n kube-system 配置对应的IngressRoute后就可以访问dashboard了. kubectl create -f traefik_ingress.yml 使用SSH隧道访问Traefik路由 把Traefik上配置的虚拟域名绑定到本地host文件 vi /etc/hosts 把Traefik的http服务端口(node port)映射到本地80端口 访问http://node1.test.com/dashboard/ 安装Docker Registry 生成docker密码, 把htpasswd放在node2的/opt/docker/auth, 后面要放在secret里面 创建系统服务的命名空间 部署docker服务 kubectl create -f docker_registry.yml 获取docker registry地址 Cluster IP给kubernetes配置image用, NodePort需要映射出去给本地用外网IP pushi image kubectl get svc -n kube-system 测试Docker服务器 本地浏览器访问http://vm_public_ip:32299/v2/_catalog 输入用户名密码后可以登录 本地映射Docker服务器端口 开发机Docker Desktop访问insecure registry node1.test.com是hosts文件配置的本地ip, 5000端口是ssl隧道映射的docker服务的node port 不管docker registry的pod运行在哪台VM, Node Port都会映射到所有VM 开发机rancher-desktop insecure registry 在开发机运行 添加下面的配置 开发机push Docker image到服务器Docker registry 服务器上检查image是否已经上传 开发机使用Maven build并pushi Docker image服务器docker registry 项目代码:https://github.com/kjstart/mavendemo 需要在本地Maven配置docker服务器的账号密码, 这里的server id和项目pom.xml里要对应 vi ~/.m2/settings.xml 配置好后就可以build项目了 注意Docker镜像命名不能用驼峰语法(ExampleName)会报Broken Pipe错误. 配置服务器containerd insecured http和auth 这步需要在每个VM(node)配置, 10.200.174.243是docker registry的ClusterIP, 请酌情修改. sudo vi /etc/containerd/config.toml sudo mkdir -p /etc/containerd/certs.d/10.200.172.167:5000 sudo vi /etc/containerd/certs.d/10.200.172.167:5000/hosts.toml sudo systemctl restart containerd 创建应用程序的命名空间 创建应用程序配置 创建应用程序秘钥 也可以用Lens创建, data的值直接填原文,不用base64编码 部署一个项目 这是demo项目https://github.com/kjstart/mavendemo 访问虚拟机上运行的服务 如果一些服务不迁移到k8s上,可以用下面的方法访问 比如要访问192.168.1.160:8161 kubectl create -f mysql-vm.yml k get svc -n infra 然后在k8s pod里就可以用Service的CLUSTER-IP访问服务了. 以后迁移服务, Service的IP不变 外网访问应用程序 后续要把公网域名映射到VM的Traefik端口, IngressRoute的域名做对应修改. 应用的端口在container和service暴露, 并通过IngressRoute映射为路径, 这里是/mavendemo http://node1.test.com:31708/mavendemo/hello 内网访问应用程序 使用service定义的服务名和应用程序暴露的端口来访问, 在container和service层都要暴露端口 添加新的Node(VM)到集群 在主节点生成token,24小时内可重复使用 kubeadm token create 在新节点完成K8s安装后(参考上面的安装Kubernetes部分),运行下面的命令 kubeadm join 192.168.113.141:6443 --token 你的token --discovery-token-ca-cert-hash sha256:f96f75de5775c1a66caa6ad5cb8783f4251db5c3137ac42c511f794b95afac33 允许K8s master节点部署应用 master节点(control plane)默认是不会部署应用程序的pod的. 如果需要部署, 编辑master节点, 删除NoSchedule的taint就可以了. kubelet常用alias 放在.bash_profile里, 可简化操作 参考文档 http://www.cdyszyxy.cn/cwtj/616625.html https://kubernetes.io/zh-cn/docs/setup/production-environment/container-runtimes/ https://github.com/containerd/containerd/blob/main/docs/getting-started.md https://github.com/kubernetes-sigs/cri-tools/blob/master/docs/crictl.md https://helm.sh/docs/intro/install/ https://doc.traefik.io/traefik/getting-started/install-traefik/ https://blog.csdn.net/avatar_2009/article/details/109807878 https://stackoverflow.com/questions/70971697/modify-docker-daemon-configuration-in-rancher-desktop-vm https://github.com/containerd/containerd/blob/main/docs/cri/config.md#registry-configuration https://github.com/containerd/containerd/blob/main/docs/hosts.md https://blog.csdn.net/weixin_44742630/article/details/126095739 https://www.cnblogs.com/yangmeichong/p/16661444.html https://blog.csdn.net/weixin_43616190/article/details/126415601 https://kubernetes.io/docs/concepts/configuration/configmap/ https://kubernetes.io/zh-cn/docs/concepts/configuration/secret/ https://blog.csdn.net/Thomson_tian/article/details/117218281 https://blog.csdn.net/sanhewuyang/article/details/128369826

2023-02-26 0comments 695hotness 0likes Alvin Liu Read all
uncategorized

Protected: Alvin Liu

There is no excerpt because this is a protected post.

2023-02-26 0comments 2227hotness 3likes Alvin Liu Read all
12
Post
  • General Conversion Tool convertt.top
  • SQL Developer Code Templates Autocomplete
  • Oracle Database Java Stored Procedure
  • Android 13 bypass Restricted Setting without root
  • Backup your Mac without time machine
Category
  • Architect
  • Database
  • Distributed System
  • Frontend
  • Golang
  • High Performance
  • JVM
  • Linux
  • Management
  • Misc
  • uncategorized

Android Babel Blog Cache Database Distributed System Dynamo Golang HA Heap JCS JVM Kubernetes Lens Linux Management Memory OCI Oracle Performance Planning Traefik Typescript Ubuntu Webpack WordPress

Comments
  1. martine on Use Lens to connect Kubernetes through SSH Tunnel
  2. kjstart on ES6 - ES13 新特性列表

COPYRIGHT © 2024 Alvin Liu. alvingoodliu@[email protected] ALL RIGHTS RESERVED.

Theme Made By Seaton Jiang