【完结11章】技术大牛成长课,从0到1带你手写一个数据库系统
给大家分享一套数据库课程——技术大牛成长课,从0到1带你手写一个数据库系统,课程已完结,共11章,附源码。
数据库系统是为适应数据处理的需要而发展起来的一种较为理想的数据处理系统,也是一个为实际可运行的存储、维护和应用系统提供数据的软件系统,是存储介质 、处理对象和管理系统的集合体。
如果分片数据损坏,无法修复,比如某个磁盘坏了,这时候数据无法修复,为了恢复索引状态,可以允许分片的数据丢失,后续通过上层数据来重建索引,这时候我们可以增加 accept_data_loss参数来允许分片数据丢失
POST /_cluster/reroute
{
"commands": [
{
"move": {
"index": "test_index",
"shard": 1,
"from_node": "node1",
"to_node": "node2",
"accept_data_loss" : true
}
}
]
}
数据库研究跨越于计算机应用、系统软件和理论三个领域,其中应用促进新系统的研制开发,新系统带来新的理论研究,而理论研究又对前两个领域起着指导作用。数据库系统的出现是计算机应用的一个里程牌,它使得计算机应用从以科学计算为主转向以数据处理为主,并从而使计算机得以在各行各业乃至家庭普遍使用。在它之前的文件系统虽然也能处理持久数据,但是文件系统不提供对任意部分数据的快速访问,而这对数据量不断增大的应用来说是至关重要的。为了实现对任意部分数据的快速访问,就要研究许多优化技术。这些优化技术往往很复杂,是普通用户难以实现的,所以就由系统软件(数据库管理系统)来完成,而提供给用户的是简单易用的数据库语言。由于对数据库的操作都由数据库管理系统完成,所以数据库就可以独立于具体的应用程序而存在,从而数据库又可以为多个用户所共享。因此,数据的独立性和共享性是数据库系统的重要特征。数据共享节省了大量人力物力,为数据库系统的广泛应用奠定了基础。数据库系统的出现使得普通用户能够方便地将日常数据存入计算机并在需要的时候快速访问它们,从而使计算机走出科研机构进入各行各业、进入家庭。
如果仅仅是考虑存储空间,更建议通过设置更高级别的索引压缩存储方式来减少对对磁盘空间的消耗,也能有大约30%的空间节省。设置方式如下:
PUT test-index
{
"settings": {
"index.codec":"best_compression"
}
}
可以只保存原始文档的一部分到_source里面吗? 可以,ES提供了过滤规则,可以只将一部分字段存入_source中。
如果不存储_source或仅存储部分内容,可以大量减小ES的存储占用量。
PUT test-index
{
"mappings": {
"_source": {
"enabled": false
}
}
}
PUT test-index
{
"mappings": {
"_source": {
"excludes": [
"name"
]
}
}
}
PUT logs
{
"mappings": {
"_source": {
"includes": [
"*.count",
"meta.*"
],
"excludes": [
"meta.description",
"meta.other.*"
]
}
}
}
PUT logs/_doc/1
{
"requests": {
"count": 10,
"foo": "bar"
},
"meta": {
"name": "Some metric",
"description": "Some metric description",
"other": {
"foo": "one",
"baz": "two"
}
}
}
GET logs/_search
{
"query": {
"match": {
"meta.other.foo": "one"
}
}
}
查询返回的结果为:{
"took" : 22,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 0.2876821,
"hits" : [
{
"_index" : "logs",
"_id" : "1",
"_score" : 0.2876821,
"_source" : {
"meta" : {
"other" : { },
"name" : "Some metric"
},
"requests" : {
"count" : 10
}
}
}
]
}
}
数据的结构化,数据的共享性好,数据的独立性好,数据存储粒度小,数据管理系统,为用户提供了友好的接口。
数据库系统的核心和基础,是数据模型,现有的数据库系统均是基于某种数据模型的。
数据库系统的核心是数据库管理系统。
数据库系统一般由数据库、数据库管理系统(DBMS)、应用系统、数据库管理员和用户构成。DBMS是数据库系统的基础和核心。
数据库管理系统主要包括:进行数据定义语言以及翻译的相关程序,在这个部分的帮助下,可以让数据库的用户自行进行选择,并且也能得到翻译由此形成一个内部形式;进行数据运行控制的程序,因为这一程序的工作,让数据库中的资源可以充分得到管理,并且能实现关于数据的一种控制;数据库的实用程序则可以使得数据库在相对完整的基础上建立起来,并且在相对完整的数据库系统下让数据库得到维护。
数据冗余是指在多个表中重复存储相同的数据。虽然冗余数据可以提高数据检索和查询效率,但它也会占用更多的存储空间,并增加数据更新和维护的复杂度
更新异常是指在一个表中更新某些数据时,由于数据的冗余存储,可能会导致其他相关表中的数据不一致或出现错误
插入异常是指在向一个表中插入数据时,由于某些相关的数据还没有被插入,或者某些数据没有被正确地插入,导致插入操作无法完成或出现错误
删除异常是指在从一个表中删除某些数据时,由于数据的冗余存储,可能会导致其他相关表中的数据也被删除或者无法删除。这种情况下,可能会导致数据的丢失或数据不一致的问题。
管理fielddata
我们可以可以使用下面的api来清理索引的fielddata:
POST /test-index/_cache/clear?fielddata=true
我们可以通过下面的api来查看集群中fielddata的使用情况
GET /_stats/fielddata?fields=* (包含集群元信息和每个索引的占用情况)
GET /_nodes/stats/indices/fielddata?fields=* (所有索引的汇总情况)
GET /_nodes/stats/indices/fielddata?level=indices&fields=* (每个索引单独占用情况)
我们可以配置fielddata内存限制,超出这个限制就清除内存中已有的fielddata数据。默认无限制,限制内存使用,但是会导致频繁evict(驱逐)和reload(重载),大量IO性能损耗,以及内存碎片和gc。
如果一次query load的fielddata超过总内存,就会发生内存溢出,circuit breaker会估算query要加载的fielddata大小,如果超出总内存,就短路,query直接失败。
可通过下列配置进行限制,注意,下面的配置都是针对节点级别的
1.fielddata的内存限制,默认堆内存的40%
indices.breaker.fielddata.limit:40%
2.各种查询聚合操作的内存限制,默认堆内存的60%
indices.breaker.request.limit:60%
3.总的jvm限制,包括但不限于上面两个,默认95%
indices.breaker.total.limit:95%
如果indices.breaker.total.use_real_memory设置为false,这个值默认是75%
![QQ截图20231211150950.png](https://static.golangjob.cn/231211/ce87aedd79bbf1c4056f540f099e1349.png)
有疑问加站长微信联系(非本文作者)