Pythonã§ãã¹ã¿ãŒ/ã¹ã¬ãŒãããŒã¿ããŒã¹ã¬ããªã±ãŒã·ã§ã³ãå®è£ ããŠãããã©ãŒãã³ã¹ãããŒã¿å¯çšæ§ãããã³çœå®³åŸ©æ§ãæ¹åããæ¹æ³ãåŠã³ãŸããäžçäžã®éçºè åãã®å æ¬çãªã¬ã€ãã
PythonããŒã¿ããŒã¹ã¬ããªã±ãŒã·ã§ã³ïŒãã¹ã¿ãŒ/ã¹ã¬ãŒãã¢ãŒããã¯ãã£ã®ç¿åŸ
ããŒã¿ããŒã¹ã¬ããªã±ãŒã·ã§ã³ã¯ãææ°ã®ããŒã¿ç®¡çã«ãããåºæ¬çãªæŠå¿µã§ãããããŒã¿å¯çšæ§ãããã©ãŒãã³ã¹ãããã³çœå®³åŸ©æ§ã確ä¿ããããã«äžå¯æ¬ ã§ãããã®å æ¬çãªã¬ã€ãã§ã¯ãåºã䜿çšãããŠããã¬ããªã±ãŒã·ã§ã³æŠç¥ã§ãããã¹ã¿ãŒ/ã¹ã¬ãŒãã¢ãŒããã¯ãã£ãšãPythonã䜿çšããŠå¹æçã«å®è£ ããæ¹æ³ã«ã€ããŠèª¬æããŸããå ç¢ã§ã¹ã±ãŒã©ãã«ãªããŒã¿ããŒã¹ã·ã¹ãã ãæ§ç¯ããããã®æŠå¿µãå®éã®å®è£ ãå©ç¹ãããã³èæ ®äºé ã«ã€ããŠè©³ãã説æããŸãã
ããŒã¿ããŒã¹ã¬ããªã±ãŒã·ã§ã³ã®çè§£
ããŒã¿ããŒã¹ã¬ããªã±ãŒã·ã§ã³ã«ã¯ãããŒã¿ããŒã¹ã®è€æ°ã®ã³ããŒãäœæããã³ç¶æããããšãå«ãŸããŸãããããã®ã³ããŒïŒã¬ããªã«ïŒã¯ãéåžžãç°ãªããµãŒããŒãå°ççã«åæ£ãããµãŒããŒããŸãã¯åé·æ§ã®ããã«åããµãŒããŒå ã«åæ£ãããŸãããã®åé·æ§ã«ã¯ãããã€ãã®éèŠãªå©ç¹ããããŸãã
- ããã©ãŒãã³ã¹ã®åäžïŒè€æ°ã®ã¬ããªã«ã«èªã¿åãæäœã忣ãããšãåäžã®ããŒã¿ããŒã¹ãµãŒããŒãžã®è² è·ã軜æžãããã¯ãšãªå¿çæéãççž®ãããŸããããã¯ããã©ãã£ãã¯ã®å€ãã¢ããªã±ãŒã·ã§ã³ã§ç¹ã«åœ¹ç«ã¡ãŸãã
- å¯çšæ§ã®åäžïŒãã©ã€ããªããŒã¿ããŒã¹ãµãŒããŒïŒãã¹ã¿ãŒïŒã«é害ãçºçããå Žåãã¬ããªã«ïŒã¹ã¬ãŒãïŒãææ ŒãããŠãããŠã³ã¿ã€ã ãæå°éã«æããç¶ç¶çãªãµãŒãã¹ã確ä¿ã§ããŸãã
- çœå®³åŸ©æ§ïŒå°ççã«å€æ§ãªå Žæã«ããã¬ããªã«ã¯ãèªç¶çœå®³ããã®ä»ã®äºæããªãã€ãã³ããçºçããå Žåã®ããŒã¿æå€±ããä¿è·ããŸãã
- ããŒã¿ã®ããã¯ã¢ãããšãªã«ããªïŒã¬ããªã«ã¯ãããŒã¿ãªã«ããªã®ããã«ããã«å©çšã§ããããã¯ã¢ãããæäŸããŸãã
- ã¹ã±ãŒã©ããªãã£ïŒã¬ããªã±ãŒã·ã§ã³ã䜿çšãããšãè€æ°ã®ãµãŒããŒã«è² è·ã忣ããããšã§ãã·ã¹ãã ã¯ãã倧éã®èªã¿åããªã¯ãšã¹ããåŠçã§ããŸãã
ãã¹ã¿ãŒ/ã¹ã¬ãŒãã¢ãŒããã¯ãã£ã®èª¬æ
ãã¹ã¿ãŒ/ã¹ã¬ãŒãã¢ãŒããã¯ãã£ã¯ãäžè¬çãªã¿ã€ãã®ããŒã¿ããŒã¹ã¬ããªã±ãŒã·ã§ã³ã§ããããã¯ã次ã®2ã€ã®äž»èŠãªåœ¹å²ã§æ§æãããŠããŸãã
- ãã¹ã¿ãŒïŒãã©ã€ããªïŒïŒãã®ãµãŒããŒã¯ããã¹ãŠã®æžãèŸŒã¿æäœïŒINSERTãUPDATEãDELETEïŒãåŠçããŸããããã¯ãããŒã¿ã®ä¿¡é Œã§ãããœãŒã¹ã§ãã
- ã¹ã¬ãŒãïŒã¬ããªã«ïŒïŒãããã®ãµãŒããŒã¯ããã¹ã¿ãŒããããŒã¿ãåä¿¡ãã倿ŽãããŒã«ã«ã³ããŒã«é©çšããŸããéåžžãèªã¿åãæäœãåŠçãããããè² è·åæ£ãšããã©ãŒãã³ã¹ã®åäžãå¯èœã«ãªããŸãã
ãã®ã¢ãŒããã¯ãã£ã§ã¯ããã¹ã¿ãŒããŒã¿ããŒã¹ãä¿¡é Œã§ãããœãŒã¹ã§ããã倿Žã¯ã¹ã¬ãŒãããŒã¿ããŒã¹ã«äŒæãããŸããã¹ã¬ãŒãã¯åžžã«ãã¹ã¿ãŒããã®å€æŽããªãã¹ã³ããããããé©çšããŸããããã«ãããã¹ã¬ãŒãã¯ãã¹ã¿ãŒã®ããŒã¿ã®æŽåæ§ã®ããïŒãã ããæœåšçã«é å»¶ããïŒã³ããŒãæã€ããšãä¿èšŒãããŸãã
äž»ãªç¹åŸŽïŒ
- 1ã€ã®ãã¹ã¿ãŒãè€æ°ã®ã¹ã¬ãŒãïŒéåžžã1ã€ã®ãã¹ã¿ãŒãš1ã€ä»¥äžã®ã¹ã¬ãŒãããããŸãã
- ãã¹ã¿ãŒã§ã®æžãèŸŒã¿æäœïŒãã¹ãŠã®æžãèŸŒã¿æäœã¯ãã¹ã¿ãŒã«éä¿¡ãããŸãã
- ã¹ã¬ãŒãã§ã®èªã¿åãæäœïŒèªã¿åãæäœã¯ã¹ã¬ãŒãéã§åæ£ã§ããŸãã
- éåæã¬ããªã±ãŒã·ã§ã³ïŒã¬ããªã±ãŒã·ã§ã³ã¯éåžžéåæã§ããã€ãŸãããã¹ã¿ãŒã¯ç¶è¡ããåã«ã¹ã¬ãŒãã倿Žã確èªããã®ãåŸ ã¡ãŸãããããã«ãããããããªé å»¶ïŒã¬ããªã±ãŒã·ã§ã³ã©ã°ïŒãçºçããå¯èœæ§ããããŸãã
- ããŒã¿æŽåæ§ïŒã¹ã¬ãŒãã¯æçµçã«ãã¹ã¿ãŒãšæŽåæ§ãåããŸãããæéå·®ãçããå¯èœæ§ããããŸãã
ãã¹ã¿ãŒ/ã¹ã¬ãŒã ã¬ããªã±ãŒã·ã§ã³ã®å©ç¹
ãã¹ã¿ãŒ/ã¹ã¬ãŒã ã¬ããªã±ãŒã·ã§ã³ã«ã¯ããã€ãã®å©ç¹ããããããŸããŸãªã¢ããªã±ãŒã·ã§ã³ã§äººæ°ã®ããéžæè¢ãšãªã£ãŠããŸãã
- èªã¿åãããã©ãŒãã³ã¹ã®åäžïŒè€æ°ã®ã¹ã¬ãŒãã«èªã¿åãæäœã忣ãããšããã¹ã¿ãŒãžã®è² è·ã軜æžãããã¯ãšãªå¿çæéãççž®ãããŸãã
- é«å¯çšæ§ïŒãã¹ã¿ãŒã«é害ãçºçããå Žåãã¹ã¬ãŒããææ ŒãããŠæ°ãããã¹ã¿ãŒã«ããããšãã§ããŸãïŒãã ããããã«ã¯æåã«ããä»å ¥ãŸãã¯èªåãã§ãŒã«ãªãŒããŒã¡ã«ããºã ãå¿ èŠã§ãïŒã
- ããŒã¿ããã¯ã¢ããïŒã¹ã¬ãŒãã¯ããã¹ã¿ãŒã®ããã©ãŒãã³ã¹ã«åœ±é¿ãäžããããšãªããäžè²«æ§ã®ããããã¯ã¢ãããäœæããããã«äœ¿çšã§ããŸãã
- ã¹ã±ãŒã©ããªãã£ïŒã¹ã¬ãŒãã远å ããããšã§ãå¢å ããèªã¿åããã©ãã£ãã¯ãåŠçã§ããŸãã
- çœå®³åŸ©æ§ïŒå°ççã«å€æ§ãªå Žæã«ããã¬ããªã«ã¯ãçœå®³ãçºçããå Žåã®ããŒã¿æå€±ããä¿è·ããŸãã
課é¡ãšèæ ®äºé
ãã¹ã¿ãŒ/ã¹ã¬ãŒãã¢ãŒããã¯ãã£ã«ã¯å€ãã®å©ç¹ããããŸãããç¹å®ã®èª²é¡ããããŸãã
- ã¬ããªã±ãŒã·ã§ã³ã©ã°ïŒã¬ããªã±ãŒã·ã§ã³ã¯éåžžéåæã§ããããããã¹ã¿ãŒã§å€æŽãè¡ãããŠããã¹ã¬ãŒãã«åæ ããããŸã§ã«é å»¶ãçºçããå¯èœæ§ããããŸããããã¯ããªã¢ã«ã¿ã€ã ã®ããŒã¿æŽåæ§ãå¿ èŠãšããã¢ããªã±ãŒã·ã§ã³ã«ãšã£ãŠæžå¿µäºé ãšãªãå¯èœæ§ããããŸãã
- ãã§ãŒã«ãªãŒããŒã®è€éãïŒã¹ã¬ãŒãããã¹ã¿ãŒã«ææ Œãããã«ã¯ãæ éãªèšç»ãšå®è£ ãå¿ èŠã§ããå€ãã®å Žåãæåã«ããä»å ¥ãå¿ èŠã§ãããããŠã³ã¿ã€ã ãå¿ èŠã§ããèªåãã§ãŒã«ãªãŒããŒãœãªã¥ãŒã·ã§ã³ã¯å©çšå¯èœã§ãããè€éããå¢ãå¯èœæ§ããããŸãã
- ããŒã¿æŽåæ§ã®åé¡ïŒã¹ã¬ãŒãã¯ãã¹ã¿ãŒãããé ããŠãããããããŒã¿æŽåæ§ãäžæçã«æãªãããã·ããªãªãçºçããå¯èœæ§ããããŸããã¢ããªã±ãŒã·ã§ã³ã¯ãæœåšçãªäžæŽåãåŠçããããã«èšèšããå¿ èŠããããŸãã
- ãã¹ã¿ãŒã®ã¿ãžã®æžãèŸŒã¿æäœïŒãã¹ãŠã®æžãèŸŒã¿æäœã¯ãã¹ã¿ãŒãééããå¿ èŠããããããæžã蟌ã¿è² è·ãéåžžã«é«ãå Žåãããã«ããã¯ã«ãªãå¯èœæ§ããããŸãã
- ã»ããã¢ãããšç®¡çã®è€éãïŒã¬ããªã±ãŒã·ã§ã³ç°å¢ã®ã»ããã¢ãããšç®¡çã«ã¯ãããŒã¿ããŒã¹ç®¡çã®å°éç¥èãå¿ èŠã§ãã
Pythonã§ã®ãã¹ã¿ãŒ/ã¹ã¬ãŒã ã¬ããªã±ãŒã·ã§ã³ã®å®è£
Pythonã¯ãããŒã¿ããŒã¹ãšã®å¯Ÿè©±ãšãã¹ã¿ãŒ/ã¹ã¬ãŒã ã¬ããªã±ãŒã·ã§ã³ã®å®è£ ã«åªããããŒã«ãæäŸããŸããPostgreSQLãMySQLãªã©ã®äžè¬çãªããŒã¿ããŒã¹ã·ã¹ãã ã§ã®ã¬ããªã±ãŒã·ã§ã³ã®ã»ããã¢ããæ¹æ³ãèŠãŠã¿ãŸããããã³ãŒãäŸã«å ¥ãåã«ã次ã®åææ¡ä»¶ãããããšã確èªããŠãã ããã
- ããŒã¿ããŒã¹ãµãŒããŒïŒ2ã€ä»¥äžã®ããŒã¿ããŒã¹ãµãŒããŒãå¿ èŠã§ãã1ã€ã¯ãã¹ã¿ãŒãšããŠæ©èœãããã1ã€ã¯ã¹ã¬ãŒããšããŠæ©èœããŸãã
- ããŒã¿ããŒã¹ãã©ã€ããŒïŒé©åãªPythonããŒã¿ããŒã¹ãã©ã€ããŒãã€ã³ã¹ããŒã«ããŸãïŒäŸïŒPostgreSQLã®å Žåã¯`psycopg2`ãMySQLã®å Žåã¯`mysql-connector-python`ãŸãã¯`pymysql`ïŒã
- ååãªæš©éïŒããŒã¿ããŒã¹ãŠãŒã¶ãŒãæ¥ç¶ãããŒã¿ãè€è£œããæäœãå®è¡ããããã«å¿ èŠãªæš©éãæã£ãŠããããšã確èªããŸãã
PostgreSQLã®äŸ
PostgreSQLã¯ãçµã¿èŸŒã¿ã®ã¬ããªã±ãŒã·ã§ã³æ©èœãæäŸããŸãããã¹ã¿ãŒãšã¹ã¬ãŒãã«æ¥ç¶ããèªã¿åã/æžãèŸŒã¿æäœãå®è¡ããæ¹æ³ã瀺ããç°¡åãªPythonã®äŸã次ã«ç€ºããŸãã
import psycopg2
# Master Database Configuration
master_host = 'master_db_host'
master_database = 'your_database'
master_user = 'your_user'
master_password = 'your_password'
# Slave Database Configuration
slave_host = 'slave_db_host'
slave_database = 'your_database'
slave_user = 'your_user'
slave_password = 'your_password'
def connect_to_master():
try:
conn = psycopg2.connect(host=master_host, database=master_database, user=master_user, password=master_password)
print("Connected to master database.")
return conn
except psycopg2.Error as e:
print(f"Error connecting to master: {e}")
return None
def connect_to_slave():
try:
conn = psycopg2.connect(host=slave_host, database=slave_database, user=slave_user, password=slave_password)
print("Connected to slave database.")
return conn
except psycopg2.Error as e:
print(f"Error connecting to slave: {e}")
return None
def write_to_master(conn, query, params=None):
if conn is None:
print("Cannot write to master: no connection.")
return
try:
with conn.cursor() as cur:
cur.execute(query, params)
conn.commit()
print("Data written to master.")
except psycopg2.Error as e:
conn.rollback()
print(f"Error writing to master: {e}")
def read_from_slave(conn, query, params=None):
if conn is None:
print("Cannot read from slave: no connection.")
return None
try:
with conn.cursor() as cur:
cur.execute(query, params)
results = cur.fetchall()
return results
except psycopg2.Error as e:
print(f"Error reading from slave: {e}")
return None
# Example Usage
# Establish connections
master_conn = connect_to_master()
slave_conn = connect_to_slave()
# Write to master
if master_conn:
write_query = "INSERT INTO your_table (column1, column2) VALUES (%s, %s)"
write_params = ('value1', 'value2')
write_to_master(master_conn, write_query, write_params)
# Read from slave
if slave_conn:
read_query = "SELECT * FROM your_table"
results = read_from_slave(slave_conn, read_query)
if results:
print("Data read from slave:", results)
# Close connections
if master_conn: master_conn.close()
if slave_conn: slave_conn.close()
PostgreSQLã¬ããªã±ãŒã·ã§ã³ã®éèŠãªæ³šæç¹ïŒ
- è«çã¬ããªã±ãŒã·ã§ã³ãšç©çã¬ããªã±ãŒã·ã§ã³ïŒPostgreSQLã¯ãç©çã¬ããªã±ãŒã·ã§ã³ãšè«çã¬ããªã±ãŒã·ã§ã³ã®äž¡æ¹ãæäŸããŸããç©çã¬ããªã±ãŒã·ã§ã³ã¯ãããŒã¿ã®ãããåäœã®ã³ããŒãäœæããäžè¬çã«é«éã§ããè«çã¬ããªã±ãŒã·ã§ã³ã¯ãç¹å®ã®ããŒãã«ãŸãã¯ããŒãã«ã®ã»ãããã¬ããªã±ãŒãããããæè»æ§ãé«ããŸãïŒããšãã°ãããŒã¿ã®äžéšã®ã¿ãã¬ããªã±ãŒããããªã©ïŒãäžèšã®ã³ãŒãã¯ãåºæ¬çãªæ¥ç¶ãã¬ãŒã ã¯ãŒã¯ã瀺ããŠããŸããå®éã®ãªããªã±ãŒã·ã§ã³æ§æïŒãã¹ã¿ãŒãšã¹ã¬ãŒãã®ã»ããã¢ããïŒã¯ãPythonã³ãŒãã®å€ã§ãPostgreSQLã®æ§æãã¡ã€ã«ãšã³ãã³ãã䜿çšããŠè¡ãããŸãã
- ã¬ããªã±ãŒã·ã§ã³ã®ã»ããã¢ããïŒPostgreSQLã®ã¬ããªã±ãŒã·ã§ã³ã®ã»ããã¢ããã«ã¯ããã¹ã¿ãŒãµãŒããŒãšã¹ã¬ãŒããµãŒããŒã®äž¡æ¹ã§`postgresql.conf`ãš`pg_hba.conf`ã倿Žããããšãå«ãŸããŸããã¹ã¬ãŒãã§ãã¹ã¿ãŒãµãŒããŒã®æ¥ç¶ãã©ã¡ãŒã¿ãŒãå®çŸ©ããæ¥ç¶ããŠããŒã¿ãåæããããã«ã¹ã¬ãŒããæ§æããå¿ èŠããããŸããããã«ã¯ããã¹ã¿ãŒã§`wal_level`ã`replica`ãŸãã¯`logical`ã«èšå®ãã`replication`ãŠãŒã¶ãŒãæ§æããããšãå«ãŸããŸãã
- ãã§ã€ã«ãªãŒããŒïŒèªåãã§ã€ã«ãªãŒããŒã®å®è£ ã«ã¯ã`repmgr`ããã®ä»ã®é«å¯çšæ§ïŒHAïŒãœãªã¥ãŒã·ã§ã³ãªã©ã®è¿œå ã®ã³ã³ããŒãã³ããšæ§æãå¿ èŠã§ãã
- ç£èŠïŒæœåšçãªåé¡ãç¹å®ããããã«ãã¬ããªã±ãŒã·ã§ã³ã©ã°ãç£èŠããŸããPostgreSQLã¯ãã¬ããªã±ãŒã·ã§ã³ã¹ããŒã¿ã¹ãç£èŠããããã®`pg_stat_replication`ãªã©ã®ããŒã«ãæäŸããŸãã
MySQLã®äŸ
MySQLãçµã¿èŸŒã¿ã®ã¬ããªã±ãŒã·ã§ã³æ©èœãæäŸããŸãã`mysql-connector-python`ã©ã€ãã©ãªã䜿çšããåæ§ã®Pythonã®äŸã次ã«ç€ºããŸãã`pip install mysql-connector-python`ã䜿çšããŠã©ã€ãã©ãªãã€ã³ã¹ããŒã«ããããšãå¿ããªãã§ãã ããã
import mysql.connector
# Master Database Configuration
master_host = 'master_db_host'
master_database = 'your_database'
master_user = 'your_user'
master_password = 'your_password'
# Slave Database Configuration
slave_host = 'slave_db_host'
slave_database = 'your_database'
slave_user = 'your_user'
slave_password = 'your_password'
def connect_to_master():
try:
conn = mysql.connector.connect(host=master_host, database=master_database, user=master_user, password=master_password)
print("Connected to master database.")
return conn
except mysql.connector.Error as e:
print(f"Error connecting to master: {e}")
return None
def connect_to_slave():
try:
conn = mysql.connector.connect(host=slave_host, database=slave_database, user=slave_user, password=slave_password)
print("Connected to slave database.")
return conn
except mysql.connector.Error as e:
print(f"Error connecting to slave: {e}")
return None
def write_to_master(conn, query, params=None):
if conn is None:
print("Cannot write to master: no connection.")
return
try:
with conn.cursor() as cur:
cur.execute(query, params)
conn.commit()
print("Data written to master.")
except mysql.connector.Error as e:
conn.rollback()
print(f"Error writing to master: {e}")
def read_from_slave(conn, query, params=None):
if conn is None:
print("Cannot read from slave: no connection.")
return None
try:
with conn.cursor() as cur:
cur.execute(query, params)
results = cur.fetchall()
return results
except mysql.connector.Error as e:
print(f"Error reading from slave: {e}")
return None
# Example Usage
# Establish connections
master_conn = connect_to_master()
slave_conn = connect_to_slave()
# Write to master
if master_conn:
write_query = "INSERT INTO your_table (column1, column2) VALUES (%s, %s)"
write_params = ('value1', 'value2')
write_to_master(master_conn, write_query, write_params)
# Read from slave
if slave_conn:
read_query = "SELECT * FROM your_table"
results = read_from_slave(slave_conn, read_query)
if results:
print("Data read from slave:", results)
# Close connections
if master_conn: master_conn.close()
if slave_conn: slave_conn.close()
MySQLã¬ããªã±ãŒã·ã§ã³ã®éèŠãªæ³šæç¹ïŒ
- ã¬ããªã±ãŒã·ã§ã³ã®æ§æïŒMySQLã¬ããªã±ãŒã·ã§ã³ã®ã»ããã¢ããã«ã¯ãéåžžãMySQLæ§æãã¡ã€ã«ïŒ`my.cnf`ãŸãã¯`my.ini`ïŒãä»ããŠãã¹ã¿ãŒãšã¹ã¬ãŒããæ§æããã¹ã¬ãŒãã§`CHANGE MASTER TO`ã³ãã³ãã䜿çšããŠãã¹ã¿ãŒã®æ¥ç¶è©³çްãæå®ããããšãå«ãŸããŸãããã®ããã»ã¹ã¯ãPythonã³ãŒããå®è¡ãããåã«å®è¡ãããŸãã
- ãã€ããªãã®ã³ã°ïŒbinlogïŒïŒãã¹ã¿ãŒãµãŒããŒã§ã¯ã倿Žã远跡ããããã«ãã€ããªãã®ã³ã°ãæå¹ã«ããå¿ èŠããããŸããããã¯ãMySQLã¬ããªã±ãŒã·ã§ã³ã®åºæ¬çãªèŠä»¶ã§ããMySQLæ§æã§`log_bin`ãæå¹ã«ãªã£ãŠããããšã確èªããŠãã ããã
- ã¬ããªã±ãŒã·ã§ã³ãŠãŒã¶ãŒïŒãã¹ã¿ãŒãµãŒããŒã§ã¬ããªã±ãŒã·ã§ã³ãŠãŒã¶ãŒãäœæãããã®ãŠãŒã¶ãŒã«`REPLICATION SLAVE`æš©éãä»äžããå¿ èŠããããŸãããã®ãŠãŒã¶ãŒã¯ãã¹ã¬ãŒãããã¹ã¿ãŒããæ¥ç¶ããŠå€æŽãåä¿¡ããããã«äœ¿çšãããŸãã
- ãã§ã€ã«ãªãŒããŒïŒPostgreSQLãšåæ§ã«ãMySQLã§èªåãã§ã€ã«ãªãŒããŒãå®è£ ããã«ã¯ã`MHA`ïŒMySQL HA ManagerïŒãŸãã¯`Percona XtraDB Cluster`ãªã©ã®å°çšãœãªã¥ãŒã·ã§ã³ãå¿ èŠã§ãã
- æºåæã¬ããªã±ãŒã·ã§ã³ïŒMySQLã¯ãããŒã¿æŽåæ§ãåäžãããæºåæã¬ããªã±ãŒã·ã§ã³ãæäŸããŸããæºåæã¬ããªã±ãŒã·ã§ã³ã§ã¯ããã¹ã¿ãŒã¯ãã©ã³ã¶ã¯ã·ã§ã³ãã³ãããããåã«ãå°ãªããšã1ã€ã®ã¹ã¬ãŒãããã®ç¢ºèªãåŸ ã¡ãŸããããã«ããããã¹ã¿ãŒã«é害ãçºçããå Žåã®ããŒã¿æå€±ã®ãªã¹ã¯ã軜æžãããŸãã
- ã°ããŒãã«ãã©ã³ã¶ã¯ã·ã§ã³èå¥åïŒGTIDïŒïŒGTIDã¯ãã¬ããªã±ãŒã·ã§ã³ã管çããããã®ããè¿ä»£çã§ä¿¡é Œæ§ã®é«ãæ¹æ³ã§ãããã©ã³ã¶ã¯ã·ã§ã³ããšã«ã°ããŒãã«ã«äžæã®èå¥åãæäŸãããç¹ã«ãã§ã€ã«ãªãŒããŒæã®ã¬ããªã±ãŒã·ã§ã³ç®¡çãç°¡çŽ åãããŸãã
PythonããŒã¿ããŒã¹ã¬ããªã±ãŒã·ã§ã³ã®ãã¹ããã©ã¯ãã£ã¹
ããŒã¿ããŒã¹ã¬ããªã±ãŒã·ã§ã³ã广çã«å®è£ ããã«ã¯ããã¹ããã©ã¯ãã£ã¹ãæ éã«æ€èšããå¿ èŠããããŸãã
- é©åãªã¬ããªã±ãŒã·ã§ã³æŠç¥ãéžæããïŒãã¹ã¿ãŒ/ã¹ã¬ãŒãã¯è¯ãåºçºç¹ã§ãããä»ã®ãªãã·ã§ã³ïŒãã«ããã¹ã¿ãŒãã¯ã©ã¹ã¿ãªã³ã°ãªã©ïŒãç¹å®ã®ããŒãºã«é©ããŠããå ŽåããããŸããéžæã¯ãããŒã¿æŽåæ§ã®èŠä»¶ãæžã蟌ã¿è² è·ãããŠã³ã¿ã€ã ã®èš±å®¹åºŠãªã©ã®èŠçŽ ã«ãã£ãŠç°ãªããŸãã
- ã¬ããªã±ãŒã·ã§ã³ã©ã°ãç£èŠããïŒãã¹ã¿ãŒãšã¹ã¬ãŒãéã®ã¬ããªã±ãŒã·ã§ã³ã©ã°ãç¶ç¶çã«ç£èŠããŸããããŒã¿ããŒã¹åºæã®ããŒã«ïŒPostgreSQLã®`pg_stat_replication`ãMySQLã®ç£èŠããŒã«ãªã©ïŒã䜿çšããŠã©ã°ã远跡ããæœåšçãªåé¡ãç¹å®ããŸããã©ã°ã蚱容ã§ãããããå€ãè¶ ããå Žåã«éç¥ããããã«ã¢ã©ãŒããèšå®ããŸãã
- èªåãã§ãŒã«ãªãŒããŒãå®è£ ããïŒå¿ èŠãªå ŽåïŒïŒé«å¯çšæ§ãéèŠãªå Žåã¯ãèªåãã§ãŒã«ãªãŒããŒã¡ã«ããºã ãå®è£ ããŸããããã«ã¯ãããŒã¿ããŒã¹ã·ã¹ãã ã«åºæã®ããŒã«ãŸãã¯ãµãŒãããŒãã£ãœãªã¥ãŒã·ã§ã³ã®äœ¿çšãå«ãŸããå ŽåããããŸããè€éãã®å¢å ãªã©ãé¢ä¿ãããã¬ãŒããªããæ€èšããŠãã ããã
- 宿çãªããã¯ã¢ããïŒãã¹ã¿ãŒãšã¹ã¬ãŒããå«ãããŒã¿ããŒã¹ã宿çã«ããã¯ã¢ããããŸããããã¯ã¢ãããšåŸ©å ã®æé ããã¹ãããŠãããŒã¿ã®æŽåæ§ãšåŸ©æ§å¯èœæ§ã確ä¿ããŸãã
- ã»ãã¥ãªãã£ïŒããŒã¿ããŒã¹ãµãŒããŒãšã¬ããªã±ãŒã·ã§ã³æ¥ç¶ãä¿è·ããŸãã匷åãªãã¹ã¯ãŒãã䜿çšãã転éäžã®ããŒã¿ãæå·åããèš±å¯ããããŠãŒã¶ãŒãžã®ã¢ã¯ã»ã¹ãå¶éããŸãã
- æ¥ç¶ããŒãªã³ã°ïŒPythonã³ãŒãã§æ¥ç¶ããŒãªã³ã°ã䜿çšããŠãããŒã¿ããŒã¹æ¥ç¶ãæé©åããŸããæ¥ç¶ããŒãªã³ã°ã¯æ¢åã®æ¥ç¶ãåå©çšããæ°ããæ¥ç¶ã®ç¢ºç«ã®ãªãŒããŒããããåæžããŸãã
- ã¬ããªã±ãŒã·ã§ã³ã®ç«¶åãåŠçããïŒæœåšçãªã¬ããªã±ãŒã·ã§ã³ã®ç«¶åãçè§£ããŠå¯ŸåŠããŸãããã¹ã¿ãŒãšã¹ã¬ãŒãã®äž¡æ¹ã§ããŒã¿ãåæã«å€æŽãããå Žåãç«¶åãçºçããå¯èœæ§ããããŸããç«¶å解決ã¡ã«ããºã ãå®è£ ããå¿ èŠãããå ŽåããããŸãã
- 培åºçã«ãã¹ãããïŒã¬ããªã±ãŒã·ã§ã³ã®ã»ããã¢ããã培åºçã«ãã¹ãããŸãããã§ãŒã«ãªãŒããŒã·ããªãªãã·ãã¥ã¬ãŒãããããŒã¿æŽåæ§ããã¹ãããã¢ããªã±ãŒã·ã§ã³ãããŸããŸãªæ¡ä»¶äžã§æ£ããæ©èœããããšã確èªããŸãã
- ãã¹ãŠãææžåããïŒæ§æã®è©³çްãã¹ã¯ãªãããæé ãªã©ãã¬ããªã±ãŒã·ã§ã³ã®ã»ããã¢ãããææžåããŸãããã®ããã¥ã¡ã³ãã¯ããã©ãã«ã·ã¥ãŒãã£ã³ã°ãã¡ã³ããã³ã¹ãããã³çœå®³åŸ©æ§ã«äžå¯æ¬ ã§ãã
- ãã©ã³ã¶ã¯ã·ã§ã³åé¢ã¬ãã«ãæ€èšããïŒã¹ã¬ãŒãããèªã¿åãå Žåã¯ããã©ã³ã¶ã¯ã·ã§ã³åé¢ã¬ãã«ã«æ³šæããŠãã ãããããŒã¿æŽåæ§ã確ä¿ããããããŸãã¯æœåšçãªã¬ããªã±ãŒã·ã§ã³ã©ã°ãåŠçããããã«ãåé¢ã¬ãã«ã調æŽããå¿ èŠãããå ŽåããããŸãã
- ããŒã¿ããŒã¹åºæã®ãã¥ãŒãã³ã°ïŒç¹å®ã®ããŒã¿ããŒã¹ã·ã¹ãã ïŒPostgreSQLãMySQLãªã©ïŒãšäºæ³ãããã¯ãŒã¯ããŒãã«åºã¥ããŠããŒã¿ããŒã¹æ§æãæé©åããŸããããã«ã¯ããããã¡ãŒãµã€ãºãæ¥ç¶å¶éãããã³ãã®ä»ã®ãã©ã¡ãŒã¿ãŒã®èª¿æŽãå«ãŸããå ŽåããããŸããæšå¥šäºé ã«ã€ããŠã¯ãããŒã¿ããŒã¹ã®ããã¥ã¡ã³ããåç §ããŠãã ããã
- å°ççãªèæ ®äºé ïŒå°ççãªãªãŒãžã§ã³éã§ã¬ããªã±ãŒãããå Žåã¯ããããã¯ãŒã¯ã¬ã€ãã³ã·ãã¬ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ã«äžãã圱é¿ãèæ ®ããŠãã ãããè·é¢ã¯ã¬ããªã±ãŒã·ã§ã³ã©ã°ãå€§å¹ ã«å¢å ãããå¯èœæ§ããããŸããã¬ã€ãã³ã·ãæå°éã«æããã¬ããªã±ãŒã·ã§ã³æŠç¥ãšãããã¯ãŒã¯æ§æãéžæããŸãã
- ã¹ã±ãŒã©ããªãã£ã®èšç»ïŒå°æ¥ã®æé·ãèšç»ããŸãããã©ãã£ãã¯ãšããŒã¿éã®å¢å ãäºæž¬ããŸããã¹ã¬ãŒãã远å ããŠãè² è·ã®å¢å ã«å¯Ÿå¿ããããã«ã¬ããªã±ãŒã·ã§ã³ã¢ãŒããã¯ãã£ãèšèšããŸããåæã¯ãšãªããã®ä»ã®èªã¿åãéçŽåã®æäœã«ã¯ãèªã¿åãã¬ããªã«ã䜿çšããããšãæ€èšããŠãã ããã
é«åºŠãªæŠå¿µ
åºæ¬ãè¶ ããŠãæ€èšãã¹ãé«åºŠãªãããã¯ã次ã«ç€ºããŸãã
- ãã«ããã¹ã¿ãŒã¬ããªã±ãŒã·ã§ã³ïŒäžéšã®ã·ããªãªã§ã¯ãè€æ°ã®ããŒã¿ããŒã¹ã€ã³ã¹ã¿ã³ã¹ãžã®æžã蟌ã¿ãèš±å¯ããå ŽåããããŸããããã¯ããã«ããã¹ã¿ãŒã¬ããªã±ãŒã·ã§ã³ãšåŒã°ããŸããæ éãªèšç»ãå¿ èŠã§ãããæœåšçãªç«¶åãåŠçããããã®ç«¶å解決æŠç¥ãå«ãŸããããšããããããŸãã
- ã¯ã©ã¹ã¿ãªã³ã°ïŒã¯ã©ã¹ã¿ãªã³ã°ã«ã¯ãè€æ°ã®ãµãŒããŒã«ããŒã¿ã忣ããèªåãã§ãŒã«ãªãŒããŒãæäŸããããšãå«ãŸããŸããäŸãšããŠã¯ãPostgreSQLã¯ã©ã¹ã¿ãŒïŒããšãã°ã`pgpool-II`ãªã©ã®ããŒã«ã䜿çšïŒãMySQLã¯ã©ã¹ã¿ãŒïŒããšãã°ã`Galera`ã䜿çšïŒããããŸãã
- ç«¶å解決ïŒè€æ°ã®ã©ã€ã¿ãŒãé¢äžããŠããå ŽåïŒããšãã°ããã«ããã¹ã¿ãŒã¬ããªã±ãŒã·ã§ã³ïŒãçºçããå¯èœæ§ã®ããç«¶åã解決ããããã®ã¡ã«ããºã ãå®è£ ããŸããææ³ã«ã¯ãã¿ã€ã ã¹ã¿ã³ãããŒã¹ã®ç«¶å解決ãæçµæžã蟌ã¿ã®åªå ãããã³ã«ã¹ã¿ã ç«¶åãã³ãã©ãŒãå«ãŸããŸãã
- ããŒã¿ããŒãã£ã·ã§ãã³ã°ïŒã·ã£ãŒãã£ã³ã°ïŒïŒéåžžã«å€§èŠæš¡ãªããŒã¿ã»ããã®å Žåã¯ãè€æ°ã®ããŒã¿ããŒã¹ã«ããŒã¿ãããŒãã£ã·ã§ãã³ã°ããããšãæ€èšããŠãã ãããããã«ãããã¹ã±ãŒã©ããªãã£ãåäžããããã©ãŒãã³ã¹ãåäžããŸãã
- æ¥ç¶æååã®æ§æïŒç°å¢å€æ°ãŸãã¯æ§æãã¡ã€ã«ã䜿çšããŠããŒã¿ããŒã¹æ¥ç¶æååã管çããã³ãŒãã倿Žããã«ããŸããŸãªç°å¢ïŒéçºããã¹ããæ¬çªãªã©ïŒã管çããããããŸãã
- éåæã¿ã¹ã¯ãšã¡ãã»ãŒãžãã¥ãŒïŒéåæã¿ã¹ã¯ïŒããšãã°ãCeleryãªã©ã®ããŒã«ã䜿çšïŒãšã¡ãã»ãŒãžãã¥ãŒïŒããšãã°ãRabbitMQãKafkaïŒã䜿çšããŠãæéã®ãããããŒã¿ããŒã¹æäœããªãããŒããããã¹ã¿ãŒãµãŒããŒãžã®è² è·ã軜æžããŸãã
- ããŒã¿ããŒã¹ã¹ããŒãã®èšèšïŒå¹ççãªã¬ããªã±ãŒã·ã§ã³ã«ã¯ãé©åãªããŒã¿ããŒã¹ã¹ããŒãã®èšèšãäžå¯æ¬ ã§ããã¬ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ã劚ããå¯èœæ§ã®ãããéåžžã«å€§ããªããŒãã«ãè€éãªã¯ãšãªã¯é¿ããŠãã ããã
å®éã®äŸãšãŠãŒã¹ã±ãŒã¹
ããŒã¿ããŒã¹ã¬ããªã±ãŒã·ã§ã³ã¯ãããŸããŸãªæ¥çããã³ã¢ããªã±ãŒã·ã§ã³ã§åºã䜿çšãããŠããŸããæ¬¡ã«ããã€ãã®äŸã瀺ããŸãã
- Eã³ããŒã¹ïŒEã³ããŒã¹ãã©ãããã©ãŒã ã¯ãé«èªã¿åããã©ãã£ãã¯ïŒè£œåãªã¹ãããã©ãŠãžã³ã°ã顧客ã¢ã«ãŠã³ãïŒãåŠçããªãããããŒã¿æŽåæ§ã確ä¿ããããã«ã¬ããªã±ãŒã·ã§ã³ã䜿çšããŸããå€ãã®å Žåããã¹ã¿ãŒãæžãèŸŒã¿æäœïŒæ³šæã補åã®æŽæ°ïŒã«äœ¿çšããã¹ã¬ãŒããèªã¿åãæäœã«äœ¿çšããŸãã
- ãœãŒã·ã£ã«ã¡ãã£ã¢ïŒãœãŒã·ã£ã«ã¡ãã£ã¢ãã©ãããã©ãŒã ã¯ãã¹ã±ãŒã©ããªãã£ãšé«å¯çšæ§ã®ããã«ã¬ããªã±ãŒã·ã§ã³ã«äŸåããŠããŸããã¬ããªã±ãŒã·ã§ã³ã䜿çšãããšãæ°çŸäžäººã®ãŠãŒã¶ãŒãšå€§éã®ããŒã¿ãåŠçã§ããŸããèªã¿åãæäœïŒãã¥ãŒã¹ãã£ãŒãããŠãŒã¶ãŒãããã¡ã€ã«ïŒã¯ãå€ãã®å Žåãã¹ã¬ãŒãã«ãã£ãŠåŠçãããŸãã
- ã³ã³ãã³ãé ä¿¡ãããã¯ãŒã¯ïŒCDNïŒïŒCDNã¯ãããŒã¿ããŒã¹ã¬ããªã±ãŒã·ã§ã³ã䜿çšããŠãã³ã³ãã³ããšãŠãŒã¶ãŒããŒã¿ãå°ççã«åæ£ãããµãŒããŒéã§ã¬ããªã±ãŒãããŸããããã«ãããã³ã³ãã³ãããŠãŒã¶ãŒã«è¿ã¥ããããšã§ããã©ãŒãã³ã¹ãåäžããŸãã
- éèãµãŒãã¹ïŒéèæ©é¢ã¯ãããŒã¿ã®æŽåæ§ãšå¯çšæ§ã確ä¿ããããã«ã¬ããªã±ãŒã·ã§ã³ãå©çšããŠããŸããããŒã¿ã®åé·æ§ã¯ãçœå®³åŸ©æ§ãšäºæ¥ç¶ç¶ã«äžå¯æ¬ ã§ãã
- ã²ãŒã ïŒãªã³ã©ã€ã³ã²ãŒã ã¯ã¬ããªã±ãŒã·ã§ã³ãå©çšããŠããã¬ãŒã€ãŒããŒã¿ãšã²ãŒã ã®ç¶æ ãè€æ°ã®ãµãŒããŒéã§åæããã·ãŒã ã¬ã¹ãªã²ãŒã ãšã¯ã¹ããªãšã³ã¹ããµããŒãããŸãã
- ã°ããŒãã«ã¢ããªã±ãŒã·ã§ã³ïŒã°ããŒãã«ãªãã¬ãŒã³ã¹ãæã€çµç¹ã¯ã¬ããªã±ãŒã·ã§ã³ã䜿çšããŠããŠãŒã¶ãŒã®è¿ãã«ããŒã¿ãä¿åããã¬ã€ãã³ã·ãåæžããããã©ãŒãã³ã¹ãåäžãããŸããããšãã°ããã³ãã³ãæ±äº¬ããµã³ããŠãã«ãªãã£ã¹ãããäŒæ¥ã¯ããããã®åå Žæã®ãµãŒããŒã«ããŒã¿ããŒã¹ãã¬ããªã±ãŒãããå ŽåããããŸãã
äŸïŒã°ããŒãã«Eã³ããŒã¹ãã©ãããã©ãŒã
ã°ããŒãã«Eã³ããŒã¹ãã©ãããã©ãŒã ã¯ãã¡ã€ã³ã®ããŒã¿ã»ã³ã¿ãŒã«ãã¹ã¿ãŒããŒã¿ããŒã¹ããç°ãªãå°åã«ã¹ã¬ãŒãããŒã¿ããŒã¹ãé 眮ãããã¹ã¿ãŒ/ã¹ã¬ãŒãã¢ãŒããã¯ãã£ã䜿çšã§ããŸãããšãŒãããã®é¡§å®¢ã¯ãšãŒãããã®ã¹ã¬ãŒãããŒã¿ããŒã¹ã«ã¢ã¯ã»ã¹ããã¢ãžã¢ã®é¡§å®¢ã¯ã¢ãžã¢ã®ã¹ã¬ãŒãããŒã¿ããŒã¹ã«ã¢ã¯ã»ã¹ããŸããæ³šæåŠçãšè£œåã®æŽæ°ã¯ãã¹ã¿ãŒã«ãã£ãŠåŠçããããã®åŸã倿Žãã¹ã¬ãŒãã«ã¬ããªã±ãŒããããŸããããã«ãããäžçäžã®é¡§å®¢ã®ã¬ã€ãã³ã·ãççž®ãããå°åçãªåæ¢ã«å¯Ÿããå埩åãåäžããŸãã
çµè«
ãã¹ã¿ãŒ/ã¹ã¬ãŒã ã¬ããªã±ãŒã·ã§ã³ã¯ãå ç¢ã§ã¹ã±ãŒã©ãã«ããã€é«å¯çšæ§ã®ããŒã¿ããŒã¹ã·ã¹ãã ãæ§ç¯ããããã®åŒ·åãªææ³ã§ããPythonã¯ããã®æ±çšæ§ã®é«ãããŒã¿ããŒã¹ãã©ã€ããŒã«ãããã¬ããªã±ãŒã·ã§ã³æŠç¥ã®å®è£ ãšç®¡çã«æé©ãªç°å¢ãæäŸããŸãããã®ã¬ã€ãã§èª¬æããæŠå¿µããã¹ããã©ã¯ãã£ã¹ãããã³èæ ®äºé ãçè§£ããããšã§ããã¹ã¿ãŒ/ã¹ã¬ãŒã ã¬ããªã±ãŒã·ã§ã³ã广çã«å®è£ ããŠãã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãä¿¡é Œæ§ãããã³å埩åãåäžãããããšãã§ããŸããç¹å®ã®ããŒãºã«æé©ãªã¬ããªã±ãŒã·ã§ã³æŠç¥ãéžæããã·ã¹ãã ãç¶¿å¯ã«ç£èŠããæé«ã®ããã©ãŒãã³ã¹ãåŸãããã«æ§æãç¶ç¶çã«æé©åããããšãå¿ããªãã§ãã ãããæ éãªèšç»ãšå®è¡ã«ãããããŒã¿ããŒã¹ ã¬ããªã±ãŒã·ã§ã³ã®å©ç¹ã掻çšããŠãã°ããŒãã«ãªãŒãã£ãšã³ã¹ã®èŠæ±ã«å¯Ÿå¿ã§ãããå埩åããããã¹ã±ãŒã©ãã«ãªã€ã³ãã©ã¹ãã©ã¯ãã£ãæ§ç¯ã§ããŸãã