рдЬрд╛рд╡рд╛ рдореЗрдВ рд╡рд┐рддрд░рд┐рдд KV рд╕рдВрдЧреНрд░рд╣рдг рдХреЗ рд▓рд┐рдП RAFT рд╕рд░реНрд╡рд╕рдореНрдорддрд┐ рдПрд▓реНрдЧреЛрд░рд┐рдердо рд▓рд╛рдЧреВ рдХрд░рдирд╛

рдлрд┐рд░ рд╕реЗ рд╣реИрд▓реЛред рдХреБрдЫ рджрд┐рдиреЛрдВ рдкрд╣рд▓реЗ, рдкрд╛рдареНрдпрдХреНрд░рдо "рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЯ" рдкрд░ рдПрдХ рдирдП рд╕рдореВрд╣ рдореЗрдВ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рд╢реБрд░реВ рд╣реБрдЖ , рдФрд░ рдЖрдЬ рд╣рдо рдкрд╛рдареНрдпрдХреНрд░рдо рдХреЗ рдЫрд╛рддреНрд░реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ, рдПрдВрдЯреЛрди рдкреНрд▓рд╛рд╢рдХреЛрд╡ (рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓реЙрдЬрд┐рд╕реНрдЯрд┐рдХреНрд╕ рдореЗрдВ рд╡рд┐рдХрд╛рд╕ рдХреЗ рдкреНрд░рдореБрдЦ рдФрд░ рдХреНрд▓реЙрддреНрд░рд╛ рдореЗрдВ рд╕рд╣-рд╕рдВрд╕реНрдерд╛рдкрдХ) рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦрд┐рдд рдПрдХ рд▓реЗрдЦ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ ред




рд╡рд░реНрддрдорд╛рди рдореЗрдВ, рд╡рд┐рддрд░рд┐рдд microservice рд╕рд┐рд╕реНрдЯрдо рд╡рд╕реНрддреБрддрдГ рдЙрджреНрдпреЛрдЧ рдорд╛рдирдХ рдмрди рдЧрдП рд╣реИрдВ, рдФрд░ рди рдХреЗрд╡рд▓ рдЙрджреНрдпрдо рдХреА рджреБрдирд┐рдпрд╛ рдореЗрдВред рд╡рд┐рддрд░рд┐рдд рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд╛рднреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рд╣реИред рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕ рдХреЗ рдлрд╛рдпрджреЗ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рд╕рднреА рдХреЛ рдЬреНрдЮрд╛рдд рд╣реИрдВ: рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХрд┐рдпрд╛рдВ, рдХрдВрдкреЛрдЬрд┐рдмрд┐рд▓рд┐рдЯреА, рд╕реНрдХреЗрд▓реЗрдмрд┐рд▓рд┐рдЯреА, рд╡рд┐рдХрд╛рд╕ рд╕реНрдХреЗрд▓рд┐рдВрдЧ, рдЯреАрдЯреАрдПрдо рдХрдореА, рдФрд░ рдЗрд╕реА рддрд░рд╣ред рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рд╡рд┐рддрд░рд┐рдд рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХрд╛ рд╡рд┐рдХрд╛рд╕ рдмрдврд╝рддреА рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рдорд╛рдВрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдордп рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдФрд░ рдЪрд╛рд░реЛрдВ рдУрд░ рд╕рдм рдХреБрдЫ рдХреЗ рдбрд┐рдЬрд┐рдЯрд▓реАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╡рд┐рдХрд▓реНрдк рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред

рдпрд╣ рднреА рдзреНрдпрд╛рди рд░рдЦрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдлрд┐рд▓рд╣рд╛рд▓ рдПрдХ рдмрд╣реБрдд рд╣реА рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХрд╛рд░рдХ рд╣реИ рдЬреЛ рдХрд┐ рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рдПрдХ рд╡рд┐рдХрд╛рд╕ рд░рдгрдиреАрддрд┐ рдХреА рдкрд╕рдВрдж рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рддреИрдпрд╛рд░ рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдБрдЪреЗ рдХреЗ рд╕рдорд╛рдзрд╛рди рдХреА рдЙрдкрд▓рдмреНрдзрддрд╛ рд╣реИ рдЬреЛ рдПрдХ рд╡рд┐рддрд░рд┐рдд рдкреНрд░рдгрд╛рд▓реА рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреА рдЕрддрд┐рд░рд┐рдХреНрдд рд▓рд╛рдЧрддреЛрдВ рд╕реЗ рдЬреБрдбрд╝реА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рд╕рдорд╛рдзрд╛рди рдкрд░ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИред рд╣рдо рдХрдВрдЯреЗрдирд░ рдСрд░реНрдХреЗрд╕реНрдЯреНрд░реЗрд╢рди рд╕рд┐рд╕реНрдЯрдо, рд╕рд░реНрд╡рд┐рд╕ рдореИрд╢, рд╡рд┐рддрд░рд┐рдд рдЯреНрд░реЗрд╕рд┐рдВрдЧ рдХреЗ рд╕рд╛рдзрди, рдирд┐рдЧрд░рд╛рдиреА, тАЛтАЛрд▓реЙрдЧрд┐рдВрдЧ рдЗрддреНрдпрд╛рджрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдпрд╣ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдкрд╣рд▓реЗ рдЬрд┐рди рдХрд╛рд░рдХреЛрдВ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд╡реЗ рдЖрдЬ рдХреЗ рдХреБрдЫ рд╡рд░реНрд╖реЛрдВ рдкрд╣рд▓реЗ рдЬрд┐рддрдиреЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рд╣реБрдП, рдЙрддрдиреЗ рд╣реА рд╕реВрдХреНрд╖реНрдорджрд░реНрд╢реА рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╣реЛрддреЗ рд╣реИрдВред

рдЖрдзреБрдирд┐рдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛рдУрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдЕрдзрд┐рдХрд╛рдВрд╢ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдПрдХ рдЕрдЦрдВрдб рд╕рдВрд░рдЪрдирд╛ рд╕реЗ рдПрдХ рдорд╛рдЗрдХреНрд░реЛрд╕реИрд╕ рд╕рд░реНрд╡рд┐рд╕ рдореЗрдВ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреЗ рдкрд╣рд▓реЗ рдЕрд╡рд╕рд░ рдХреА рддрд▓рд╛рд╢ рдХрд░рддреЗ рд╣реИрдВред рдкрд╣рд▓реЗ рдХрджрдореЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ, рдЬреЛ рдХреБрд▓ рд░реАрдлреИрдХреНрдЯрд░рд┐рдВрдЧ рдФрд░ рдЧрдВрднреАрд░ рдЕрдкрдШрдЯрди рдХрд╛ рд╕рд╣рд╛рд░рд╛ рд▓рд┐рдП рдмрд┐рдирд╛ рд▓рд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдПрдХ рдХреНрд╖реИрддрд┐рдЬ рдорд╛рдкрдиреАрдпрддрд╛ рдкреНрд░рдгрд╛рд▓реА рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╣реИред рдпрд╣реА рд╣реИ, рдЕрдкрдиреЗ рдЕрдЦрдВрдб рдЖрд╡реЗрджрди рдХреЛ рдПрдХ рдХреНрд▓рд╕реНрдЯрд░ рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рдВрднрд╡рддрдГ рд╕рдорд╛рди рдореЛрдиреЛрд▓рд┐рде рд╕реЗ рдорд┐рд▓рдХрд░ рднреА, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдЙрдирдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рдХреНрд╖реИрддрд┐рдЬ рдорд╛рдкрдиреАрдпрддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╕рдордп, рдПрдХ рдХреНрд▓рд╕реНрдЯрд░ рдХреЗ рднреАрддрд░ рдбреЗрдЯрд╛ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝реЗрд╢рди рдХрд╛ рдкреНрд░рд╢реНрди рдмрд╣реБрдд рдЬрд▓реНрджреА рдФрд░ рдмрд╣реБрдд рддреАрд╡реНрд░рддрд╛ рд╕реЗ рдЙрдарддрд╛ рд╣реИред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рд╕рднреА рдЖрдзреБрдирд┐рдХ рдбреАрдмреАрдПрдордПрд╕ рдПрдХ рдпрд╛ рджреВрд╕рд░реЗ рддрд░реАрдХреЗ рд╕реЗ рдиреЛрдбреНрд╕ рдХреЗ рдмреАрдЪ рдбреЗрдЯрд╛ рдкреНрд░рддрд┐рдХреГрддрд┐ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВред рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдХреЗрд╡рд▓ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП DBMS рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рдпрд╣ рддрдп рдХрд░рдирд╛ рд╣реИ рдХрд┐ рд╕рд┐рд╕реНрдЯрдо рдХреА рдХреНрдпрд╛ рд╕рдВрдкрддреНрддрд┐рдпрд╛рдБ (рдХреИрдк рдкреНрд░рдореЗрдп рдХреЗ рдЕрдиреБрд╕рд╛рд░) рдЙрд╕реЗ рдЪрд╛рд╣рд┐рдП, CP рдпрд╛ AP, рдФрд░ рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рд╣реЛ рдЧрдИ рд╣реИред рдорд╛рдорд▓реЗ рдореЗрдВ рдЬрдм рд╕реАрдкреА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдФрд░ рд╕реНрдерд┐рд░рддрд╛ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдВ рдЕрдзрд┐рдХ рд╣реЛрддреА рд╣реИрдВ, рддреЛ рдбреЗрдЯрд╛ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝реЗрд╢рди рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдЖрд░рдПрдПрдлрдЯреА рд╕рд░реНрд╡рд╕рдореНрдорддрд┐ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреНрд▓рд╕реНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред

рдпрд╣ рдмрд▓реНрдХрд┐ рдирдпрд╛ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо (2012 рдореЗрдВ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛) рд╕реНрдерд┐рд░рддрд╛ рдХреА рдПрдХ рдЙрдЪреНрдЪ рдЧрд╛рд░рдВрдЯреА рджреЗрддрд╛ рд╣реИ рдФрд░ рдмрд╣реБрдд рд▓реЛрдХрдкреНрд░рд┐рдп рд╣реИред рдореИрдВрдиреЗ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЬрд╛рд╡рд╛ (рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ) рдореЗрдВ рдПрдХ рд╕реБрд╕рдВрдЧрдд рдХреБрдВрдЬреА-рдореВрд▓реНрдп рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЗ рдореЗрд░реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд▓рд┐рдЦрд╛ред

рдХреНрдпрд╛ рдпрд╣ рдХрд┐рд╕реА рднреА рд╡рд┐рддрд░рд┐рдд рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛ рд╕реНрд╡рдпрдВ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ? рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдЖрдк рдПрдХ рд╡рд┐рддрд░рд┐рдд рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХрд╛ рдПрдХ рддреИрдпрд╛рд░-рдирд┐рд░реНрдорд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рд╕рдВрднрд╛рд╡рдирд╛ рдХреА рдЙрдЪреНрдЪрддрдо рдбрд┐рдЧреНрд░реА рдХреЗ рд╕рд╛рде рдпрд╣ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдШрд░-рдирд┐рд░реНрдорд┐рдд "рд╕рд╛рдЗрдХрд┐рд▓" рд╕реЗ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рдПрдХ DBMS рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдирд┐рд░рдВрддрд░рддрд╛ рдХреЗ рдЖрд╡рд╢реНрдпрдХ рд╕реНрддрд░ рдХреЛ рдмрдирд╛рдП рд░рдЦрддрд╛ рд╣реИред рдпрд╛ рдЖрдк рдЬрд╝реБрдХрд╛рдЗрдкрд░ рдХреЛ рддреИрдирд╛рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ред рдпрд╛ рдЖрдк рдЕрдкрдиреА рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдПрдХ рд░реВрдкрд░реЗрдЦрд╛ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЬрд╛рд╡рд╛ рдХреЗ рд▓рд┐рдП, рдПрдЯрдорд┐рдХреНрд╕ рд╣реИ , рдЬреЛ рд╡рд┐рддрд░рд┐рдд рдбреЗрдЯрд╛ рдХреЛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╣рд▓ рдХрд░рддрд╛ рд╣реИред

рд▓реЗрдХрд┐рди рджреВрд╕рд░реА рддрд░рдлред рдпрджрд┐ рдЖрдк рдПрдХ рдЯрд░реНрдирдХреА рд╕рдорд╛рдзрд╛рди рд▓реЗрддреЗ рд╣реИрдВ, рддреЛ рдПрдХ рдмрд╛рд╣рд░реА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрдорддреМрд░ рдкрд░ рдЖрдкрдХреЗ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рд╡рд┐рдлрд▓рддрд╛ рдХрд╛ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдмрд┐рдВрджреБ рдЬреЛрдбрд╝ рд░рд╣рд╛ рд╣реИред рдФрд░ рдЪреМрдЦрдЯреЗ рдмреЗрдорд╛рдиреА рдпрд╛ рд╕рдВрдЪрд╛рд▓рд┐рдд рдХрд░рдирд╛ рдФрд░ рд╕реАрдЦрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╛ рд╡реЗ рдЖрдкрдХреА рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рдмрд┐рд▓реНрдХреБрд▓ рднреА рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕рд░реНрд╡рд╕рдореНрдорддрд┐ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рд╕реНрд╡рддрдВрддреНрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдПрдХ рдмрд╣реБрдд рд╣реА рджрд┐рд▓рдЪрд╕реНрдк рдЗрдВрдЬреАрдирд┐рдпрд░рд┐рдВрдЧ рдХрд╛рд░реНрдп рд╣реИ рдЬреЛ рдЖрдкрдХреЗ рдХреНрд╖рд┐рддрд┐рдЬ рдХреЛ рд╡реНрдпрд╛рдкрдХ рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рд╕рдордЭ рджреЗрддрд╛ рд╣реИ рдХрд┐ рд╕реЗрд╡рд╛рдУрдВ рдХреЛ рдЕрдзрд┐рдХ рдЗрд╖реНрдЯрддрдо рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреНрд▓рд╕реНрдЯрд░ рдореЗрдВ рд╕рд╣рднрд╛рдЧрд┐рддрд╛ рдХрд░рддреЗ рд╕рдордп рдЖрдиреЗ рд╡рд╛рд▓реА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рдХреИрд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПред

рдЪреВрдВрдХрд┐ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдореЗрдВ рдбреЗрдЯрд╛ рдЕрдЦрдВрдбрддрд╛ рдХреЛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрд╛рдпреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реИ, рдЖрдк рдЕрдзрд┐рдЧреНрд░рд╣реАрдд рдЬреНрдЮрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рдЗрд╕рдХреА рд╕рдВрдкреВрд░реНрдгрддрд╛ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдХреЛрдИ рднреА рд╣рд┐рд╕реНрд╕рд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЬреАрд╡рди рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╢реНрд░рдорд┐рдХреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реИред рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рд╕рдордХрдХреНрд╖ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдк рдХрд╛рд░реНрдпрдХрд░реНрддрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рдХреЛ рд╕рдордиреНрд╡рдпрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдирд╛рдорд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдФрд░ рдЬрдм рд╕рдордиреНрд╡рдп рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдЧрд┐рд░рддрд╛ рд╣реИ, рддреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рд╕реНрд╡рддрдВрддреНрд░ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдХреЛ рд╕рдордиреНрд╡рдпрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рдпреБрдХреНрдд рдХрд░реЗрдВред рдЖрд░рдПрдПрдлрдЯреА рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреА рдкрд╣рд▓реА рдЫрдорд╛рд╣реА, рдЬреЛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рд╕рдордХрдХреНрд╖ рдиреЛрдбреНрд╕ рдХреЗ рдмреАрдЪ рдПрдХ рдиреЗрддрд╛ рдХрд╛ рдЪрдпрди рдХреИрд╕реЗ рдХрд░реЗрдВ, рдЗрд╕рд╕реЗ рдЖрдкрдХреЛ рдорджрдж рдорд┐рд▓реЗрдЧреАред рдпрд╛ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдорд╛рд╕реНрдЯрд░-рд╕реНрд▓реЗрд╡ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдХреЗрд╡рд▓ рджреЛ рдиреЛрдбреНрд╕ рд╣реИрдВ, рддреЛ рдЖрдк рдЕрдкрдиреЗ рд╕рд░рд▓ рдорд╛рдорд▓реЗ рдореЗрдВ рдбреЗрдЯрд╛ рдПрдХреНрд╕рдЪреЗрдВрдЬ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд░рдПрдПрдлрдЯреА рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдкреНрд░рддрд┐рдХреГрддрд┐ рдирд┐рдпрдореЛрдВ рдХрд╛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рд▓реЗрдЦ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдЖрд░рдПрдПрдлрдЯреА рдХреЛ рдЦреБрдж рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдкрд░ рдПрдХ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдЧрд╛рдЗрдб рд╣реИред рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдЦреБрдж рдФрд░ рдЗрд╕рдХреЗ рдХрд╛рдо рдХреЗ рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рдкрд╣рд▓реБрдУрдВ рдХреЛ рдирд╣реАрдВ рд╕рдордЭрд╛ рдЬрд╛рдПрдЧрд╛ред рдЖрдк рдЗрд╕ рдЙрддреНрдХреГрд╖реНрдЯ рд▓реЗрдЦ рдореЗрдВ рдпрд╣рд╛рдВ рдПрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╡рд┐рд╡рд░рдг рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдпрд╣рд╛рдВ рдкреВрд░реНрдг рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ред рд╡рд╣рд╛рдБ рдЖрдк рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдПрдХ рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рджреГрд╢реНрдп рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред

рд╕рд╛рдорд╛рдиреНрдп рд╕рдорд╛рдзрд╛рди рд╡рд┐рд╡рд░рдг


рдХреЛрдб рдХрд╛ рд╡рд╣ рд╣рд┐рд╕реНрд╕рд╛ рдЬреЛ рд╕реАрдзреЗ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ, рд▓реЗрдЦ рдореЗрдВ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХрд╛ рдПрдХ рд▓рд┐рдВрдХ рд╣реИ, рдЬрд╣рд╛рдВ рдЖрдк рдкреВрд░реЗ рдХреЛрдб рдХреЛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред

рдХрд╛рд░реНрдп рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдерд╛ред рдПрдХ рд╡рд┐рддрд░рд┐рдд рдкреНрд░рдгрд╛рд▓реА рд╡рд┐рдХрд╕рд┐рдд рдХрд░реЗрдВ рдЬреЛ рдЖрдкрдХреЛ рдХреБрдВрдЬреА-рдореВрд▓реНрдп рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдбреЗрдЯрд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдиреЛрдб рдХрд╛ рдбреЗрдЯрд╛ рд╕рдВрдЧрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЕрд░реНрдерд╛рддреН, рдпрджрд┐ рдбреЗрдЯрд╛ рдПрдХ рдиреЛрдб рдХреЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдорд┐рд▓рд╛ рдФрд░ рдЕрдзрд┐рдХрд╛рдВрд╢ рдиреЛрдбреНрд╕ рдиреЗ рдкреБрд╖реНрдЯрд┐ рдХреА рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдпрд╣ рдбреЗрдЯрд╛ рднреА рдкреНрд░рд╛рдкреНрдд рд╣реБрдЖ рд╣реИ, рддреЛ рдЬрд▓реНрдж рд╣реА рдпрд╛ рдмрд╛рдж рдореЗрдВ рдпрд╣ рдбреЗрдЯрд╛ рдкреНрд░рддреНрдпреЗрдХ рдиреЛрдб рдХреЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд╣реЛрдЧрд╛ред рдЬрдм рдХреНрд▓рд╕реНрдЯрд░ рдХрд╛ рдПрдХ рд╣рд┐рд╕реНрд╕рд╛ рдХрд╛рдЯ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЬрдм рдпрд╣ рд╡рд╛рдкрд╕ рдЬреБрдбрд╝рд╛ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдХреНрд▓рд╕реНрдЯрд░ рдХреЗ рдмрд╛рд╣рд░ рд▓рдЧреЗ рдиреЛрдбреНрд╕ рдХреЛ рдореБрдЦреНрдп рдХреНрд▓рд╕реНрдЯрд░ рдХреЗ рд╕рд╛рде рдкрдХрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдкреНрд░рддреНрдпреЗрдХ рдиреЛрдб рдбреЗрдЯрд╛рдмреЗрд╕ рдбреЗрдЯрд╛ рд▓рд┐рдЦрдиреЗ рдФрд░ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ REST API рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рджреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рдиреЛрдбреНрд╕ рдХреЗ рд▓рд┐рдП рджреЛ рдореЙрдбреНрдпреВрд▓ рд╣реЛрддреЗ рд╣реИрдВ: рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ рд╕рд░реНрд╡рд░ред рдиреАрдЪреЗ рд╣рдо рд╕рд░реНрд╡рд░ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реИрдВред рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛрдб рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рд╣реИред

рдПрдХ рд╕рд░реНрд╡рд░ рдиреЛрдб рддреАрди рд░рд╛рдЬреНрдпреЛрдВ рдореЗрдВ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ:

  • рдЕрдиреБрдпрд╛рдпреА (рдЕрдиреБрдпрд╛рдпреА)ред рдЧреНрд░рд╛рд╣рдХ рд╕реЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИред рдиреЗрддрд╛ рд╕реЗ рджрд┐рд▓ рдХреА рдзрдбрд╝рдХрди рд▓реЗрддрд╛ рд╣реИ
  • рдЙрдореНрдореАрджрд╡рд╛рд░ (рдЙрдореНрдореАрджрд╡рд╛рд░)ред рдЧреНрд░рд╛рд╣рдХ рд╕реЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИред рдЕрдиреНрдп рдиреЛрдбреНрд╕ рдХреЛ рд╡реЛрдЯ рдЕрдиреБрд░реЛрдз рднреЗрдЬрддрд╛ рд╣реИ
  • рдиреЗрддрд╛ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдкрдврд╝рдирд╛ рдФрд░ рд▓рд┐рдЦрдирд╛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИред рдЕрдиреНрдп рдиреЛрдбреНрд╕ рдХреЗ рд▓рд┐рдП рджрд┐рд▓ рдХреА рдзрдбрд╝рдХрди рдЕрдиреБрд░реЛрдз рднреЗрдЬрддрд╛ рд╣реИред рдЕрдиреНрдп рдиреЛрдбреНрд╕ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рдбреЗрдЯрд╛ рднреЗрдЬрддрд╛ рд╣реИред

рдХрд┐рд╕реА рдПрдХ рдиреЛрдб рдХреЗ "рдиреЗрддреГрддреНрд╡" рдХреА рдЕрд╡рдзрд┐ рдХреЛ рджреМрд░ (рд╢рдмреНрдж) рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдХ рдирдпрд╛ рдЙрдореНрдореАрджрд╡рд╛рд░ рдПрдХ рдирдпрд╛ рджреМрд░ рдЦреЛрд▓рддрд╛ рд╣реИред

рдЖрдзрд╛рд░ рд╕рд╛рдордЧреНрд░реА рднрдВрдбрд╛рд░рдг


рдкреНрд░рддреНрдпреЗрдХ рдиреЛрдб рдСрдкрд░реЗрд╢рди рд▓реЙрдЧ рдХреЗ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рддрдХ рдкрд╣реБрдВрдЪ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдбреЗрдЯрд╛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдЪрд╛рд▓рди рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рджрд░реНрдЬ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред

https://github.com/pleshakoff/raft/blob/master/server/src/main/java/com/raft/server/operations/OperationsLog.java


public interface OperationsLog {
   void append(Operation operation);
   Operation get(Integer index);
   List<Operation> all();

   Long getTerm(Integer index);
   Integer getLastIndex();
   Long getLastTerm();

   void removeAllFromIndex(int newOperationIndex);
}

рдбреЗрдЯрд╛ рдФрд░ рдкреНрд░рдХрд╛рд░ (рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░реЗрдВ, рдмрджрд▓реЗрдВ, рд╣рдЯрд╛рдПрдВ) рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдкреНрд░рддреНрдпреЗрдХ рдСрдкрд░реЗрд╢рди рдореЗрдВ рдЙрд╕ рд░рд╛рдЙрдВрдб рдХреА рд╕рдВрдЦреНрдпрд╛ рд╢рд╛рдорд┐рд▓ рд╣реЛрддреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЗрд╕реЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкреНрд░рддреНрдпреЗрдХ рдСрдкрд░реЗрд╢рди рдореЗрдВ рдПрдХ рд╕реВрдЪрдХрд╛рдВрдХ рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдмрдврд╝рддрд╛ рд╣реИред рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рд╕рднреА рдкрд░рд┐рдЪрд╛рд▓рдиреЛрдВ рдХреЛ рдЙрд╕реА рдХреНрд░рдо рдореЗрдВ рдЕрдиреБрдпрд╛рдпрд┐рдпреЛрдВ рдХреЗ рд▓реЙрдЧ рдореЗрдВ рдбрд╛рд▓рд╛ рдЬрд╛рдП, рдЬрд┐рд╕рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдиреЗрддрд╛ рдХреЗ рд▓реЙрдЧ рдореЗрдВ рдбрд╛рд▓рд╛ рдЧрдпрд╛ рд╣реИред

рдкреНрд░рддреНрдпреЗрдХ рдиреЛрдб рдореЗрдВ рдПрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рддрдХ рдкрд╣реБрдВрдЪ рд╣реЛрддреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдбреЗрдЯрд╛ рд╕реАрдзреЗ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реЛрддрд╛ рд╣реИред

https://github.com/pleshakoff/raft/blob/master/server/src/main/java/com/raft/server/storage/Storage.java

public interface Storage {
   List<Entry> all();
   String get(Long key);
   void insert(Long key, String val);
   void update(Long key, String val);
   void delete(Long key);
}

рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ, рдПрдореНрдмреЗрдбреЗрдб рдЗрди-рдореЗрдореЛрд░реА рд╕рдорд╛рдзрд╛рди рд▓реЙрдЧ рдФрд░ рдбреЗрдЯрд╛рдмреЗрд╕ (рд╕рд╛рдзрд╛рд░рдг рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзреА рд╕реВрдЪреА рдФрд░ рдорд╛рдирдЪрд┐рддреНрд░) рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдЖрдк рдмрд╕ рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рднрдВрдбрд╛рд░рдг рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рд▓реЙрдЧ рд╕реЗ рдбреЗрдЯрд╛рдмреЗрд╕ рддрдХ рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рдЖрд╡реЗрджрди рдПрдХ рд╡рд┐рддрд░рд┐рдд рд░рд╛рдЬреНрдп рдорд╢реАрди рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдХ рд░рд╛рдЬреНрдп рдорд╢реАрди рдПрдХ рдРрд╕рд╛ рддрдВрддреНрд░ рд╣реИ рдЬреЛ рдПрдХ рдХреНрд▓рд╕реНрдЯрд░ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╝рд┐рдореНрдореЗрджрд╛рд░ рд╣реИ, рдЧрд▓рдд рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░рддрд╛ рд╣реИ (рдЖрдЙрдЯ-рдСрдл-рдСрд░реНрдбрд░ рд╕рдВрдЪрд╛рд▓рди рдпрд╛ рдПрдХ рдбрд┐рд╕реНрдХрдиреЗрдХреНрдЯ рдиреЛрдб рдЬреЛ рдЦреБрдж рдХреЛ рдПрдХ рдиреЗрддрд╛ рдорд╛рдирддрд╛ рд╣реИ)ред рдЬрд┐рди рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдорд╛рдиреНрдп рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЙрдирдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд▓рд╛рдЧреВ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдЙрдиреНрд╣реЗрдВ рдЪреЗрдХ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдкрд╛рд░рд┐рдд рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП рдФрд░ рдХреБрдЫ рдорд╛рдирджрдВрдбреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреЛ рдХрд┐ рд░рд╛рдЬреНрдп рдорд╢реАрди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред

рдПрдХ рдиреЗрддрд╛ рдХреЗ рд▓рд┐рдП, рдПрдХ рдСрдкрд░реЗрд╢рди рдбреЗрдЯрд╛рдмреЗрд╕ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ рдпрджрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рдиреЛрдбреНрд╕ рдиреЗ рдЗрд╕ рддрдереНрдп рдХреА рдкреБрд╖реНрдЯрд┐ рдХреА рд╣реИ рдХрд┐ рдСрдкрд░реЗрд╢рди рдЙрдирдХреЗ рд▓реЙрдЧ рдореЗрдВ рднреА рджреЛрд╣рд░рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдПрдХ рдЕрдиреБрдпрд╛рдпреА рдХреЗ рд▓рд┐рдП, рдСрдкрд░реЗрд╢рди рдбреЗрдЯрд╛рдмреЗрд╕ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ рдпрджрд┐ рдПрдХ рд╕рдВрдХреЗрдд рдЙрд╕ рдиреЗрддрд╛ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдЙрд╕реЗ рдЕрдкрдиреЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИред

рдЯрд╛рдЗрдорд░


рдкреНрд░рддреНрдпреЗрдХ рдиреЛрдб рдЕрдиреНрдп рдиреЛрдбреНрд╕ рдХреЗ рд╕рд╛рде рдбреЗрдЯрд╛ рдПрдХреНрд╕рдЪреЗрдВрдЬ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред

рджреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рд╢реНрдиреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

  • рдорддрджрд╛рди рдЬрдм рдорддрджрд╛рди рдХрд╛ рджреМрд░ рдЪрд▓рддрд╛ рд╣реИ
  • рдПрдкреЗрдВрдб, рдЙрд░реНрдл тАЛтАЛрджрд┐рд▓ рдХреА рдзрдбрд╝рдХрди (рдпрджрд┐ рдбреЗрдЯрд╛ рдХреЗ рдмрд┐рдирд╛), рдЕрдиреБрдпрд╛рдпрд┐рдпреЛрдВ рдХреЛ рд▓реЙрдЧ рдбреЗрдЯрд╛ рдХреЛ рджреЛрд╣рд░рд╛рдиреЗ рдФрд░ рдорддрджрд╛рди рдХреЗ рдПрдХ рдирдП рджреМрд░ рдХреА рд╢реБрд░реБрдЖрдд рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдПред

рдХрд┐рд╕реА рдШрдЯрдирд╛ рдХреА рд╢реБрд░реБрдЖрдд рдХрд╛ рддрдереНрдп рдЯрд╛рдЗрдорд░ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдиреЛрдб рдкрд░ рджреЛ рдкреНрд░рдХрд╛рд░ рдХреА рдЯрд╛рдЗрдорд░ рд▓реЙрдиреНрдЪ рдХреА рдЧрдИ рд╣реИрдВ:

  • рд╡реЛрдЯред рдорддрджрд╛рди рдХрд╛ рдПрдХ рджреМрд░ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдкреНрд░рддреНрдпреЗрдХ рдиреЛрдб рдХрд╛ рдЕрдкрдирд╛ рдЕрдВрддрд░рд╛рд▓ рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рд╡рд╣ рдПрдХ рдирдпрд╛ рд╡реЛрдЯ рд╢реБрд░реВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдЧрд╛ред рдиреЗрддрд╛ рд╕реЗ рджрд┐рд▓ рдХреА рдзрдбрд╝рдХрди рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╕рдордп рдЙрд▓реНрдЯреА рдЧрд┐рдирддреА рд╢реБрд░реВ рд╣реЛрддреА рд╣реИред
  • рджрд┐рд▓ рдХреА рдзрдбрд╝рдХрдиред рдкрд░рд┐рд╢рд┐рд╖реНрдЯ рдиреЗрддрд╛ рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрдпрд╛рдпрд┐рдпреЛрдВ рдХреЛ рдЕрдиреБрд░реЛрдз рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдПред рдпрджрд┐ рдиреЛрдб рдХреЛ рджрд┐рд▓ рдХреА рдзрдбрд╝рдХрди рдирд╣реАрдВ рдорд┐рд▓рддреА рд╣реИ рдФрд░ рдорддрджрд╛рди рдЯрд╛рдЗрдорд░ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдпрд╣ рдПрдХ рдЙрдореНрдореАрджрд╡рд╛рд░ рдмрди рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЪреБрдирд╛рд╡ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ, рдорддрджрд╛рди рдХреЗ рджреМрд░ рдХреА рд╕рдВрдЦреНрдпрд╛ рдмрдврд╝рд╛рддрд╛ рд╣реИ рдФрд░ рдЕрдиреНрдп рдиреЛрдбреНрд╕ рдХреЛ рдорддрджрд╛рди рдЕрдиреБрд░реЛрдз рднреЗрдЬрддрд╛ рд╣реИред рдпрджрд┐ рдиреЛрдб рдмрд╣реБрдордд рдХреЗ рд╡реЛрдЯреЛрдВ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдиреЗрддрд╛ рдмрди рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рджрд┐рд▓ рдХреА рдзрдбрд╝рдХрди рдХреЛ рдмрд╛рд╣рд░ рднреЗрдЬрдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрддрд╛ рд╣реИред

рдиреЛрдб рдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐


рдкреНрд░рддреНрдпреЗрдХ рдиреЛрдб рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдбреЗрдЯрд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред

https://github.com/pleshakoff/raft/blob/master/server/src/main/java/com/raft/server/context/Context.java

public interface Context {
   Integer getId(); //    
   State getState();//: , ,  
   Integer getVotedFor(); 
               //          
   Long getCurrentTerm(); //  
   Integer getCommitIndex(); //    
   List<Peer> getPeers(); //      
}

рдПрдХ рдиреЗрддрд╛ рдиреЛрдб рдиреЛрдбреНрд╕ рдХреЗ рд▓рд┐рдП рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдХреЛ рднреА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдпрд╣ рдбреЗрдЯрд╛ рдХреЛ рджреЛрд╣рд░рд╛рддрд╛ рд╣реИред

https://github.com/pleshakoff/raft/blob/master/server/src/main/java/com/raft/server/node/peers/Peer.java

public interface Peer {
   Integer getId(); //  
   Integer getNextIndex(); //  ,    
   Integer getMatchIndex();//   
   Boolean getVoteGranted(); //     
}

рдЕрдиреБрдпрд╛рдпрд┐рдпреЛрдВ рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдкрд░ рдиреЛрдб рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдХреЛ рдиреЗрддрд╛ рджреНрд╡рд╛рд░рд╛ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╡реЗ рдиреЗрддрд╛ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдХреМрди рд╕рд╛ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдСрдкрд░реЗрд╢рди рдЕрдиреБрдпрд╛рдпреА рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИ рдФрд░ рдХреМрди рд╕рд╛ рд╕рдВрдЪрд╛рд▓рди рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдиреБрдпрд╛рдпреА рдХреЗ рд▓реЙрдЧ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИред

рдорддрджрд╛рди


рдЪреБрдирд╛рд╡ рд╕реЗрд╡рд╛ рд╡рд░реНрдЧ рдорддрджрд╛рди рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ

public interface ElectionService {
   void processElection();
   AnswerVoteDTO vote(RequestVoteDTO requestVoteDTO);
} 

рдорддрджрд╛рди рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рднреЗрдЬрдирд╛


рдпрджрд┐ рдиреЛрдб рдПрдХ рдЕрдиреБрдпрд╛рдпреА рд╣реИ рдФрд░ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдЕрд╡рдзрд┐ рдХреЗ рд▓рд┐рдП рджрд┐рд▓ рдХреА рдзрдбрд╝рдХрди рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдЕрдкрдиреЗ рд╡рд░реНрддрдорд╛рди рджреМрд░ рдХреЛ рдмрдврд╝рд╛рддрд╛ рд╣реИ, рдЦреБрдж рдХреЛ рдЙрдореНрдореАрджрд╡рд╛рд░ рдШреЛрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЕрдиреНрдп рдиреЛрдбреНрд╕ рдХреЛ рд╡реЛрдЯ рдЕрдиреБрд░реЛрдз рднреЗрдЬрдирд╛ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рд╡рд╣ рдПрдХ рдХреЛрд░рдо рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЕрдзрд┐рдХрд╛рдВрд╢ рдиреЛрдбреНрд╕ рдиреЗ рдЕрдкрдирд╛ рд╡реЛрдЯ рдбрд╛рд▓рд╛, рддреЛ рд╡рд╣ рдирдпрд╛ рдиреЗрддрд╛ рдмрди рдЬрд╛рдПрдЧрд╛ред RAFT рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ, рдХреЛрд░рдо рд╕рднреА рдиреЛрдбреНрд╕ (51%) рдХреЗ рдЖрдзреЗ рд╕реЗ рдЕрдзрд┐рдХ рд╣реИред

рдЖрдЗрдП processElectionрд╡рд░реНрдЧ рд╡рд┐рдзрд┐ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВ ElectionServiceImpl, рдЬрд┐рд╕реЗ рд╡реЛрдЯ-рдЯрд╛рдЗрдорд░ рджреНрд╡рд╛рд░рд╛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рд╡реЛрдЯ рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдиреЛрдбреНрд╕ рдХреЛ рдорддрджрд╛рди рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рднреЗрдЬрддрд╛ рд╣реИ ред

//1
context.setState(CANDIDATE); 
Long term = context.incCurrentTerm(); 
context.setVotedFor(context.getId()); 

List<Integer> peersIds = context.getPeers().stream().map(Peer::getId).collect(Collectors.toList());
long voteGrantedCount = 1L;
long voteRevokedCount = 0L;

//2
while (checkCurrentElectionStatus(term)) {
   List<AnswerVoteDTO> answers = getVoteFromAllPeers(term, peersIds);
   peersIds = new ArrayList<>();
   for (AnswerVoteDTO answer : answers) {
       //3
       if (answer.getStatusCode().equals(OK)) {
           //4
           if (answer.getTerm()>context.getCurrentTerm()) {
               context.setTermGreaterThenCurrent(answer.getTerm());
               return;
           }
           if (answer.isVoteGranted()) {
               //5 
               context.getPeer(answer.getId()).setVoteGranted(true);
               voteGrantedCount++;
           } else
               //6 
               voteRevokedCount++;
       } else {
          peersIds.add(answer.getId());
       }
   }
  //7
  if (voteGrantedCount >= context.getQuorum()) {
       winElection(term);
       return;
   } else if (voteRevokedCount >= context.getQuorum()) {
       loseElection(term);
       return;
   } 

  1. "рдЙрдореНрдореАрджрд╡рд╛рд░" рдХреА рд╕реНрдерд┐рддрд┐ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВред рд░рд╛рдЙрдВрдб рдирдВрдмрд░ рдЙрдард╛рдПрдВ рдФрд░ рдЕрдкрдиреЗ рд▓рд┐рдП рд╡реЛрдЯ рдХрд░реЗрдВред
  2. , ( ). - , , heartbeat .
  3. - , . , , -.
  4. , . , heartbeat .
  5. рдиреЛрдб рдиреЗ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдорддрджрд╛рди рдХрд┐рдпрд╛! рд╣рдо рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд╡реЛрдЯ рдбрд╛рд▓рдиреЗ рд╡рд╛рд▓реЗ рдиреЛрдбреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдмрдврд╝рд╛рддреЗ рд╣реИрдВ рдФрд░ рддрдп рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕ рдиреЛрдб рдиреЗ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдорддрджрд╛рди рдХрд┐рдпрд╛ред
  6. рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд╡реЛрдЯ рдирд╣реАрдВ, рд╣рдо рднреА рдорд╛рдирддреЗ рд╣реИрдВред
  7. рдпрджрд┐ рдХреЛрд░рдо рдПрдХрддреНрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдиреЛрдб рдЪреБрдирд╛рд╡ рдЬреАрддрд╛ рд╣реИ, рддреЛ рд╣рдо "рд▓реАрдбрд░" рдХреА рд╕реНрдерд┐рддрд┐ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдЕрдиреНрдпрдерд╛, рд╣рдо рдЕрдиреБрдпрд╛рдпреА рдмрди рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВред

рдпрд╣ рднреА рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЬрдм рдПрдХ рдиреЛрдб рдиреЗрддрд╛ рдмрди рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдиреЗрддрд╛ рджреНрд╡рд╛рд░рд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдиреЛрдбреНрд╕ рдХреА рд╕реВрдЪреА рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдиреЛрдб рдХреЗ рд▓рд┐рдП рдЕрдЧрд▓рд╛ рдЗрдВрдбреЗрдХреНрд╕ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рд▓реАрдбрд░ рдХреЗ рд▓реЙрдЧ рдкреНрд▓рд╕ рдореЗрдВ рдЕрдВрддрд┐рдо рдЗрдВрдбреЗрдХреНрд╕ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕ рдЗрдВрдбреЗрдХреНрд╕ рд╕реЗ рд╢реБрд░реВ рд╣реЛрдХрд░, рд▓реАрдбрд░ рдЕрдиреБрдпрд╛рдпреА рд▓реЙрдЧ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдЧрд╛ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдиреЗрддрд╛ рджреНрд╡рд╛рд░рд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдпрд╣ рд╕реВрдЪрдХрд╛рдВрдХ рдЕрдиреБрдпрд╛рдпреА рдХреЗ рд▓реЙрдЧ рдХреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЗ рдЕрдиреБрд░реВрдк рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдореВрд▓реНрдп рдХреЗрд╡рд▓ рддрднреА рдкреНрд░рд╛рдкреНрдд рд╣реЛрдЧрд╛ рдЬрдм рдЕрдиреБрдпрд╛рдпреА рдХреЗ рд╕рд╛рде рдбреЗрдЯрд╛ рдХрд╛ рдЖрджрд╛рди-рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд▓реЗрдХрд┐рди рдХреБрдЫ рд╢реБрд░реБрдЖрддреА рдмрд┐рдВрджреБ рдХреА рдЬрд░реВрд░рдд рд╣реИ ред

  private void winElection(Long term) {
       context.setState(LEADER);
       context.getPeers().forEach(peer ->
               peer.setNextIndex(operationsLog.getLastIndex()+1)

       );
   }

рдорддрджрд╛рди рдЕрдиреБрд░реЛрдз рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг


рдорддрджрд╛рди рдХрд░рддреЗ рд╕рдордп, рдкреНрд░рддреНрдпреЗрдХ рдиреЛрдб рдХреЛ рдЙрдореНрдореАрджрд╡рд╛рд░ рд╕реЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдлреЙрд░реНрдо рдХрд╛ рдЕрдиреБрд░реЛрдз рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ :

class RequestVoteDTO {
   private final Long term; //     
   private final Integer candidateId; //  
   private final Integer lastLogIndex; //     
   private final Long lastLogTerm; //       
}

рдЕрдм voteрдХреНрд▓рд╛рд╕ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ ElectionServiceImpl, рдпрд╣ рдЙрдореНрдореАрджрд╡рд╛рд░ рд╕реЗ рд╡реЛрдЯ рдЕрдиреБрд░реЛрдз рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдиреЗрддрд╛ рдХреА рднреВрдорд┐рдХрд╛ рдХреЗ рд▓рд┐рдП рдЙрд╕рдХреА рдЙрдореНрдореАрджрд╡рд╛рд░реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд┐рд░реНрдгрдп рджреЗрддрд╛ рд╣реИред

https://github.com/pleshakoff/raft/blob/eba5ea1984e2623702f4c299cf1b0af7a6ba0d14/server/src/main/java/com/raft/server/election/ElectionServiceImpl.java#L178


public AnswerVoteDTO vote(RequestVoteDTO dto) {
   
       boolean termCheck;
       //1
       if (dto.getTerm() < context.getCurrentTerm())
           return new AnswerVoteDTO(context.getId(),context.getCurrentTerm(),false);
       else //2
       if (dto.getTerm().equals(context.getCurrentTerm())) {
           termCheck = (context.getVotedFor() == null||
                          context.getVotedFor().equals(dto.getCandidateId()));
       }
       else
       {   //3
           termCheck = true;
             context.setTermGreaterThenCurrent(dto.getTerm());
       }

       //4  
       boolean logCheck = !((operationsLog.getLastTerm() > dto.getLastLogTerm()) ||
               ((operationsLog.getLastTerm().equals(dto.getLastLogTerm())) &&
                       (operationsLog.getLastIndex() > dto.getLastLogIndex())));


       boolean voteGranted = termCheck&&logCheck;

       //5
       if (voteGranted) {
           context.setVotedFor(dto.getCandidateId());
       }
       //6   
       return new AnswerVoteDTO(context.getId(),context.getCurrentTerm(),voteGranted);
   }

рдХрд┐рд╕реА рдЙрдореНрдореАрджрд╡рд╛рд░ рд╕реЗ рдЕрдиреБрд░реЛрдз рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдкрд░, рдиреЛрдб рджреЛ рдЪреЗрдХ рдмрдирд╛рддрд╛ рд╣реИ: рдЙрдореНрдореАрджрд╡рд╛рд░ рдХреЗ рд░рд╛рдЙрдВрдб рдФрд░ рдЙрд╕рдХреЗ рд▓реЙрдЧ рдХреА рд▓рдВрдмрд╛рдИ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдЙрдореНрдореАрджрд╡рд╛рд░ рдХрд╛ рд░рд╛рдЙрдВрдб рдЕрдзрд┐рдХ рд╣реИ рдФрд░ рдЙрд╕рдХрд╛ рд▓реЙрдЧ рд▓рдВрдмрд╛ рдпрд╛ рдмрд░рд╛рдмрд░ рд╣реИ, рддреЛ рдиреЛрдб рдЙрдореНрдореАрджрд╡рд╛рд░ рдХреЛ рдЕрдкрдирд╛ рдиреЛрдб рджреЗрддрд╛ рд╣реИ

  1. рдпрджрд┐ рдЙрдореНрдореАрджрд╡рд╛рд░ рдХреЗ рджреМрд░ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЧрд╛рдБрда рдХрд╛ рд╡рд░реНрддрдорд╛рди рджреМрд░ рдмрдбрд╝рд╛ рд╣реИ, рддреЛ рд╣рдо рдордирд╛ рдХрд░ рджреЗрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХреБрдЫ рдкрд┐рдЫрдбрд╝рдиреЗ рд╡рд╛рд▓реА рдЧрд╛рдБрда рдХрд╛ рдПрдХ рдЕрдиреБрд░реЛрдз рд╣реИ, рдЬреЛ, рдЬрд╛рд╣рд┐рд░ рддреМрд░ рдкрд░, рдХреБрдЫ рд╕рдордп рдХреЗ рд▓рд┐рдП рдХреНрд▓рд╕реНрдЯрд░ рдХреЗ рдмрд╛рд╣рд░ рдерд╛ рдФрд░ рдЪреБрдирд╛рд╡ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╢реБрд░реВ рдХрд░ рджреА рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╡рд░реНрддрдорд╛рди рдиреЗрддрд╛ рдХреЛ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рдерд╛ред
  2. , , , , , , ; . тАФ .
  3. ,
  4. . , , , , .
  5. рдПрдХ рд╕рдХрд╛рд░рд╛рддреНрдордХ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд╕рд╛рде, рд╣рдо рдЗрд╕ рддрдереНрдп рдХреЛ рдареАрдХ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдиреЛрдб рдиреЗ рдЪреБрдирд╛рд╡ рдореЗрдВ рднрд╛рдЧ рд▓рд┐рдпрд╛ рдФрд░ рдЙрдореНрдореАрджрд╡рд╛рд░ рдХреЗ рд▓рд┐рдП рд╡реЛрдЯ рдбрд╛рд▓рд╛ред
  6. рдкрд░рд┐рдгрд╛рдо рд╡рд╛рдкрд╕ рдЙрдореНрдореАрджрд╡рд╛рд░ рдХреЛ рднреЗрдЬреЗрдВ

рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЛ рдХреБрдЫ рдХрдо рдФрд░ рдЕрдзрд┐рдХ рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдЗрд╕ рддрд░рд╣ рдХреЗ "рднреЛрд▓реЗ" рд╡рд┐рдХрд▓реНрдк рдХреЛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рддрд╛рдХрд┐ рдЦреБрдж рдХреЛ рднреНрд░рдорд┐рдд рди рдХрд░реЗрдВ рдФрд░ рдХрд┐рд╕реА рдХреЛ рднреНрд░рдорд┐рдд рди рдХрд░реЗрдВред

рдкреНрд░рддрд┐рдХреГрддрд┐


рдЯрд╛рдЗрдорд░ рд▓реАрдбрд░ рдЕрдкрдиреЗ рд╡реЛрдЯрд┐рдВрдЧ рдЯрд╛рдЗрдорд░ рдХреЛ рд░реАрд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА рдиреЛрдбреНрд╕ рдХреЗ рджрд┐рд▓ рдХреА рдзрдбрд╝рдХрди рдЕрдиреБрдпрд╛рдпрд┐рдпреЛрдВ рдХреЛ рднреЗрдЬрддрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рдиреЗрддрд╛ рд╕рднреА рдЕрдиреБрдпрд╛рдпрд┐рдпреЛрдВ рдХреЗ рдЕрдВрддрд┐рдо рд╕рдВрдЪрд╛рд▓рди рдХреЗ рдЕрдкрдиреЗ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рд╕реВрдЪрдХ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╡рд╣ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдСрдкрд░реЗрд╢рди рдХреЛ рдиреЛрдбреНрд╕ рдореЗрдВ рднреЗрдЬрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдпрджрд┐ рдиреЗрддрд╛ рдХрд╛ рд╕рдВрдЪрд╛рд▓рди рд▓реЙрдЧ рдХрд┐рд╕реА рднреА рдЕрдиреБрдпрд╛рдпреА рдХреЗ рд▓реЙрдЧ рд╕реЗ рдЕрдзрд┐рдХ рд▓рдВрдмрд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╡рд╣ рджрд┐рд▓ рдХреА рдзрдбрд╝рдХрди рдХреЗ рд╕рд╛рде, рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдЙрд╕реЗ рд▓рд╛рдкрддрд╛ рд╕рдВрдЪрд╛рд▓рди рднреЗрдЬрддрд╛ рд╣реИред рдЗрд╕реЗ рдПрдкреЗрдВрдб рд░рд┐рдХреНрд╡реЗрд╕реНрдЯ рдХрд╣реЗрдВред рдпрджрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рдиреЛрдб рдирдП рд╕рдВрдЪрд╛рд▓рди рдХреА рдкреНрд░рд╛рдкреНрддрд┐ рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдиреЗрддрд╛ рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЕрдкрдиреЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдкрд░ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЕрдВрддрд┐рдо рд▓рд╛рдЧреВ рдХрд┐рдП рдЧрдП рдСрдкрд░реЗрд╢рди рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЛ рдмрдврд╝рд╛рддрд╛ рд╣реИред рдпрд╣ рдЗрдВрдбреЗрдХреНрд╕ рдЕрдиреБрдпрд╛рдпрд┐рдпреЛрдВ рдХреЛ рджрд┐рд▓ рдХреА рдзрдбрд╝рдХрди рдЕрдиреБрд░реЛрдз рдХреЗ рд╕рд╛рде рднреА рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИред рдФрд░ рдпрджрд┐ рд▓реАрдбрд░ рдЗрдВрдбреЗрдХреНрд╕ рдЕрдиреБрдпрд╛рдпреА рд╕реВрдЪрдХрд╛рдВрдХ рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ, рддреЛ рдЕрдиреБрдпрд╛рдпреА рднреА рдЕрдкрдиреЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ рддрд╛рдХрд┐ рд╕реВрдЪрдХрд╛рдВрдХреЛрдВ рдХреЛ рдмрд░рд╛рдмрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред

рдЗрд╕ рддрд░рд╣ рдХреЗ рдкрд░рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛ рдЕрдиреБрд░реЛрдз рдиреЗрддрд╛ рдЕрдиреБрдпрд╛рдпреА рдХреЛ рднреЗрдЬрддрд╛ рд╣реИ

class RequestAppendDTO {
   private final Long term; //   
   private final Integer leaderId; //   

   private final Integer prevLogIndex;//   
   private final Long prevLogTerm;//   
   private final Integer leaderCommit;//      
   private final Operation operation; //
}

рдРрд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИрдВ рдЬрд┐рдирдореЗрдВ рдСрдкрд░реЗрд╢рди рдХрдИ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рдмреИрдЪреЛрдВ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ, рдХреЗрд╡рд▓ рдПрдХ рдСрдкрд░реЗрд╢рди рдкреНрд░рддрд┐

рдЕрдиреБрд░реЛрдз рдкреНрд░реЗрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред рд╡рд░реНрдЧ рджрд┐рд▓ рдХреА рдзрдбрд╝рдХрди-рдЕрдкреАрд▓ рдЕрдиреБрд░реЛрдз рднреЗрдЬрдиреЗ рдФрд░ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд░рддрд╛ рд╣реИ:

https://github.com/pleshakoff/raft/blob/eba5ea1984e2623702f4c299cf1b0af7a6ba0d14/server/src/main/java/com/raft/server/replication/ReplicationService.java

public interface ReplicationService {
   void appendRequest();
   AnswerAppendDTO append(RequestAppendDTO requestAppendDTO);
}

рдбреЗрдЯрд╛ рдкрд░рд┐рд╡рд░реНрддрди рдЕрдиреБрд░реЛрдз рд╕рдмрдорд┐рдЯ рдХрд░реЗрдВ


рдПрдХ sendAppendForOnePeerрд╡рд░реНрдЧ ReplicationServiceImpl

рд╡рд┐рдзрд┐ рдХреЗ рдПрдХ рдЯреБрдХрдбрд╝реЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ ред рд╡рд┐рдзрд┐ рдЕрдиреБрдпрд╛рдпреА рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдиреБрд░реЛрдз рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдФрд░ рдЗрд╕реЗ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ ред

private CompletableFuture<AnswerAppendDTO> sendAppendForOnePeer(Integer id) {
   return CompletableFuture.supplyAsync(() -> {
       try {
           //1
           Peer peer = context.getPeer(id);

           Operation operation;
           Integer prevIndex;
           //2    
           if (peer.getNextIndex() <= operationsLog.getLastIndex()) {
               operation = operationsLog.get(peer.getNextIndex());
               prevIndex = peer.getNextIndex() - 1;
           } else 
           //3  
           {
               operation = null;
               prevIndex = operationsLog.getLastIndex();
           }


           RequestAppendDTO requestAppendDTO = new RequestAppendDTO(
                   context.getCurrentTerm(), //   
                   context.getId(), //  
                   prevIndex,//      
                   operationsLog.getTerm(prevIndex),//  
                   context.getCommitIndex(),
                               //      
                   Operation //
           );

...
/*   http     */
}

  1. рдЕрдиреБрдпрд╛рдпреА рдореЗрдЯрд╛рдбреЗрдЯрд╛
  2. , . ( ), , , , . , , , ,
  3. , , ; , , ,

рдЗрд╕рдХреЗ рдмрд╛рдж, appendRequestрд╡рд░реНрдЧ рд╡рд┐рдзрд┐ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ ReplicationServiceImpl, рдЬреЛ рд╕рднреА рдЕрдиреБрдпрд╛рдпрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рднреЗрдЬрдиреЗ рдФрд░ рдкрд░рд┐рдгрд╛рдо рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред

https://github.com/pleshakoff/raft/blob/eba5ea1984e2623702f4c299cf1b0af7a6ba0d14/server/src/main/java/com/raft/server/replication/ReplicationServiceImpl.java#L109

public void appendRequest() {
       List<Integer> peersIds = context.getPeers().stream().map(Peer::getId).collect(Collectors.toList());

       //1 
       while (peersIds.size() > 0) {
           //2 
           List<AnswerAppendDTO> answers = sendAppendToAllPeers(peersIds);
           peersIds = new ArrayList<>();
           for (AnswerAppendDTO answer : answers) {
               //3
               if (answer.getStatusCode().equals(OK)) {
                   //4
                   if (answer.getTerm() > context.getCurrentTerm()) {
                        context.setTermGreaterThenCurrent(answer.getTerm());
                       return;
                   }
                   Peer peer = context.getPeer(answer.getId());
                   //5     
                   if (answer.getSuccess()) {                      
                       peer.setNextIndex(answer.getMatchIndex() + 1);
                       peer.setMatchIndex(answer.getMatchIndex());
                       if (peer.getNextIndex() <= operationsLog.getLastIndex())
                           peersIds.add(answer.getId());
                   //6      
                   } else {
                       peer.decNextIndex();
                       peersIds.add(answer.getId());
                   }
               }
           }
           //7
           tryToCommit();
       }
}

  1. рд╣рдо рдЕрдиреБрд░реЛрдз рдХреЛ рджреЛрд╣рд░рд╛рддреЗ рд╣реИрдВ рдЬрдм рддрдХ рдХрд┐ рд╣рдореЗрдВ рд╕рднреА рдЕрдиреБрдпрд╛рдпрд┐рдпреЛрдВ рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдирд╣реАрдВ рдорд┐рд▓ рдЬрд╛рддреА рд╣реИ рдХрд┐ рдкреНрд░рддрд┐рдХреГрддрд┐ рд╕рдлрд▓ рд░рд╣реАред рдЪреВрдВрдХрд┐ рдПрдХ рдСрдкрд░реЗрд╢рди рдкреНрд░рддрд┐ рдЕрдиреБрд░реЛрдз рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЕрдиреБрдпрд╛рдпрд┐рдпреЛрдВ рдХреЗ рд▓реЙрдЧ рдХреЛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпрд╛рдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ
  2. рд╕рднреА рдЕрдиреБрдпрд╛рдпрд┐рдпреЛрдВ рдХреЛ рдЕрдиреБрд░реЛрдз рднреЗрдЬреЗрдВ рдФрд░ рдЙрддреНрддрд░ рдХреЗ рд╕рд╛рде рдПрдХ рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ
  3. рд╣рдо рдХреЗрд╡рд▓ рдЙрдкрд▓рдмреНрдз рдЕрдиреБрдпрд╛рдпрд┐рдпреЛрдВ рд╕реЗ рдЬрд╡рд╛рдм рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ
  4. рдпрджрд┐ рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдЕрдиреБрдпрд╛рдпрд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛ рджреМрд░ рдиреЗрддрд╛ рдХреЗ рджреМрд░ рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ, рддреЛ рд╣рдо рд╕рдм рдХреБрдЫ рд░реЛрдХ рджреЗрддреЗ рд╣реИрдВ рдФрд░ рдЕрдиреБрдпрд╛рдпреА рдореЗрдВ рдмрджрд▓ рдЬрд╛рддреЗ рд╣реИрдВ
  5. рдпрджрд┐ рдЕрдиреБрдпрд╛рдпреА рдиреЗ рдЙрддреНрддрд░ рджрд┐рдпрд╛ рдХрд┐ рд╕рдм рдХреБрдЫ рд╕рдлрд▓ рдерд╛, рддреЛ рд╣рдо рдЕрдиреБрдпрд╛рдпреА рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╣реИрдВ: рд╣рдо рдЕрдиреБрдпрд╛рдпреА рдХреЗ рд▓реЙрдЧ рдХреЗ рдЕрдВрддрд┐рдо рд╕реВрдЪрдХрд╛рдВрдХ рдФрд░ рдЕрдиреБрдпрд╛рдпреА рджреНрд╡рд╛рд░рд╛ рдЕрдкреЗрдХреНрд╖рд┐рдд рдЕрдЧрд▓реЗ рдСрдкрд░реЗрд╢рди рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЛ рдмрдЪрд╛рддреЗ рд╣реИрдВред
  6. , , , , . , , . , . , .
  7. , . .


рдЕрдм рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдиреБрдпрд╛рдпреА рдиреЗрддрд╛ рд╕реЗ рдЕрдиреБрд░реЛрдз рдХреЛ рдХреИрд╕реЗ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред рдХрдХреНрд╖рд╛
рд╡рд┐рдзрд┐appendReplicationServiceImpl

public AnswerAppendDTO append(RequestAppendDTO dto) {
     
       //1     
       if (dto.getTerm() < context.getCurrentTerm()) {
           return new AnswerAppendDTO(context.getId(),context.getCurrentTerm(),false, null);
       } else if (dto.getTerm() > context.getCurrentTerm()) {
           //2 
           context.setCurrentTerm(dto.getTerm());
           context.setVotedFor(null);
       }
       //3  
       applicationEventPublisher.publishEvent(new ResetElectionTimerEvent(this));

       if (!context.getState().equals(FOLLOWER)) {
           context.setState(FOLLOWER);
       }
        
       //4  
       if ((dto.getPrevLogIndex() > operationsLog.getLastIndex()) ||                                                                                        !dto.getPrevLogTerm().equals(operationsLog.getTerm(dto.getPrevLogIndex()))) {
                      return new AnswerAppendDTO(context.getId(), context.getCurrentTerm(), false, null);
       }


       Operation newOperation = dto.getOperation();
       if (newOperation != null) {
           int newOperationIndex = dto.getPrevLogIndex() + 1;
           
         synchronized (this) {
               //5
               if ((newOperationIndex <= operationsLog.getLastIndex()) &&
                      (!newOperation.getTerm().equals(operationsLog.getTerm(newOperationIndex)))){
                   operationsLog.removeAllFromIndex(newOperationIndex);
               }
               //6
               if (newOperationIndex <= operationsLog.getLastIndex())
               {
                 return new AnswerAppendDTO(context.getId(), context.getCurrentTerm(), true,      operationsLog.getLastIndex());
               }
               //7
               operationsLog.append(newOperation);
           }
        }
        //8 
        if (dto.getLeaderCommit() > context.getCommitIndex()) {
           context.setCommitIndex(Math.min(dto.getLeaderCommit(), operationsLog.getLastIndex()));
       }

                 
       return new AnswerAppendDTO(context.getId(), context.getCurrentTerm(), true, operationsLog.getLastIndex());
   }

  1. рдпрджрд┐ рдиреЗрддрд╛ рдХрд╛ рджреМрд░ рдЕрдиреБрдпрд╛рдпреА рдХреЗ рджреМрд░ рд╕реЗ рдХрдо рд╣реИ, рддреЛ рд╣рдо рдЕрдкрдиреЗ рдиреЗрддрд╛ рдХреЛ рдПрдХ рджреМрд░ рднреЗрдЬрддреЗ рд╣реИрдВ рдФрд░ рд╕рдВрдХреЗрдд рджреЗрддреЗ рд╣реИрдВ рдХрд┐ рдЙрдирдХрд╛ рдЕрдиреБрд░реЛрдз рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЬреИрд╕реЗ рд╣реА рдиреЗрддрд╛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдЕрдкрдиреЗ рд╕реЗ рдмрдбрд╝рд╛ рдПрдХ рдЧреЛрд▓ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рд╡рд╣ рдЕрдиреБрдпрд╛рдпреА рдореЗрдВ рдмрджрд▓ рдЬрд╛рдПрдЧрд╛
  2. рдпрджрд┐ рдиреЗрддрд╛ рдХрд╛ рджреМрд░ рдЕрдиреБрдпрд╛рдпреА рдХреЗ рджреМрд░ рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ, рддреЛ рдЗрд╕ рджреМрд░ рдХреЛ рдЕрдиреБрдпрд╛рдпреА рдкрд░ рд╕реЗрдЯ рдХрд░реЗрдВред
  3. рдЪреВрдВрдХрд┐ рдиреЗрддрд╛ рд╕реЗ рдЕрдиреБрд░реЛрдз рдкреНрд░рд╛рдкреНрдд рд╣реБрдЖ рдерд╛, рдЗрд╕ рдмрд╛рдд рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛ рдХрд┐ рд╡рд╣рд╛рдВ рдбреЗрдЯрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ, рд╣рдо рд╡реЛрдЯ рдЯрд╛рдЗрдорд░ рдХреЛ рд░реАрд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ рдФрд░, рдпрджрд┐ рд╣рдо рдЕрдиреБрдпрд╛рдпреА рдирд╣реАрдВ рдереЗ, рддреЛ рд╣рдо рдпрд╣ рдмрди рдЬрд╛рддреЗ рд╣реИрдВ
  4. , , , , , , . , ,
  5. , . . , , - , , , , . , .
  6. , . ,
  7. ,
  8. , , , .


рдпрд╣ рдХреЗрд╡рд▓ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╣рддрд╛ рд╣реИ рдХрд┐ рдХреИрд╕реЗ рдиреЗрддрд╛ рд▓реЙрдЧ рд╕реЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдкрд░ рд╕рдВрдЪрд╛рд▓рди рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рдЕрдиреБрдпрд╛рдпрд┐рдпреЛрдВ рдХреЛ рд╕рдВрдЪрд╛рд▓рди рднреЗрдЬрдиреЗ рдФрд░ рдЙрдирд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдПрдВ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рдиреЗрддрд╛ рдиреЛрдбреНрд╕ рдХреЗ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддрд╛ рд╣реИред рдЬреИрд╕реЗ рд╣реА рдиреЛрдбреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдЬрд┐рд╕рдХрд╛ рд▓реЙрдЧ рдореЗрдВ рдЕрдВрддрд┐рдо рдСрдкрд░реЗрд╢рди рдХрд╛ рд╕реВрдЪрдХрд╛рдВрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рджреНрд╡рд╛рд░рд╛ рд▓рд╛рдЧреВ рдЕрдВрддрд┐рдо рдСрдкрд░реЗрд╢рди рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХ рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ, рдХреЛрд░рдо рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рд╣рдо рдпрд╣ рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рдиреЛрдб рдХреЛ рдСрдкрд░реЗрд╢рди рдкреНрд░рд╛рдкреНрдд рд╣реБрдЖ рдФрд░ рд╣рдо рдЗрд╕реЗ рдиреЗрддрд╛ рдХреЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдпрджрд┐ рдХрд┐рд╕реА рдиреЗрддрд╛ рдиреЗ рдЕрдиреБрдпрд╛рдпрд┐рдпреЛрдВ рдХреЛ рдПрдХ рдСрдкрд░реЗрд╢рди рднреЗрдЬрд╛ рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдиреЗ рдЙрд╕реЗ рдЕрдкрдиреЗ рд▓реЙрдЧ рдореЗрдВ рдбрд╛рд▓рд╛ рдФрд░ рдиреЗрддрд╛ рдХреЛ рдЙрддреНрддрд░ рджрд┐рдпрд╛, рддреЛ рд╣рдо рдЗрд╕ рдСрдкрд░реЗрд╢рди рдХреЛ рдиреЗрддрд╛ рдХреЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдкрд░ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд▓рд╛рдЧреВ рдХрд┐рдП рдЧрдП рдЕрдВрддрд┐рдо рдСрдкрд░реЗрд╢рди рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЛ рдмрдврд╝рд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдЧрд▓реЗ рдПрдкреЗрдВрдб-рд╣рд╛рд░реНрдЯрдмреАрдЯ рдЕрдиреБрд░реЛрдз рд╡рд╛рд▓рд╛ рдпрд╣ рдЗрдВрдбреЗрдХреНрд╕ рдЕрдиреБрдпрд╛рдпреА рдХреЗ рд▓рд┐рдП рдЙрдбрд╝рд╛рди рднрд░реЗрдЧрд╛ рдФрд░ рдпрд╣ рдЕрдкрдиреЗ рд▓реЙрдЧ рд╕реЗ рдЕрдкрдиреЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд▓рд┐рдП рдЙрд╕реА рдЗрдВрдбреЗрдХреНрд╕ рдХреЗ рд╕рд╛рде рдСрдкрд░реЗрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдЧрд╛ ред

tryToCommitрдХрдХреНрд╖рд╛ рдкрджреНрдзрддрд┐ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддреЗ рд╣реИрдВReplicationServiceImpl

  private void tryToCommit() {
       while (true) {
           //1
           int N = context.getCommitIndex() + 1;
           //2
           Supplier<Long> count = () ->
               context.getPeers().stream().map(Peer::getMatchIndex).
                       filter(matchIndex -> matchIndex >= N).count() + 1;

           //3 
           if (operationsLog.getLastIndex() >= N &&
                   operationsLog.getTerm(N).equals(context.getCurrentTerm())&&
                      count.get()>=context.getQuorum()
           )
           {
               context.setCommitIndex(N);
           } else
               return;
       }
   }

  1. рд╣рдо рдбреЗрдЯрд╛рдмреЗрд╕ рдкрд░ рд▓рд╛рдЧреВ рдСрдкрд░реЗрд╢рди рдХреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реВрдЪрдХрд╛рдВрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ
  2. рд╣рдо рдЧрд┐рдирддреЗ рд╣реИрдВ рдХрд┐ рдХрд┐рддрдиреЗ рдЕрдиреБрдпрд╛рдпрд┐рдпреЛрдВ рдХреЗ рдкрд╛рд╕ рдЙрдирдХреЗ рд▓реЙрдЧ рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЗ рд╕рд╛рде рдПрдХ рдСрдкрд░реЗрд╢рди рд╣реИ, рдФрд░ рдПрдХ рдиреЗрддрд╛ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдордд рднреВрд▓рдирд╛
  3. рдпрджрд┐ рдРрд╕реЗ рдЕрдиреБрдпрд╛рдпрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛрд░рдо рд╣реИ рдФрд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЗ рд╕рд╛рде рд╕рдВрдЪрд╛рд▓рди рдиреЗрддрд╛ рдХреЗ рд▓реЙрдЧ рдореЗрдВ рд╣реИ, рдФрд░ рдЗрд╕ рдСрдкрд░реЗрд╢рди рдХрд╛ рджреМрд░ рд╡рд░реНрддрдорд╛рди рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ, рддреЛ рдиреЗрддрд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рдкрд░ рдСрдкрд░реЗрд╢рди рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЕрдВрддрд┐рдо рд▓рд╛рдЧреВ рдХрд┐рдП рдЧрдП рдСрдкрд░реЗрд╢рди рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЛ рдмрдврд╝рд╛рддрд╛ рд╣реИред рдкрд┐рдЫрд▓реЗ рджреМрд░ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЙрдирдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рдиреЗрддрд╛ рдЬрд┐рдореНрдореЗрджрд╛рд░ рдерд╛ рдФрд░ рд╕рдВрдШрд░реНрд╖ рдкреИрджрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдиреЗрддрд╛ рдХреЗрд╡рд▓ рдЕрдкрдиреЗ рд╡рд░реНрддрдорд╛рди рджреМрд░ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред

рдирд┐рд╖реНрдХрд░реНрд╖


рдХреЛрдИ рднреА рд╡рд┐рддрд░рд┐рдд рдПрд▓реНрдЧреЛрд░рд┐рдердо, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рд╡рд╛рд░ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐ RAFT рд╣реИ, рдПрдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдПрдХреАрдХреГрдд рд╕рдорд╛рдзрд╛рди рд╣реИ рдЬреЛ рдкрд░рд┐рдгрд╛рдо рдХреА рдЙрдкрд▓рдмреНрдзрд┐ рдХреА рдЧрд╛рд░рдВрдЯреА рджреЗрддрд╛ рд╣реИ, рдЬреЛ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╕рднреА рдирд┐рдпрдореЛрдВ рдХреЗ рдЕрдзреАрди рд╣реИред

рдХрдИ рд╡рд┐рддрд░рд┐рдд рдПрд▓реНрдЧреЛрд░рд┐рджрдо рд╣реИрдВ рдФрд░ рд╡реЗ рдЕрд▓рдЧ рд╣реИрдВред ZAB рд╣реИ, рдЬрд┐рд╕реЗ Zookeeper рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Kafka рдореЗрдВ рдбреЗрдЯрд╛ рдХреЛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рд╕реНрдерд┐рд░рддрд╛ рдХреЗ рд▓рд┐рдП рдХрдо рдХрдареЛрд░ рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдПрд▓реНрдЧреЛрд░рд┐рджрдо рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдкреА рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдЧреЙрд╕рд┐рдк рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рджреНрд░рд╡реНрдпрдорд╛рдиред рдРрд╕реЗ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рд╣реИрдВ рдЬреЛ RAFT рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЙрд╕реА рд╕рдордп MOKKA рдЬреИрд╕реЗ рд▓реЙрдЧреНрд╕ рдХреЗ рдЖрджрд╛рди-рдкреНрд░рджрд╛рди рдХреЗ рд▓рд┐рдП рдЧреЙрд╕рд┐рдк рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдЗрдирдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рднреА рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдирд╛ рдХрд┐рд╕реА рднреА рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рдж рдЙрдкрдпреЛрдЧреА рд╣реИ, рдФрд░ рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдКрдкрд░ рдмрддрд╛рдпрд╛ рд╣реИ, рд╕рдорд╛рдзрд╛рди рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рдФрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣рд┐рд╕реНрд╕реЛрдВ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдФрд░ рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдЖрдкрдХреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕ рджрд┐рд╢рд╛ рдореЗрдВ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЛ рджреЗрдЦрдирд╛ рд╣реЛрдЧрд╛ рдЬрд┐рдирдХреА рдЧрддрд┐рд╡рд┐рдзрд┐рдпрд╛рдБ рд╡рд┐рддрд░рд┐рдд рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдХреЗ рд╡рд┐рдХрд╛рд╕ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВ рдФрд░ рдбреЗрдЯрд╛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдореБрджреНрджреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИрдВ, рднрд▓реЗ рд╣реА рд╡реЗ рдорд╛рдирдХ рдФрджреНрдпреЛрдЧрд┐рдХ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

рд╕рдВрджрд░реНрдн



рд╣рдореЗрдВ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рд╕рд╛рдордЧреНрд░реА рдЖрдкрдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рдереАред рдФрд░ рдпрджрд┐ рдЖрдк рдПрдХ рдХреЛрд░реНрд╕ рдкрдХрдбрд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ , рддреЛ рдЖрдк рдЗрд╕реЗ рдЕрднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

All Articles