天天看點

lamp架構之mysql主從複制一. 主從複制二. GTID複制三. 半同步複制四. 組複制五. 延遲複制六. 慢查詢七. MySQL路由器

mysql主從複制

  • 一. 主從複制
  • 二. GTID複制
  • 三. 半同步複制
  • 四. 組複制
  • 五. 延遲複制
  • 六. 慢查詢
  • 七. MySQL路由器
    • 1.MySQL路由器配置

主從複制是MySQL本身自帶的一個功能,不需要額外的第三方軟體就可以實作。

主從複制可實作:資料備份、故障轉移、MySQL叢集、高可用、讀寫分離等功能

主從複制的好處:

(1)資料更安全:做了資料備援,不會因為單台伺服器的當機而丢失資料

(2)性能大大提升:一主多從,不同使用者從不同資料庫讀取,性能提升

(3)擴充性更優:流量增大時,可以友善的增加從伺服器,不影響系統使用

(4)負載均衡:一主多從相當于分擔了主機任務,做了負載均衡。

主從複制的缺點:

主從機制是一樣的:

mysql主從的實作是,mysql master被使用後,其中master背景IO線程會寫Binlog;slave有一個Relay Log線程同步binlog日志,同時有另一個Extractor線程會讀取相應的Binlog,在Slave進行相應的同樣的操作。

對于主從正常執行,相應的延遲幾乎是不存在的。但是在高QPS下,主從同步卻出現了比較明顯的延遲情況。在PPT介紹中,當master QPS達到1萬左右時,Slave重做的QPS卻隻有2000左右,是以所謂的瓶頸其實是在Binlog日志在slave重做這塊。而此處實作是單線程的,是以改進的方法此處用多線程實作。

主從複制實作原理:

把主伺服器上的binLog日志(記錄資料的增删改和授權等寫操作行為)複制到從伺服器上執行一遍,這樣從伺服器上的資料就和主伺服器上的資料相同了。

mysql的安裝和配置在lamp的第一篇,感興趣可以去看看:

一. 主從複制

server1為master端:

lamp架構之mysql主從複制一. 主從複制二. GTID複制三. 半同步複制四. 組複制五. 延遲複制六. 慢查詢七. MySQL路由器
lamp架構之mysql主從複制一. 主從複制二. GTID複制三. 半同步複制四. 組複制五. 延遲複制六. 慢查詢七. MySQL路由器
lamp架構之mysql主從複制一. 主從複制二. GTID複制三. 半同步複制四. 組複制五. 延遲複制六. 慢查詢七. MySQL路由器
lamp架構之mysql主從複制一. 主從複制二. GTID複制三. 半同步複制四. 組複制五. 延遲複制六. 慢查詢七. MySQL路由器

在westos資料庫中添加user_tb這個表:

lamp架構之mysql主從複制一. 主從複制二. GTID複制三. 半同步複制四. 組複制五. 延遲複制六. 慢查詢七. MySQL路由器
lamp架構之mysql主從複制一. 主從複制二. GTID複制三. 半同步複制四. 組複制五. 延遲複制六. 慢查詢七. MySQL路由器
lamp架構之mysql主從複制一. 主從複制二. GTID複制三. 半同步複制四. 組複制五. 延遲複制六. 慢查詢七. MySQL路由器

将server1中的資料庫導入:

lamp架構之mysql主從複制一. 主從複制二. GTID複制三. 半同步複制四. 組複制五. 延遲複制六. 慢查詢七. MySQL路由器

為了友善slave複制server1二進制檔案到slave(server2)執行,做複制之前:主從的base需要相同

lamp架構之mysql主從複制一. 主從複制二. GTID複制三. 半同步複制四. 組複制五. 延遲複制六. 慢查詢七. MySQL路由器
lamp架構之mysql主從複制一. 主從複制二. GTID複制三. 半同步複制四. 組複制五. 延遲複制六. 慢查詢七. MySQL路由器

在server1安裝rsync:

lamp架構之mysql主從複制一. 主從複制二. GTID複制三. 半同步複制四. 組複制五. 延遲複制六. 慢查詢七. MySQL路由器

配置/etc/my.cnf檔案:

lamp架構之mysql主從複制一. 主從複制二. GTID複制三. 半同步複制四. 組複制五. 延遲複制六. 慢查詢七. MySQL路由器
lamp架構之mysql主從複制一. 主從複制二. GTID複制三. 半同步複制四. 組複制五. 延遲複制六. 慢查詢七. MySQL路由器

在salve端配置:

lamp架構之mysql主從複制一. 主從複制二. GTID複制三. 半同步複制四. 組複制五. 延遲複制六. 慢查詢七. MySQL路由器

在.bsah_profile檔案添加mysql路徑:

lamp架構之mysql主從複制一. 主從複制二. GTID複制三. 半同步複制四. 組複制五. 延遲複制六. 慢查詢七. MySQL路由器

然後初始化mysql:

添加mysql使用者:

lamp架構之mysql主從複制一. 主從複制二. GTID複制三. 半同步複制四. 組複制五. 延遲複制六. 慢查詢七. MySQL路由器

在server2的mysql中也要添加westos庫 ,再将server1中庫的資料導入:

lamp架構之mysql主從複制一. 主從複制二. GTID複制三. 半同步複制四. 組複制五. 延遲複制六. 慢查詢七. MySQL路由器

在server2中:

mysql -pwestos

lamp架構之mysql主從複制一. 主從複制二. GTID複制三. 半同步複制四. 組複制五. 延遲複制六. 慢查詢七. MySQL路由器

看slave端的IO 和 SQL 狀态均為yes 才為服務成功!!

lamp架構之mysql主從複制一. 主從複制二. GTID複制三. 半同步複制四. 組複制五. 延遲複制六. 慢查詢七. MySQL路由器

檢視一下已經同步過來:

lamp架構之mysql主從複制一. 主從複制二. GTID複制三. 半同步複制四. 組複制五. 延遲複制六. 慢查詢七. MySQL路由器

二. GTID複制

server1:

lamp架構之mysql主從複制一. 主從複制二. GTID複制三. 半同步複制四. 組複制五. 延遲複制六. 慢查詢七. MySQL路由器
lamp架構之mysql主從複制一. 主從複制二. GTID複制三. 半同步複制四. 組複制五. 延遲複制六. 慢查詢七. MySQL路由器

将server1的配置檔案複制給server3:

lamp架構之mysql主從複制一. 主從複制二. GTID複制三. 半同步複制四. 組複制五. 延遲複制六. 慢查詢七. MySQL路由器
lamp架構之mysql主從複制一. 主從複制二. GTID複制三. 半同步複制四. 組複制五. 延遲複制六. 慢查詢七. MySQL路由器

在server2中:

lamp架構之mysql主從複制一. 主從複制二. GTID複制三. 半同步複制四. 組複制五. 延遲複制六. 慢查詢七. MySQL路由器
lamp架構之mysql主從複制一. 主從複制二. GTID複制三. 半同步複制四. 組複制五. 延遲複制六. 慢查詢七. MySQL路由器
lamp架構之mysql主從複制一. 主從複制二. GTID複制三. 半同步複制四. 組複制五. 延遲複制六. 慢查詢七. MySQL路由器
lamp架構之mysql主從複制一. 主從複制二. GTID複制三. 半同步複制四. 組複制五. 延遲複制六. 慢查詢七. MySQL路由器

在server3中:

lamp架構之mysql主從複制一. 主從複制二. GTID複制三. 半同步複制四. 組複制五. 延遲複制六. 慢查詢七. MySQL路由器
lamp架構之mysql主從複制一. 主從複制二. GTID複制三. 半同步複制四. 組複制五. 延遲複制六. 慢查詢七. MySQL路由器
lamp架構之mysql主從複制一. 主從複制二. GTID複制三. 半同步複制四. 組複制五. 延遲複制六. 慢查詢七. MySQL路由器
lamp架構之mysql主從複制一. 主從複制二. GTID複制三. 半同步複制四. 組複制五. 延遲複制六. 慢查詢七. MySQL路由器
lamp架構之mysql主從複制一. 主從複制二. GTID複制三. 半同步複制四. 組複制五. 延遲複制六. 慢查詢七. MySQL路由器
lamp架構之mysql主從複制一. 主從複制二. GTID複制三. 半同步複制四. 組複制五. 延遲複制六. 慢查詢七. MySQL路由器
lamp架構之mysql主從複制一. 主從複制二. GTID複制三. 半同步複制四. 組複制五. 延遲複制六. 慢查詢七. MySQL路由器
lamp架構之mysql主從複制一. 主從複制二. GTID複制三. 半同步複制四. 組複制五. 延遲複制六. 慢查詢七. MySQL路由器
lamp架構之mysql主從複制一. 主從複制二. GTID複制三. 半同步複制四. 組複制五. 延遲複制六. 慢查詢七. MySQL路由器
lamp架構之mysql主從複制一. 主從複制二. GTID複制三. 半同步複制四. 組複制五. 延遲複制六. 慢查詢七. MySQL路由器

三. 半同步複制

先停掉server2 io_thread:

lamp架構之mysql主從複制一. 主從複制二. GTID複制三. 半同步複制四. 組複制五. 延遲複制六. 慢查詢七. MySQL路由器

然後在server1中的表中插入成績:

lamp架構之mysql主從複制一. 主從複制二. GTID複制三. 半同步複制四. 組複制五. 延遲複制六. 慢查詢七. MySQL路由器

檢視server2中能否同步資料:

lamp架構之mysql主從複制一. 主從複制二. GTID複制三. 半同步複制四. 組複制五. 延遲複制六. 慢查詢七. MySQL路由器

在server2中開啟slave io:

lamp架構之mysql主從複制一. 主從複制二. GTID複制三. 半同步複制四. 組複制五. 延遲複制六. 慢查詢七. MySQL路由器
lamp架構之mysql主從複制一. 主從複制二. GTID複制三. 半同步複制四. 組複制五. 延遲複制六. 慢查詢七. MySQL路由器
lamp架構之mysql主從複制一. 主從複制二. GTID複制三. 半同步複制四. 組複制五. 延遲複制六. 慢查詢七. MySQL路由器
lamp架構之mysql主從複制一. 主從複制二. GTID複制三. 半同步複制四. 組複制五. 延遲複制六. 慢查詢七. MySQL路由器
lamp架構之mysql主從複制一. 主從複制二. GTID複制三. 半同步複制四. 組複制五. 延遲複制六. 慢查詢七. MySQL路由器
lamp架構之mysql主從複制一. 主從複制二. GTID複制三. 半同步複制四. 組複制五. 延遲複制六. 慢查詢七. MySQL路由器
lamp架構之mysql主從複制一. 主從複制二. GTID複制三. 半同步複制四. 組複制五. 延遲複制六. 慢查詢七. MySQL路由器

在server1中:

lamp架構之mysql主從複制一. 主從複制二. GTID複制三. 半同步複制四. 組複制五. 延遲複制六. 慢查詢七. MySQL路由器
lamp架構之mysql主從複制一. 主從複制二. GTID複制三. 半同步複制四. 組複制五. 延遲複制六. 慢查詢七. MySQL路由器
lamp架構之mysql主從複制一. 主從複制二. GTID複制三. 半同步複制四. 組複制五. 延遲複制六. 慢查詢七. MySQL路由器

在server2中再次檢視:

lamp架構之mysql主從複制一. 主從複制二. GTID複制三. 半同步複制四. 組複制五. 延遲複制六. 慢查詢七. MySQL路由器

四. 組複制

多主模式

server1-3配置大體相同

vim /etc/my.cnf

lamp架構之mysql主從複制一. 主從複制二. GTID複制三. 半同步複制四. 組複制五. 延遲複制六. 慢查詢七. MySQL路由器
lamp架構之mysql主從複制一. 主從複制二. GTID複制三. 半同步複制四. 組複制五. 延遲複制六. 慢查詢七. MySQL路由器
lamp架構之mysql主從複制一. 主從複制二. GTID複制三. 半同步複制四. 組複制五. 延遲複制六. 慢查詢七. MySQL路由器

上圖address後的server以及第一行的server-id都要和檔案所在主機保持一緻:

lamp架構之mysql主從複制一. 主從複制二. GTID複制三. 半同步複制四. 組複制五. 延遲複制六. 慢查詢七. MySQL路由器

server1:

mysql> SET SQL_LOG_BIN=0;
mysql> CREATE USER [email protected]'%' IDENTIFIED BY 'password';
mysql> GRANT REPLICATION SLAVE ON *.* TO [email protected]'%';
mysql> FLUSH PRIVILEGES;
mysql> SET SQL_LOG_BIN=1;
mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='password' FOR CHANNEL 'group_replication_recovery';
mysql> SET GLOBAL group_replication_bootstrap_group=ON;     
mysql> START GROUP_REPLICATION;
mysql> SET GLOBAL group_replication_bootstrap_group=OFF;
           

server2 server3 相同

mysql> SET SQL_LOG_BIN=0;
mysql> CREATE USER [email protected]'%' IDENTIFIED BY 'password';
mysql> GRANT REPLICATION SLAVE ON *.* TO [email protected]'%';
mysql> FLUSH PRIVILEGES;
mysql> SET SQL_LOG_BIN=1;
mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='password' FOR 	CHANNEL 'group_replication_recovery';
mysql> START GROUP_REPLICATION;
           

在server1:

mysql> SELECT * FROM performance_schema.replication_group_members; ##查詢組狀态

lamp架構之mysql主從複制一. 主從複制二. GTID複制三. 半同步複制四. 組複制五. 延遲複制六. 慢查詢七. MySQL路由器

建立資料庫看資訊同步:

在server1中:

mysql> create database test;
mysql> USE test;
mysql> create table t1 (c1 INT PRIMARY KEY, C2 TEXT NOT NULL);   ##隻支援帶有主鍵的表
mysql> INSERT INTO t1 VALUES (1, 'Luis');
mysql> SELECT * FROM t1;
           

在server2中:

lamp架構之mysql主從複制一. 主從複制二. GTID複制三. 半同步複制四. 組複制五. 延遲複制六. 慢查詢七. MySQL路由器

在server3中:

lamp架構之mysql主從複制一. 主從複制二. GTID複制三. 半同步複制四. 組複制五. 延遲複制六. 慢查詢七. MySQL路由器

五. 延遲複制

在server2中:

STOP SLAVE SQL_THREAD;
CHANGE MASTER TO MASTER_DELAY=60;
START SLAVE SQL_THREAD;
show slave status\G;
           

六. 慢查詢

set global slow_query_log=ON;   
show variables like "long%";
set  long_query_time=5;
show status like '%slow%';
           

七. MySQL路由器

1.MySQL路由器配置

在server4執行

rpm -ivh mysql-router-community-8.0.21-1.el7.x86_64.rpm
vim /etc/mysqlrouter/mysqlrouter.conf

[routing:ro]
bind_address = 0.0.0.0
bind_port = 7001
destinations = 172.25.1.1:3306,172.25.1.2:3306,172.25.1.3:3306
routing_strategy = round-robin

[routing:rw]
bind_address = 0.0.0.0
bind_port = 7002
destinations = 172.25.1.1:3306,172.25.1.2:3306,172.25.1.3:3306
routing_strategy = first-available
           

systemctl start mysqlrouter.service

mysql> grant all on test.* to [email protected]’%’ identified by ‘westos’; ##建立一個遠端登入的使用者

在真機中:

mysql -h 172.25.1.4 -P 7001 -u sun -p

在真機測試連接配接路由ip 登陸mysql
           

路由隻能實作排程,負載均衡,不能實作讀寫分離。

[[email protected] ~]# lsof -i :3306在這裡插入圖檔描述

檢視日志:cat /var/log/mysqlrouter/mysqlrouter.log

當連接配接server1 down掉之後會自動跳轉到server2上

由于mysql路由器的7001端口采用的使輪詢的排程算法,是以每次連接配接到的後端真實的資料庫都是一次變化的