An open source time-series database for fast ingest and SQL queries
APACHE-2.0 License
Bot releases are visible (Hide)
Published by bluestreak01 almost 5 years ago
Published by bluestreak01 almost 5 years ago
Published by bluestreak01 almost 5 years ago
What's new?
What did we fix?
Published by bluestreak01 almost 5 years ago
Before you continue, some keywords we used and their meaning:
CAIRO - storage engine
GRIFFIN - SQL engine
STD - QuestDB standard libraries
PostgresSQL wire server implementation (BETA)
GRIFFIN: new algo for sample by .. fill none
without key. It executes a little faster than generic algo.
GRIFFIN: order by
implementation for cursors without random access to rows.
GRIFFIN: group by
implementation
GRIFFIN: support multiple columns in latest by
clause
GRIFFIN: renamed to_char
for date and timestamp to to_str
to make them easier to find
GRIFFIN: optimised and
and or
operators to recognise constant conditions better and avoid unnecessary data processing.
GRIFFIN: =
implementation for SYMBOL = CHAR and STRING = CHAR
GRIFFIN: 'sum' performance optimisation
Network: ability to set multicast TTL and bind port for unicast
GRIFFIN: "insert into ... values" implementation
GRIFFIN: implementation of 'select count() from table' that would use result of base.size() when its available. This speed up exploratory 'count()' queries dramatically
GRIFFIN: UNION and UNION ALL implementations and tests
GRIFFIN: "splice join" implementation
GRIFFIN: alter table drop column SQL implementation
GRIFFIN: SQL limit
implementation
GRIFFIN: INNER
, OUTER
, AS OF
join implementation
CAIRO: "remove partition" API on TableWriter
CAIRO: new LONG256 data type
STD: ARM64 Linux support and binary
HTTP server implementation. The server is able to send and receive unlimited amount of data from and to data store.
STD: Os.currentTimeNanos() system clock in nanosecond resolution (not to be confused with System.nanoTime())
STD: (network) set/get TCP_NODELAY
STD: (network) implementation of interrupt for blocking accept()
STD: (network) bridge to native IP_MULTICAST_LOOP and IP_MULTICAST_IF
STD: (network) connect() and configureNoLinger() bridges
STD: (network) SO_REUSEADDR and SO_REUSEPORT bridges
STD: (log) implemented log writer that can roll files on size and/or date.
LineProtoSender can now be bound to a specific interface. It also receives IP addresses as inti n order to offload dealing with address parsing errors somewhere else.
STD: (threading) available() method is made available only on SP- and SC- sequences. available() is new to SPSequence and allows bulk publishing and enables higher queue throughput STD: Worker can have CPU affinity now
null
for symbol value now corresponds to null for int. This removes unnecessary complexity around implementing getInt()Published by bluestreak01 about 6 years ago
Beta release of new storage system dubbed CAIRO and new query system GRIFFIN.
Downsides:
This system is under active development. For now lacks features of legacy SQL, such as joins, group-by and analytic functions - these are not yet developed. However GRIFFIN provides sample-by implementation with various missing data fill options, including linear interpolation and more extensive language basics, such as select from function. Eventually GRIFFIN will implement all features of legacy SQL and well beyond that.
GRIFFIN also is not yet linked to HTTP server or any network service.
Published by bluestreak01 almost 7 years ago
Release notes
Published by bluestreak01 almost 7 years ago
This release introduces new storage system, CAIRO. I am writing it to run in parallel with legacy storage and keep existing functionality completely unaffected. CAIRO is available to try if you look for any of the following:
CAIRO is not yet integrated with neither HTTP server nor SQL. These are the things to come.
Also included in this release CUTLASS: UDP receiver for Influx line protocol. Everything broadcast for Influx can be easily stored in QuestDB. CUTLASS supports on-the-fly table definition and column addition and it stores data in CAIRO.
Stay tuned for more exciting releases ;-)
Published by bluestreak01 almost 8 years ago
configuration file bugfix
Published by bluestreak01 almost 8 years ago
Bugfix release, stability improvements.
Published by bluestreak01 almost 8 years ago
Published by bluestreak01 about 8 years ago
QuestDB initial release.
This release brings technology focused on making your data workflow faster, more productive and more fun.
QuestDB does in seconds what other tools do in minutes, hours, days or don't do at all.
Published by bluestreak01 about 10 years ago
Replication can be done over secure channel using industry-standard SSL encryption protocol. Configuring SSL is notoriously complicated, so I tried my best to make it as simple as possible for both JournalServer
and JournalClient
. I shall let you be the judge though. More...
Client Certificate came almost for free after implementing SSL. I did try to make it simple for you though. More...
It is now possible for client and server to exchange shared secret for authentication and authorization purposes. Shared Secret can be anything you want it to be, there is no limit on amount of data you can send. More...
Usually Kerberos is a pain, not with NFSdb, not anymore. Kerberos implementation uses Shared Secret exchange mechanism and in addition it handles generation and validation of service tokens
, Your application deals with usernames. It is that cool! More...
If you have JournalClient
running on Windows platform you can generate service token
for currently logged in user with minimum fuss. User is not prompted for password! More...
JournalClient
can automatically recover after server restarts. If you have multiple clients replicating single server you can restart server without needing to restart clients afterwards. Whats cooler still is that when you shutdown server clients can failover automatically. JournalClient
will also maintain transactional consistency during server outages.
Replication protocol is incompatible with previous release of NFSdb. I had to change the protocol to accomodate shared secret exchange.
Published by bluestreak01 about 10 years ago
<dependency>
<groupId>com.nfsdb</groupId>
<artifactId>nfsdb-core</artifactId>
<version>2.0.1</version>
</dependency>
Unique keys can be either String
or int
fields. In fact it is just an indexed field that you can search.
Configure int
"id" field as follows:
JournalFactory factory = new JournalFactory(new JournalConfigurationBuilder() {{
$(Order.class)
.$int("id").index()
// or .$str("id).index() for String keys
;
}}.build(args[0]));
To prepare for search by "id" create parameterisable query stream. It is analogous to PreparedStatement.
Journal<Order> reader = factory.reader(Order.class);
Order order = new Order();
Q q = new QImpl();
StringRef col = new StringRef();
col.value = "id";
IntRef id = new IntRef();
DataSource<Order> ds = q.ds(
q.forEachPartition(
q.sourceDesc(reader)
, q.headEquals(col, id)
)
, order
);
Execute query for given "id":
id.value = i;
Order o = ds.$new().head();
On client have a reader for journal that is being replicated. increment()
and incrementBuffered()
create iterator over added data.
This is fully featured client that measures transaction latency.
public static void main(String[] args) throws Exception {
JournalFactory factory = new JournalFactory(args[0]);
final JournalClient client = new JournalClient(factory);
final Journal<Price> reader = factory.bulkReader(Price.class, "price-copy");
client.subscribe(Price.class, null, "price-copy", new TxListener() {
@Override
public void onCommit() {
int count = 0;
long t = 0;
for (Price p : reader.incrementBuffered()) {
if (count == 0) {
t = p.getTimestamp();
}
count++;
}
System.out.println("took: "
+ (System.currentTimeMillis() - t)
+ ", count=" + count);
}
});
client.start();
System.out.println("Client started");
}
Published by bluestreak01 about 10 years ago
This release introduces two major features:
This nfsdb.xml:
<db>
<journal class="org.nfsdb.examples.model.Quote" defaultPath="quote" timestampColumn="timestamp"
partitionType="MONTH" recordCountHint="1000000" openPartitionTTL="180" lagHours="24" key="sym">
<sym name="sym" indexed="true" maxsize="4" hintDistinctCount="15"/>
<sym name="ex" maxsize="2" hintDistinctCount="1"/>
<sym name="mode" hintDistinctCount="1"/>
</journal>
<journal class="org.nfsdb.examples.model.Price" defaultPath="price" timestampColumn="timestamp"
partitionType="MONTH" recordCountHint="1000000" openPartitionTTL="180" lagHours="24" key="sym">
<sym name="sym" indexed="true" maxsize="4" hintDistinctCount="15"/>
</journal>
</db>
is replaced with this configuration:
public static final JournalConfigurationBuilder CONFIG = new JournalConfigurationBuilder() {{
$(Quote.class)
.partitionBy(PartitionType.MONTH)
.lag(24, TimeUnit.HOURS)
.key("sym")
.$sym("sym").index().size(4).valueCountHint(15)
.$sym("ex").size(2).valueCountHint(1)
.$ts()
;
$(Price.class)
.key("sym")
.partitionBy(PartitionType.MONTH)
.$sym("sym").index().size(4).valueCountHint(15)
.$ts()
;
}};
Changelog:
Published by bluestreak01 over 10 years ago
Published by bluestreak01 over 10 years ago
Published by bluestreak01 over 10 years ago
Published by bluestreak01 over 10 years ago
First release of NFSdb to maven central.