MySQL多線程同步mysql
系統結構 :linux
傳統的主從結構是 [Master] à [Slave], Master和slave主從關係; sql
使用transfer之後,[Master] à [Transfer] .--> [Slave], Master和Transfer主從關係,Transfer和Slave是Client-Server關係。 數據庫
服務器環境:服務器
主庫:192.168.15.216 (3306端口) 多線程
從庫:192.168.15.217 (3306端口)socket
Transfer: 192.168.15.217 (3307端口) ide
MySQL版本:mysql-5.5.18-linux2.6-x86_64.tar.gz 性能
存儲引擎:Innodb測試
Database: rocdata
MySQL-Transfer:Transfer.2.1-based-PS-5.5.18
注:
Tranfsfer相同的表使用同一個線程更新,若只有一個表,性能與原生版本相同。要體現效果,通常16個表或以上,考慮到線上大庫都有分表,這個條件比較容易知足。
1、192.168.15.216主庫配置
首先確認主庫上使用row格式的binlog,配置/etc/my.cnf:
[client]
port = 3306
socket = /tmp/mysql.sock
[mysqld1]
port = 3306
socket = /tmp/mysql.sock
basedir=/usr/local/mysql
datadir=/mysqldata/
bind-address=192.168.15.216
skip-external-locking
skip-name-resolve
user=mysql
max_allowed_packet = 256M
query_cache_size=256M
max_connections=2000
max_connect_errors=10000
key_buffer_size=6000M
read_buffer_size=32M
read_rnd_buffer_size = 32M
myisam_sort_buffer_size=512M
tmp_table_size=1024M
old-passwords
interactive_timeout=60
wait_timeout=60
connect_timeout=60
table_cache=8192
thread_cache_size=512
sort_buffer_size=128M
back_log = 500
thread_concurrency=48
expire_logs_days=10
log-bin=mysql-bin
#binlog_format=STATEMENT
binlog_format=ROW
#binlog_format="MIXED
# master
server-id = 1
binlog-do-db = rocdata
binlog-ignore-db = mysql
啓動MySQL,並查看Pos狀態。
2、192.168.15.217從庫配置。
MySQL端口3306和3307 ,建議MySQL TDIR目錄區分開來。個人MySQL和Transfer目錄:
/usr/local/mysql/
/usr/local/mysql-transfer
Transfer.2.1-based-PS-5.5.18替換T安裝目錄/usr/local/mysql-transfer/bin/下的mysqld。
一、配置3306端口,同步Master數據,這裏不須要寫主從同步信息,和單臺MySQL配置同樣。
/usr/local/mysql目錄部署一個MySQL版本5.5.18(真實庫),配置/etc/my.cnf:
[mysqld]
port = 3306
socket = /tmp/mysql.sock
basedir=/usr/local/mysql
datadir=/mysqldata/data3306
bind-address=192.168.15.217
skip-external-locking
skip-name-resolve
user=mysql
max_allowed_packet = 256M
query_cache_size=256M
max_connections=2000
max_connect_errors=10000
key_buffer_size=6000M
read_buffer_size=32M
read_rnd_buffer_size = 32M
myisam_sort_buffer_size=512M
tmp_table_size=1024M
old-passwords
interactive_timeout=60
wait_timeout=60
connect_timeout=60
table_cache=8192
thread_cache_size=512
sort_buffer_size=128M
back_log = 500
thread_concurrency=48
expire_logs_days=10
啓動MySQL 3306端口,並導入數據,前提須要記錄的Pos點,保證Transfer同步正常。和傳統的主從拷貝數據同樣。
此時3306端口的運行狀態。
二、配置3307 Transfer服務
a) /usr/local/mysql-transfer/目錄部署一個MySQL (T),版本5.5.18
b) 用附件中的mysqld替換T安裝目錄/usr/local/mysql-transfer/bin/下的mysqld
c) 在/usr/local/mysql-transfer/log 目錄下執行下執行 for((i=0; i<=16; i++)); do mkdir $i;done
d) 配置/etc/my3307.cnf,作如下修改:
[mysqld]
port = 3307
socket = /tmp/mysql3307.sock
basedir=/usr/local/mysql
datadir=/mysqldata/data3307
bind-address=192.168.15.217
skip-external-locking
skip-name-resolve
user=mysql
max_allowed_packet = 1G
query_cache_size=256M
max_connections=2000
max_connect_errors=10000
key_buffer_size=6000M
read_buffer_size=32M
read_rnd_buffer_size = 32M
myisam_sort_buffer_size=512M
tmp_table_size=1024M
old-passwords
interactive_timeout=60
wait_timeout=60
connect_timeout=60
table_cache=8192
thread_cache_size=512
sort_buffer_size=128M
back_log = 500
thread_concurrency=48
expire_logs_days=10
#tranfer
transfer_slave_thread = 16
remote_slave_hostname = 192.168.15.217
remote_slave_username = transfer
remote_slave_password = transferpw
remote_slave_port = 3306
relay-log =/usr/local/mysql/log/mysqld-relay-bin
relay-log-index =/usr/local/mysql/log/mysqld-relay-bin.index
master-info-file =/usr/local/mysql/log/master.info
relay-log-info-file =/usr/local/mysql/log/relay-log.info
log_slave_updates = 0
slave_skip_errors=1062,1032
#slave 192.168.15.217
server-id = 3
replicate_do_db = rocdata
replicate-ignore-db = mysql
replicate-ignore-db = test
replicate-ignore-db = information_schema
[說明]配置給Transfer的這個uname必須有Slave的super權限
e) Transfer須要導入同步的數據庫結構,不須要數據
f) Slave的 max_allowed_packet設置爲1G (建議)
g) 啓動Transfer並設置爲Master的從庫
具體步驟:
在3306端口上賦予Transfer 有Slave的super權限:
mysql> grant all privileges on *.* to 'transfer'@'192.168.15.217' identified by 'transferpw';
在主庫192.168.15.216賦予Transfer 有 replicate privileges權限:
mysql> grant replication slave, reload, super on *.* to 'repluser216'@'192.168.15.217' identified by 'replpasswd216';
啓動Transfer並設置爲Master的從庫:
mysql> CHANGE MASTER to MASTER_HOST='192.168.15.216', MASTER_PORT=3306, MASTER_USER='repluser216', MASTER_PASSWORD='replpasswd216', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=82104;
3、測試
一、在192.168.15.216主庫rocdate上建立表test,並寫入數據:
mysql> create table test ( id int(4));
mysql> insert into test values(1);
mysql> insert into test values(2);
二、查看192.18.15.216 MySQL(T)和MySQL真實庫狀態: