MySQL レプリケーション テクノロジの非同期レプリケーションと準同期レプリケーション

WBOY
リリース: 2022-04-25 20:59:59
転載
3578 人が閲覧しました

この記事では、mysqlに関する関連知識を提供します。主に、非同期レプリケーション、半同期レプリケーションなど、MySQL レプリケーション テクノロジに関連する問題を紹介します。一緒にそれについて話しましょう。ぜひご覧ください。みんなを助けます。

MySQL レプリケーション テクノロジの非同期レプリケーションと準同期レプリケーション

推奨学習:mysql ビデオ チュートリアル

非同期レプリケーション

MySQL レプリケーション テクノロジの非同期レプリケーションと準同期レプリケーション

非同期レプリケーション (非同期レプリケーション) では、マスターはスレーブがバイナリ ログを受信するかどうかを気にする必要がないため、マスターはスレーブに依存しません。マスターとスレーブは独立して動作する 2 台のサーバーと考えることができ、最終的にはバイナリ ログを通じてデータの一貫性が保たれます。

非同期レプリケーションは、マスターとスレーブの遅延が非常に大きく、ダンプ スレッドが大量のバイナリ ログ ファイルを読み取る必要がない限り、データベース自体にオーバーヘッドがほとんどないため、最高のパフォーマンスを発揮します。

ビジネスにデータの整合性に対する高度な要件がなく、障害発生時のデータ損失、または大量の損失さえも許容できる場合は、非同期レプリケーションを使用することをお勧めします。これは最高のパフォーマンスを備えています (たとえば、Weibo のようなビジネスには非常に高いパフォーマンス要件がありますが、通常はデータ損失が許容されます)。しかし、多くの場合、監視サービスや警報システムなど、中核的なビジネス システムがデータ セキュリティを最も懸念しています。

非同期レプリケーション環境の計画:

  • マスター (docker)、ポート 3310

  • スレーブ (docker)、ポート 3311

マスターの設定

設定ファイル 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
ログイン後にコピー

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
ログイン後にコピー

同期用のユーザーの作成:

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)
ログイン後にコピー

マスター上のマスターのバイナリ ログを表示します:

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)
ログイン後にコピー

マスター上のプロセス リストを表示します:

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)
ログイン後にコピー

スレーブの構成

構成ファイル my. cnf は、server-id フィールドが一意である必要があることを除いて、master の cnf と同じです。

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
ログイン後にコピー

スレーブにマスター情報を設定します:

# 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;
ログイン後にコピー

スレーブを開き、SQL および IO スレッドを開始します:

mysql> start slave;Query OK, 0 rows affected (0.00 sec)
ログイン後にコピー

スレーブ ステータス:

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)
ログイン後にコピー

新しく追加されたデータのみがコピーされ、既存のデータはツール (mysqldump など) を使用して手動で同期する必要があります。

スレーブ上のプロセス リストを表示します:

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)
ログイン後にコピー

準同期レプリケーション

準同期レプリケーションは、準同期レプリケーションです。 MySQL 5.7 バージョンのメカニズムより前。

MySQL レプリケーション テクノロジの非同期レプリケーションと準同期レプリケーション

準同期レプリケーションでは、マスター トランザクションの送信プロセス中に、少なくとも N 個のスレーブがバイナリ ログを受信する必要があります。これにより、マスターがダウンしても、少なくとも N 個のスレーブが存在することが保証されます。スレーブ: サーバー内のデータが完成しました。

準同期レプリケーションは MySQL の組み込み機能ではありません。代わりに、準同期プラグインをインストールし、準同期レプリケーション機能を有効にし、バイナリを受け入れるように N スレーブを設定する必要があります。ログが正常に記録されます。

欠点: user1 がメイン データベースにデータを挿入し、データが返されるのを待っているとします。User2 はこの時点でこのデータをクエリできます。この時点でマスターがハングアップすると、user2 はデータを見つけることができませんこのデータは、ファントムリーディングと同様の現象を引き起こします。

強化された準同期レプリケーション

強化された準同期レプリケーションは、準同期レプリケーションの欠点を解決します。トランザクションがコミットされる前に WAIT と ACK が発生するため、スレーブがバイナリログを受信しないが、マスターがダウンしている場合、最後のトランザクションが送信されていないため、データ自体は外部から見えず、損失の問題はありません。

MySQL レプリケーション テクノロジの非同期レプリケーションと準同期レプリケーション

したがって、電子商取引、銀行、保険、証券、およびファンドと密接に関連するその他のビジネスの中核的な注文ビジネスなど、データの一貫性要件が必要なビジネスの場合、必ず拡張半同期レプリケーションを使用してください。このようにして、データは安全かつ保証され、ダウンタイムが発生した場合でも、スレーブ マシンにはデータの完全なコピーが保持されます。

強化された準同期レプリケーション環境は、非同期レプリケーションに基づいています。

プラグインをインストールします。マスターとスレーブの切り替え状況が発生するため、マスターとスレーブの両方にインストールすることをお勧めします:

# master mysql> install plugin rpl_semi_sync_master soname 'semisync_master.so'; # slave mysql> install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
ログイン後にコピー

プラグインが次のとおりであることを確認してください。正常にインストールされました:

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)
ログイン後にコピー

最初にスレーブ同期で半分を開始します:

mysql> set global rpl_semi_sync_slave_enabled = {0|1}; # 1:启用,0:禁止
ログイン後にコピー

マスターで半同期を再開します:

mysql> set global rpl_semi_sync_master_enabled = {0|1}; # 1:启用,0:禁止 # mysql> set global rpl_semi_sync_master_timeout = 10000; # 单位为ms,默认为10s
ログイン後にコピー

ライブラリから io_thread を再開します:

mysql> stop slave io_thread; mysql> start slave io_thread;
ログイン後にコピー

準同期のパラメータを設定ファイルに書き込むことが推奨されない理由

パラメータを設定ファイルに書き込むと、インスタンスは起動直後に準同期モードになります。長期間切断されていたインスタンスが再起動されると、メイン データベースがダウンする可能性があります。

長期間切断されていたスレーブ データベースを再接続した後は、すべてのトランザクションがトレースされるまで待ってから、起動直後に切り替えるのではなく、手動で半同期モードをオンにして、データベースへの影響を防ぐ必要があります。メインデータベース。

メイン データベース ステータス情報のクエリ

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)
ログイン後にコピー

重要なパラメータの説明:

  • Rpl_semi_sync_master_clients:支持和注册半同步复制的已连Slave数
  • Rpl_semi_sync_master_no_times:master关闭半同步复制的次数
  • Rpl_semi_sync_master_no_tx:master没有收到slave的回复而提交的次数,可以理解为master等待超时的次数,即半同步模式不成功提交数量
  • 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 , 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视频教程

以上がMySQL レプリケーション テクノロジの非同期レプリケーションと準同期レプリケーションの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:csdn.net
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!