Artikel ini membawa anda pengetahuan yang berkaitan tentang mysql Ia terutamanya memperkenalkan isu yang berkaitan dengan teknologi replikasi MySQL, termasuk replikasi tak segerak, replikasi separa segerak, dll. Mari kita bincangkan bersama-sama. membantu semua orang.
Pembelajaran yang disyorkan: tutorial video mysql
Dalam replikasi asynchronous (replikasi async), Master tidak perlu mengambil berat sama ada Slave menerima log binari, jadi Master tidak mempunyai sebarang pergantungan pada Slave. Anda boleh menganggap Master dan Slave sebagai dua pelayan yang berfungsi secara bebas, dan data akhirnya akan konsisten melalui log binari.
Replikasi tak segerak mempunyai prestasi terbaik kerana ia hampir tiada overhed pada pangkalan data itu sendiri, melainkan kelewatan induk-hamba adalah sangat besar dan Benang Dump perlu membaca sejumlah besar fail log binari.
Jika perniagaan tidak mempunyai keperluan yang tinggi untuk ketekalan data dan boleh bertolak ansur dengan kehilangan data apabila kegagalan berlaku, atau kerugian yang besar, adalah disyorkan untuk menggunakan replikasi tak segerak, yang mempunyai prestasi terbaik (contohnya, seperti Walaupun perniagaan seperti Weibo mempunyai keperluan prestasi yang sangat tinggi, kehilangan data biasanya boleh diterima). Tetapi selalunya sistem perniagaan teras paling mementingkan keselamatan data, seperti perkhidmatan pemantauan dan sistem penggera.
Perancangan persekitaran replikasi tak segerak:
master (docker), port 3310
slave (docker), port 3311
Fail konfigurasi my.cnf
$ sudo cat /home/mysql/docker-data/3311/conf/my.cnf # For advice on how to change settings please see # http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html [mysqld] # # Remove leading # and set to the amount of RAM for the most important data # cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%. # innodb_buffer_pool_size = 128M # # Remove leading # to turn on a very important data integrity option: logging # changes to the binary log between backups. # log_bin # # Remove leading # to set options mainly useful for reporting servers. # The server defaults are faster for transactions and fast SELECTs. # Adjust sizes as needed, experiment to find the optimal values. # join_buffer_size = 128M # sort_buffer_size = 2M # read_rnd_buffer_size = 2M #datadir=/home/mysql/docker-data/3307/data #socket=/home/mysql/docker-data/3307/mysql.sock character_set_server=utf8 init_connect='SET NAMES utf8' # Disabling symbolic-links is recommended to prevent assorted security risks symbolic-links=0 #log-error=/home/mysql/docker-data/3307/logs/mysqld.log #pid-file=/home/mysql/docker-data/3307/mysqld.pid lower_case_table_names=1 # 表名是否小写 server-id=1403311 log-bin=mysql-bin # 开启binlog binlog-format=ROW # binlog的格式 auto_increment_increment=1 # 自增的步长,适用于主主复制,为了避免id冲突,步长设置为master的个数 auto_increment_offset=1 # 自增的偏移,主主复制每个master的偏移需要不一致 # binlog-do-db=mstest # 要同步的数据库 # binlog-ignore-db=mysql # 要忽略的数据库 #rpl_semi_sync_master_enabled=1 #rpl_semi_sync_master_timeout=10000
Mulakan mysql:
$ docker run --name mysql3310 -p 3310:3306 --privileged=true -ti -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=order -e MYSQL_USER=user -e MYSQL_PASSWORD=pass -v /home/mysql/docker-data/3310/conf:/etc/mysql/conf.d -v /home/mysql/docker-data/3310/data/:/var/lib/mysql -v /home/mysql/docker-data/3310/logs/:/var/log/mysql -d mysql:5.7
Buat untuk pengguna Disegerakkan :
mysql> GRANT REPLICATION SLAVE,FILE,REPLICATION CLIENT ON *.* TO 'repluser'@'%' IDENTIFIED BY '123456'; Query OK, 0 rows affected, 1 warning (0.01 sec) mysql> FLUSH PRIVILEGES; Query OK, 0 rows affected (0.01 sec)
Lihat log binari tuan pada tuan:
mysql> show master status; +------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+-------------------+ | mysql-bin.000003 | 1147 | | | | +------------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec)
Lihat senarai proses pada tuan:
mysql> show processlist; +----+----------+------------------+-------+-------------+------+---------------------------------------------------------------+------------------+ | Id | User | Host | db | Command | Time | State | Info | +----+----------+------------------+-------+-------------+------+---------------------------------------------------------------+------------------+ | 2 | root | localhost | order | Query | 0 | starting | show processlist | | 6 | repluser | 172.17.0.1:48450 | NULL | Binlog Dump | 448 | Master has sent all binlog to slave; waiting for more updates | NULL | +----+----------+------------------+-------+-------------+------+---------------------------------------------------------------+------------------+ 2 rows in set (0.00 sec)
Fail konfigurasi my.cnf adalah konsisten dengan konfigurasi induk, kecuali medan id pelayan mestilah unik.
Mulakan mysql:
$ docker run --name mysql3311 -p 3311:3306 --privileged=true -ti -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=order -e MYSQL_USER=user -e MYSQL_PASSWORD=pass -v /home/mysql/docker-data/3311/conf:/etc/mysql/conf.d -v /home/mysql/docker-data/3311/data/:/var/lib/mysql -v /home/mysql/docker-data/3311/logs/:/var/log/mysql -d mysql:5.7
Tetapkan maklumat induk dalam hamba:
# master_log_file和master_log_pos取上面show master status显示的值mysql> change master to master_host='172.23.252.98',master_port=3310,master_user='repluser',master_password='123456',master_log_file='mysql-bin.000003',master_log_pos=1147;
Mulakan hamba, mulakan benang SQL dan IO:
mysql> start slave;Query OK, 0 rows affected (0.00 sec)
Semak status hamba:
mysql> show slave status\G;*************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.54.214 Master_User: repluser Master_Port: 3310 Connect_Retry: 60 Master_Log_File: mysql-bin.000003 Read_Master_Log_Pos: 1147 Relay_Log_File: 2da789531bf3-relay-bin.000002 Relay_Log_Pos: 320 Relay_Master_Log_File: mysql-bin.000003 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 1147 Relay_Log_Space: 534 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 0Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 1403311 Master_UUID: cd2eaa0a-7a59-11ec-b3b4-0242ac110002 Master_Info_File: /var/lib/mysql/master.info SQL_Delay: 0 SQL_Remaining_Delay: NULL Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates Master_Retry_Count: 86400 Master_Bind: Last_IO_Error_Timestamp: Last_SQL_Error_Timestamp: Master_SSL_Crl: Master_SSL_Crlpath: Retrieved_Gtid_Set: Executed_Gtid_Set: Auto_Position: 0 Replicate_Rewrite_DB: Channel_Name: Master_TLS_Version:1 row in set (0.00 sec)
Hanya data baharu akan disalin dan data sedia ada perlu disegerakkan secara manual menggunakan alatan (seperti mysqldump).
Lihat senarai proses pada hamba:
mysql> show processlist; +----+-------------+-----------+-------+---------+------+--------------------------------------------------------+------------------+ | Id | User | Host | db | Command | Time | State | Info | +----+-------------+-----------+-------+---------+------+--------------------------------------------------------+------------------+ | 4 | root | localhost | order | Query | 0 | starting | show processlist | | 7 | system user | | NULL | Connect | 533 | Waiting for master to send event | NULL | | 8 | system user | | NULL | Connect | 127 | Slave has read all relay log; waiting for more updates | NULL | +----+-------------+-----------+-------+---------+------+--------------------------------------------------------+------------------+ 3 rows in set (0.00 sec)
Replikasi separa segerak ialah separa segerak replikasi segerak sebelum MySQL 5.7 Mekanisme replikasi segerak.
Replikasi separa segerak memerlukan semasa proses penyerahan transaksi Master, sekurang-kurangnya N Slaves menerima log binari Ini memastikan bahawa apabila Master turun, terdapat sekurang-kurangnya N Hamba Data dalam pelayan telah lengkap.
Replikasi separuh segerak bukan fungsi terbina dalam MySQL Sebaliknya, anda perlu memasang pemalam separa segerak, dayakan fungsi replikasi separa segerak dan sediakan N hamba untuk menerima binari. log berjaya.
Kelemahan: Katakan pengguna1 memasukkan sekeping data dalam pangkalan data utama dan sedang menunggu data dikembalikan. Pengguna2 boleh menanyakan data ini pada masa ini data ini, mengakibatkan fenomena yang serupa dengan bacaan hantu.
Replikasi separa segerak yang dipertingkatkan menyelesaikan kekurangan replikasi separa segerak TUNGGU dan ACK berlaku sebelum transaksi dilakukan, supaya walaupun jika Hamba tidak menerima Log perduaan, tetapi Master tidak berfungsi Memandangkan transaksi terakhir belum diserahkan, data itu sendiri tidak dapat dilihat oleh dunia luar, dan tidak ada masalah kehilangan.
Oleh itu, bagi mana-mana perniagaan yang mempunyai keperluan ketekalan data, seperti perniagaan pesanan teras e-dagang, perbankan, insurans, sekuriti dan perniagaan lain yang berkait rapat dengan dana, pastikan anda menggunakan replikasi separa segerak Dipertingkat. Dengan cara ini, data adalah selamat dan terjamin Walaupun terdapat masa henti, mesin hamba akan mempunyai salinan data yang lengkap.
Persekitaran replikasi separa segerak yang dipertingkatkan adalah berdasarkan replikasi tak segerak.
Pasang pemalam Adalah disyorkan untuk memasangnya pada kedua-dua induk dan hamba, kerana akan berlaku situasi penukaran induk-hamba:
# master mysql> install plugin rpl_semi_sync_master soname 'semisync_master.so'; # slave mysql> install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
Pastikan pemalam. berjaya dipasang:
mysql> show plugins; ... ... | rpl_semi_sync_master | ACTIVE | REPLICATION | semisync_master.so | GPL | | rpl_semi_sync_slave | ACTIVE | REPLICATION | semisync_slave.so | GPL | +----------------------------+----------+--------------------+--------------------+---------+ 46 rows in set (0.00 sec)
Mulakannya dahulu Separa penyegerakan pada hamba:
mysql> set global rpl_semi_sync_slave_enabled = {0|1}; # 1:启用,0:禁止
Mulakan semula separa penyegerakan pada induk:
mysql> set global rpl_semi_sync_master_enabled = {0|1}; # 1:启用,0:禁止 # mysql> set global rpl_semi_sync_master_timeout = 10000; # 单位为ms,默认为10s
Mulakan semula io_thread daripada pustaka:
mysql> stop slave io_thread; mysql> start slave io_thread;
ke dalam fail konfigurasi, yang akan menyebabkan contoh memasuki mod separa segerak sejurus selepas dimulakan jika kejadian yang telah lama terputus dijalankan semula dan dimulakan semula, ia boleh menyebabkan pustaka utama diseret runtuh.
Selepas menyambung semula pangkalan data hamba yang telah diputuskan untuk masa yang lama, anda mesti menunggu semua urus niaga dikesan dan kemudian menghidupkan mod separa segerak secara manual dan bukannya menukar terus selepas permulaan untuk mengelakkan kesan pada pangkalan data utama.
mysql> show global status like "%semi%"; +--------------------------------------------+-------+ | Variable_name | Value | +--------------------------------------------+-------+ | Rpl_semi_sync_master_clients | 0 | | Rpl_semi_sync_master_net_avg_wait_time | 0 | | Rpl_semi_sync_master_net_wait_time | 0 | | Rpl_semi_sync_master_net_waits | 0 | | Rpl_semi_sync_master_no_times | 0 | | Rpl_semi_sync_master_no_tx | 0 | | Rpl_semi_sync_master_status | ON | | Rpl_semi_sync_master_timefunc_failures | 0 | | Rpl_semi_sync_master_tx_avg_wait_time | 0 | | Rpl_semi_sync_master_tx_wait_time | 0 | | Rpl_semi_sync_master_tx_waits | 0 | | Rpl_semi_sync_master_wait_pos_backtraverse | 0 | | Rpl_semi_sync_master_wait_sessions | 0 | | Rpl_semi_sync_master_yes_tx | 0 | | Rpl_semi_sync_slave_status | ON | +--------------------------------------------+-------+ 15 rows in set (0.00 sec)
Perihalan parameter penting:
mysql> show global variables like '%sync%'; +-------------------------------------------+------------+ | Variable_name | Value | +-------------------------------------------+------------+ | binlog_group_commit_sync_delay | 0 | | binlog_group_commit_sync_no_delay_count | 0 | | innodb_flush_sync | ON | | innodb_sync_array_size | 1 | | innodb_sync_spin_loops | 30 | | rpl_semi_sync_master_enabled | ON | | rpl_semi_sync_master_timeout | 10000 | | rpl_semi_sync_master_trace_level | 32 | | rpl_semi_sync_master_wait_for_slave_count | 1 | | rpl_semi_sync_master_wait_no_slave | ON | | rpl_semi_sync_master_wait_point | AFTER_SYNC | | rpl_semi_sync_slave_enabled | ON | | rpl_semi_sync_slave_trace_level | 32 | | sync_binlog | 1 | | sync_frm | ON | | sync_master_info | 10000 | | sync_relay_log | 10000 | | sync_relay_log_info | 10000 | +-------------------------------------------+------------+ 18 rows in set (0.01 sec)
重要参数说明:
可以在slave端执行stop slave
,测试master端会发生什么情况?
在master上执行下面的sql:
mysql> insert into t_order values(3,"C");Query OK, 1 row affected (10.05 sec)
会发现这条语句会阻塞10s(对应上面的参数rpl_semi_sync_master_timeout),然后执行成功,最后看看看master的日志描述:
2022-01-25T02:31:57.016430Z 4 [Note] Start binlog_dump to master_thread_id(4) slave_server(1403312), pos(mysql-bin.000005, 154) 2022-01-25T02:31:57.016515Z 4 [Note] Start asynchronous binlog_dump to slave (server_id: 1403312), pos(mysql-bin.000005, 154) 2022-01-25T02:33:32.183819Z 2 [Note] Semi-sync replication initialized for transactions. 2022-01-25T02:33:32.183865Z 2 [Note] Semi-sync replication enabled on the master. 2022-01-25T02:33:32.184004Z 0 [Note] Starting ack receiver thread 2022-01-25T02:33:59.644444Z 5 [Note] While initializing dump thread for slave with UUID <aba2eb12-7cbc-11ec-9c1d-0242ac110003>, found a zombie dump thread with the same UUID. Master is killing the zombie dump thread(4). 2022-01-25T02:33:59.644612Z 5 [Note] Start binlog_dump to master_thread_id(5) slave_server(1403312), pos(mysql-bin.000005, 154) 2022-01-25T02:33:59.644632Z 4 [Note] Stop asynchronous binlog_dump to slave (server_id: 1403312) 2022-01-25T02:33:59.644727Z 5 [Note] Start semi-sync binlog_dump to slave (server_id: 1403312), pos(mysql-bin.000005, 154) 2022-01-25T02:38:02.847879Z 0 [ERROR] mysqld: Got an error reading communication packets 2022-01-25T02:38:27.228952Z 2 [Warning] Timeout waiting for reply of binlog (file: mysql-bin.000005, pos: 684), semi-sync up to file mysql-bin.000005, position 419. 2022-01-25T02:38:27.229063Z 2 [Note] Semi-sync replication switched OFF. 2022-01-25T02:39:47.230189Z 5 [Note] Stop semi-sync binlog_dump to slave (server_id: 1403312)
可以发现半同步关闭了,变成异步模式。
推荐学习:mysql视频教程
Atas ialah kandungan terperinci Teknologi replikasi MySQL replikasi tak segerak dan separa segerak. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!