分布式架构 Mysql优化及高可用

分布式架构 Mysql优化及高可用


特点介绍

  • Mysql是一个关系型数据库管理系统,分为社区版和商业版,由于其体积小、速度快、总体拥有成本低
  • 源码开放,不需要支付额外的费用
  • 适用于中小型网站数据库
  • 为多种编程语言提供了 API,支持多个操作系统使用
  • 支持多线程,充分利用 CPU 资源
  • 提供用于管理、检查、优化数据库操作的管理工具
  • 支持多种存储引擎(MyISAM、查询/插入快,不支持事物,InnoDB 插入慢 支持ACID事务,支持行级锁定)

Mysql 优化思路

  • 表设计合理化
  • 索引优化(添加适当索引[四种: 普通索引、主键索引、唯一索引unique、全文索引])
  • Mysql配置优化 (配置最大并发数my.ini)
  • SQL查询优化
  • Mysql服务器硬件升级
  • 定时的去清除不需要的数据,定时进行碎片整理

Mysql 优化步骤

表设计合理化

  • 1.字符集的选择 如果确认全部是中文,不会使用多语言以及中文无法表示的字符,那么选GBK,只需要2个字节 UTF-8编码会占用3个字节

  • 2.表的存储引擎(查询/插入快,不需要事物支持,可用MyISAM、需要事物可用 InnoDB,不支持全文索引),MyISAM适合SELECT密集型的表,而InnoDB适合INSERT和UPDATE密集型的表

  • 3.如果一个表有许多的列,但平时参与查询和汇总的列却并不是很多,此时可以考虑将表格拆分成2个表,一个是常用的字段,另一个是很少用到的字段

  • 4.BLOB和CLOB 此类字段一般数据量很大,建议设计上数据库可以只保存其外部连接,而数据以其它方式保存,比如系统文件

  • 5.就是用空间换取时间。如果大表查询里经常要join某个基础表,且这个数据基本不变,比如人的姓名,城市的名字等。一旦基础表发生变动,
    则需要更新所有涉及到的冗余表

  • 6 合理构建分区表,分区策略(Range/List/Hash/Key)

  • 7 如果预期长度范围varchar就满足,就避免使用TEXT,表数据量越大,读取越慢,(Mysql 是行存储模式,所以会把整行读取出来,text 储存了大量的数据。读取时,占了大量的io开销)

  • 8.尽量使用TIMESTAMP而非DATETIME

索引优化( (mysql单表最大索引数量为16,建议4-8之间)

  • 1.尽可能使用长度短的主键,在主键上无需建单独的索引,因为系统内部为主键建立了聚簇索引,允许在其它索引上包含主键列
  • 2.外键会影响插入和更新性能,对于批量可靠数据的插入,尽可能用选用对应主表的主键作作为外键,外键是默认加上索引的
  • 3.优先创建复合索引,效果大于单索引
  • 4.经常需要检索查询、排序建议建立索引
  • 5.mysql强制使用指定索引查询 (select * from table_name force index (index_name) where conditions;)
  • 6.创建索引时,需要指定合适长度,其长度直接影响索引文件的大小,因此会影响增删改查的速度
    如 zachary_goods 商品表,title字段长度255,通过本地执行计划
    explain select id,title from zachary_goods where title=“测试商品”;

±—±------------±----------±-----±--------------±------------±--------±------±-----±-------------------------+

| id | select_type | table | type | possible_keys | key |
key_len | ref | rows | Extra |

±—±------------±----------±-----±--------------±------------±--------±------±-----±-------------------------+

| 1 | SIMPLE | zachary_goods | ref | index_title |
index_title | 150 | const | 1 | Using where; Using index |

±—±------------±----------±-----±--------------±------------±--------±------±-----±-------------------------+

其中key_len 为150过长这样当更新时是比较占内存的
设置区分度高的并且长度适合的索引
select count(distinct left(title,total))/count(*) from zachary_goods;
total是指截取的长度,实际上也可以发现设置该长度的查询度,比例越大说明越良好
通过测试发现索引长度30最佳
alter table zachary_goods add index index_title(title(30));

执行计划介绍

1.select_type: SIMPLE – 查询类型(简单查询、联合查询、子查询)
2.table: user – 显示这一行的数据是关于哪张表的
3.type: range – 区间索引(在小于1990/2/2区间的数据),这是重要的列,显示连接使用了何种类型。从最好到最差的连接类型为system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL,const代表一次就命中,ALL代表扫描了全表才确定结果。一般来说,得保证查询至少达到range级别,最好能达到ref
4.possible_keys: birthday – 指出MySQL能使用哪个索引在该表中找到行。如果是空的,没有相关的索引。这时要提高性能,可通过检验WHERE子句,看是否引用某些字段,或者检查字段不是适合索引
5.key: birthday – 实际使用到的索引。如果为NULL,则没有使用索引。如果为primary的话,表示使用了主键
6.key_len: 4 – 最长的索引宽度。如果键是NULL,长度就是NULL。在不损失精确性的情况下,长度越短越好
7.ref: const – 显示哪个字段或常数与key一起被使用
8.rows: 1 – 这个数表示mysql要遍历多少数据才能找到
9.Extra: Using where; Using index – 执行状态说明,这里可以看到的坏的例子是Using temporary和Using

SQL查询优化

  • 1.可通过开启慢查询日志来找出较慢的SQL
  • 2.sql语句尽可能简单:一条sql只能在一个cpu运算;大语句拆小语句,减少锁时间;一条大sql可以堵死整个库
  • 3.不用SELECT *,罗列相关字段,减少资源开销
  • 4.OR改写成IN:OR的效率是n级别,IN的效率是log(n)级别,in的个数建议控制在200以内
  • 5.避免like %xxx式查询,全表扫描
  • 6.尽量避免在WHERE子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描
  • 7.对于连续数值,使用BETWEEN不用IN
  • 8.列表数据不要拿全表,要使用LIMIT来分页,每页数量也不要太大

Mysql配置优化

  • 1.修改MySQL客户端的数据库连接闲置最大时间值 wait_timeout参数值,由默认的8小时,修改为30分钟,wait_timeout=1800(单位秒)
    通过命令show variables like 'wait_timeout’查看结果值
  • 2.修改back_log参数值:由默认的50修改为500(每个连接256kb),back_log值指出在MySQL暂时停止回答新请求之前的短时间内多少个请求可以被存在堆栈中
  • 3.修改max_connections参数值,修改为3000;max_connections=3000,
    max_connections是指MySql的最大连接数,如果服务器的并发连接请求量比较大,建议调高此值,以增加并行连接数量
  • 4.修改thread_concurrency值,thread_concurrency应设为CPU核数的2倍

Mysql常见问题分析及处理

  1. Mysql死锁(非主键索引更新引起的死锁)
    死锁一般会抛出MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction
    主键更新,Mysql会锁住主键索引,非主键索引更新时;Mysql会先锁住非主键索引,再锁定主键索引
    如:update zachary_goods set status=‘CHECKED’ where title=“测试商品”,Mysql会执行以下过程
    1.由于用到了非主键索引,首先需要获取index_title上的行级锁
    2.获取锁成功后根据主键进行更新,所以需要获取主键上的行级锁
    3.更新完毕后,提交,并释放所有锁
    那么死锁如何产生呢?,如上SQL再执行1.2之间时,突然外界执行了 update zachary_goods set status=‘CHECKED’ where id=1 AND
    同样会先锁住主键索引,然后锁住非主键索引,此时此刻 上叙SQL等待主键锁,下叙SQL等待非主键索引,就产生了死锁
    处理方案
    1.默认更新时,先获取需要更新的记录的主键
    2.通过主键更新记录避免死锁

  2. Mysql 缺少索引的数据表更新引起的死锁
    相关异常Error: ER_LOCK_WAIT_TIMEOUT: Lock wait timeout exceeded; try restarting transaction
    分析思考:
    原因是锁等待超时,当前事务在等待其它事务释放锁资源造成的
    MySQL 默认的级别是 REPEATABLE READ(可重复读),这表示在 MySQL 的默认情况下,“脏读”、“不可重复读” 是不会发生的。这就需要在更新的时候进行必要的锁定(InnoDB 是采用行级锁的方式),从而保证一致性
    InnoDB 的行锁是通过给索引上的索引项加锁来实现的,意味着只有通过索引条件检索数据,其才使用行级锁,否则,其 将使用表锁
    执行SQL时候没有给相关字段加索引导致锁住了整个表,由于数据量大导致其它查询本表处于等待锁资源,而这个等待时间太久,导致超时了
    处理方案
    1.相关字段加索引
    2.text 字段做索引,所以必须选择字段前多少位做索引,或者使用全文索引,InnoDB不支持全文索引

  3. Mysql多线程update发生死锁
    相关异常Error updating database.
    Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction
    分析思考: 因为行锁是对索引加锁,那么当where语句中包含多个条件时候,mysql在生成执行计划的时候实际上也只用到一个字段的索引(区分度最大的字段),所以即使where语句中包含多个字段,实际上也只使用了一个字段的索引,那么根据这个字段进行过滤出来的记录数可能就不止一条,这个可以通过explain查看到。
    当高并发的情况下,当两个事务同时需要对同一个检索的记录进行更新操作时,由于其中一个事务把同一个检索的所有记录都锁住了,
    那么必然会导致另外一个事务无法获取到锁
    处理方案
    1.建立复合索引,对where条件中所用到的所有的字段共同构建一个复合索引
    2.再次执行explain,发现这个时候确实只锁住了一条记录,问题解决

Mysql优化过程(千万级别数据)

读写分离:

04
主从复制过程:
02

一主多从:
1

级联复制:

2

  • 1.当传统单节点数据库由于负载过高,数据量大,查询缓慢,此时优化思路 可以做主从、读写分离
  • 2.所谓读写分离,1个主节点用于写数据,把读数据分流到1个从节点。从而提高节点利用率、缓解数据库压力
  • 3.以上方案可以撑一段时间,当数据量持续加大后,以上方案已经到达瓶颈后,这个时候分析写数据/读数据哪个有瓶颈?
  • 4.如果读数据有瓶颈后,可以优化成,1主多从,从节点做负载均衡。mysql的binlong同步5个节点以上会存在性能问题,建议3-5个节点
    如果由于业务系统需要,必须要大于5个节点以上,建议使用 从节点挂载同步到从节点,减少主节点同步到从节点的性能耗损
  • 5.如果写数据存在瓶颈,此时考虑表构造、索引优化
  • 6.当表构造、索引优化后并发已到瓶颈后,此时考虑分库,由于mysql单库存在最大并发限制(3000),提高并发、提高磁盘存储率
  • 7.分库后由于数据库持续增大,索引优化到瓶颈后效果不好。此时考虑分区。分区相当于单库的分表,
    Mysql支持多种分区算法,无嵌入程序。Mysql支持单库最大分区1024,意味着可以分1024个区块
  • 8.由于应用程序里面各种统计算法、业务模式加大,此时单台主节点数据库已经到达瓶颈(分区不支持数据库横向扩展),此时考虑分表,
    由于分表会有很多潜在问题,维护成本高额、统计数据繁琐、数据移植难度大等。笔者建议不到万不得已不要走此步骤
  • 9.分表有效将大表横向切分成小表,可分布在多台数据库上。性能非常高。常用分表如(shared-jdbc,my-cat,mysql-proxy官网插件)

注明:如是对公司业务发展非常了解、业务清晰明了、数据量预估到位、风险评估到位可提前设计一步到位、否则就是过度为了设计而设计
笔者建议,按照系统规模、业务场景逐渐优化改造,不要想着一步到位。

Mysql 高可用部署架构

  1. 由于Mysql的写入单台存在瓶颈,不管是主从复制、读写分离都不能完全有效利用服务器资源,并存在数据延迟的风险,数据不一致风险
    笔者推荐一款开源好用的插件 Galera Cluster
    04

    简单说明就是Mysql集群,和主从结构稍有不同,集群中都是主节点,都可以读写操作,当客户端写入到某台数据库后,
    实时自动同步新数据同步到其它节点上面,这种架构不共享任何数据,是一种高冗余架构。 它能解决Mysql如下问题
    1.多主架构:真正的多点读写的集群,在任何时候读写数据,都是最新的,充分利用服务器资源
    2.同步复制:集群不同节点之间数据同步,没有延迟,在数据库挂掉之后,数据不会丢失
    3.并发复制:从节点在APPLY数据时,支持并行执行,有更好的性能表现
    4.故障切换:在出现数据库故障时,因为支持多点写入,切的非常容易

总结

Mysql优化根据业务场景逐渐优化,不要盲目过度设计优化,根据系统业务情况采用适合数据库进行业务处理,传统数据库可以和Nosql数据库共存,分别使用它的优化,让系统业务更加稳健运行

作者简介:张程 技术研究

更多文章请关注微信公众号:zachary分解狮 (frankly0423)

在这里插入图片描述

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
第1部分概述 1 1 交易型系统设计的一些原则 2 1.1 高并发原则 3 1.1.1 无状态 3 1.1.2 拆分 3 1.1.3 服务化 4 1.1.4 消息队列 4 1.1.5 数据异构 6 1.1.6 缓存银弹 7 1.1.7 并发化 9 1.2 高可用原则 10 1.2.1 降级 10 1.2.2 限流 11 1.2.3 切流量 12 1.2.4 可回滚 12 1.3 业务设计原则 12 1.3.1 防重设计 13 1.3.2 幂等设计 13 1.3.3 流程可定义 13 1.3.4 状态与状态机 13 1.3.5 后台系统操作可反馈 14 1.3.6 后台系统审批化 14 1.3.7 文档和注释 14 1.3.8 备份 14 1.4 总结 14 第2部分高可用 17 2 负载均衡与反向代理 18 2.1 upstream配置 20 2.2 负载均衡算法 21 2.3 失败重试 23 2.4 健康检查 24 2.4.1 TCP心跳检查 24 2.4.2 HTTP心跳检查 25 2.5 其他配置 25 2.5.1 域名上游服务器 25 2.5.2 备份上游服务器 26 2.5.3 不可用上游服务器 26 2.6 长连接 26 2.7 HTTP反向代理示例 29 2.8 HTTP动态负载均衡 30 2.8.1 Consul+Consul-template 31 2.8.2 Consul+OpenResty 35 2.9 Nginx四层负载均衡 39 2.9.1 静态负载均衡 39 2.9.2 动态负载均衡 41 参考资料 42 3 隔离术 43 3.1 线程隔离 43 3.2 进程隔离 45 3.3 集群隔离 45 3.4 机房隔离 46 3.5 读写隔离 47 3.6 动静隔离 48 3.7 爬虫隔离 49 3.8 热点隔离 50 3.9 资源隔离 50 3.10 使用Hystrix实现隔离 51 3.10.1 Hystrix简介 51 3.10.2 隔离示例 52 3.11 基于Servlet 3实现请求隔离 56 3.11.1 请求解析和业务处理线程池分离 57 3.11.2 业务线程池隔离 58 3.11.3 业务线程池监控/运维/降级 58 3.11.4 如何使用Servlet 3异步化 59 3.11.5 一些Servlet 3异步化压测数据 64 4 限流详解 66 4.1 限流算法 67 4.1.1 令牌桶算法 67 4.1.2 漏桶算法 68 4.2 应用级限流 69 4.2.1 限流总并发/连接/请求数 69 4.2.2 限流总资源数 70 4.2.3 限流某个接口的总并发/请求数 70 4.2.4 限流某个接口的时间窗请求数 70 4.2.5 平滑限流某个接口的请求数 71 4.3 分布式限流 75 4.3.1 Redis+Lua实现 76 4.3.2 Nginx+Lua实现 77 4.4 接入层限流 78 4.4.1 ngx_http_limit_conn_module 78 4.4.2 ngx_http_limit_req_module 80 4.4.3 lua-resty-limit-traffic 88 4.5 节流 90 4.5.1 throttleFirst/throttleLast 90 4.5.2 throttleWithTimeout 91 参考资料 92 5 降级特技 93 5.1 降级预案 93 5.2 自动开关降级 95 5.2.1 超时降级 95 5.2.2 统计失败次数降级 95 5.2.3 故障降级 95 5.2.4 限流降级 95 5.3 人工开关降级 96 5.4 读服务降级 96 5.5 写服务降级 97 5.6 多级降级 98 5.7 配置中心 100 5.7.1 应用层API封装 100 5.7.2 配置文件实现开关配置 101 5.7.3 配置中心实现开关配置 102 5.8 使用Hystrix实现降级 106 5.9 使用Hystrix实现熔断 108 5.9.1 熔断机制实现 108 5.9.2 配置示例 112 5.9.3 采样统计 113 6 超时与重试机制 117 6.1 简介 117 6.2 代理层超时与重试 119 6.2.1 Nginx 119 6.2.2 Twemproxy 126 6.3 Web容器超时 127 6.4 中间件客户端超时与重试 127 6.5 数据库客户端超时 131 6.6 NoSQL客户端超时 134 6.7 业务超时 135 6.8 前端Ajax超时 135 6.9 总结 136 6.10 参考资料 137 7 回滚机制 139 7.1 事务回滚 139 7.2 代码库回滚 140 7.3 部署版本回滚 141 7.4 数据版本回滚 142 7.5 静态资源版本回滚 143 8 压测与预案 145 8.1 系统压测 145 8.1.1 线下压测 146 8.1.2 线上压测 146 8.2 系统优化和容灾 147 8.3 应急预案 148 第3部分高并发 153 9 应用级缓存 154 9.1 缓存简介 154 9.2 缓存命中率 155 9.3 缓存回收策略 155 9.3.1 基于空间 155 9.3.2 基于容量 155 9.3.3 基于时间 155 9.3.4 基于Java对象引用 156 9.3.5 回收算法 156 9.4 Java缓存类型 156 9.4.1 堆缓存 158 9.4.2 堆外缓存 162 9.4.3 磁盘缓存 162 9.4.4 分布式缓存 164 9.4.5 多级缓存 166 9.5 应用级缓存示例 167 9.5.1 多级缓存API封装 167 9.5.2 NULL Cache 170 9.5.3 强制获取最新数据 170 9.5.4 失败统计 171 9.5.5 延迟报警 171 9.6 缓存使用模式实践 172 9.6.1 Cache-Aside 173 9.6.2 Cache-As-SoR 174 9.6.3 Read-Through 174 9.6.4 Write-Through 176 9.6.5 Write-Behind 177 9.6.6 Copy Pattern 181 9.7 性能测试 181 9.8 参考资料 182 10 HTTP缓存 183 10.1 简介 183 10.2 HTTP缓存 184 10.2.1 Last-Modified 184 10.2.2 ETag 190 10.2.3 总结 192 10.3 HttpClient客户端缓存 192 10.3.1 主流程 195 10.3.2 清除无效缓存 195 10.3.3 查找缓存 196 10.3.4 缓存未命中 198 10.3.5 缓存命中 198 10.3.6 缓存内容陈旧需重新验证 202 10.3.7 缓存内容无效需重新执行请求 205 10.3.8 缓存响应 206 10.3.9 缓存头总结 207 10.4 Nginx HTTP缓存设置 208 10.4.1 expires 208 10.4.2 if-modified-since 209 10.4.3 nginx proxy_pass 209 10.5 Nginx代理层缓存 212 10.5.1 Nginx代理层缓存配置 212 10.5.2 清理缓存 215 10.6 一些经验 216 参考资料 217 11 多级缓存 218 11.1 多级缓存介绍 218 11.2 如何缓存数据 220 11.2.1 过期与不过期 220 11.2.2 维度化缓存与增量缓存 221 11.2.3 大Value缓存 221 11.2.4 热点缓存 221 11.3 分布式缓存与应用负载均衡 222 11.3.1 缓存分布式 222 11.3.2 应用负载均衡 222 11.4 热点数据与更新缓存 223 11.4.1 单机全量缓存+主从 223 11.4.2 分布式缓存+应用本地热点 224 11.5 更新缓存与原子性 225 11.6 缓存崩溃与快速修复 226 11.6.1 取模 226 11.6.2 一致性哈希 226 11.6.3 快速恢复 226 12 连接池线程池详解 227 12.1 数据库连接池 227 12.1.1 DBCP连接池配置 228 12.1.2 DBCP配置建议 233 12.1.3 数据库驱动超时实现 234 12.1.4 连接池使用的一些建议 235 12.2 HttpClient连接池 236 12.2.1 HttpClient 4.5.2配置 236 12.2.2 HttpClient连接池源码分析 240 12.2.3 HttpClient 4.2.3配置 241 12.2.4 问题示例 243 12.3 线程池 244 12.3.1 Java线程池 245 12.3.2 Tomcat线程池配置 248 13 异步并发实战 250 13.1 同步阻塞调用 251 13.2 异步Future 252 13.3 异步Callback 253 13.4 异步编排CompletableFuture 254 13.5 异步Web服务实现 257 13.6 请求缓存 259 13.7 请求合并 261 14 如何扩容 266 14.1 单体应用垂直扩容 267 14.2 单体应用水平扩容 267 14.3 应用拆分 268 14.4 数据库拆分 271 14.5 数据库分库分表示例 275 14.5.1 应用层还是中间件层 275 14.5.2 分库分表策略 277 14.5.3 使用sharding-jdbc分库分表 279 14.5.4 sharding-jdbc分库分表配置 279 14.5.5 使用sharding-jdbc读写分离 283 14.6 数据异构 284 14.6.1 查询维度异构 284 14.6.2 聚合数据异构 285 14.7 任务系统扩容 285 14.7.1 简单任务 285 14.7.2 分布式任务 287 14.7.3 Elastic-Job简介 287 14.7.4 Elastic-Job-Lite功能与架构 287 14.7.5 Elastic-Job-Lite示例 288 15 队列术 295 15.1 应用场景 295 15.2 缓冲队列 296 15.3 任务队列 297 15.4 消息队列 297 15.5 请求队列 299 15.6 数据总线队列 300 15.7 混合队列 301 15.8 其他队列 302 15.9 Disruptor+Redis队列 303 15.9.1 简介 303 15.9.2 XML配置 304 15.9.3 EventWorker 305 15.9.4 EventPublishThread 307 15.9.5 EventHandler 308 15.9.6 EventQueue 308 15.10 下单系统水平可扩展架构 311 15.10.1 下单服务 313 15.10.2 同步Worker 313 15.11 基于Canal实现数据异构 314 15.11.1 Mysql主从复制 315 15.11.2 Canal简介 316 15.11.3 Canal示例 318 第4部分案例 323 16 构建需求响应式亿级商品详情页 324 16.1 商品详情页是什么 324 16.2 商品详情页前端结构 325 16.3 我们的性能数据 327 16.4 单品页流量特点 327 16.5 单品页技术架构发展 327 16.5.1 架构1.0 328 16.5.2 架构2.0 328 16.5.3 架构3.0 330 16.6 详情页架构设计原则 332 16.6.1 数据闭环 332 16.6.2 数据维度化 333 16.6.3 拆分系统 334 16.6.4 Worker无状态化+任务化 334 16.6.5 异步化+并发化 335 16.6.6 多级缓存化 335 16.6.7 动态化 336 16.6.8 弹性化 336 16.6.9 降级开关 336 16.6.10 多机房多活 337 16.6.11 多种压测方案 338 16.7 遇到的一些坑和问题 339 16.7.1 SSD性能差 339 16.7.2 键值存储选型压测 340 16.7.3 数据量大时JIMDB同步不动 342 16.7.4 切换主从 342 16.7.5 分片配置 342 16.7.6 模板元数据存储HTML 342 16.7.7 库存接口访问量600w/分钟 343 16.7.8 微信接口调用量暴增 344 16.7.9 开启Nginx Proxy Cache性能不升反降 344 16.7.10 配送至读服务因依赖太多,响应时间偏慢 344 16.7.11 网络抖动时,返回502错误 346 16.7.12 机器流量太大 346 16.8 其他 347 17 京东商品详情页服务闭环实践 348 17.1 为什么需要统一服务 348 17.2 整体架构 349 17.3 一些架构思路和总结 350 17.3.1 两种读服务架构模式 351 17.3.2 本地缓存 352 17.3.3 多级缓存 353 17.3.4 统一入口/服务闭环 354 17.4 引入Nginx接入层 354 17.4.1 数据校验/过滤逻辑前置 354 17.4.2 缓存前置 355 17.4.3 业务逻辑前置 355 17.4.4 降级开关前置 355 17.4.5 AB测试 356 17.4.6 灰度发布/流量切换 356 17.4.7 监控服务质量 356 17.4.8 限流 356 17.5 前端业务逻辑后置 356 17.6 前端接口服务端聚合 357 17.7 服务隔离 359 18 使用OpenResty开发高性能Web应用 360 18.1 OpenResty简介 361 18.1.1 Nginx优点 361 18.1.2 Lua的优点 361 18.1.3 什么是ngx_lua 361 18.1.4 开发环境 362 18.1.5 OpenResty生态 362 18.1.6 场景 362 18.2 基于OpenResty的常用架构模式 363 18.2.1 负载均衡 363 18.2.2 单机闭环 364 18.2.3 分布式闭环 367 18.2.4 接入网关 368 18.2.5 核心接入Nginx功能 369 18.2.6 业务Nginx功能 369 18.2.7 Web应用 370 18.3 如何使用OpenResty开发Web应用 371 18.3.1 项目搭建 371 18.3.2 启停脚本 372 18.3.3 配置文件 372 18.3.4 nginx.conf配置文件 373 18.3.5 Nginx项目配置文件 373 18.3.6 业务代码 374 18.3.7 模板 374 18.3.8 公共Lua库 375 18.3.9 功能开发 375 18.4 基于OpenResty的常用功能总结 375 18.5 一些问题 376 19 应用数据静态化架构高性能单页Web应用 377 19.1 整体架构 378 19.1.1 CMS系统 379 19.1.2 前端展示系统 380 19.1.3 控制系统 380 19.2 数据和模板动态化 381 19.3 多版本机制 381 19.4 异常问题 382 20 使用OpenResty开发Web服务 383 20.1 架构 383 20.2 单DB架构 384 20.2.1 DB+Cache/数据库读写分离架构 384 20.2.2 OpenResty+Local Redis+Mysql集群架构 385 20.2.3 OpenResty+Redis集群+Mysql集群架构 386 20.3 实现 387 20.3.1 后台逻辑 388 20.3.2 前台逻辑 388 20.3.3 项目搭建 389 20.3.4 Redis+Twemproxy配置 389 20.3.5 Mysql+Atlas配置 390 20.3.6 Java+Tomcat安装 394 20.3.7 Java+Tomcat逻辑开发 395 20.3.8 Nginx+Lua逻辑开发 401 21 使用OpenResty开发商品详情页 405 21.1 技术选型 407 21.2 核心流程 408 21.3 项目搭建 408 21.4 数据存储实现 410 21.4.1 商品基本信息SSDB集群配置 410 21.4.2 商品介绍SSDB集群配置 413 21.4.3 其他信息Redis配置 417 21.4.4 集群测试 418 21.4.5 Twemproxy配置 419 21.5 动态服务实现 422 21.5.1 项目搭建 422 21.5.2 项目依赖 422 21.5.3 核心代码 423 21.5.4 基本信息服务 424 21.5.5 商品介绍服务 426 21.5.6 其他信息服务 426 21.5.7 辅助工具 427 21.5.8 web.xml配置 428 21.5.9 打WAR包 428 21.5.10 配置Tomcat 428 21.5.11 测试 429 21.5.12 Nginx配置 429 21.5.13 绑定hosts测试 430 21.6 前端展示实现 430 21.6.1 基础组件 430 21.6.2 商品介绍 432 21.6.4 前端展示 434 21.6.5 测试 442

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值