MySQL多線程同步-Transfer解決主從同步延時問題

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真實庫狀態:    
        

相關文章
相關標籤/搜索