天天看點

MySQL5.6基于GTID同步複制,與如何實作MySQL負載均衡、讀寫分離。

   MySQL想必大家都不陌生,之前文章也有介紹同步複制與半同步複制,今天先來了解下什麼是GTID。

GTID(global transaction ID)全局事務ID,是由伺服器的UUID+一段随機數事務ID。

特性:從伺服器從主伺服器複制過來的事務,GTID不變,也就是說一個事務在全局複制架構中的ID不變。

有什麼用:

    在MySQL叢集中,當Master故障時,需要從Slave中挑選一個提升為Master可以基于GTID對比其他Slave來保證資料的一緻性。

MySQL主從同步如何配置資料過濾

主伺服器配置:

Binlog-do-db   //指定要記錄二進制日志的資料庫

Binlog-ignore-db  //指定要忽略記錄二進制日志的資料庫

從伺服器配置:

Replicate-do-table=   //指定要記錄二進制日志的表

Replicate-ignore-table=  //指定要忽略記錄二進制日志的表

Replicate-do-db=  //指定要記錄二進制日志的資料庫

Replicate-ignore-db=  //指定要忽略記錄二進制日志的資料庫

Replicate-wild-do-table=  //指定要記錄二進制日志的表(支援通配符)

Replicate-wild-ignore-table=  //指定要忽略記錄二進制日志的表(支援通配符)

實驗一、配置一個基于GTID的MySQL主從複制架構。

實驗環境:RHEL6.4+MySQL5.6

    Master:192.168.18.201 admin1.tuchao.com 

    Slave: 192.168.18.202 admin2.tuchao.com

安裝和啟動MySQL過程和之前都一樣(略)

Master配置:

[mysqld]

port            = 3306

socket          = /tmp/mysql.sock

skip-external-locking

key_buffer_size = 256M

max_allowed_packet = 1M

table_open_cache = 256

sort_buffer_size = 1M

read_buffer_size = 1M

read_rnd_buffer_size = 4M

myisam_sort_buffer_size = 64M

thread_cache_size = 8

query_cache_size= 16M

thread_concurrency = 2

datadir=/mydata

log-bin=mysql-bin

innodb_file_per_table = 1

binlog-format=ROW  //設定二進制日志格式

log-slave-updates=true //是否記錄從伺服器同步資料動作

gtid-mode=on //啟用Gtid模式

enforce-gtid-consistency=true //是否強制GTID的一緻性

master-info-repository=TABLE //master資訊的記錄位置

relay-log-info-repository=TABLE //中繼日志資訊的記錄位置

sync-master-info=1

slave-parallel-workers=2 //設定從伺服器複制線程數

binlog-checksum=CRC32 //設定binlog校驗算法(循環備援校驗碼)

master-verify-checksum=1 //設定主伺服器是否校驗

slave-sql-verify-checksum=1 //設定從伺服器是否校驗

binlog-rows-query-log_events=1

server-id       = 10

report-port=3306

report-host=admin1.tuchao.com //設定報告給哪台伺服器,一般設定為本機的主機名。

Slave配置:

datadir=/data

binlog-format=ROW

log-slave-updates=true

gtid-mode=on

enforce-gtid-consistency=true

master-info-repository=TABLE

relay-log-info-repository=TABLE

slave-parallel-workers=2

binlog-checksum=CRC32

master-verify-checksum=1

slave-sql-verify-checksum=1

server-id       = 20

report-host=admin2.tuchao.com

其實master和slave配置幾乎相同, 隻需要修改幾個參數我在上面用紅色字型做了标記,如server-id ,report-host等。

在Master上授權複制權限的使用者

grant replication slave,replication client on *.* to 'repluser'@'192.168.18.202' identified by '123456';

啟動slave複制線程

change master to master_host='admin1.tuchao.com',master_user='repluser',master_password='123456',master_auto_position=1;

start slave;

檢視警告資訊

Show warnings

檢視Slave狀态

show slave status\G

<a href="http://s3.51cto.com/wyfs02/M00/46/B9/wKiom1P0HVHiLPJBAAIUhlZFM00896.jpg" target="_blank"></a>

這時我們在Master上建立一個tuchao資料庫

<a href="http://s3.51cto.com/wyfs02/M02/46/BC/wKioL1P0JW3g02VTAAEQnJ5-JXE645.jpg" target="_blank"></a>

來到Slave檢視

<a href="http://s3.51cto.com/wyfs02/M00/46/BA/wKiom1P0JHbSxLPqAADMQtFQX8w645.jpg" target="_blank"></a>

同步成功!

實驗二、使用amoeba建構MySQL叢集實作負載均衡,讀寫分離。

    我們在192.168.18.199這台主機部署amoeba由于是java程式,要先安裝jdk,然後定義JAVA_HOME環境變量,導出PATH環境變量。(略)

amoeba-mysql2.2 官網下載下傳位址:

http://sourceforge.net/projects/amoeba/files/Amoeba%20for%20mysql/2.2.x/

建立需要的目錄,建立連結,解壓程式到目錄。

mkdir /usr/local/amoeba-mysql-2.2

cd /usr/local

ln -sv amoeba-mysql-2.2 amoeba

tar zxvf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba-mysql-2.2/

導出PATH環境變量

vim /etc/profile.d/amoeba.sh

export AMOEBA_HOME=/usr/local/amoeba

export PATH=$AMOEBA_HOME/bin:$PATH

編輯 /usr/local/amoeba/conf/dbServers.xml 

<a href="http://s3.51cto.com/wyfs02/M01/46/C2/wKiom1P0Vb6xDtrhAARgaBpieF8991.jpg" target="_blank"></a>

<a href="http://s3.51cto.com/wyfs02/M01/46/C2/wKiom1P0VdnRkXCHAAOLVFaqd9M292.jpg" target="_blank"></a>

編輯vim /usr/local/amoeba/conf/amoeba.xml

<a href="http://s3.51cto.com/wyfs02/M02/46/C2/wKiom1P0ViCg8iAXAAPGeTIU2pA383.jpg" target="_blank"></a>

<a href="http://s3.51cto.com/wyfs02/M02/46/C4/wKioL1P0V1rBtlbsAAP4MrsNrtU983.jpg" target="_blank"></a>

配置完成後儲存,啟動amoeba。

amoeba start

<a href="http://s3.51cto.com/wyfs02/M00/46/C3/wKiom1P0WcHCh95WAAL9617TGLo629.jpg" target="_blank"></a>

連接配接amoeba

<a href="http://s3.51cto.com/wyfs02/M02/46/C5/wKioL1P0WweBcx7gAALlsbOaqk8640.jpg" target="_blank"></a>

建立資料庫,建立表,然後用tcpdump在兩個節點抓包,你會發現寫操作都會轉發到Master。

執行select等語句凡是讀操作,會發兩個請求給Slave,一個給Master。

<a href="http://s3.51cto.com/wyfs02/M01/46/C5/wKioL1P0XUOzYWnXAAMGibSAshs102.jpg" target="_blank"></a>

<a href="http://s3.51cto.com/wyfs02/M01/46/C5/wKioL1P0XVnxCXfIAAK_IyJd_IM547.jpg" target="_blank"></a>

tcpdump 指令簡單介紹

 -i 指定網卡

 -s 指定封包的長度,s0表示抓整個包。

 -nn 不要解析主機名和端口名。

 -XX 顯示封包内容十六進制碼,ASCII,以太網頭部。

 -vv 顯示詳細資訊。

 -A  顯示資料包裡的ASCII

 -w  把内容導出到指定的檔案中

例子:

tcpdump -i eth0 -s0 -nn -A tcp dst port 3306 and dst host 192.168.18.202

tcpdump -i eth1 -s0 -nn -vv -A ip src 210.32.92.217 and tcp dst port 443

還可以用src 指定源位址。

這篇就寫到這裡了,大家自行抓包測試。

本文轉自qw87112 51CTO部落格,原文連結:http://blog.51cto.com/tchuairen/1542454