MySQLの--13マスタースレーブのレプリケーション

I.はじめにマスタースレーブのレプリケーション

MySQLのレプリケーションは、あるインスタンスから別の複製の変更にサーバーを可能にする機能です。

1)マスタサーバとすべてのデータは、バイナリログの構造に変化します。
2)プライマリ・サーバからスレーブサーバに要求し、局所的に、そのアプリケーションの内容をログバイナリ。
3)IO:メインのライブラリリクエストは、史上初のパフォーマンスに新しいイベントを取得し、relaylog置く
4)SQL:relaylogからSQL文がライブラリから実行に変換します

II。マスタ・スレーブレプリケーションの動作

マスター・スレーブレプリケーションの前提

1)2以上のデータベース例
2)主ライブラリバイナリログをオンに
3)プライマリ・データベースのユーザコピーする必要があります
4)異なるライブラリーからメインライブラリをSERVER_ID
5)は、ライブラリーから得ることが、コピー機能を有効にする前に、必要メインギャラリ前のデータ(プライマリバックアップした後、記録binlogの位置)
メインリザーバが分かっていなければならないマスターコピーから第一の開口部内のライブラリから6):IP、ポート、ユーザー、パスワード、ログファイル、POS
。7)関連スレッド開くために、ライブラリから:IO、SQL
8)ライブラリは、ユーザーからのレコードに関連する情報をコピーする必要があるが、メインライブラリーからバイナリログの最後の要求に記録されている必要があります
)9 binlogのオーバーライブラリーからの要求、生き残るためにはまず、そして、binlogの実行、保存された情報が実行されます

メインからファイルへとスレッドをコピーする必要

主なライブラリ:

1)メインライブラリバイナリログ:変更されたレコードのイベントがメインライブラリで発生した
2)ダンプスレッド:ライブラリ(TP)バイナリログスレッドから転送します

ライブラリから:

1)リレーログ(リレーログ):すべてのバイナリログイベントTP上マスタリポジトリに格納
2)master.info:ユーザ情報記憶レプリケーション、ポイントのプライマリ・データベースのバイナリログの位置に最後の要求
3)IOスレッド:受信毛メインライブラリビンログログに、またライブラリスレッドからメインライブラリー要求
のログを超えるメインライブラリーTPの実装:4)SQLスレッドを

マスタースレーブレプリケーションの回路図

前提条件:あなたがメインのライブラリーからのデータの整合性を確認する必要があり、以前のコピーからショットを呼び出すと、ライブラリ間

1)変更マスタを通じて、POSライブラリのメインライブラリー、ポート、ユーザー、パスワード、ファイルIPの文から指示する
2)ターンが必要なIOスレッドと開始スレーブコマンドによってライブラリーからSQLスレッドコピー
IOスレッドを保持することによって、ライブラリから3)ユーザーのパスワード情報を変更マスタは、正当性検証、メインライブラリを接続
ライブラリからの接続が成功した後、4)を、ライブラリがバイナリログPOSに応じて主に聞いてきます、されるこのアップデートよりも誰もが存在しない
以上、ライブラリーの要求の後に、メインライブラリーから)5を受けどのような情報、ライブラリIOスレッドへのスレッドからの新しいデータ・ダンプが存在することになる場合binlogの
メインライブラリーを受け取った6)は、TCP / IPのキャッシュに保存されたIOスレッドによってライブラリーからbinlogのイベントを送信し、ACK更新master.infoを返します。
リレーログ7)キャッシュメモリへのTCP / IPの内容
8)SQLスレッドはrelay-log.info読み出し、リードリレーログは、最後の地点を行い、その後のリレーログに進むされています伐採した後、実装は、アップデート完了ですrelay-log.info

第三に、実際のコピーから本館

メインライブラリ操作:

1)設定ファイルを変更します

#编辑mysql配置文件
[root@db01 ~]# vim /etc/my.cnf
#在mysqld标签下配置
[mysqld]
#主库server-id为1,从库不等于1
server_id =1
#开启binlog日志
log_bin=mysql-bin

2)マスタースレーブレプリケーションのユーザーを作成します。

#登录数据库
[root@db01 ~]# mysql -uroot -poldboy123
#创建rep用户
mysql> grant replication slave on *.* to rep@'10.0.0.%' identified by '123';

ライブラリの操作から:

1)設定ファイルを変更します

#修改db02配置文件
[root@db02 ~]# vim /etc/my.cnf
#在mysqld标签下配置
[mysqld]
#主库server-id为1,从库不等于1, 但从库之间的server_id可以相等
server_id =5
#重启mysql
[root@db02 ~]# /etc/init.d/mysqld restart

#记录主库binlog及位置点
[root@db01 ~]# mysql -uroot -poldboy123
mysql> show master status;
|  mysql-bin.000002 |      317 
#登陆数据库
[root@db02 ~]# mysql -uroot -poldboy123
#执行change master to 语句
mysql> change master to
-> master_host='10.0.0.51',
-> master_user='rep',
-> master_password='123',
-> master_log_file='mysql-bin.000002',
-> master_log_pos=317,
-> master_port=3306;

mysql> start slave;
mysql> show slave status\G
             Slave_IO_Running: Yes
             Slave_SQL_Running: Yes

IV。マスターコピーベースのトラブルシューティングから、

IOスレッド・エラー・ソリューション

# IO线程报错:
解决思路:
1.网络
[root@db02 ~]# ping 10.0.0.51
1)硬件层,路由,交换机,网络设备
2)网线
3)安全组规则
4)插错网线口

2.端口
[root@db02 ~]# telnet 10.0.0.51 3306
#关闭防火墙
systemctl stop firewalld
#防火墙添加允许mysql端口
firewalld-cmd --add-service=mysql 
firewalld-cmd --add-port=3306/tcp

3.用户名
mysql> grant replication slave on *.* to rep@'%' identified by '123';

4.密码,先登录测试
[root@db03 data]# mysql -urep -p123 -h10.0.0.51

如果报错  #rep@'db03',需在参数,跳过反向解析
vim /etc/my.cnf
skip_name_resolve

#搭建主从时,用户名、密码、主机域、端口一定要一致。
 change master to
 master_host='10.0.0.51',#1
 master_user='rep',#2
 master_password='123',#3
 master_log_file='mysql-bin.000003',
 master_log_pos=169853,
 master_port=3306;
 

SQLスレッドエラー

処理方法:

#临时停止同步
mysql> stop slave;
#将同步指针向下移动一个(可重复操作)
mysql> set global sql_slave_skip_counter=1;
#开启同步
mysql> start slave;

処理方法2:

#编辑配置文件
[root@db01 ~]# vim /etc/my.cnf
#在[mysqld]标签下添加以下参数,把线程号添加到配置文件
slave-skip-errors=1032,1062,1007

しかし、方法、方法IIは、単にエラーをスキップし、すべてのリスクある根本的な問題を解決することはできません

処理方法3:

1)再データベースバックアップ、にライブラリから復元
読み取り専用ライブラリから)2

#在命令行临时设置
set global read_only=1;
#在配置文件中永久生效
read_only=1

注:これはすべてのログオンされている場合は超超大国を含むユーザ権限、まだ動作することができ

  1. すべての権利は、プロファイルは、読み取り専用に設定されている、または操作することができる場合でも。
  2. 許可なしにすべて。彼はさらに読み取り専用、権利が動作していないの作成、削除、挿入、選択するように指定しました。

例えば:

#设置配置文件永久生效
[root@db03 ~]# vim /etc/my.cnf
read_only=1
#重启
[root@db03 ~]# /etc/init.d/mysqld  restart
Shutting down MySQL.. SUCCESS! 
Starting MySQL. SUCCESS!
#查看
mysql> show variables like 'read_only';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| read_only     | ON    |
+---------------+-------+
1 row in set (0.00 sec)

1.すべての権利

[root@db03 ~]# mysql
mysql> grant all on *.* to rea@'%' identified by '123';
Query OK, 0 rows affected (0.00 sec)

[root@db03 ~]# mysql -urea -p123 -h 10.0.0.53
mysql> create database aaa;
Query OK, 1 row affected (0.01 sec)

2.ないすべての権限

mysql> grant select,create,delete,insert on *.* to rea1@'%' identified by '123';
Query OK, 0 rows affected (0.00 sec)

[root@db03 ~]# mysql -urea1 -p123 -h10.0.0.53
mysql> create database bbb;
ERROR 1290 (HY000): The MySQL server is running with the --read-only option so it cannot execute this statement
mysql> drop database test;
ERROR 1290 (HY000): The MySQL server is running with the --read-only option so it cannot execute this statement
...

ライブラリからV.遅延

普通のコピーからの主な欠陥かもしれません

どのように1)論理的な破損を行うには?
2)ライブラリが行うことができ、メインライブラリの動作を保証するものではありません
3)高可用性を?自動フェイルオーバー?
4)コピーフィルタ

企業は一般的に3-6時間を遅延されます

ライブラリーからの遅延の設定方法

#停止主从
mysql>stop slave;
#设置延时为180秒
mysql> change master to master_delay= 180;
#开启主从
mysql>start slave;
#查看状态
mysql> show slave status\G
SQL_Delay: 60

#或者做主从的时候直接指定延时
 change master to
 master_host='10.0.0.51',
 ...
 master_delay=3600;

3.延时从库停止方法
#停止主从
mysql> stop slave;
#设置延时为0
mysql> change master to master_delay = 0;
#开启主从
mysql> start slave;

ビジネスケース:

通常のバックアップ1.5~2時間リストアするために必要な総データ500Gの順、
1)が3,600秒の遅延を配置しました

mysql>change master to master_delay = 3600;

2)メインライブラリー

drop database db;

3)どのようにライブラリーからの遅延の使用、データを回復するには?

ヒント:
ライブラリは下DATADIRのrelaylogに格納されてから1、
2、mysqlbinlogはrelaylogコンテンツ傍受することができ
「3、ショー中継ログイベント DB01リレー-bin.000001を」;

アイデアを扱います:

1)ストップSQLスレッド

誤消去relaylog前にインターセプトポイント2)

  • relay-log.info回復するための出発点として、最後の実行ポイントの位置を取得
  • 文書の内容の分析、前に誤って削除した位置へのアクセスをリレーログ

アナログ障害で:

1)を閉じるSQL

2)アナログデータ

3)図書館遅延3600から開きます

4)、破壊シミュレーションライブラリの失敗を削除します。(これらのステップは5分以内に完了します。)

5)ライブラリー、シャットダウンのSQLスレッドから

6)リレーログをとら

回復relay.sql

方法1:、図書館アイデンティティからキャンセルのデータベースからデータを復旧する際の主要図書館

方法2:リードアウトからマスターライブラリのライブラリパスデータ、データを回復します

シミュレーション環境

1.メイン図書館

#一直写数据
[root@db01 ~]# sh mysqldump.sh
#全备
[root@db01 ~]# mysqldump -uroot -p1 -A --triggers -R --master-data=2 --single-transaction |gzip >/backup/full.gz
Warning: Using a password on the command line interface can be insecure.
#查看
[root@db01 ~]# ll /backup/
total 376
-rw-r--r-- 1 root root 384381 Nov 17 09:22 full.gz
#查看mysql-bin和起点
[root@db01 ~]# zcat /backup/full.gz |head -25
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=517;

#scp到对端
[root@db01 ~]# scp /backup/dbdb.sql  172.16.1.54:/tmp
[root@db01 ~]# mysql -uroot -p1
mysql> grant replication slave on *.* to rep@'%' identified by '123';
  1. ライブラリから
#准备初始化环境
[root@db04 ~]# /etc/init.d/mysqld  stop
[root@db04 ~]# rm -fr /application/mysql/data/*
[root@db04 ~]# ./mysql_install_db  --user=mysql --basedir=/opt/mysql --datadir=/opt/mysql/data/
[root@db04 ~]# /etc/init.d/mysqld  start

#导库
[root@db04 ~]# zcat /tmp/dbdb.sql  |mysql
#主从
[root@db04 ~]# mysql -uroot -p1
mysql> change master to
        master_host='10.0.0.51',
        master_user='db',
        master_password='123',
        master_log_file='mysql-bin.000001',
        master_log_pos=517,
        master_port=3306,   
        master_delay=3600;
  1. 削除故障シミュレーションライブラリのメインライブラリー
[root@db01 ~]# mysql -uroot -p1
mysql> select count(*) from db1.t1;
+----------+
| count(*) |
+----------+
|      888 |
+----------+
1 row in set (0.00 sec)

mysql> drop database db1;
Query OK, 1 row affected (0.02 sec)
  1. ライブラリから近いSQLスレッドへ
[root@db04 ~]# mysql
           SQL_Delay: 3600

mysql> select count(*) from db1.t1;
+----------+
| count(*) |
+----------+
|      655 |
+----------+
1 row in set (0.00 sec)

mysql> stop slave sql_thread;
Query OK, 0 rows affected (0.01 sec)
             Slave_IO_Running: Yes
            Slave_SQL_Running: No

誤って一次ライブラリーライブラリから削除5.メインライブラリにコピー導出しました

[root@db04 data]# mysqldump -B db1>/tmp/db_quan.sql
[root@db04 data]# scp /tmp/db_quan.sql  172.16.1.51:/backup/

6.切片は、データを穿刺する前に、ライブラリの動作に同期されていません。

#获取起点
[root@db04 data]# cat relay-log.info 
7
./db04-relay-bin.000002
283
mysql-bin.000003
44040
3600
0
1


#获取终点
方法一:
[root@db04 data]# mysql
#查看relaylog事件
mysql> show relaylog events in 'db04-relay-bin.000002';
| db04-relay-bin.000002 | 45118 | Query       |         1 |      161795 | drop database db1  
#或者在命令行执行
[root@db04 ~]# mysql -e "show relaylog events in 'db04-relay-bin.000002'";

#方法二:
[root@db04 data]# mysqlbinlog  -d db1 --base64-output=decode-rows -vvv db04-relay-bin.000002 |grep -i -B 5 'drop database'
#191117 13:38:56 server id 1  end_log_pos 88875 CRC32 0xcfd701dd    Xid = 15750
COMMIT/*!*/;
# at 45118
#191117 13:38:58 server id 1  end_log_pos 88964 CRC32 0x905241e7    Query   thread_id=2671  exec_time=0 error_code=0
SET TIMESTAMP=1573969138/*!*/;
drop database db1

#截取这段数据导出并发送给主库
[root@db04 data]# mysqlbinlog  --start-position=283 --stop-position=45118 /opt/mysql/data/db04-relay-bin.000002 >/tmp/db_zeng.sql
[root@db04 data]# scp /tmp/db_zeng.sql  172.16.1.51:/backup/

7.マスターライブラリと二つのデータの整合性へのビューの内容

[root@db01 data]# mysql -uroot  -p1 </backup/db_quan.sql 
[root@db01 data]# mysql -uroot  -p1 </backup/db_zeng.sql 
mysql> select count(*) from db1.t1;
+----------+
| count(*) |
+----------+
|      900 |
+----------+
1 row in set (0.00 sec)

同期がオフに遅れることになりますかどうかを確認するために、ライブラリからSQLスレッドを回し8.

[root@db04 data]# mysql
mysql> start slave sql_thread;
mysql> stop slave;
mysql> change master to master_delay=0;
mysql> start slave;
#查看
mysql> select count(*) from db1.t1;
+----------+
| count(*) |
+----------+
|      900 |
+----------+
1 row in set (0.00 sec)

9.再び遅延を回し

mysql> stop slave;
mysql> change master to master_delay=3600;
mysql> start slave;
Query OK, 0 rows affected (0.01 sec)

おすすめ

転載: www.cnblogs.com/gongjingyun123--/p/11879341.html