Bedrock is a distributed relational DBMS designed for geo-replication. It uses SQLite as its backing data storage and supports the MySQL wire protocol.[01]
- Website
- https://bedrockdb.com/[01]
- Source Code
- https://github.com/Expensify/Bedrock[02]
- Developer
- Country of Origin
- US
- Start Year
- 2016 [13]
- Project Type
- Open Source
- Written in
- C++
- Supported Languages
- C++
- Embeds / Uses
- SQLite
- Inspired By
- SQLite
- Compatible With
- MySQL
- License
- LGPL v3
Bedrock is a distributed relational DBMS designed for geo-replication. It uses SQLite as its backing data storage and supports the MySQL wire protocol.[01]
History[03][04][01]
BedRock is the system that backs Expensify, the expense management company. It had been used for 8 years prior to being launched. It was originally created as an in house solution to the strict database constraints of financial institutions - response time within milliseconds, transaction logging and authentication, and replication of multiple servers.
Concurrency Control[05][06][07]
Bedrock maintains page locks using Two-Phase Locking as done in SQLite. However, it has its own proprietary synchronization engine to support concurrency over multiple servers.
Bedrock's synchronization engine is a private distributed general ledger, i.e, a private blockchain. Each thread has an internal table called journal, which has 3 columns called id, query, hash. Each time a query is committed to the database, a new row is inserted into the journal. The new row records the query, and calculates the new incremental hash based on the previous row. When a server connects to a cluster, the most recent id and hash are broadcasted. If two servers disagree on the the hash corresponding to the id, then they know that they have "forked" at some point and stop communicating with each other. A Paxos-based election scheme decides which fork stands up to the new master.
Since Bedrock supports multi-threaded writes, it is prone to write conflicts. This is addressed by "sharding" the table, and querying all the journal tables in a UNION whenever the database is to be viewed as one.
Data Model[08][01]
Bedrock is a networking and distributed transaction layer built on top of SQLite. SQLite supports a relational data model.
Foreign Keys[02]
Bedrock is built on top of SQLite, and hence supports foreign keys just as in SQLite. To enable foreign key support, SQLITE_OMIT_FOREIGN_KEY and SQLITE_OMIT_TRIGGER must not be defined at runtime.
Hardware Acceleration[01]
Bedrock is written for modern hardware with SSD-backed RAID drives and RAM file caches. It was made to be "simple", not requiring any esoteric hardware hacks as done by other systems. Hence, there is no standard hardware acceleration option.
Indexes[02]
Bedrock is built on top of SQLite. It supports indexes just as done in SQLite. The default index is a B Tree. There is an option to use an R Tree for range queries, in which case SQLITE_ENABLE_RTREE needs to be defined.
Joins[05][02][09]
Bedrock uses the join algorithm used by SQLite. SQLite uses nested loop joins, and has been criticised previously for its slow performance.
Query Execution[02][10]
Bedrock uses the same query execution model as used by SQLite. The Squery method in Bedrock calls the sqlite3_exec method, which is a one step query execution interface.
Query Interface[11]
Bedrock queries can be any SQLite compatible query. The result is returned in an HTTP-like / JSON format, as per user request. It also support the MySQL protocol, and hence the user can continue using the MySQL client of their choice. It also provides a PHP binding that one can use to work with it from the shell itself.
Storage Architecture[12][02]
Bedrock is an embedded SQLite engine, and reads / writes to ordinary disk files.
Storage Model[05]
Bedrock stores data in a SQLite database. This stores data in a row-wise, where each row is referred to as a tuple. The tuples are stored contiguously on each page, and can be stored across multiple pages.
Citations
13 sources- Bedrock by Expensify bedrockdb.com
- GitHub - Expensify/Bedrock: Rock solid distributed database specializing in active/active automatic failover and WAN replication · GitHub github.com
- Bedrock/docs at main · Expensify/Bedrock · GitHub github.com
- Your Database is Your Prison — Here’s How Expensify Broke Free firstround.com
- https://dbdb.io/db/sqlite dbdb.io
- Bedrock by Expensify bedrockdb.com
- Bedrock by Expensify bedrockdb.com
- SQLite Home Page sqlite.org
- http://sqlite.1065341.n5.nabble.com/Join-performance-in-SQLite-td50946.html nabble.com
- One-Step Query Execution Interface sqlite.org
- Bedrock by Expensify bedrockdb.com
- https://www.loc.gov/preservation/digital/formats/fdd/fdd000461.shtml loc.gov
- First commit github.com