<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="lt">
	<id>https://wiki.eofnet.lt/w//index.php?action=history&amp;feed=atom&amp;title=MySQL_multi_master_replikacija</id>
	<title>MySQL multi master replikacija - Versijų istorija</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.eofnet.lt/w//index.php?action=history&amp;feed=atom&amp;title=MySQL_multi_master_replikacija"/>
	<link rel="alternate" type="text/html" href="https://wiki.eofnet.lt/w//index.php?title=MySQL_multi_master_replikacija&amp;action=history"/>
	<updated>2026-04-15T15:01:35Z</updated>
	<subtitle>Šio puslapio versijų istorija projekte</subtitle>
	<generator>MediaWiki 1.35.1</generator>
	<entry>
		<id>https://wiki.eofnet.lt/w//index.php?title=MySQL_multi_master_replikacija&amp;diff=8123&amp;oldid=prev</id>
		<title>\dev\null: sunkumų išvengimas</title>
		<link rel="alternate" type="text/html" href="https://wiki.eofnet.lt/w//index.php?title=MySQL_multi_master_replikacija&amp;diff=8123&amp;oldid=prev"/>
		<updated>2017-01-28T19:34:25Z</updated>

		<summary type="html">&lt;p&gt;sunkumų išvengimas&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Naujas puslapis&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Strategija padaryti du identiškus [[MySQL]] serverius, pasinaudojant [[MySQL]] [[multi master]] replikacija. Techniškai tai du serveriai veikiantys kaip Master &amp;gt; Slave ir atvirkščiai. Kiekvienas jų yra tiek Master tiek Slave, ir taip sukuriamas atbulinis duomenų sinchronizavimo mechanizmas užtikrinantis 100% replikaciją. Taip pat šiame straipsnyje aprašomos galimai iškylančios problemos bei jų sprendimas, kad replikacija būtų kuo stabilesnė.&lt;br /&gt;
&lt;br /&gt;
Naudosime du serverius:&lt;br /&gt;
* node1 - Y.Y.Y.Y&lt;br /&gt;
* node2 - X.X.X.X&lt;br /&gt;
&lt;br /&gt;
= Pasiruošimas =&lt;br /&gt;
Pirmaiusia reikėtų žinoti jog prieš pradedant visą replikavimo procesą reikia perkopijuoti produkcinės DB duomenis į Slave serverį, tai galima padaryti paprastu [[mysqldump]], arba jeigu versijos yra identiškos tiesiog saugiu [[sftp]] ryšiu perkelti [[MySQL]] failus ('''/var/lib/mysql''') į Slave serverį. Pastaruoju atveju turite išjungti Master [[MySQL]] serverį, kad saugiai tai padaryti, išjungti trumpam vistiek reiks, dėl [[MySQL]] konfigūracijos keitimo. Bet jeigu manote, kad kopijuojamų duomenų yra perdaug 10-50GB&amp;gt; tuomet galite viską dumpinti į didelį sql'ą. Sukišti į Slave serverį, kol pirmajį Master'į laikysite su užlokintą nuo pakeitimų (su įjungtu binary logu).&lt;br /&gt;
 mysql&amp;gt; FLUSH TABLES WITH READ LOCK;&lt;br /&gt;
Persikopijavus ir paleidus Slave serverį, galima daryti &amp;quot;quit&amp;quot; pastarojoje sesijoje, ir lentelės atsirakins.&lt;br /&gt;
== Master configas (buvęs productionas) ==&lt;br /&gt;
'''/etc/mysql/mysql.conf.d/mysqld.cnf''' Atkreipkite dėmesį į paryškintas eilutes&lt;br /&gt;
 [mysqld_safe]&lt;br /&gt;
 socket          = /var/run/mysqld/mysqld.sock&lt;br /&gt;
 nice            = 0&lt;br /&gt;
 [mysqld]&lt;br /&gt;
 # * Basic Settings&lt;br /&gt;
 user            = mysql&lt;br /&gt;
 pid-file        = /var/run/mysqld/mysqld.pid&lt;br /&gt;
 socket          = /var/run/mysqld/mysqld.sock&lt;br /&gt;
 port            = 3306&lt;br /&gt;
 basedir         = /usr&lt;br /&gt;
 datadir         = /var/lib/mysql&lt;br /&gt;
 tmpdir          = /tmp&lt;br /&gt;
 lc-messages-dir = /usr/share/mysql&lt;br /&gt;
 skip-external-locking&lt;br /&gt;
 '''bind-address = 0.0.0.0'''&lt;br /&gt;
 # * Fine Tuning&lt;br /&gt;
 key_buffer_size         = 16M&lt;br /&gt;
 max_allowed_packet      = 16M&lt;br /&gt;
 thread_stack            = 192K&lt;br /&gt;
 thread_cache_size       = 8&lt;br /&gt;
 '''myisam-recover-options  = BACKUP'''&lt;br /&gt;
 query_cache_limit       = 1M&lt;br /&gt;
 query_cache_size        = 16M&lt;br /&gt;
 log_error = /var/log/mysql/error.log&lt;br /&gt;
 '''server-id               = 1'''&lt;br /&gt;
 binlog_format = mixed&lt;br /&gt;
 '''log_bin                 = /var/log/mysql/mysql-bin.log'''&lt;br /&gt;
 '''expire_logs_days        = 10'''&lt;br /&gt;
 '''max_binlog_size=10G'''&lt;br /&gt;
 # keli hackai padesiantys lengviau replikuoti mysql&lt;br /&gt;
 '''innodb_flush_log_at_trx_commit=1'''&lt;br /&gt;
 '''sync_binlog=1'''&lt;br /&gt;
 '''slave_exec_mode=IDEMPOTENT'''&lt;br /&gt;
 '''relay_log_info_repository=TABLE'''&lt;br /&gt;
Po konfigūracijos pakeitimo perkrauname mysql:&lt;br /&gt;
 service mysql restart&lt;br /&gt;
== Kitas master configas (naujasis slave) ==&lt;br /&gt;
'''/etc/mysql/mysql.conf.d/mysqld.cnf'''&lt;br /&gt;
 [mysqld_safe]&lt;br /&gt;
 socket          = /var/run/mysqld/mysqld.sock&lt;br /&gt;
 nice            = 0&lt;br /&gt;
 [mysqld]&lt;br /&gt;
 # * Basic Settings&lt;br /&gt;
 user            = mysql&lt;br /&gt;
 pid-file        = /var/run/mysqld/mysqld.pid&lt;br /&gt;
 socket          = /var/run/mysqld/mysqld.sock&lt;br /&gt;
 port            = 3306&lt;br /&gt;
 basedir         = /usr&lt;br /&gt;
 datadir         = /var/lib/mysql&lt;br /&gt;
 tmpdir          = /tmp&lt;br /&gt;
 lc-messages-dir = /usr/share/mysql&lt;br /&gt;
 skip-external-locking&lt;br /&gt;
 '''bind-address            = 0.0.0.0'''&lt;br /&gt;
 # * Fine Tuning&lt;br /&gt;
 key_buffer_size         = 16M&lt;br /&gt;
 max_allowed_packet      = 16M&lt;br /&gt;
 thread_stack            = 192K&lt;br /&gt;
 thread_cache_size       = 8&lt;br /&gt;
 myisam-recover-options  = BACKUP&lt;br /&gt;
 # * Query Cache Configuration&lt;br /&gt;
 query_cache_limit       = 1M&lt;br /&gt;
 query_cache_size        = 16M&lt;br /&gt;
 # * Logging and Replication&lt;br /&gt;
 general_log_file        = /var/log/mysql/mysql.log&lt;br /&gt;
 general_log             = 1&lt;br /&gt;
 '''log_error = /var/log/mysql/error.log'''&lt;br /&gt;
 '''server-id               = 2'''&lt;br /&gt;
 binlog_format = mixed&lt;br /&gt;
 '''log_bin                 = /var/log/mysql/mysql-bin.log'''&lt;br /&gt;
 max_binlog_size=10G&lt;br /&gt;
 expire_logs_days        = 10&lt;br /&gt;
 '''relay-log=mysqld-relay-bin'''&lt;br /&gt;
 '''report-host=node1'''&lt;br /&gt;
 '''slave_exec_mode=IDEMPOTENT'''&lt;br /&gt;
 '''relay_log_info_repository=TABLE'''&lt;br /&gt;
Po konfigūracijos pakeitimo perkrauname mysql:&lt;br /&gt;
 service mysql restart&lt;br /&gt;
== Replikacija ==&lt;br /&gt;
&lt;br /&gt;
Pirmajame serveryje pasileidžiame mysql klienta (pasijungiame kaip root), antrajame taip pat, iš pirmojo pažiūrime master status:&lt;br /&gt;
 SHOW MASTER STATUS;&lt;br /&gt;
Duodame leidimą replikacijai:&lt;br /&gt;
 grant replication slave on *.* to 'repl'@'Y.Y.Y.Y' identified by 'SLAPTAŽODIS‘;&lt;br /&gt;
Antrajame serveryje rašome:&lt;br /&gt;
 change master to master_host = 'X.X.X.X', master_user='repl', master_password='SLAPTAŽODIS', master_log_file=''''mysql-bin.000005'''', master_log_pos='''769'''; &lt;br /&gt;
Butinai užrašome tikslų '''master log''' ir '''log pos''' iš pirmojo serverio master statuso (nuo tos vietos jis pradės replikuotis), paleidžiame slave&lt;br /&gt;
 start slave;&lt;br /&gt;
Taip pat leidžiame prėima pirmajam serveriui būti šito serverio slave'u:&lt;br /&gt;
 grant replication slave on *.* to 'repl2’@’X.X.X.X' identified by 'SLAPTAŽODIS‘;&lt;br /&gt;
Taip pat pažiūrime master status'ą&lt;br /&gt;
 mysql&amp;gt; show master status;&lt;br /&gt;
 +------------------+-----------+--------------+------------------+-------------------+&lt;br /&gt;
 | File             | Position  | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |&lt;br /&gt;
 +------------------+-----------+--------------+------------------+-------------------+&lt;br /&gt;
 | mysql-bin.000002 | 254 |              |                  |                   |&lt;br /&gt;
 +------------------+-----------+--------------+------------------+-------------------+&lt;br /&gt;
 1 row in set (0.01 sec)&lt;br /&gt;
Pirmajame serveryje darome atgalinę replikaciją (užrašydami antrojo serverio master statuso binary failą bei jo poziciją:&lt;br /&gt;
 change master to master_host = 'Y.Y.Y.Y', master_user='repl2', master_password='SLAPTAŽODIS', master_log_file=''''mysql-bin.000002'''', master_log_pos='''254'''; &lt;br /&gt;
 start slave;&lt;br /&gt;
Replikacija turetų pradėti vykti, jeigu abiejuose serveriuose matome (parašius '''show slave status\G;''') &lt;br /&gt;
  Slave_IO_Running: Yes&lt;br /&gt;
  Slave_SQL_Running: Yes&lt;br /&gt;
Jeigu nepavyko, kartojame ir būtinai žiūrime logą '''/var/log/mysql/error.log'''&lt;br /&gt;
== Laikui bėgant problemos dėl incremental ID'u bei kitų bėdų ==&lt;br /&gt;
Nors su šiais konfigais turėtume to išvengti bet dėl visa pikta, kas valandą ant crontab'o galime užkabinti šį scriptą kuris išspręs problemas bent jau kol ateis adminas:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#/bin/bash&lt;br /&gt;
mysql_user=root&lt;br /&gt;
mysql_host=localhost&lt;br /&gt;
mysql_port=3306&lt;br /&gt;
mysql_socket=/var/run/mysqld/mysqld.sock&lt;br /&gt;
&lt;br /&gt;
cmd=mysql&lt;br /&gt;
[ -n &amp;quot;$mysql_host&amp;quot;  ] &amp;amp;&amp;amp; cmd=&amp;quot;$cmd --host=$mysql_host&amp;quot;&lt;br /&gt;
[ -n &amp;quot;$mysql_port&amp;quot;  ] &amp;amp;&amp;amp; cmd=&amp;quot;$cmd --port=$mysql_port&amp;quot;&lt;br /&gt;
[ -n &amp;quot;$mysql_socket&amp;quot;  ] &amp;amp;&amp;amp; cmd=&amp;quot;$cmd --socket=$mysql_socket&amp;quot;&lt;br /&gt;
[ -n &amp;quot;$mysql_user&amp;quot;  ] &amp;amp;&amp;amp; cmd=&amp;quot;$cmd --user=$mysql_user&amp;quot;&lt;br /&gt;
#[ -n &amp;quot;$mysql_pass&amp;quot;  ] &amp;amp;&amp;amp; cmd=&amp;quot;$cmd --password=$mysql_pass&amp;quot;&lt;br /&gt;
#echo $cmd&lt;br /&gt;
while(true);&lt;br /&gt;
do&lt;br /&gt;
Last_SQL_Error=`$cmd -e &amp;quot;show slave status\G&amp;quot; | grep &amp;quot;Last_SQL_Error:&amp;quot; | awk 'BEGIN{FS=&amp;quot;:&amp;quot;}{print $2}' | tr -d ' '`&lt;br /&gt;
#Last_SQL_Error=&amp;quot;&amp;quot;&lt;br /&gt;
if [ -z &amp;quot;$Last_SQL_Error&amp;quot; ]; then&lt;br /&gt;
break&lt;br /&gt;
fi&lt;br /&gt;
Master_UUID=`$cmd -e &amp;quot;show slave status\G&amp;quot; | grep &amp;quot;Master_UUID&amp;quot; | awk 'BEGIN{FS=&amp;quot;:&amp;quot;}{print $2}'`&lt;br /&gt;
Executed_Gtid_Set=`$cmd -e &amp;quot;show slave status\G&amp;quot; | grep &amp;quot;Executed_Gtid_Set&amp;quot; | grep $Master_UUID  | awk 'BEGIN{FS=&amp;quot; &amp;quot;}{print $2}'`&lt;br /&gt;
Executed_id_Last=`echo $Executed_Gtid_Set |  awk 'BEGIN{FS=&amp;quot;:&amp;quot;}{print $NF}' |  awk 'BEGIN{FS=&amp;quot;-&amp;quot;}{print $2}'`&lt;br /&gt;
Executed_Gtid_Last=${Master_UUID}:${Executed_id_Last}&lt;br /&gt;
Executed_id_Next=`echo $Executed_id_Last + 1 | bc`&lt;br /&gt;
GTID_NEXT=${Master_UUID}:${Executed_id_Next}&lt;br /&gt;
$cmd &amp;lt;&amp;lt; EOF&lt;br /&gt;
stop slave;&lt;br /&gt;
SET GTID_NEXT='$GTID_NEXT';&lt;br /&gt;
BEGIN;&lt;br /&gt;
COMMIT;&lt;br /&gt;
SET GTID_NEXT='AUTOMATIC';&lt;br /&gt;
start slave;&lt;br /&gt;
EOF&lt;br /&gt;
echo $Last_SQL_Error&lt;br /&gt;
echo $Executed_Gtid_Set&lt;br /&gt;
echo $GTID_NEXT&lt;br /&gt;
sleep 1&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Problemos ==&lt;br /&gt;
Jai iškyla problemų ar sutrinka replikacija ir reikia ją perkrauti [https://bugs.mysql.com/bug.php?id=72824 pasiskaitom čia] kaip išvengti sunkumų.&lt;br /&gt;
&lt;br /&gt;
= Kiti dalykai =&lt;br /&gt;
&lt;br /&gt;
* [https://www.percona.com/doc/percona-toolkit/2.2/pt-table-checksum.html pt-table-checksum]&lt;br /&gt;
* [http://dev.mysql.com/doc/refman/5.7/en/replication-options-master.html#sysvar_auto_increment_increment rep master increment]&lt;br /&gt;
* [https://www.percona.com/doc/percona-server/5.5/reliability/crash_resistant_replication.html crash resistant replication]&lt;br /&gt;
* [http://dev.mysql.com/doc/refman/5.5/en/replication-howto-rawdata.html mysql replication raw data]&lt;/div&gt;</summary>
		<author><name>\dev\null</name></author>
	</entry>
</feed>