Rumah  >  Artikel  >  pangkalan data  >  Bagaimana untuk melaksanakan replikasi tak segerak MySQL dan replikasi separa segerak

Bagaimana untuk melaksanakan replikasi tak segerak MySQL dan replikasi separa segerak

PHPz
PHPzke hadapan
2023-06-01 10:28:261314semak imbas

Bagaimana untuk melaksanakan replikasi tak segerak MySQL dan replikasi separa segerak

Replikasi tak segerak

Bagaimana untuk melaksanakan replikasi tak segerak MySQL dan replikasi separa segerak

Dalam replikasi tak segerak (replikasi tak segerak), Guru tidak perlu peduli sama ada Hamba menerima binari log, jadi Guru Tidak ada pergantungan pada Hamba. Master dan Slave boleh dianggap sebagai dua pelayan yang berfungsi secara bebas Dengan bantuan log binari, mereka akhirnya boleh mengekalkan konsistensi data.

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

Konfigurasi induk

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:

rreee

Buat pengguna untuk penyegerakan:

$ 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

Lihat log binari tuan pada tuan:

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 senarai proses 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)

konfigurasi hamba

Fail konfigurasi my cnf adalah sama dengan master, kecuali medan id pelayan perlu unik.

Mulakan mysql:

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)

Tetapkan maklumat induk dalam hamba:

$ 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

Dayakan hamba, mulakan benang SQL dan IO:

# 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;

Lihat Status hamba:

mysql> start slave;Query OK, 0 rows affected (0.00 sec)

Hanya data yang baru ditambah akan disalin dan data sedia ada perlu disegerakkan secara manual menggunakan alatan (seperti mysqldump).

Lihat senarai proses pada 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)

Replikasi separa segerak

Replikasi separa segerak ialah replikasi separa segerak sebelum mekanisme MySQL 5.7.

Bagaimana untuk melaksanakan replikasi tak segerak MySQL dan replikasi separa 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 dipertingkatkan

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.

Bagaimana untuk melaksanakan replikasi tak segerak MySQL dan replikasi separa segerak

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. Walaupun terdapat gangguan, mesin hamba akan mempunyai sandaran data yang lengkap, jadi data akan selamat dan boleh dipercayai.

Persekitaran replikasi separa segerak yang dipertingkatkan adalah berdasarkan replikasi tak segerak.

Pasang pemalam Adalah disyorkan untuk memasangnya pada master dan slave, kerana akan ada senario penukaran master-slave:

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)

Pastikan pemalam dipasang. berjaya:

# master
mysql> install plugin rpl_semi_sync_master soname 'semisync_master.so';
# slave
mysql> install plugin rpl_semi_sync_slave soname 'semisync_slave.so';

Mulakan separuh pada hamba dahulu Penyegerakan:

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)

Mulakan semula separuh penyegerakan pada induk:

mysql> set global rpl_semi_sync_slave_enabled = {0|1};  # 1:启用,0:禁止

Mulakan semula io_thread dari perpustakaan:

rreee

Mengapa tidak disyorkan untuk menulis parameter separa penyegerakan ke dalam fail konfigurasi

Menulis parameter ke dalam fail konfigurasi akan menyebabkan tika memasuki mod separa segerak selepas permulaan itu telah diputuskan untuk masa yang lama dimulakan semula, ia mungkin menyebabkan pangkalan data utama diturunkan.

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.

Maklumat status pangkalan data induk pertanyaan

mysql> set global rpl_semi_sync_master_enabled = {0|1};  # 1:启用,0:禁止
# mysql> set global rpl_semi_sync_master_timeout = 10000;    # 单位为ms,默认为10s

Penerangan parameter penting:

  • Rpl_semi_sync_master_clients: Bilangan Hamba yang disambungkan yang menyokong dan mendaftar replikasi separa segerak

  • Rpl_semi_sync_master_no_times: Bilangan kali induk telah menutup replikasi separa segerak

  • Rpl_semi_sync_master_no_tx: Bilangan kali induk telah menyerahkan balasan tanpa menerima balasan daripada hamba, yang boleh difahami sebagai tamat masa menunggu tuan Bilangan kali, iaitu, bilangan penyerahan yang tidak berjaya dalam mod separa segerak

  • Rpl_semi_sync_master_status:ON是活动状态(半同步),OFF是非活动状态(异步),用于表示主服务器使用的是异步复制模式,还是半同步复制模式

  • Rpl_semi_sync_master_tx_avg_wait_time:master花在每个事务上的平均等待时间

  • Rpl_semi_sync_master_tx_waits:master等待成功的次数,即master没有等待超时的次数,也就是成功提交的次数

  • Rpl_semi_sync_master_yes_tx:master成功接收到slave的回复的次数,即半同步模式成功提交数量。

查询主库参数信息

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)

重要参数说明:

  • rpl_semi_sync_master_enabled:(主库)是否启动半同步

  • rpl_semi_sync_master_timeout:等待多时毫秒后变成异步复制,默认是10000ms

  • rpl_semi_sync_master_wait_point:5.7默认AFTER_SYNC(增强版半同步复制,无损复制模式),在得到slave的应答后再commit,可选值AFTER_COMMIT,在master提交后同步数据给slave,然后master等待slave应答,应答成功返回客户端。

可以在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)

可以发现半同步关闭了,变成异步模式。

Atas ialah kandungan terperinci Bagaimana untuk melaksanakan replikasi tak segerak MySQL dan replikasi separa segerak. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam
Artikel sebelumnya:Apakah jenis masa dalam mysqlArtikel seterusnya:Apakah jenis masa dalam mysql