一.半同步復(fù)制
(1)半同步復(fù)制作用
相比較于同步復(fù)制和異步復(fù)制來說污抬,半同步復(fù)制的工作原理是當(dāng)主庫執(zhí)行完客戶端的提交的事務(wù)后并不是馬上返還給客戶端,而是要至少等待一個從庫將事務(wù)接收到并將內(nèi)容寫入relay_log中绳军。這樣做的好處是提高了數(shù)據(jù)的安全性印机,但是也會造成一些延遲,所以半同步復(fù)制也主要應(yīng)用在延遲較小的網(wǎng)絡(luò)環(huán)境中
(2)簡單配置實現(xiàn)半同步復(fù)制
首先準(zhǔn)備兩個虛擬機门驾,一個作為主庫射赛,一個作為從庫
開啟mysql數(shù)據(jù)庫
配置兩臺虛擬機為主從復(fù)制的關(guān)系
主庫上
從庫上
在主庫中設(shè)置 grant replication client ,replication slave on . to 'repluser'@'172.18.%.%' identified by 'replpass';
flush privileges;
在主庫上安裝插件
install plugin rpl_semi_sync_master SONAME 'semisync_master';
在從節(jié)點上
開啟數(shù)據(jù)庫
執(zhí)行 change master to master_host='172.18.254.242',master_user='repluser',master_password='replpass',master_log_file='master-log.000003' master_log_pos=245;
start slave;
show slave status\G
在從節(jié)點上安裝插件
install plugin rpl_semi_sync_slave SONAME 'semisync_slave';
分別在主從節(jié)點上開啟半同步復(fù)制的功能
set @@global.rpl_semi_sync_master_enabled=ON;
set @@global.rpl_semi_sync_slave_enabled=ON;
stop slave;
start slave;
show global status like '%rpl%';
此時在主服務(wù)器上
create database youdb;
use youdb;
create table hi values(id int,name char(30));
查看后表創(chuàng)建成功
(2)使用復(fù)制過濾器
1.概念:僅復(fù)制有限一個或幾個數(shù)據(jù)庫相關(guān)的數(shù)據(jù),而非所有奶是;由復(fù)制過濾器進行楣责;
2.兩種實現(xiàn)思路
(1) 主服務(wù)器
主服務(wù)器僅向二進制日志中記錄有關(guān)特定數(shù)據(jù)庫相關(guān)的寫操作;
問題:其它庫的time-point recovery將無從實現(xiàn)聂沙;
binlog_do_db=
binlog_ignore_db=
(2) 從服務(wù)器
從服務(wù)器的SQL THREAD僅重放關(guān)注的數(shù)據(jù)庫或表相關(guān)的事件腐魂,并將其應(yīng)用于本地;
問題:網(wǎng)絡(luò)IO和磁盤IO;
Replicate_Do_DB=
Replicate_Ignore_DB=
Replicate_Do_Table=
Replicate_Ignore_Table=
Replicate_Wild_Do_Table=
Replicate_Wild_Ignore_Table=
權(quán)衡利弊與實際需要做好采用從服務(wù)器實現(xiàn)
(3)實現(xiàn)過程
在從服務(wù)器上
stop slave;
set @@global.replicate_ignore_db=youdb;——將youdb數(shù)據(jù)庫過濾不會對其內(nèi)容進行復(fù)制
start slave;
查看slave狀態(tài)
此時在主服務(wù)上對youdb數(shù)據(jù)庫做一些修改
insert into hi values(2,'wanghai');
use database youdb;
在從服務(wù)器上去查看
注意小細(xì)節(jié):在主服務(wù)器上
在從服務(wù)上
這說明雖然從服務(wù)器也是從相同位置讀取數(shù)據(jù),但是并沒有對數(shù)據(jù)進行復(fù)制
(4)復(fù)制的監(jiān)控和維護
1.理日志:PURGE
PURGE { BINARY | MASTER } LOGS { TO 'log_name' | BEFORE datetime_expr };
一般情況下最好不要刪除二進制文件蛔琅,如果非要刪除狭魂,也應(yīng)該先將二進制文件復(fù)制到別的地方,再進行刪除
例:如圖如果想刪除000003以前的日志但不包括000003日志就可以執(zhí)行 purge binary logs to 'master-log.000003';
2.復(fù)制監(jiān)控
MASTER:
SHOW MASTER STATUS;
SHOW BINLOG EVENTS;
SHOW BINARY LOGS;
SLAVE:
SHOW SLAVE STATUS;
判斷從服務(wù)器是否落后于主服務(wù)器:
Seconds_Behind_Master: 0
3.如何確定主從節(jié)點數(shù)據(jù)是否一致?
通過表的CHECKSUM檢查;
使用percona-tools中pt-table-checksum;
4.主從數(shù)據(jù)不一致時的修復(fù)方法育叁?
重新復(fù)制;
二.主從復(fù)制的讀寫分離
(1)常用的軟件是proxysql——下載地址www.proxysql.com,下載對應(yīng)版本芍殖。該軟件特點是高性能豪嗽,高可用
其他軟件:mysql-proxy ,oneproxy,maxscale
(2)接下來使用proxysql來實現(xiàn)讀寫分離的目的
步驟:在官網(wǎng)上下載好對應(yīng)版本后,通過yum install proxysql-1.4.2-1-centos67.x86_64.rpm
下載好之后可以先查看一下該軟件的相關(guān)信息
進入配置文件進行配置
hostgroup=0代表主數(shù)據(jù)庫,hostgroup=1代表從數(shù)據(jù)庫
創(chuàng)建用戶配置段設(shè)置
設(shè)置查詢規(guī)則
調(diào)度讀寫分離
實驗進行驗證讀寫分離是否生效
在proxysql服務(wù)器上以dbadmin身份登錄數(shù)據(jù)庫
通過proxysql代理將數(shù)據(jù)庫代理到主數(shù)據(jù)庫上龟梦,此時寫操作都調(diào)度主數(shù)據(jù)庫上隐锭,而讀的內(nèi)容到調(diào)度到從數(shù)據(jù)庫上
注意細(xì)節(jié):不要忘了在從服務(wù)器上設(shè)置復(fù)制過濾器,否則讀寫分離的效果無法生效
三.MHA的應(yīng)用實現(xiàn)
(1)關(guān)于MHA的介紹
MHA(Master HA)是一款開源的Mysql的高可用程序计贰,它為Mysql的主從復(fù)制架構(gòu)提供了自動監(jiān)測機制钦睡,當(dāng)MHA監(jiān)測到master主節(jié)點出現(xiàn)故障后,它會提升和主節(jié)點復(fù)制信息內(nèi)容最接近的slave節(jié)點作為新的主節(jié)點躁倒,并且MHA還會通過獲取其他從節(jié)點的信息來避免一些一致性方面的問題荞怒。MHA還能提供master在線切換主從節(jié)點的功能。
MHA有兩種角色
1.MHA Manager(管理節(jié)點):通常單獨的存在于一臺服務(wù)器上管理多個master/slave集群秧秉,每個集群稱為一個application
2.MHA node(數(shù)據(jù)節(jié)點):該數(shù)據(jù)節(jié)點主要工作在每一個MYSQL服務(wù)器上褐桌,它通過監(jiān)控具有解析和清理logs日志功能的腳本來加快故障轉(zhuǎn)移
(2)準(zhǔn)備MHA環(huán)境
1.本次實驗要有四個節(jié)點
一個節(jié)點作為master節(jié)點
兩個節(jié)點作為slave節(jié)點
一個節(jié)點作為MHA節(jié)點
2.各節(jié)點之間要做解析
3.主節(jié)點的配置文件進行設(shè)置
4.從節(jié)點配置文件進行設(shè)置
注意server_id不要相同
5.設(shè)置完成后主從節(jié)點開啟Mysql
在主節(jié)點上進行授權(quán)
show master status\G;
grant all on . to 'mhaadmin'@'172.18.%.%' identified by
'mhapass';
flush privileges;
在從節(jié)點上執(zhí)行
change master to master_host='172.18.254.242',master_user='repluser',master_password='replpass',master_log_file='master-log.000004',master_log_pos=245;
start slave;
show slave status\G
在另一個從節(jié)點上做相同操作
復(fù)制集群配置完成
6.準(zhǔn)備基于SSH互相通信的環(huán)境
在其中一個節(jié)點上
執(zhí)行ssh-keygen-id -t rsa -P ''
cd.ssh
ssh-copy-id -i ./id_rsa.pub root@node3
分別將id_rsa 和id_rsa.pub復(fù)制到各個節(jié)點上
ssh 驗證
各個節(jié)點都交叉進行驗證
(7)安裝MHA
在node4上進行安裝
lftp 172.18.0.1/pub
cd Source
cd 6.x86_64
mget mhamysql-manager-0.56-0.e16.noarch.rpm
mhamysql-node-0.56-0.e16.noarch.rpm
在主從點上安裝mhamysql-node-0.56-0.e16.noarch.rpm即可
(8)對MHA進行的配置文件進行配置
mkdir /etc/masterha
vim /etc/masterha/app1.cnf
配置完成后進行檢查檢驗ssh通信是否成功
master_check_ssh --conf=/etc/masterha/app1.cnf
主從復(fù)制集群是否成功
mhamysql-node-0.56-0.e16.noarch.rpm
注意:要在從節(jié)點上手動執(zhí)行flush privileges;
否則監(jiān)測結(jié)果為Health is not ok
檢查成功后啟動MHA
masterha_manger --conf=/etc/masterha/app1.cnf
(9)模擬主節(jié)點故障
關(guān)閉主節(jié)點數(shù)據(jù)庫,然后在MHA服務(wù)器上重新執(zhí)行
mhamysql-node-0.56-0.e16.noarch.rpm
監(jiān)測結(jié)果為Health is not ok
此時在從節(jié)點上(172.18.25.62)變?yōu)橹鞴?jié)點
show slave status\G象迎;
內(nèi)容為空撩嚼,證明此時該節(jié)點為主節(jié)點
show master status\G;
變?yōu)樾碌闹鞴?jié)點
如果想要原來的主節(jié)點上線,就要在原來的主節(jié)點的配置文件文件中加入relay_log_purge=OFF relay_only=ON
重新啟動該數(shù)據(jù)庫挖帘,并導(dǎo)入
change master to master_host='172.18.25.62',master_user='repluser',master_password='replpass',master_log_file='master-log.000003',master_log_pos=395;
start slave;
show slave status\G;
上線成功
注意:啟動MHA也可以執(zhí)行后臺運行機制
nohup masterha_manager --conf=/etc/masterha/app1.cnf &>/data/master/app1/manager.log &
四.表分區(qū)的建立
(1)根據(jù)范圍進行劃分
打開數(shù)據(jù)庫
選擇hellodb數(shù)據(jù)庫
創(chuàng)建一個表
CREATE TABLE students (id INT, name VARCHAR(100), age TINYINT UNSIGNED NOT NULL, gender ENUM('F','M')) PARTITION BY range(age)(partition youngman values less than (40), partition middleman values less than (70), partition oldman values less than maxvalue);
for語句生成表內(nèi)容
gender=('F' 'M')
echo ${gender[0]}
echo ${gender[1]}
for i in {1..1000};do mysql -e "insert into hellodb.students2 values ($i,'stu$i',$[RANDOM%100+18],'${gender[$RANDOM%2]}');" -uroot -pmagedu;done
(2)按hash劃分表
創(chuàng)建一個新的表
CREATE TABLE students (id INT, name CHAR(100) NOT NULL, age TINYINT UNSIGNED, gender ENUM('F','M')) PARTITION BY hash(id) PARTITIONS 6;
同樣用for語句創(chuàng)建表的內(nèi)容
for i in {1..1000};do mysql -e "insert into hellodb.students values ($i,'stu$i',$[RANDOM%100+18],'${gender[$RANDOM%2]}');" -uroot -pmagedu;done
(3)按照List來劃分表
CREATE TABLE students (id INT, name CHAR(100) NOT NULL, age TINYINT UNSIGNED, gender ENUM('F','M'),majorid tinyint unsigned not null) partition by list(majorid) (partition apr0 values in (1,4,7),partition par1 values in (2,5,8),partition par2 values in (3,6,9));