一、主從複制的問題和解決方案
二、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:
node3:
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.修改配置檔案
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
service mysql start
node3:
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.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添加以下參數
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
MySQL 5.6和5.7的并行複制:參考
http://www.cnblogs.com/xiaotengyi/p/5532191.html
本文轉自MT_IT51CTO部落格,原文連結:http://blog.51cto.com/hmtk520/1943840,如需轉載請自行聯系原作者