数据库服务器架构
ORM
ORM(Object Relational Mapping):对象与关系数据之间的映射
映射关系表:
类(class)—— 数据库的表(table)
对象(object)——记录(record 行数据)
对象的属性(attribute)—— 字段(field)
主流技术:Hibernate ; MyBatis;Entity FrameWork
数据库读写分离化
主从数据库结构
特点:一般一主多从,也可以多主多从;主库做写的操作,从库做读的操作
主从复制操作:
- 主库更新数据完成前,将操作写binlog日志文件
- 从库打开I/O线程与主库连接,做binlog dump process(从日志中读取主库的操作),并将事件写入中继日志
- 从库执行中继日志事件,保持与主库一致
缓存技术
用缓存缓解读库的压力,将数据暂存在缓存中,减少对硬盘的直接操作
缓存与数据库的协作
数据读取:
- 根据key从缓存读取
- 若缓存中没有,则根据key在数据库中查找
- 读取到“值”之后,更新缓存
数据写入:
- 根据key值写入数据库
- 根据key更新缓存
常见的缓存技术
MemCache
简单的key/value结构,不支持数据容灾,不支持事务管理,结构简单,功能较少
Redis
Redis集群切片:
- 客户端切片,在客户端通过key的hash值对应到不同的redis服务器
- 中间件实现切片:在应用软件和redis中间实现服务器到后台redis节点的切片
- 客户端服务器协作切片:两者结合,服务器为客户端提供slot(插槽)(一个服务器可能对应多个slot),再由客户端的hash算法选择相应的插槽。
数据分片方案:
- 范围分片:根据某个关键字的取值范围将数据分片
- Hash分片:根据某个关键字的Hash值将数据分片,能够较为均匀地分片
- 一致性Hash分片: 将服务器的编号也进行Hash计算,再根据某个关键字的Hash值与服务器的Hash值进行比较,将数据存在Hash值距离较近的服务器上。(缓解了新增服务器后,数据迁移的问题)
分布式存储方案:
- 主从模式:一主多从(主负责写,从负责读),主服务器故障时手动切换
- 哨兵模式:在主从模式的基础上增加哨兵的监督,哨兵负责监督服务器运行状态,如果主服务器故障,哨兵可以自行选择切换主服务器。
- 集群模式:分节点对等集群,根据Web服务器的slot插槽来分配数据库的节点。
Redis数据类型:
- String:最大512MB,用于缓存,计数。共享Session
- Hash (字典):一个Key对应一组数据,用于存储、读取、修改用户属性
- List:双向链表,增删快,查询慢,用于消息队列,文章列表
- Set(集合):键值对无序,唯一,增删查复杂度为O(1),用于独立IP,标签
- Sorted Set(有序集合):键值对有序,唯一,自带按权重排序的效果,用于排行榜
数据淘汰机制:
- 不淘汰:禁止驱逐数据,填满了就报警,是系统默认的淘汰策略,常用机制:noeviction
- 根据过期时间淘汰:常用机制:volatile - random(随机移除某个过期的key),volatile - lru(优先移除最近未使用的过期的key),volatile-ttl(ttl值(ttl值标识过期时间,值最小表示过期最久)最小的key优先移除)
- 全键空间 :常用机制:allkey - random(随机移除某个key) ,allkey -lru(优先移除最近未使用的key)
Redis的持久化(数据恢复):
- RDB:传统数据库中快照的思想。指定时间间隔将数据进行备份
- AOF:传统数据库中的日志思想,把每条改变数据集的命令追加到AOF文件的末尾,数据丢失时,可以根据AOF文件中的命令重建数据库
常见问题:
- 缓存雪崩:短时间内大量缓存数据失效,客户端的大量请求直接发送到数据库,导致数据库崩溃,可以通过加锁或队列、设置不同的缓存失效时间、添加二级缓存等方法避免
- 缓存穿透:缓存没有存储服务器需要的数据或查询数据为空,服务器有大量直接访问数据库的请求。可以通过为空数据设置默认值;设置过滤器等方法缓解
- 缓存预热:系统上线后,需要将相关需要缓存数据直接加到缓存系统中,避免需要第二次访问某些数据时才将数据加入缓存的效率低下的问题
- 缓存更新:缓存中的过期数据没有及时更新,可以通过定期更新;根据查询语句判断是否过期等方式避免