mysql的主從服務M-S

什麼是MySQL Replication

Replication可以實現將數據從一臺數據庫服務器(master)複製到一或多臺數據庫服務器(slave)
默認情況下屬於異步複製,無需維持長連接
通過配置,可以複製所有的庫或者幾個庫,甚至庫中的一些表
是MySQL內建的,本身自帶的

Replication的原理
簡單的說就是master將數據庫的改變寫入二進制日誌,slave同步這些二進制日誌,並根據這些二進制日誌進行數據操作
在這裏插入圖片描述
DML:SQL操作語句,update, insert,delete
Relay log :中繼日誌

Replication的作用
1、Fail Over 故障切換
2、Backup Server 備份服務,無法對SQL語句執行產生的故障恢復,有限的備份
3、High Performance高性能,可以多臺slave,實現讀寫分離

Replication如何工作
整體上來說,複製有3個步驟:
(1) master將改變記錄到二進制日誌(binary log)中(這些記錄叫做二進制日誌事件,binary log events);
(2) slave將master的binary log events拷貝到它的中繼日誌(relay log);
(3) slave重做中繼日誌中的事件,修改salve上的數據。
在這裏插入圖片描述
在這裏插入圖片描述
mysql主從複製中:
第一步:master記錄二進制日誌。在每個事務更新數據完成之前,master在二進制日誌記錄這些改變。MySQL將事務寫入二進制日誌,即使事務中的語句都是交叉執行的。在事件寫入二進制日誌完成後,master通知存儲引擎提交事務。
第二步:slave將master的binary log拷貝到它自己的中繼日誌。首先,slave開始一個工作線程——I/O線程。I/O線程在master上打開一個普通的連接,然後開始binlog dump process。Binlog dump process從master的二進制日誌中讀取事件,如果已經執行完master產生的所有文件,它會睡眠並等待master產生新的事件。I/O線程將這些事件寫入中繼日誌。
第三步:SQL slave thread(SQL從線程)處理該過程的最後一步。SQL線程從中繼日誌讀取事件,並重新執行其中的事件而更新slave的數據,使其與master中的數據一致。

Replication常見方案:
1、One master and Muti salve 一主多備
在這裏插入圖片描述
一般用來做讀寫分離的,master寫,其他slave讀,這種架構最大問題I/O壓力集中
在Master上<多臺同步影響IO>

2、M-S-S
使用一臺slave作爲中繼,分擔Master的壓力,slave中繼需要開啓bin-log,並配置log-slave-updates
在這裏插入圖片描述
Slave中繼可使用Black-hole存儲引擎,不會把數據存儲到磁盤,只記錄二進制日誌

3、M-M 雙主互備 (互爲主從)
很多人誤以爲這樣可以做到MySQL負載均衡,實際沒什麼好處,每個服務器需要做同樣的同步更新,破壞了事物的隔離性和數據的一致性
在這裏插入圖片描述
不推薦,這樣的並沒有實現負載均衡
4、M-M-M
監控三臺機器互相做對方的master
在這裏插入圖片描述
天生的缺陷:複製延遲,slave上同步要慢於master,如果大併發的情況那延遲更嚴重

Mysql在5.6已經自身可以實現fail over故障切換
5、One slave Muti master 一從對多主
好處:節省成本,將多個master數據自動化整合
缺陷:對庫和表數據的修改較多

二:部署MySQL主從同步

模式:C/S
端口:3306

系統版本centos 7.4
數據庫版本mysql 5.7
兩臺服務器分別安裝好mysql5.7,啓動服務

修改密碼安全策略(這個主要測試主從暫時關閉)
編輯/etc/my.cnf文件

[root@localhost ~]# cat /etc/my.cnf   添加到配置文件
validate_password=off

重啓數據庫

[root@localhost ~]# systemctl restart mysqld

過濾數據庫密碼,因爲這個數據庫使用yum安裝的,密碼默認存放在/var/log/mysql.log

[root@localhost ~]# grep 'temporary password' /var/log/mysqld.log

登錄數據庫,修改密碼,修改完記得退出重新用新密碼登錄,每個數據庫都做同樣的操作。

mysql> set password for root@localhost=password( '123456' );
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)

mysql> exit

準備工作完成。開始配置主從 M-S
在主上創建一個數據庫,因爲這個是主從同步,所以庫,表的結構需要保持一致,需要提前創建好
創建一個庫,一張用戶表

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)
mysql> create database test;
Query OK, 1 row affected (0.00 sec)

mysql> use test;
Database changed
mysql> create table test(id int, name varchar(10));
Query OK, 0 rows affected (0.00 sec)
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| test           |
+----------------+
1 row in set (0.00 sec)

修改配置文件

[root@localhost ~]# vim  /etc/my.cnf   
把下面的內容添加到[mysqld]下
log-bin=mysql-bin-master     #啓用二進制日誌
server-id=1              #本機數據庫ID 標示,id不能重複
binlog-do-db=test    #可以被從服務器複製的庫, 二進制需要同步的數據庫名
binlog-ignore-db=mysql       #不可以被從服務器複製的庫,每個數據的mysql庫存放的內容不一樣,不能複製,否則會出問題

重啓服務

[root@localhost ~]# systemctl restart mysqld   #修改完配置,重啓報錯

登錄數據庫授權

mysql> grant replication slave on *.* to slave@'10.10.100.%'  identified by "123456";
Query OK, 0 rows affected, 1 warning (0.00 sec)

對整個網段的IP授權,整個網段都可以連接主庫,用戶slave,密碼123456

查看主庫的狀態

mysql> show master status;
+-------------------------+----------+--------------+------------------+-------------------+
| File                    | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------------+----------+--------------+------------------+-------------------+
| mysql-bin-master.000004 |      448 | test         | mysql            |                   |
+-------------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

查看二進制日誌
在這裏插入圖片描述

mysql> show binlog events\G

在這裏插入圖片描述

導出數據庫的數據

[root@localhost ~]# mysqldump -root -p123456 test >test.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.

將導出的test.sql傳送至從庫服務器上

[root@localhost ~]# scp test.sql 10.10.100.28:/root
The authenticity of host '10.10.100.28 (10.10.100.28)' can't be established.
ECDSA key fingerprint is SHA256:edmhSyxI0hyv3i5Xp+blhDC5ZdTa/yD7GAxp6l1SHwE.
ECDSA key fingerprint is MD5:87:91:4f:a4:75:ae:e2:cf:3b:dc:28:ca:3d:03:c2:db.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '10.10.100.28' (ECDSA) to the list of known hosts..
[email protected]'s password: 
test.sql                                                                       100%    0     0.0KB/s   00:00

從庫操作
導入test.sql

mysql> create database test;
Query OK, 1 row affected (0.01 sec)
[root@localhost ~]# mysql -uroot -p123456 test <test.sql
mysql: [Warning] Using a password on the command line interface can be insecure.
mysql> use test;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| test           |
+----------------+
1 row in set (0.00 sec)

修改從服務器配置文件:
從服務器沒必要開啓bin-log日誌

[root@localhost ~]# cat /etc/my.cnf
server-id=2    #從服務器ID號,不要和主ID相同 ,如果設置多個從服務器,每個從服務器必須有一個唯一的server-id值,必須與主服務器的以及其它從服務器的不相同。可以認爲server-id值類似於IP地址:這些ID值能唯一識別複製服務器羣集中的每個服務器實例。

#master-host=10.10.100.22 #指定主服務器IP地址
#master-user=slave  #指定定在主服務器上可以進行同步的用戶名
#master-password=123456 #密碼
#master-port=3306
#master-connect-retry=60  #斷點重新連接時間

重啓服務

[root@localhost ~]# systemctl restart mysqld

登錄數據庫

mysql> stop slave; #停止slave
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> change master to master_host='10.10.100.22',master_user='slave',master_password='123456';
Query OK, 0 rows affected, 2 warnings (0.00 sec)
mysql> start slave;    #啓動slave
mysql> show slave status\G  查看狀態

在這裏插入圖片描述
查看從庫狀態,IO線程有問題,一直處以connecting連接的狀態,說明從庫無法與主庫連接,
排查思路查看防火牆,selinux,主庫服務是否有啓動,等等,默認防火牆是開啓的,可以把防火牆關閉,重啓服務

這個是主庫的防火牆
在這裏插入圖片描述

在從庫測試與主庫的連接是否成功

[root@localhost ~]# mysql -uslave -p123456 -h10.10.100.22  #能夠登錄說明能夠與主庫正常連接
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.28-log MySQL Community Server (GPL)

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 

這個時候再看看slave的狀態

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 10.10.100.22
                  Master_User: slave
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin-master.000005
          Read_Master_Log_Pos: 154
               Relay_Log_File: localhost-relay-bin.000008
                Relay_Log_Pos: 381
        Relay_Master_Log_File: mysql-bin-master.000005
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 

Slave_IO_Running :一個負責與主機的io通信
Slave_SQL_Running:負責自己的slave mysql進程
兩個爲YES 就成功了!

到主庫服務器上查看狀態

mysql> show processlist \G
*************************** 1. row ***************************
     Id: 2
   User: slave
   Host: 10.10.100.28:33060
     db: NULL
Command: Binlog Dump
   Time: 712
  State: Master has sent all binlog to slave; waiting for more updates
   Info: NULL
*************************** 2. row ***************************
     Id: 4
   User: root
   Host: localhost
     db: NULL
Command: Query
   Time: 0
  State: starting
   Info: show processlist
2 rows in set (0.00 sec)

插入數據測試同步:

mysql> insert into test values (1,'dz');
Query OK, 1 row affected (0.03 sec)

mysql> insert into test values (1,'ddz');
Query OK, 1 row affected (0.00 sec)

mysql> insert into test values (44,'ddz');
Query OK, 1 row affected (0.00 sec)

在從庫查看數據
在這裏插入圖片描述

排錯:

如果遇到主從不同步,看一下主從bin-log的位置,然後再同步。
在這裏插入圖片描述
在主服務器上看二進制日誌事件列表
mysql> show binlog events \G
從服務器執行MySQL命令下:
mysql> stop slave; #先停止slave服務
mysql> change master to master_log_file=‘mysql-bin-master.000001’,master_log_pos=1164;
#根據上面主服務器的show master status的結果,進行從服務器的二進制數據庫記錄迴歸,達到同步的效果
mysql>slave start; #啓動從服務器同步服務
mysql> show slave status\G; #用show slave status\G;看一下從服務器的同步情況
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
如果都是yes,那代表已經在同步

重啓從服務器,再查看狀態:
停止從服務器slave stop;
開啓從服務器slave start;
排錯思路:
1、二進制日誌沒有開啓
2、IPTABLES 沒有放開端口
3、對應的主機 IP地址寫錯了
SQL線程出錯
1、主從服務器數據庫結構不統一
出錯後,數據少,可以手動解決創建插入,再更新slave狀態。
注:如果主上誤刪除了。那麼從上也就誤刪除了。 #因此主上要定期做mysqldump備份。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章