mirror of
				https://github.com/MariaDB/server.git
				synced 2025-11-04 12:56:14 +01:00 
			
		
		
		
	Improve the performance of slave connect using B+-Tree indexes on each binlog file. The index allows fast lookup of a GTID position to the corresponding offset in the binlog file, as well as lookup of a position to find the corresponding GTID position. This eliminates a costly sequential scan of the starting binlog file to find the GTID starting position when a slave connects. This is especially costly if the binlog file is not cached in memory (IO cost), or if it is encrypted or a lot of slaves connect simultaneously (CPU cost). The size of the index files is generally less than 1% of the binlog data, so not expected to be an issue. Most of the work writing the index is done as a background task, in the binlog background thread. This minimises the performance impact on transaction commit. A simple global mutex is used to protect index reads and (background) index writes; this is fine as slave connect is a relatively infrequent operation. Here are the user-visible options and status variables. The feature is on by default and is expected to need no tuning or configuration for most users. binlog_gtid_index On by default. Can be used to disable the indexes for testing purposes. binlog_gtid_index_page_size (default 4096) Page size to use for the binlog GTID index. This is the size of the nodes in the B+-tree used internally in the index. A very small page-size (64 is the minimum) will be less efficient, but can be used to stress the BTree-code during testing. binlog_gtid_index_span_min (default 65536) Control sparseness of the binlog GTID index. If set to N, at most one index record will be added for every N bytes of binlog file written. This can be used to reduce the number of records in the index, at the cost only of having to scan a few more events in the binlog file before finding the target position Two status variables are available to monitor the use of the GTID indexes: Binlog_gtid_index_hit Binlog_gtid_index_miss The "hit" status increments for each successful lookup in a GTID index. The "miss" increments when a lookup is not possible. This indicates that the index file is missing (eg. binlog written by old server version without GTID index support), or corrupt. Signed-off-by: Kristian Nielsen <knielsen@knielsen-hq.org>
		
			
				
	
	
		
			89 lines
		
	
	
	
		
			2.6 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			89 lines
		
	
	
	
		
			2.6 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
--source include/have_sequence.inc
 | 
						|
--source include/have_innodb.inc
 | 
						|
--source include/master-slave.inc
 | 
						|
--source include/have_binlog_format_mixed.inc
 | 
						|
 | 
						|
--connection slave
 | 
						|
--source include/stop_slave.inc
 | 
						|
CHANGE MASTER TO master_use_gtid= slave_pos;
 | 
						|
--source include/start_slave.inc
 | 
						|
 | 
						|
--connection master
 | 
						|
CREATE TABLE t1 (a INT PRIMARY KEY, b INT) ENGINE=InnoDB;
 | 
						|
INSERT INTO t1 VALUES (0, 0);
 | 
						|
 | 
						|
 | 
						|
--echo *** Test looking up a lot of different event positions and GTIDs.
 | 
						|
 | 
						|
# A function for comparing GTID positions.
 | 
						|
# Handles that the domain_id order is different in the two strings.
 | 
						|
# Works by repeatedly removing one GTID from each string. If the strings have
 | 
						|
# the same length and nothing is left at the end, then they are identical.
 | 
						|
delimiter //;
 | 
						|
CREATE FUNCTION gtid_eq(a VARCHAR(255), b VARCHAR(255)) RETURNS BOOLEAN DETERMINISTIC
 | 
						|
BEGIN
 | 
						|
  DECLARE g VARCHAR(255);
 | 
						|
  IF a IS NULL OR b IS NULL OR LENGTH(a) != LENGTH(b) THEN
 | 
						|
    RETURN FALSE;
 | 
						|
  END IF;
 | 
						|
  SET a= CONCAT(a, ',');
 | 
						|
  SET b= CONCAT(',', b, ',');
 | 
						|
  WHILE LENGTH(a) > 0 DO
 | 
						|
    SET g= REGEXP_SUBSTR(a, '^[^,]+,');
 | 
						|
    SET a= SUBSTRING(a, LENGTH(g)+1);
 | 
						|
    SET b= REPLACE(b, CONCAT(',', g), ',');
 | 
						|
  END WHILE;
 | 
						|
  RETURN b = ',';
 | 
						|
END //
 | 
						|
delimiter ;//
 | 
						|
 | 
						|
SET @old_page_size= @@GLOBAL.binlog_gtid_index_page_size;
 | 
						|
SET @old_span_min= @@GLOBAL.binlog_gtid_index_span_min;
 | 
						|
 | 
						|
--echo *** A fair amount of work with default GTID index settings.
 | 
						|
--let $NUM_POS= 200
 | 
						|
--let $NUM_DOMAIN= 5
 | 
						|
--let $NUM_SERVER= 5
 | 
						|
--let $NUM_SLAVE_CONNECTS= 50
 | 
						|
--let $RND_SEED= 42
 | 
						|
--source suite/rpl/include/rpl_gtid_index.inc
 | 
						|
 | 
						|
--echo *** A lot of GTIDs with small btree pages to stress the Btree code.
 | 
						|
--let $NUM_POS= 1000
 | 
						|
--let $NUM_DOMAIN= 10
 | 
						|
--let $RND_SEED= 150
 | 
						|
SET GLOBAL binlog_gtid_index_page_size= 64;
 | 
						|
SET GLOBAL binlog_gtid_index_span_min= 1;
 | 
						|
--source suite/rpl/include/rpl_gtid_index.inc
 | 
						|
 | 
						|
--echo *** Small page size with sparse index.
 | 
						|
--let $NUM_POS= 200
 | 
						|
--let $RND_SEED= 666
 | 
						|
SET GLOBAL binlog_gtid_index_page_size= 64;
 | 
						|
SET GLOBAL binlog_gtid_index_span_min= 2048;
 | 
						|
--source suite/rpl/include/rpl_gtid_index.inc
 | 
						|
 | 
						|
--echo *** Medium page size.
 | 
						|
--let $NUM_POS= 200
 | 
						|
--let $RND_SEED= 1024
 | 
						|
SET GLOBAL binlog_gtid_index_page_size= 512;
 | 
						|
SET GLOBAL binlog_gtid_index_span_min= 512;
 | 
						|
--source suite/rpl/include/rpl_gtid_index.inc
 | 
						|
 | 
						|
--echo *** Large page size.
 | 
						|
--let $NUM_POS= 200
 | 
						|
--let $RND_SEED= 12345
 | 
						|
SET GLOBAL binlog_gtid_index_page_size= 16384;
 | 
						|
SET GLOBAL binlog_gtid_index_span_min= 1;
 | 
						|
--source suite/rpl/include/rpl_gtid_index.inc
 | 
						|
 | 
						|
 | 
						|
# Cleanup.
 | 
						|
--connection master
 | 
						|
SET GLOBAL binlog_gtid_index_page_size= @old_page_size;
 | 
						|
SET GLOBAL binlog_gtid_index_span_min= @old_span_min;
 | 
						|
 | 
						|
DROP TABLE t1;
 | 
						|
DROP FUNCTION gtid_eq;
 | 
						|
 | 
						|
--source include/rpl_end.inc
 |