1. 程式人生 > >MySQL主從復制Galera

MySQL主從復制Galera

主從復制 galera cluster 多線程復制 gtid

一、主從復制的問題和解決方案

二、Galera Cluster

三、MySQL 5.6的多線程復制、GTID

MySQL Replication:

Master HA或多主節點模型

MMM:multi master MySQL

MHA:Master HA

對主節點進行監控,可實現自動故障轉移至其他從節點,通過提升某一從節點為新的主節點

Galera Cluster:wresp

通過wresp協議在全局實現復制:任何一節點都可讀寫

讀寫分離://一般都是自己研發的

mysql-proxy:沒有stable穩定版本

mysql-proxy--> Atals (Qihoo)

Amoeba:目前,活躍度不高

一、復制的問題和解決方案:

(1)數據損壞或丟失:

某個slave上損壞:在slave上重放二進制日誌,各種原因,導致數據不一致。例如硬件故障

//使用其他master上的備份的數據集,在新的slave上進行還原,從備份的位置開始從master上進行復制。

重新復制即可//下線故障的slave,還原然後重新復制即可

master數據損壞或丟失:

//在各個slave上根據其gtid,找出最新的salve,然後提升為master

//MHA+semi repl //MHA和一個node半同步復制,提升半同步node為新的master即可

//最後方案:

二進制日誌分析,然後還原

單個故障了:活該!

(2)混合使用存儲引擎;//堅決杜絕

MyISAM不支持事務//不能回滾的

InnoDB支持事務

(3)不唯一的server id

整個復制集群,可能導致錯亂。

//例如某個slave的server id和master的server id一樣,那麽他就不會重放master發來的server-id

修改server id 重新復制

(4)復制延遲

從node落後於master

自己寫腳本,不斷監控,發現落後的時間不等於0,後,可以重啟slave的io線程

需要額外的監控工具來輔助實現。

在master上事務是可以並發的,但是往同一個二進制日誌寫入是單線程的

因此slave在本地應用也是單線程的

master上有多個庫,每一個庫的事務是可以並行的,因為對A庫的鎖,對B庫是沒有影響的,但是反映到二進制日誌中必然有先後的順序

因此slave落後是沒有辦法避免的,因此mysql 5.5之後引入了多線程機制。

支持一從多主和多線程復制

多線程復制//每一個數據庫只啟用一個線程

//但是主庫是不能一樣的

多線程復制:還是有用的,依賴於gtid

//MySQL 5.6.3之後,MariaDB10.0.5之後

復制線程:Master上的IO線程和Slave上的IO、SQL線程,

數據庫服務的衡量指標:

qps:query per second

tps:事務per second

數據庫壓力測試工具:

sysbench

二、Galera Cluster:多用於MySQL的數據復制

http://galeracluster.com/

更底層的復制機制

需要單獨編譯實現。

安裝方式

msyql官方或者galera //官方提供的支持galera 的版本

percona-cluster //整合過mysql版本

mariadb-cluster //專用的復制

base和epel都沒有提供galera-cluster的源

默認的mariadb版本是不支持galera的

需要用到的包:

MariaDB-5.5.46-centos7-x86_64-client.rpm

MariaDB-5.5.46-centos7-x86_64-common.rpm

MariaDB-Galera-5.5.46-centos7-x86_64-common.rpm

//至少需要3個node


1.前提:hosts文件和時間同步

node1:192.168.1.67

node2:192.168.1.68

node3:192.168.1.69


node1:

建議在本地配置yum源

yum remove mariadb //卸載client和server端

yum install MairaDB-Galera-server

node2:

建議在本地配置yum源

yum remove mariadb //卸載client和server端

yum install MairaDB-Galera-server

node3:

建議在本地配置yum源

yum remove mariadb //卸載client和server端

yum install MairaDB-Galera-server


2.配置文件說明/etc/my.cnf.d/server.cnf

...

[galera]

# Manatory settings //強制配置

#wresp_provider = /usr/lib64/galera/libgalera_smm.so

#wresp_cluster_address = "gcomm://192.168.1.67, 192.168.1.68, 192.168.1.69"

#wresp_cluster_name = "mycluster"

#wresp_node_name = ‘node1‘

#wresp_node_address = ‘192.168.1.67‘ //這兩個可以省略

#binlog_format = row

#default_storage_engine=InnoDB

#bind-address=0.0.0.0


# Optional setting

#wsrep_slave_threads=1

#innodb_flush_logs_at_trx_commit=0

...


首次啟動:需要初始化集群,在其中一個node上執行如下命令

/etc/init.d/mysql start --wsreq-new-cluster

而後正常啟動其他節點即可

3.修改配置文件

node1:

[galera]

wresp_provider=/usr/lib64/galera/libgalera_smm.so

wresp_cluster_address="gcomm://192.168.1.67, 192.168.1.68, 192.168.1.69"

binlog_format=row

default_storage_engine=InnoDB

innodb_autoinc_lock_mode=2

bind-address=0.0.0.0

wresp_cluster_name="mycluster"

node2: 和 node3: 配置文件相同


node1:任意一個node都可以

/etc/rc.d/init.d/mysql start --wsrep-new-cluster

node2:

service mysql start

node3:

service mysql start

3.測試

mysql> 任何一個node創建數據

在其他node上可以看到有數據

node1:

> use mydb;

> create table tb2 (id int unsigned auto_increment not null primary key,name char(30));

> insert into tb2 (name) values (‘hi‘),(‘hello‘);

node2:

> select * from tb2;

id | name

---------

1 | h1

4 | hello

> insert into tb2 (name) values (‘to‘),(‘from‘);

> select * from tb2

1 hi

4 hello

5 to

8 from

使用全局id生成器

r/w分離器:

要麽自己寫

要麽使用開源的工具

或者在應用層配置實現 //一旦故障需要手動修改或者使用vrrp

親測方法:

1.復制所有的rpm文件

2.createrepot /testrepo

3.修改yum文件指向該yum源即可

4.使用yum進行安裝即可


三、MySQL 5.6的多線程復制、GTID

註意:任何服務或者主機都應該被監控

mysql落後的原因:單線程復制,

5.5 半同步

5.6 GTID、多線程復制,

MariaDB在配置文件的mysqld選項組中添加:

slave-parallel-threads

MASTER: my.cnf添加以下參數

binlog_format = row

gtid_mode = ON

enforce-gtid-consistency = ON

slave_parallel_workers=4 --開啟基於庫的多線程復制默認0不開啟

binlog_cache_size = 8M

max_binlog_size = 50M

max_binlog_cache_size = 100M

sync_binlog = 1

expire_logs_days = 1

log-slave-updates=true

SLAVE: my.cnf添加以下參數

binlog_format = row

gtid_mode = ON

enforce-gtid-consistency = ON

binlog_cache_size = 8M

max_binlog_size = 50M

max_binlog_cache_size = 100M

sync_binlog = 1

expire_logs_days = 1

slave_parallel_workers=4

max_relay_log_size = 50M

relay_log_purge = 1

relay_log_recovery = 1

master_verify_checksum = 1 --主事件校驗

slave_sql_verify_checksum = 1 --從事件校驗

slave_allow_batching = 1

log-slave-updates=true


MySQL 5.6和5.7的並行復制:參考

http://www.cnblogs.com/xiaotengyi/p/5532191.html

MySQL主從復制Galera