Skip to content

Commit 577045c

Browse files
authored
Support filtered index cache (#5587)
* filtered cache support for Cortex Signed-off-by: Ben Ye <benye@amazon.com> * update thanos version Signed-off-by: Ben Ye <benye@amazon.com> --------- Signed-off-by: Ben Ye <benye@amazon.com>
1 parent 7812330 commit 577045c

File tree

21 files changed

+772
-285
lines changed

21 files changed

+772
-285
lines changed

docs/blocks-storage/querier.md

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -536,6 +536,11 @@ blocks_storage:
536536
# CLI flag: -blocks-storage.bucket-store.index-cache.inmemory.max-size-bytes
537537
[max_size_bytes: <int> | default = 1073741824]
538538
539+
# Selectively cache index item types. Supported values are Postings,
540+
# ExpandedPostings and Series
541+
# CLI flag: -blocks-storage.bucket-store.index-cache.inmemory.enabled-items
542+
[enabled_items: <list of string> | default = []]
543+
539544
memcached:
540545
# Comma separated list of memcached addresses. Supported prefixes are:
541546
# dns+ (looked up as an A/AAAA query), dnssrv+ (looked up as a SRV
@@ -583,6 +588,11 @@ blocks_storage:
583588
# CLI flag: -blocks-storage.bucket-store.index-cache.memcached.auto-discovery
584589
[auto_discovery: <boolean> | default = false]
585590
591+
# Selectively cache index item types. Supported values are Postings,
592+
# ExpandedPostings and Series
593+
# CLI flag: -blocks-storage.bucket-store.index-cache.memcached.enabled-items
594+
[enabled_items: <list of string> | default = []]
595+
586596
redis:
587597
# Comma separated list of redis addresses. Supported prefixes are: dns+
588598
# (looked up as an A/AAAA query), dnssrv+ (looked up as a SRV query,
@@ -679,6 +689,11 @@ blocks_storage:
679689
# CLI flag: -blocks-storage.bucket-store.index-cache.redis.cache-size
680690
[cache_size: <int> | default = 0]
681691
692+
# Selectively cache index item types. Supported values are Postings,
693+
# ExpandedPostings and Series
694+
# CLI flag: -blocks-storage.bucket-store.index-cache.redis.enabled-items
695+
[enabled_items: <list of string> | default = []]
696+
682697
chunks_cache:
683698
# Backend for chunks cache, if not empty. Supported values: memcached.
684699
# CLI flag: -blocks-storage.bucket-store.chunks-cache.backend

docs/blocks-storage/store-gateway.md

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -643,6 +643,11 @@ blocks_storage:
643643
# CLI flag: -blocks-storage.bucket-store.index-cache.inmemory.max-size-bytes
644644
[max_size_bytes: <int> | default = 1073741824]
645645
646+
# Selectively cache index item types. Supported values are Postings,
647+
# ExpandedPostings and Series
648+
# CLI flag: -blocks-storage.bucket-store.index-cache.inmemory.enabled-items
649+
[enabled_items: <list of string> | default = []]
650+
646651
memcached:
647652
# Comma separated list of memcached addresses. Supported prefixes are:
648653
# dns+ (looked up as an A/AAAA query), dnssrv+ (looked up as a SRV
@@ -690,6 +695,11 @@ blocks_storage:
690695
# CLI flag: -blocks-storage.bucket-store.index-cache.memcached.auto-discovery
691696
[auto_discovery: <boolean> | default = false]
692697
698+
# Selectively cache index item types. Supported values are Postings,
699+
# ExpandedPostings and Series
700+
# CLI flag: -blocks-storage.bucket-store.index-cache.memcached.enabled-items
701+
[enabled_items: <list of string> | default = []]
702+
693703
redis:
694704
# Comma separated list of redis addresses. Supported prefixes are: dns+
695705
# (looked up as an A/AAAA query), dnssrv+ (looked up as a SRV query,
@@ -786,6 +796,11 @@ blocks_storage:
786796
# CLI flag: -blocks-storage.bucket-store.index-cache.redis.cache-size
787797
[cache_size: <int> | default = 0]
788798
799+
# Selectively cache index item types. Supported values are Postings,
800+
# ExpandedPostings and Series
801+
# CLI flag: -blocks-storage.bucket-store.index-cache.redis.enabled-items
802+
[enabled_items: <list of string> | default = []]
803+
789804
chunks_cache:
790805
# Backend for chunks cache, if not empty. Supported values: memcached.
791806
# CLI flag: -blocks-storage.bucket-store.chunks-cache.backend

docs/configuration/config-file-reference.md

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1083,6 +1083,11 @@ bucket_store:
10831083
# CLI flag: -blocks-storage.bucket-store.index-cache.inmemory.max-size-bytes
10841084
[max_size_bytes: <int> | default = 1073741824]
10851085
1086+
# Selectively cache index item types. Supported values are Postings,
1087+
# ExpandedPostings and Series
1088+
# CLI flag: -blocks-storage.bucket-store.index-cache.inmemory.enabled-items
1089+
[enabled_items: <list of string> | default = []]
1090+
10861091
memcached:
10871092
# Comma separated list of memcached addresses. Supported prefixes are:
10881093
# dns+ (looked up as an A/AAAA query), dnssrv+ (looked up as a SRV query,
@@ -1130,6 +1135,11 @@ bucket_store:
11301135
# CLI flag: -blocks-storage.bucket-store.index-cache.memcached.auto-discovery
11311136
[auto_discovery: <boolean> | default = false]
11321137
1138+
# Selectively cache index item types. Supported values are Postings,
1139+
# ExpandedPostings and Series
1140+
# CLI flag: -blocks-storage.bucket-store.index-cache.memcached.enabled-items
1141+
[enabled_items: <list of string> | default = []]
1142+
11331143
redis:
11341144
# Comma separated list of redis addresses. Supported prefixes are: dns+
11351145
# (looked up as an A/AAAA query), dnssrv+ (looked up as a SRV query,
@@ -1226,6 +1236,11 @@ bucket_store:
12261236
# CLI flag: -blocks-storage.bucket-store.index-cache.redis.cache-size
12271237
[cache_size: <int> | default = 0]
12281238
1239+
# Selectively cache index item types. Supported values are Postings,
1240+
# ExpandedPostings and Series
1241+
# CLI flag: -blocks-storage.bucket-store.index-cache.redis.enabled-items
1242+
[enabled_items: <list of string> | default = []]
1243+
12291244
chunks_cache:
12301245
# Backend for chunks cache, if not empty. Supported values: memcached.
12311246
# CLI flag: -blocks-storage.bucket-store.chunks-cache.backend

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ require (
5353
github.com/stretchr/testify v1.8.4
5454
github.com/thanos-io/objstore v0.0.0-20230921130928-63a603e651ed
5555
github.com/thanos-io/promql-engine v0.0.0-20230821193351-e1ae4275b96e
56-
github.com/thanos-io/thanos v0.32.4-0.20231001083734-531cdb1e8ec3
56+
github.com/thanos-io/thanos v0.32.5-0.20231006043659-79bbf34b4275
5757
github.com/uber/jaeger-client-go v2.30.0+incompatible
5858
github.com/weaveworks/common v0.0.0-20221201103051-7c2720a9024d
5959
go.etcd.io/etcd/api/v3 v3.5.9

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1212,8 +1212,8 @@ github.com/thanos-io/objstore v0.0.0-20230921130928-63a603e651ed h1:iWQdY3S6DpWj
12121212
github.com/thanos-io/objstore v0.0.0-20230921130928-63a603e651ed/go.mod h1:oJ82xgcBDzGJrEgUsjlTj6n01+ZWUMMUR8BlZzX5xDE=
12131213
github.com/thanos-io/promql-engine v0.0.0-20230821193351-e1ae4275b96e h1:kwsFCU8eSkZehbrAN3nXPw5RdMHi/Bok/y8l2C4M+gk=
12141214
github.com/thanos-io/promql-engine v0.0.0-20230821193351-e1ae4275b96e/go.mod h1:+T/ZYNCGybT6eTsGGvVtGb63nT1cvUmH6MjqRrcQoKw=
1215-
github.com/thanos-io/thanos v0.32.4-0.20231001083734-531cdb1e8ec3 h1:ekD3P1XF0Hlg/u7rSNqdyLhwYE4W4RGfkMDudtepRL8=
1216-
github.com/thanos-io/thanos v0.32.4-0.20231001083734-531cdb1e8ec3/go.mod h1:Px5Boq60s+2WwR+V4v4oxgmxfw9WHrwMwjRou6pkUNw=
1215+
github.com/thanos-io/thanos v0.32.5-0.20231006043659-79bbf34b4275 h1:y2YPqM1XiBw7EhLg45F6A1g8bgt4yYxkaRAeQaNLWYk=
1216+
github.com/thanos-io/thanos v0.32.5-0.20231006043659-79bbf34b4275/go.mod h1:HwiHn7u6GeES403BTACOYib/JKAJknf8dByU/uJiEr0=
12171217
github.com/themihai/gomemcache v0.0.0-20180902122335-24332e2d58ab h1:7ZR3hmisBWw77ZpO1/o86g+JV3VKlk3d48jopJxzTjU=
12181218
github.com/themihai/gomemcache v0.0.0-20180902122335-24332e2d58ab/go.mod h1:eheTFp954zcWZXCU8d0AT76ftsQOTo4DTqkN/h3k1MY=
12191219
github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=

pkg/storage/tsdb/index_cache.go

Lines changed: 67 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414
storecache "github.com/thanos-io/thanos/pkg/store/cache"
1515

1616
"github.com/cortexproject/cortex/pkg/util"
17+
"github.com/cortexproject/cortex/pkg/util/flagext"
1718
)
1819

1920
const (
@@ -41,10 +42,10 @@ var (
4142
)
4243

4344
type IndexCacheConfig struct {
44-
Backend string `yaml:"backend"`
45-
InMemory InMemoryIndexCacheConfig `yaml:"inmemory"`
46-
Memcached MemcachedClientConfig `yaml:"memcached"`
47-
Redis RedisClientConfig `yaml:"redis"`
45+
Backend string `yaml:"backend"`
46+
InMemory InMemoryIndexCacheConfig `yaml:"inmemory"`
47+
Memcached MemcachedIndexCacheConfig `yaml:"memcached"`
48+
Redis RedisIndexCacheConfig `yaml:"redis"`
4849
}
4950

5051
func (cfg *IndexCacheConfig) RegisterFlags(f *flag.FlagSet) {
@@ -85,6 +86,10 @@ func (cfg *IndexCacheConfig) Validate() error {
8586
if err := cfg.Redis.Validate(); err != nil {
8687
return err
8788
}
89+
} else {
90+
if err := cfg.InMemory.Validate(); err != nil {
91+
return err
92+
}
8893
}
8994

9095
configuredBackends[backend] = struct{}{}
@@ -94,17 +99,63 @@ func (cfg *IndexCacheConfig) Validate() error {
9499
}
95100

96101
type InMemoryIndexCacheConfig struct {
97-
MaxSizeBytes uint64 `yaml:"max_size_bytes"`
102+
MaxSizeBytes uint64 `yaml:"max_size_bytes"`
103+
EnabledItems []string `yaml:"enabled_items"`
104+
}
105+
106+
func (cfg *InMemoryIndexCacheConfig) Validate() error {
107+
if err := storecache.ValidateEnabledItems(cfg.EnabledItems); err != nil {
108+
return err
109+
}
110+
return nil
98111
}
99112

100113
func (cfg *InMemoryIndexCacheConfig) RegisterFlagsWithPrefix(f *flag.FlagSet, prefix string) {
101114
f.Uint64Var(&cfg.MaxSizeBytes, prefix+"max-size-bytes", uint64(1*units.Gibibyte), "Maximum size in bytes of in-memory index cache used to speed up blocks index lookups (shared between all tenants).")
115+
f.Var((*flagext.StringSlice)(&cfg.EnabledItems), prefix+"enabled-items", "Selectively cache index item types. Supported values are Postings, ExpandedPostings and Series")
116+
}
117+
118+
type MemcachedIndexCacheConfig struct {
119+
ClientConfig MemcachedClientConfig `yaml:",inline"`
120+
EnabledItems []string `yaml:"enabled_items"`
121+
}
122+
123+
func (cfg *MemcachedIndexCacheConfig) Validate() error {
124+
if err := cfg.ClientConfig.Validate(); err != nil {
125+
return err
126+
}
127+
return storecache.ValidateEnabledItems(cfg.EnabledItems)
128+
}
129+
130+
func (cfg *MemcachedIndexCacheConfig) RegisterFlagsWithPrefix(f *flag.FlagSet, prefix string) {
131+
cfg.ClientConfig.RegisterFlagsWithPrefix(f, prefix)
132+
f.Var((*flagext.StringSlice)(&cfg.EnabledItems), prefix+"enabled-items", "Selectively cache index item types. Supported values are Postings, ExpandedPostings and Series")
133+
}
134+
135+
type RedisIndexCacheConfig struct {
136+
ClientConfig RedisClientConfig `yaml:",inline"`
137+
EnabledItems []string `yaml:"enabled_items"`
138+
}
139+
140+
func (cfg *RedisIndexCacheConfig) RegisterFlagsWithPrefix(f *flag.FlagSet, prefix string) {
141+
cfg.ClientConfig.RegisterFlagsWithPrefix(f, prefix)
142+
f.Var((*flagext.StringSlice)(&cfg.EnabledItems), prefix+"enabled-items", "Selectively cache index item types. Supported values are Postings, ExpandedPostings and Series")
143+
}
144+
145+
func (cfg *RedisIndexCacheConfig) Validate() error {
146+
if err := cfg.ClientConfig.Validate(); err != nil {
147+
return err
148+
}
149+
return storecache.ValidateEnabledItems(cfg.EnabledItems)
102150
}
103151

104152
// NewIndexCache creates a new index cache based on the input configuration.
105153
func NewIndexCache(cfg IndexCacheConfig, logger log.Logger, registerer prometheus.Registerer) (storecache.IndexCache, error) {
106154
splitBackends := strings.Split(cfg.Backend, ",")
107-
var caches []storecache.IndexCache
155+
var (
156+
caches []storecache.IndexCache
157+
enabledItems []string
158+
)
108159

109160
for i, backend := range splitBackends {
110161
iReg := registerer
@@ -121,8 +172,9 @@ func NewIndexCache(cfg IndexCacheConfig, logger log.Logger, registerer prometheu
121172
return c, err
122173
}
123174
caches = append(caches, c)
175+
enabledItems = cfg.InMemory.EnabledItems
124176
case IndexCacheBackendMemcached:
125-
c, err := newMemcachedIndexCacheClient(cfg.Memcached, logger, registerer)
177+
c, err := newMemcachedIndexCacheClient(cfg.Memcached.ClientConfig, logger, registerer)
126178
if err != nil {
127179
return nil, err
128180
}
@@ -131,8 +183,9 @@ func NewIndexCache(cfg IndexCacheConfig, logger log.Logger, registerer prometheu
131183
return nil, err
132184
}
133185
caches = append(caches, cache)
186+
enabledItems = cfg.Memcached.EnabledItems
134187
case IndexCacheBackendRedis:
135-
c, err := newRedisIndexCacheClient(cfg.Redis, logger, iReg)
188+
c, err := newRedisIndexCacheClient(cfg.Redis.ClientConfig, logger, iReg)
136189
if err != nil {
137190
return nil, err
138191
}
@@ -141,9 +194,15 @@ func NewIndexCache(cfg IndexCacheConfig, logger log.Logger, registerer prometheu
141194
return nil, err
142195
}
143196
caches = append(caches, cache)
197+
enabledItems = cfg.Redis.EnabledItems
144198
default:
145199
return nil, errUnsupportedIndexCacheBackend
146200
}
201+
if len(enabledItems) > 0 {
202+
latestCache := caches[len(caches)-1]
203+
cache := storecache.NewFilteredIndexCache(latestCache, enabledItems)
204+
caches[len(caches)-1] = cache
205+
}
147206
}
148207

149208
return newMultiLevelCache(caches...), nil

pkg/storage/tsdb/index_cache_test.go

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package tsdb
22

33
import (
4+
"fmt"
45
"testing"
56

67
"github.com/stretchr/testify/assert"
@@ -35,11 +36,46 @@ func TestIndexCacheConfig_Validate(t *testing.T) {
3536
"one memcached address should pass": {
3637
cfg: IndexCacheConfig{
3738
Backend: "memcached",
38-
Memcached: MemcachedClientConfig{
39-
Addresses: "dns+localhost:11211",
39+
Memcached: MemcachedIndexCacheConfig{
40+
ClientConfig: MemcachedClientConfig{
41+
Addresses: "dns+localhost:11211",
42+
},
4043
},
4144
},
4245
},
46+
"invalid enabled items memcached": {
47+
cfg: IndexCacheConfig{
48+
Backend: "memcached",
49+
Memcached: MemcachedIndexCacheConfig{
50+
ClientConfig: MemcachedClientConfig{
51+
Addresses: "dns+localhost:11211",
52+
},
53+
EnabledItems: []string{"foo", "bar"},
54+
},
55+
},
56+
expected: fmt.Errorf("unsupported item type foo"),
57+
},
58+
"invalid enabled items inmemory": {
59+
cfg: IndexCacheConfig{
60+
Backend: "inmemory",
61+
InMemory: InMemoryIndexCacheConfig{
62+
EnabledItems: []string{"foo", "bar"},
63+
},
64+
},
65+
expected: fmt.Errorf("unsupported item type foo"),
66+
},
67+
"invalid enabled items redis": {
68+
cfg: IndexCacheConfig{
69+
Backend: "redis",
70+
Redis: RedisIndexCacheConfig{
71+
ClientConfig: RedisClientConfig{
72+
Addresses: "test",
73+
},
74+
EnabledItems: []string{"foo", "bar"},
75+
},
76+
},
77+
expected: fmt.Errorf("unsupported item type foo"),
78+
},
4379
}
4480

4581
for testName, testData := range tests {

0 commit comments

Comments
 (0)