无状态网
将用户数据(用户登录信息等)放在redis集群中,所有的请求经过网关打到这个集群中,来进行信息的提取和认证,解决单个用户请求只能打到一个固定的服务器的痛点,提高了服务器的可迁移性,同时方便 扩充服务器来承接更多的用户
数据中心
目的:就近原则,让不同地理位置的人,请求距离最近的服务器(集群)/数据中心,
操作:用户会被基于地理位置的域名服务导流到最近的数据中心,也就是说流量被分散到不同的数据中心。geoDNS:一种基于用户的地理位置将域名解析为不同IP地址的DNS服务
问题:
1:如果美东的数据中心挂了,如何将请求打到美西?
2:数据同步:不同地区的用户可以使用不同的本地数据库或者缓存。在故障转移的场景中,流量可能被转到一个数据不可用的数据中心。常用的一个策略是在多个数据中心复制数据。很多分布式系统用消息队列来解决这个问题。
消息队列
消息队列将消息存储在内存中,是一种异步的通信组件,生产者往MQ里面塞数据,消费者从MQ中取数据消费,即使消费者没有及时的处理完消息,生产者也可以正常返回响应 当MQ当中的数据量不断的增加,可以适当地增加消费者的数量,当MQ中的数据不断地减少,也可以适当的减少消费者的数量。
记录日志、收集指标与自动化
记录日志:监控错误日志非常的重要,可以从每一个服务节点拉错误日志进行分析和监控,也可以将各个服务器的错误日志汇总到同一个服务器,然后来进行聚合的搜索和查看一起监控日志
收集指标:收集不同类型的指标数据,有助于获得商业洞察力和了解系统的健康状态。 以下几个指标很有用: •主机级别指标:CPU、内存、磁盘I/O等。 •聚合级别指标:比如整个数据库层的性能,整个缓存层的性能等。 •关键业务指标:每日活跃用户数、留存率、收益等。
自动化:当系统变得庞大且复杂时,就需要创建或者使用自动化工具来提高生产力。持续集成是一个很好的做法。在这种做法中,每次代码检入(check in)都需要通过自动化工具的审核,使团队能及时发现问题。同时,将构建、测试和部署等流程自动化,可以显著提高开发人员的生产力。
可以通过MQ来记录日志和指标

数据库扩展
横向扩展,也叫分片,就是添加更多服务器, 数据库分片是指把大数据库拆分成更小、更容易管理的部分(这些部分叫作Shard,分片)。每个Shard共享同样的数据库Schema,但是里面的数据都是这个Shard独有的
操作:根据用户ID(分片键),用户数据被分配到其中一个数据库服务器上。每次要访问数据时,就会用一个哈希函数来找对应的Shard。例如,以user_id(用户ID)对4求余作为哈希函数。如果余数为0,那么Shard 0就被用来存储和获取数据;如果余数为1,就用Shard 1,依此类推。
问题: 在进行数据库,横向扩展的时候最重要的一个困难点,是选择一个合适的分片键, 这个分片键具有的特点是可以将数据均匀的打到不同的数据库中。
1: 重分片数据:当出现一个数据库存储的数据马上到顶的时候,我们需要重新选择一个合适的哈希函数进来进行分配, 或者是说当这个分片键导致了数据库数据分配不均匀导致某一个数据库存储了大量的数据而其他数据库几乎没数据,我们还是需要找到一个新的哈希函数行数据分配。
2:热点键问题: 比如说,现在有成龙彭于晏马化腾张一鸣等四位大佬的信息,我们都把它存在同一个数据库中,因为这四位大佬每天都会有人进行访问,所以说这个数据库很快就爆了,为了解决这个问题,我们需要将这四位大佬分别存放在四个不同的数据库中 同时也会对这四个不同的数据库进一步的分区。
3:连接和去规范化:一旦数据库通过分片被划分到多个服务器上,就很难跨数据库分片执行连接(join)操作了。解决这个问题的常用方法就是对数据库去规范化,把数据冗余存储到多张表中,以便查询可以在一张表中执行。 ps:因为我们会对一个表进行分片产生多个分片数据库分区,所以说我们将冗余的数据进行简化和提取 建设多张不同的表,然后对这些表进行数据库的分片和分区。