一.分表分库
1.分表
垂直分表:垂直分表可以理解为按列分表,比如一个用户表包括了用户登录信息,用户基本资料,用户账号信息等等,这个表字段太多,查询时候肯定会影响性能,所有可以按照它们各自的业务垂直分表;
水平分表:按照行来分,大表拆成小表,但是字段都相同;按照id来分,按照业务(时间,类型)来分,用hash算法来分,用雪花算法来分
2.分库
垂直分库(按业务分库):分布式微服务天然就是垂直分库;一个mysql数据处理不了就可以考虑使用多个mysql服务来分担压力,垂直分库就是把一个数据中的N张表,按照模块/业务划分到多个mysql数据库,每个数据库都有自己的服务器,进行分布式部署
水平分库(同一业务表拆分到不同的库):即使做了水平分表,表太多也会影响数据库的效率,水平分库指的是把一个数据库中的表分到多个数据库中,数据库采用分布式部署,比如电商平台针对于商品库我们可以按照用户来分
二.Redis集群
1.主从模式
主从复制是将一台Redis服务器的数据,复制到其他Redis服务器上,前者称为主节点,后者称为从节点,数据的复制是单向的,只能由主节点到从节点,默认情况下,每一台Redis服务器都是主节点,且一个主节点可以有多个从节点,单一个从节点只能有一个主节点
优点:
①.从是数据的一种备份,可以防止数据丢失
②.读写分离,分担读的压力
③.主从是哨兵,cluster集群的基石
缺点:
①.只能分担读的压力,不能分担写的压力
②.主如果挂了,集群就不可用了,没法自动主备切换
③.存储得不到扩容,存储数据总量是主的数据总量
2.哨兵模式
主从模式,当主服务器中断服务后,可以将一个从服务器升级为主服务器,以便继续提供服务,但是这个过程需要人工手动来操作,为此,Redis2.8中提供了哨兵工具来实现自动化的系统监控和故障恢复功能
优点:
①.哨兵模式是基于主从模式的,所有主从模式的优点,它都有
②.主从可以自动切换,系统更加健壮,可用性更高
缺点:
①.哨兵模式依然是主从模式,没法解决写的压力,只能减轻读的压力
②.存储得不到扩容,存储数据总量是主的数据总量
3.cluster集群
Redis-Cluster采用无中心结构,集群中的每个节点都是平等的关系,都是对等的,每个节点都保存各自的数据和整个集群的状态。每个节点都和其他所有节点连接,而且这些连接保持活跃,这样就保证了我们只需要连接集群中的任意一个节点,就可以获取到其他节点的数据
优点:
①.无中心结构
②.按照数据
③.可扩展性:可线性扩展到1000多个节点,节点可动态添加或删除
④.高可用性:部分节点不可用时,集群仍然可以用,通过增加Slave或standby数据副本,能够实现故障自动failover,节点之间通过gossio协议交换状态信息,用投票机制完成Slave到Master的角色提升
⑤.降低运维成本,提高系统的扩展性和可用性
缺点:
①.Client 实现复杂,驱动要求实现 Smart Client,缓存 slots mapping 信息并及时更新,提高了开发难度,客户端的不成熟影响业务的稳定性。目前仅 JedisCluster 相对成熟,异常处理部分还不完善,比如常见的“max redirect exception”
②.节点会因为某些原因发生阻塞(阻塞时间大于cluster-node-timeout),被判断下线,这种failover是没有必要的
③.数据通过异步复制,不保证数据的强一致性
④.多个业务使用同一套集群时,无法根据统计区分冷热数据,资源隔离性比较差,容易出现互相影响的情况
⑤.Slave在集群中充当 “冷备”,不能缓解读压力,当然可以通过 SDK 的合理设计来提高 Slave 资源的利用率
三.ES集群
1.分片
单台机器无法存储大量数据,es可以将一个索引中的数据切分为多个shard,分布在多台服务器上存储。有了shard就可以横向扩展,存储更多数据,让搜索和分析等操作分布到多台服务器上去执行,提升吞吐量和性能。每个shard都是一个lucene index
2.脑裂
由于并发访问量的提高,导致了我们两个节点的集群(分片数默认为5,副本为1,没有固定的master,都是集群中的节点又做data又做master)状态变成了red,出现了大量的坏片,并且坏掉的都是主分片及其副本。分析发现,是ES集群出现了脑裂问题(俗称精神分裂),即集群中不同的节点对于master的选择出现了分歧,出现了多个master竞争,导致主分片和副本的识别也发生了分歧,对一些分歧中的分片标识为了坏片
为什么要做集群?
为了提升应用的并发作业能力我们通常会对应用做集群,这里的集群指的是把应用进行复制多个相同的应用一起工作来提高作业能力,多个应用做的是相同的事情,多个应用部署在不同的服务器
1.防止单点故障
2.提升作业能力(高并发)
3.数据的分布式存储