WL#8445: Group Replication: Auto-increment configuration/handling
Affects: Server-5.7
—
Status: Complete
This WL will provide correct setup of auto_increment variables (auto_increment_increment and auto_increment_offset) value on each member, so that different members don't generate a duplicate auto_increment value. PROBLEM STATEMENT ================= When all members in a group have same default values for auto_increment variables, it will generate duplicate auto_increment values resulting in negative certification and rollback (except one where it will get committed), when more then one member try to insert at same instant.
FR1: No member will generate duplicate AUTO_INCREMENT column value, when size of the group is not greater than GROUP_REPLICATION_AUTO_INCREMENT_INCREMENT, even when any member join/leave the group. FR2: User can always override these automatic generated values for auto_increment_increment and auto_increment_offset. FR3: These feature will only get enable when user has not set any of these auto_increment variables.
OVERVIEW ======== MySQL server already provides two auto-increment variables (auto_increment_increment and auto_increment_offset) which can be used to set generate different auto_increment values on each member. MySQL circular (5.0.2 onwards) replication already use this approach. Calculation of next value for AUTO_INCREMENT column is dependent on two variables: auto_increment_increment and auto_increment_offset. And next auto-increment value is calculated in mysql server as follows: 1. if no records present currently in table nr = 0 // nr is next auto_increment value to be calculated else nr = maximum auto-inc present in table 2. if auto_increment_increment == 1 nr = nr + 1 else nr = (nr + auto_increment_increment - auto_increment_offset) / auto_increment_increment; nr = nr * auto_increment_increment + auto_increment_offset; where, auto_increment_increment: controls the interval between successive column values. The default value is 1. auto_increment_offset: determines the starting point for the AUTO_INCREMENT column value. The default value is 1. Example: auto_increment_increment: 3 (size of group) auto_increment_offset: server_id (M1 = 1, M2 = 2, M3 = 3) ====================================================================== server| ====================================================================== M1 | 1 7 10 --------------------------------------------------------------------- M2 | 2 5 11 --------------------------------------------------------------------- M3 | 3 9 12 ====================================================================== 1 2 3 *4* 5 *6* 7 *8* 9 10 11 12 (Values inserted. Gaps surrounded with *) Note: Before this worklog there was no provision available to automate setting of different auto_increment_increment and auto_increment_offset values on each member of master-master replication. CHALLENGES ========== member joins/leave will change auto_increment_increment ======================================================= If we set auto_increment_increment as size of group, then for any view change i.e. member joins or leaves, we have to update auto_increment_increment value as well. But the update in auto_increment_increment value can still generate duplicate values on different members. Example: auto_increment_increment: 3 (size of group) auto_increment_offset: server_id (M1 = 1, M2 = 2, M3 = 3) ====================================================================== server| ====================================================================== M1 | 1 4 --------------------------------------------------------------------- M2 | 2 --------------------------------------------------------------------- M3 | 3 --------------------------------------------------------------------- M4 | 4 ====================================================================== 1 2 3 *4* (Values inserted. Duplicate value surrounded with *) Suppose we have three members in group and fourth member joins so view_change will trigger update in auto_increment_increment to 4. So before this change occurred M1 had new insert which generated next auto_incremented value of 4 and then M4 gets in with auto_increment value starting with 4, resulting in duplicate value generation. RESOLUTION ========== So to avoid such issues of duplicate value generation because of view changes, we can use some fixed value for auto_increment_increment. We will call this auto_increment_increment value as GROUP_REPLICATION_AUTO_INCREMENT_INCREMENT thereafter. But few question will arise if we use such an approach as of: What will happen if group goes above GROUP_REPLICATION_AUTO_INCREMENT_INCREMENT? - This WL will only resolve duplicate key generation issue if total members in group are less than GROUP_REPLICATION_AUTO_INCREMENT_INCREMENT. For situations where the number of members is expected to be greater than GROUP_REPLICATION_AUTO_INCREMENT_INCREMENT, the user can opt for a manual configuration of this option. What is value of GROUP_REPLICATION_AUTO_INCREMENT_INCREMENT? - This constant value determines the value to be set for auto_increment_increment. The default value for this constant is choosen as 7, as a valid compromise taking into account the maximum usable values for each possible auto_increment_increment and what is a normal group expected size. Table below shows worst case scenario of maximum usable value for different auto_increment_increment. -------------------------------- auto_inc | #values | %usable | -------------------------------- 1 |4294967295 | 100.00% | 3 |1431655765 | 33.33% | 5 |858993459 | 20.00% | 7 |613566756 | 14.29% | 9 |477218588 | 11.11% | 11 |390451572 | 9.09% | 13 |330382100 | 7.69% | 15 |286331153 | 6.67% | 17 |252645135 | 5.88% | 19 |226050910 | 5.26% | --------------------------------
Summary of changes: =================== - Whenever joiner joins group and it finds that default values are set for both auto_increment_increment and auto_increment_offset variables and group contains more than one member, then it sets auto_increment_increment as GROUP_REPLICATION_AUTO_INCREMENT_INCREMENT and auto_increment_offset as server_id. - This feature will only avoid duplicate auto_increment column values when total number of members in group is less than equal to GROUP_REPLICATION_AUTO_INCREMENT_INCREMENT. So all the nodes added after GROUP_REPLICATION_AUTO_INCREMENT_INCREMENT will have duplicate auto-increment column values, unless the user manually changes this. - Whenever number of member increases more then GROUP_REPLICATION_AUTO_INCREMENT_INCREMENT, then it will log a error. Server Core Changes: ==================== 1. new function to get server server_id. 2. new function to get/set auto_increment_increment and auto_increment_offset. Group Replication Changes: ========================== 1. Introduce a new plugin option GROUP_REPLICATION_AUTO_INCREMENT_INCREMENT with default value 7. 2. When a view is delivered: 2.1. Get server_id and auto_increment_increment and auto_increment_offset from new function defined above in server core changes 2.2 Check on joining node whether auto_increment_increment and auto_increment_offset are set to default i.e. 1 and size of group greater than 1 if above conditions are true set auto_increment_increment= GROUP_REPLICATION_AUTO_INCREMENT_INCREMENT; auto_increment_offset= server_id; 2.3. Log a plugin error on all members of the group, if group size is greater than GROUP_REPLICATION_AUTO_INCREMENT_INCREMENT.
Copyright (c) 2000, 2024, Oracle Corporation and/or its affiliates. All rights reserved.