Query Read Replicas
GreptimeDB allows you to read from Region Replicas (follower regions) to reduce load on Write Replicas (Leader regions) and improve query scalability. You can control the read preference through both SQL and HTTP protocols.
Read Preference Options
The READ_PREFERENCE
setting accepts the following values:
-
leader
Always read from write replicas. -
follower
Read only from read replicas The query will fail if no read replicas exist. -
follower_preferred
Prefer read replicas but fall back to write replicas if read replicas are unavailable.
SQL Protocol
You can set the read preference in a SQL session:
SET READ_PREFERENCE = 'follower';
HTTP Protocol
For HTTP requests, specify the X-Greptime-Read-Preference
header.
Example:
curl -X POST \
-H "Content-Type: application/x-www-form-urlencoded" \
-H "X-Greptime-Read-Preference: follower" \
-d "sql=select * from monitoring" \
http://localhost:4000/v1/sql
Example: Reading from Read Replicas
Before reading from Read Replicas, you need to add Read Replicas to the table. See Replica Management for more details.
Insert some data into a table:
INSERT INTO foo (ts, i, s)
VALUES
(1, -1, 's1'),
(2, 0, 's2'),
(3, 1, 's3');
Set the read preference to read replicas:
SET READ_PREFERENCE = 'follower';
Query the data:
SELECT * FROM foo ORDER BY ts;
+----------------------------+------+------+
| ts | i | s |
+----------------------------+------+------+
| 1970-01-01 00:00:00.001000 | -1 | s1 |
| 1970-01-01 00:00:00.002000 | 0 | s2 |
| 1970-01-01 00:00:00.003000 | 1 | s3 |
+----------------------------+------+------+
Verifying Follower Reads
To confirm that queries are served by read replicas, use EXPLAIN ANALYZE
:
EXPLAIN ANALYZE SELECT * FROM foo ORDER BY ts;
- A non-zero
other_ranges
value indicates read replicas were involved. - With the
VERBOSE
option, you can see details like this:
extension_ranges: [LeaderMemtableRange{leader: Peer { id: 1, addr: "192.168.50.189:14101" }, num_rows: 2, time_range: (1::Millisecond, 2::Millisecond) ...
If the query runs only on leaders, this extension_ranges
section will not appear.