MySQL5.6基於GTID同步複製,與如何實現MySQL負載均衡、讀寫分離

edithfang發表於2014-08-23



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配置:

[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=/data
log-bin=mysql-bin
innodb_file_per_table = 1

binlog-format=ROW
log-slave-updates=true
gtid-mode=on
enforce-gtid-consistency=true
master-info-repository=TABLE
relay-log-info-repository=TABLE
sync-master-info=1
slave-parallel-workers=2
binlog-checksum=CRC32
master-verify-checksum=1
slave-sql-verify-checksum=1
binlog-rows-query-log_events=1
server-id       = 20
report-port=3306
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

wKiom1P0HVHiLPJBAAIUhlZFM00896.jpg



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

wKioL1P0JW3g02VTAAEQnJ5-JXE645.jpg



來到Slave檢視

wKiom1P0JHbSxLPqAADMQtFQX8w645.jpg

同步成功!

實驗二、使用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 

wKiom1P0Vb6xDtrhAARgaBpieF8991.jpg

wKiom1P0VdnRkXCHAAOLVFaqd9M292.jpg


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

wKiom1P0ViCg8iAXAAPGeTIU2pA383.jpg

wKioL1P0V1rBtlbsAAP4MrsNrtU983.jpg



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

amoeba start

wKiom1P0WcHCh95WAAL9617TGLo629.jpg


連線amoeba

wKioL1P0WweBcx7gAALlsbOaqk8640.jpg



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

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

wKioL1P0XUOzYWnXAAMGibSAshs102.jpg



wKioL1P0YD7RpzZxAAK_IyJd_IM072.jpg



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
還可以用src 指定源地址。

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

本文出自 “壞人的部落格” 部落格
評論(4)

相關文章