5 ms·
Author here. There's a lot I left out of the post, especially since it's such a young project, but I'd be happy to answer any questions. Edit: I'm not sure why
by misframer 12y ago
Author here. There's a lot I left out of the post, especially since it's such a young project, but I'd be happy to answer any questions.
Edit: I'm not sure why I'm being downvoted... I'm not home at the moment, so I'm trying my best to answer using my phone.
Edit #2: Back home with a full-size QWERTY keyboard :).
- rakoo 12y agoThank you for the interesting post ! I'm curious why Bolt isn't a good fit for your timeseries project ? It has excellent iteration support, supports concurrent readers, is already mmaped and can hold multiple "namespaces" through the use of buckets.
- misframer 12y agoBolt doesn't support compression unless you implement it yourself (i.e. in your application layer). Bolt also does not support concurrent writers. I don't need MVCC nor transactions, which have overhead. Finally, tree-based systems aren't very good at doing large, sequential reads. Edit: Again, not exactly sure about the downvoting, so here is a better explanation. If I'm wrong, please let me know! Let's say you insert many points for a few metrics in time order. Because of the way B-tree page allocation works, you can't guarantee that the points for a metric will be stored in adjacent pages on disk (correct me if I'm wrong). I want the guarantee that if I'm going to read points sequentially off a disk, I will do so without seeking around to different pages. Catena does that, and keeps points very compact. When I used Bolt with a single key-value pair per point, I saw disk usage that was something like 50 bytes per point (on average). With Catena's file partitions with compression, I see around 3 bytes per point (on average). These points are 8 byte timestamps with 4 byte values. That's a huge benefit.
- rakoo 12y agoTo be clear, I'm not saying you should have used it, just that some of the functionalities are already there (and I love Bolt so I easily see parallels). It's always interesting to implement stuff from scratch, if only to understand how it works. Also, I'm only talking about using Bolt as the on-disk partition store, ie the read-only partitions. You'd only write them when flushing the in-mem partitions, so no need for concurrent writers. > tree-based systems aren't very good at doing large, sequential reads. It all depends on the implementation you've chosen. B+trees exist exactly for efficient sequential reads, and Bolt uses one. (Take a look at this [0]: 40 ns/op per k/v, and putting the database in memory doesn't even improve it). Trees also allow you to search for specific timestamps so you can [0] https://paulosuzart.github.io/blog/2014/07/07/going-back-to-go/ https://paulosuzart.github.io/blog/2014/07/07/going-back-to-...
- misframer 12y agoI like Bolt too. It was my first choice :). Using it for read-only partitions sounds like a great idea. I think the current implementation looks like a tree if you "squint" a bit. There's a hierarchy of metrics and sources, and the arrays of points are like the leaf nodes. You're very correct about B+trees being efficient with sequential reads. We use MySQL with InnoDB for all of our time series where I work[0]. I started this way just to get a good understanding of what works and what doesn't. I think I'm on track to implementing something like a B+tree by using smaller extents of points. [0] http://www.slideshare.net/vividcortex/vividcortex-building-a-timeseries-database-in-mysql http://www.slideshare.net/vividcortex/vividcortex-building-a...
- benbjohnson 12y agoBolt author here. I don't think I'd agree that Bolt isn't good for time series. In fact, it has fast appends and fast sequential reads so it works really well for time sorted data. Having a sequential page ordering (like Catena) will have a huge boost when running on spinning disk but it's much less of an issue on SSDs. All that being said, I do like the approach of Catena. I think it works well for best case scenarios and you can get some large perf gains from tailoring the format to a specific type of data. However, some of the trade offs such as dropping writes after the in-memory window are not going to be acceptable to many people. As far as disk usage goes, it sounds like you could improve the utilization by increasing Bucket.FillPercent to 1.0. By default Bolt splits pages in half since it assumes random writes. You can do some optimizations if you're writing in order. Another option that'd be interesting to look at would be doing Catena on top of Bolt. You can write your large, compressed Catena-ized data as a single value in Bolt and it'll be laid out sequentially on disk. I know you mentioned that you don't need transactions but I find them to be really useful once you start distributing data across a cluster and need some guarantees about writes.
- tinco 12y agoDo you think it's good enough to replace Graphite's Carbon at this point? Not as a drop in to graphite, but as a backend to a custom metrics system? I know your project is young and probably has not seen much battle testing, but your blog post indicates to me that you've put a lot of thought into it being robust. We are using Carbon for our metrics solution at the moment, and I've read its source and it's not something I'd give a big 'ready for production' stamp even though I know many shops are using it in production. Perhaps, if you feel like it and will entertain my cheap grab for information, could you give super small explanation of the performance differences between your partition style format and for example Whisper (like RRD, it's what Carbon uses) and InfluxDB? As far as I understand Whisper is simply a cyclic buffer of fixed time distance points in a file per series. And InfluxDB is simply a key value store I think. Your solution lies somewhere in between those right?
- misframer 12y agoInfluxDB uses Bolt in the latest version. Yes, it's a key-value store. See my other comment below about why I'm not using Bolt. I'm not too familiar with Whisper, but it since it uses fixed size storage, it's not for my use case. I have large amounts of time series metrics (>10,000), and many of them end up being sparse with only a few irregular points. Partitioning by time instead of by metric means I don't have to deal with thousands of files, especially those that have some large, fixed size. I'm very focused on making this "production ready." It's currently used for another project of mine[0], so I haven't been looking at integrating it into other systems. [0] http://preetamjinka.github.io/cistern/ http://preetamjinka.github.io/cistern/
- SEJeff 12y agoCarbon uses a custom format called whisper, which was written by Chris Davis because you can't backfill past data into rrd. FYI graphite supports pluggable storage backends such as influxdb. Personally, I'm pretty invested in Cyanite which is a small shim ontop of Cassandra which speaks the carbon line protocol. Once this is semi prod worthy, I'd be happy to see if we can't write one of the pluggable backends to grapbite for it, which also works with graphite-api if you want a slightly easier to setup flask based version. Disclaimer: I'm a graphite maintainer
- shizcakes 12y agoI read through your post, and I am curious; what is the reasoning driving having metrics split across partitions, rather than partitioning by metric itself?
- misframer 12y agoMy use case involves having many, many metrics. I have at least 500 metrics per source, and potentially hundreds of sources. It's also easier to handle retention the way Catena does it because it only involves deleting the oldest file. A lot of systems have a file per metric. With the data I work with, this is an operational nightmare. Dropping old data becomes difficult, and getting points from lots of metrics for a certain time range gets difficult too. Imagine having a dashboard with lots of metrics displayed. You're probably going to be seeing points from the same time range across metrics. This scenario is a lot better if you only have to read through a single file instead of, say, a few dozen or something like that.
- sbt 12y ago> Edit: I'm not sure why I'm being downvoted... Welcome to the internet :)