一.半同步復制
(1)半同步復制作用
相比較于同步復制和異步復制來說,半同步復制的工作原理是當主庫執行完客戶端的提交的事務后并不是馬上返還給客戶端,而是要至少等待一個從庫將事務接收到并將內容寫入relay_log中。這樣做的好處是提高了數據的安全性,但是也會造成一些延遲,所以半同步復制也主要應用在延遲較小的網絡環境中
(2)簡單配置實現半同步復制
首先準備兩個虛擬機,一個作為主庫,一個作為從庫
開啟mysql數據庫
配置兩臺虛擬機為主從復制的關系
主庫上
搜狗截圖20171113211010.png
從庫上
搜狗截圖20171113211034.png
在主庫中設置 grant replication client ,replication slave on . to 'repluser'@'172.18.%.%' identified by 'replpass';
flush privileges;
搜狗截圖20171113211708.png
在主庫上安裝插件
install plugin rpl_semi_sync_master SONAME 'semisync_master';
搜狗截圖20171113212102.png
搜狗截圖20171113212218.png
在從節點上
開啟數據庫
執行 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
搜狗截圖20171113212641.png
在從節點上安裝插件
install plugin rpl_semi_sync_slave SONAME 'semisync_slave';
搜狗截圖20171113212802.png
分別在主從節點上開啟半同步復制的功能
set @@global.rpl_semi_sync_master_enabled=ON;
搜狗截圖20171113213042.png
搜狗截圖20171113213059.png
set @@global.rpl_semi_sync_slave_enabled=ON;
搜狗截圖20171113213339.png
stop slave;
start slave;
show global status like '%rpl%';
搜狗截圖20171113213438.png
此時在主服務器上
搜狗截圖20171113213850.png
create database youdb;
use youdb;
create table hi values(id int,name char(30));
查看后表創建成功
搜狗截圖20171113214132.png
(2)使用復制過濾器
1.概念:僅復制有限一個或幾個數據庫相關的數據,而非所有;由復制過濾器進行;
2.兩種實現思路
(1) 主服務器
主服務器僅向二進制日志中記錄有關特定數據庫相關的寫操作;
問題:其它庫的time-point recovery將無從實現;
binlog_do_db=
binlog_ignore_db=
(2) 從服務器
從服務器的SQL THREAD僅重放關注的數據庫或表相關的事件,并將其應用于本地;
問題:網絡IO和磁盤IO;
Replicate_Do_DB=
Replicate_Ignore_DB=
Replicate_Do_Table=
Replicate_Ignore_Table=
Replicate_Wild_Do_Table=
Replicate_Wild_Ignore_Table=
權衡利弊與實際需要做好采用從服務器實現
(3)實現過程
在從服務器上
stop slave;
set @@global.replicate_ignore_db=youdb;——將youdb數據庫過濾不會對其內容進行復制
start slave;
查看slave狀態
搜狗截圖20171113214847.png
此時在主服務上對youdb數據庫做一些修改
insert into hi values(2,'wanghai');
use database youdb;
搜狗截圖20171113215119.png
在從服務器上去查看
搜狗截圖20171113215211.png
注意小細節:在主服務器上
搜狗截圖20171113215313.png
在從服務上
搜狗截圖20171113215326.png
這說明雖然從服務器也是從相同位置讀取數據,但是并沒有對數據進行復制
(4)復制的監控和維護
1.理日志:PURGE
PURGE { BINARY | MASTER } LOGS { TO 'log_name' | BEFORE datetime_expr };
搜狗截圖20171113215730.png
一般情況下最好不要刪除二進制文件,如果非要刪除,也應該先將二進制文件復制到別的地方,再進行刪除
例:如圖如果想刪除000003以前的日志但不包括000003日志就可以執行 purge binary logs to 'master-log.000003';
2.復制監控
MASTER:
SHOW MASTER STATUS;
SHOW BINLOG EVENTS;
SHOW BINARY LOGS;
SLAVE:
SHOW SLAVE STATUS;
判斷從服務器是否落后于主服務器:
Seconds_Behind_Master: 0
3.如何確定主從節點數據是否一致?
通過表的CHECKSUM檢查;
使用percona-tools中pt-table-checksum;
4.主從數據不一致時的修復方法?
重新復制;
二.主從復制的讀寫分離
(1)常用的軟件是proxysql——下載地址www.proxysql.com,下載對應版本。該軟件特點是高性能,高可用
其他軟件:mysql-proxy ,oneproxy,maxscale
(2)接下來使用proxysql來實現讀寫分離的目的
步驟:在官網上下載好對應版本后,通過yum install proxysql-1.4.2-1-centos67.x86_64.rpm
下載好之后可以先查看一下該軟件的相關信息
搜狗截圖20171114095759.png
進入配置文件進行配置
搜狗截圖20171114100230.png
搜狗截圖20171114101134.png
hostgroup=0代表主數據庫,hostgroup=1代表從數據庫
創建用戶配置段設置
搜狗截圖20171114101646.png
設置查詢規則
搜狗截圖20171114102048.png
調度讀寫分離
搜狗截圖20171114102328.png
實驗進行驗證讀寫分離是否生效
在proxysql服務器上以dbadmin身份登錄數據庫
搜狗截圖20171114102806.png
通過proxysql代理將數據庫代理到主數據庫上,此時寫操作都調度主數據庫上,而讀的內容到調度到從數據庫上
注意細節:不要忘了在從服務器上設置復制過濾器,否則讀寫分離的效果無法生效
三.MHA的應用實現
(1)關于MHA的介紹
MHA(Master HA)是一款開源的Mysql的高可用程序,它為Mysql的主從復制架構提供了自動監測機制,當MHA監測到master主節點出現故障后,它會提升和主節點復制信息內容最接近的slave節點作為新的主節點,并且MHA還會通過獲取其他從節點的信息來避免一些一致性方面的問題。MHA還能提供master在線切換主從節點的功能。
MHA有兩種角色
1.MHA Manager(管理節點):通常單獨的存在于一臺服務器上管理多個master/slave集群,每個集群稱為一個application
2.MHA node(數據節點):該數據節點主要工作在每一個MYSQL服務器上,它通過監控具有解析和清理logs日志功能的腳本來加快故障轉移
(2)準備MHA環境
1.本次實驗要有四個節點
一個節點作為master節點
兩個節點作為slave節點
一個節點作為MHA節點
2.各節點之間要做解析
搜狗截圖20171114150920.png
3.主節點的配置文件進行設置
搜狗截圖20171114151119.png
4.從節點配置文件進行設置
搜狗截圖20171114151241.png
注意server_id不要相同
5.設置完成后主從節點開啟Mysql
在主節點上進行授權
show master status\G;
grant all on . to 'mhaadmin'@'172.18.%.%' identified by
'mhapass';
flush privileges;
在從節點上執行
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
在另一個從節點上做相同操作
復制集群配置完成
6.準備基于SSH互相通信的環境
在其中一個節點上
執行ssh-keygen-id -t rsa -P ''
搜狗截圖20171114154816.png
cd.ssh
ssh-copy-id -i ./id_rsa.pub root@node3
分別將id_rsa 和id_rsa.pub復制到各個節點上
搜狗截圖20171114155135.png
ssh 驗證搜狗截圖20171114155359.png
各個節點都交叉進行驗證
(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
搜狗截圖20171114161350.png
配置完成后進行檢查檢驗ssh通信是否成功
master_check_ssh --conf=/etc/masterha/app1.cnf
主從復制集群是否成功
mhamysql-node-0.56-0.e16.noarch.rpm
注意:要在從節點上手動執行flush privileges;
否則監測結果為Health is not ok
檢查成功后啟動MHA
masterha_manger --conf=/etc/masterha/app1.cnf
(9)模擬主節點故障
關閉主節點數據庫,然后在MHA服務器上重新執行
mhamysql-node-0.56-0.e16.noarch.rpm
監測結果為Health is not ok
此時在從節點上(172.18.25.62)變為主節點
show slave status\G;
內容為空,證明此時該節點為主節點
show master status\G;
變為新的主節點
如果想要原來的主節點上線,就要在原來的主節點的配置文件文件中加入relay_log_purge=OFF relay_only=ON
重新啟動該數據庫,并導入
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也可以執行后臺運行機制
nohup masterha_manager --conf=/etc/masterha/app1.cnf &>/data/master/app1/manager.log &
四.表分區的建立
(1)根據范圍進行劃分
打開數據庫
選擇hellodb數據庫
創建一個表
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);
搜狗截圖20171114201947.png
for語句生成表內容
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
搜狗截圖20171114202754.png
(2)按hash劃分表
創建一個新的表
CREATE TABLE students (id INT, name CHAR(100) NOT NULL, age TINYINT UNSIGNED, gender ENUM('F','M')) PARTITION BY hash(id) PARTITIONS 6;
搜狗截圖20171114203016.png
同樣用for語句創建表的內容
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));
搜狗截圖20171114203658.png