1. MySQL高可用需求介紹
1.1 MySQL高可用生產業務需求
在企業實際生產場景中,一主多從的MySQL數據庫架構師最常用的架構,該架構部署簡單、維護方便,並且通過簡單的代理或者通過程序的方式就可以實現對主從庫的讀寫分離,且多個從庫還可以通過lvs或haproxy實現對多個從庫的負載均衡。
但是,在以上的MySQL數據庫架構中,我們不難發現,雖然從庫是多個,但是主庫僅有一個,也就是說主庫一旦宕機,所有的寫業務就會終止,而從庫宕機1個就沒什麼大的影響。
Mysql+Drbd+Heartbeat高可用服務應用,這個解決方案可以有效的解決主庫單點的問題。當主庫宕機後。可以實現主庫從一個主節點切換到另一個主節點,而所有的從庫會自動和新的主庫進行同步,且新主庫的數據和宕機瞬間的主幾乎完全一致,從而實現了MySQL主庫的熱備方案。
1.2 MySQL高可用架構拓撲
正常情況說明:
A. Heartbeat通過串口線或直練線對DB服務做健康檢查,並執行DRBD、MySQL、VIP等資源自動動態切換
B. db-1-2作爲db-1-1高可用備份,正常情況下db-1-1提供一個主分區給MySQL使用
C. 物理磁盤做RAID10或RAID0,根據性能和冗餘需求來選
D. 服務器之間、服務器和交換機之間都是雙千兆網卡綁定
E. 應用服務器(包括不限於web等)通過VIP訪問MySQL主庫
F. MySQL在DRBD分區1中
G. MySQL slave1,MySQL slave2通過VIP同步主庫MySQL 3306
H. 以上高可用爲MySQL多從的模式,屬於一主二從。
1.2.2 MySQL主庫宕機切換過程架構拓撲
1.2.3 MySQL主庫宕機切換新主後架構拓撲
提示:經過高可用方案切換後的數據庫架構,就是一個常規的主從結構。此時,主庫就從熱備變成了單點,因此,要儘快恢復原來的主庫,以確保切換後的新主庫宕機對業務帶來的影響。
1.3 MySQL高可用生產需求描述
假設有3臺數據庫服務器db-1-1/db-1-2/db-1-3,其實際IP分別爲10.0.15.81(db-1-1),10.0.15.82(db-1-2),10.0.15.83(db-1-3)
db-1-1的數據庫文件目錄爲/data,對前端提供的訪問VIP爲10.0.15.181
配置目標:一旦數據庫服務器db-1-1宕機,服務器上的mysql數據庫服務和虛擬IP會自動切換到服務器db-1-2繼續提供服務,從而達到mysql數據庫高可用無業務影響的目的。
這裏還有一個特別的問題,就是以前的多個從庫如何能自動和新的主庫同步,經過實踐,通過drbd的方式同步,然後做從庫時使用和主庫對外提供服務的VIP爲同步IP,當主庫宕機後,VIP漂移到熱備主庫,默認情況60秒內,從庫就可以找到新的VIP,從而自動和新的主庫同步。強調:通過MySQL同步做雙主的方式,是難以做到主庫宕機從庫和新的主庫自動同步的
1.4 高可用架構圖
單主熱備模式:上圖
雙主熱備模式:
1.5 網卡及IP資源
名稱 | 接口 | IP | 用途 |
MASTER | eth0 | 10.0.15.81 | 外網管理IP,用於WAN數據轉發 |
eth1 | 192.168.2.81 | 用於MYSQL服務器間心跳連接(直連) | |
eth2 | 192.168.3.81 | 用於MYSQL服務器DRBD同步(直連) | |
vip | 10.0.15.181 | 用於對外MySQL數據庫服務VIP | |
BACKUP | eth0 | 192.168.1.82 | 外網管理IP,用於WAN數據轉發 |
eth1 | 192.168.2.82 | 用於MYSQL服務器間心跳連接(直連) | |
eth2 | 192.168.3.82 | 用於MYSQL服務器DRBD同步(直連) | |
vip |
2. 開始部署mysql高可用
2.1 分別修改服務器機器名
分別設置兩臺機器的hostname爲db-1-1/db-1-2
方法爲:編輯/etc/sysconfig/network,設置HOSTNAME=db-1-1和HOSTNAME=db-1-2,然後再命令行執行hostname db-1-1和hostname db-1-2使設置馬上生效
2.2 分別增加配置一塊硬盤
2.3 分別配置hosts
vim /etc/hosts
10.0.15.81 db-1-1
10.0.15.82 db-1-2
2.4 添加路由
81主機:
route add -host 192.168.2.82 dev eth1
route add -host 192.168.3.82 dev eth2
echo 'route add -host 192.168.2.82 dev eth1' >> /etc/rc.local
echo 'route add -host 192.168.3.82 dev eth2' >> /etc/rc.local
82主機:
route add -host 192.168.2.81 dev eth1
route add -host 192.168.3.81 dev eth2
echo 'route add -host 192.168.2.81 dev eth1' >> /etc/rc.local
echo 'route add -host 192.168.3.81 dev eth2' >> /etc/rc.local
2.5 硬盤分區,格式化
2.6 安裝相關軟件
安裝drbdyum -y install kmod-drbd83 drbd83
安裝heartbeatyum -y install heartbeat
安裝mysql通過編譯方式安裝
2.7 理順MySQL數據/data目錄各配置列表
主機名稱 | db-1-1 | db-1-2 |
管理IP | eth0:10.0.15.81 | eth0:10.0.15.82 |
DRBD管理名稱 | data | data |
DRBD掛載目錄 | /data | /data |
DRBD邏輯設備 | /dev/drbd0 | /dev/drbd0 |
DRBD對接IP | eth2:192.168.3.81/24 | eth2:192.168.3.82/24 |
DRBD存儲設備 | /dev/sdb1 | /dev/sdb1 |
DRBD Meta設備 | /dev/sdb2 | /dev/sdb2 |
NFS/MySQL導出目錄 | /data | /data |
NFS/MySQL虛擬IP | eth0:10.0.15.181/24 | eth0:10.0.15.181/24 |
注:灰色部分爲自動生成
2.8 配置heartbeat服務
在高可用方案中,heartbeat服務的主要作用就是控制IP及drbd,mysql等服務根據要在主備節點上正確的啓動和停止
Heartbeat的默認配置文件目錄爲/etc/ha.d。Heartbeat常用的配置文件有三個,ha.cf、authkey、haresource
配置名稱 | 作用 | 備註 |
ha.cf | heartbeat參數配置文件 | 在這裏配置heartbeat的一些基本參數 |
authkey | heartbeat認證文件 | 高可用服務器對之間根據對端的authkey,對對端進行認證,權限必須是600 |
haresource | heartbeat資源配置文件 | 如配置IP資源及腳本程序等 |
2.8.2配置authkey文件
cat authkey
auth 1
1 sha1 47e9336850f1db6fa58bc470bc9b7810eb397f04
chmod 600 /etc/ha.d/authkey
2.8.3 配置ha.cf
vim ha.cf
#the start by oldboy
debugfile /var/log/ha-debug
logfile /var/log/ha-log
logfacility local1
keepalive 2
deadtime 30
warntime 10
initdead 120
#bcast eth1
mcast eth1 225.0.0.81 694 1 0
auto_failback on
node db-1-1
node db-1-2
crm no
2.8.4 配置haresoure文件
vim haresources
#oldboy services
#db-1-1 IPaddr::10.0.15.181/24/eth0 ---->先用這個測試下,是否可以起到VIP
db-1-1 IPaddr::10.0.15.181/24/eth0 drbddisk::data Filesystem::/dev/drbd0::/data::ext3 rsdata
2.8.5 配置haresource說明
db-1-1 IPaddr::10.0.0.17/24/eth0 drbddisk::data Filesystem::/dev/drbd0::/data::ext4 rsdatadb-1-1 ==>主機名,表示初始狀態會在db-1-1綁定IP 10.0.15.181
IPaddr ==>heartbeat配置IP的默認腳本,其後的IP等都是其參數
10.0.15.181/24/eth0 ==>集羣對外服務的VIP,初始啓動在db-1-1上
drbddisk::data ==>啓動drbd data資源,相當於執行/etc/ha.d/resource.d/drbddidk data stop/start
Filesystem::/dev/drbd0::/data::ext3 ==>drbd分區掛載到/data目錄,這裏相當於/etc/ha.d/resource.d/Filesystem::/dev/drbd0/data ext3 stop/start
rsdata ==>啓動mysql服務腳本。這裏相當於/etc/init.d/rsdata stop/start
2.9 測試
/etc/init.d/heartbeat start
3. 配置DRBD服務
在高可用方案中,DRBD的主要作用就是確保數據能實時完整從主節點同步到熱備節點上。
3.1 加載drbd模塊到內核
modprobe drbd(臨時生效)
lsmod | grep drbd
3.2 初始化DRBD的metadata並啓動DRBD
創建DRBD記錄信息的metdata分區數據塊
drbdadm create-md data
drbdadm up all
3.3 指定一個要同步的資源,同步數據到對端
在主節點的一端執行
drbdadm -- --overwrite-data-of-peer primary data
此步執行完,如果從端分區爲空,就會自動開始進行數據同步
從端查看:
cat /proc/drbd
version: 8.4.1 (api:1/proto:86-100)
GIT-hash: 91b4c048c1a0e06777b5f65d312b38d47abaea80 build by root@db-1-2, 2016-04-29 02:11:47
0: cs:SyncTarget ro:Secondary/Primary ds:Inconsistent/UpToDate C r-----
ns:0 nr:396288 dw:396288 dr:0 al:0 bm:24 lo:1 pe:9 ua:0 ap:0 ep:1 wo:b oos:1145924
[====>...............] sync'ed: 26.0% (1145924/1542212)K
finish: 0:00:11 speed: 99,072 (99,072) want: 102,400 K/sec
3.4 配合heartbeat調試drbd服務
需要執行相關切換命令確保heartbeat服務及drbd服務之間的配合是正確的才能繼續進行。這類似項目階段的里程碑,成功配置drbd服務,並且能配合heartbeat服務進行主備切換時第二步。
cat /etc/ha.d/haresources
db-1-1 IPaddr::10.0.15.181/24/eth0 drbddisk::data Filesystem::/dev/drbd0::/data::ext4
重新啓動heartbeat服務
判斷heartbeat配合drbd啓動成功的3點
1)ifconfig 查看是否有VIP
2)df -h 查看drbd0是否掛載
3)cat /proc/drbd 查看Primary/Secondary主從是否正確
3.5 heartbeat配合drbd調試的結論
主備節點的啓動順序是相同的:
1)VIP啓動 2)drbd啓動 3)drbd分區的掛載
發生切換時主或者備節點釋放資源的順序是相同的,但是和上面啓動的順序是相反的
1)drbd分區的掛載 2)drbd啓動和設置 3)vip的啓動
重點中的重點:
根據heartbeat的日誌文件以及heartbeat原理及啓動資源的順序去排查問題
排查的方法就是按照啓動heartbeat服務,heartbeat加載腳本資源的順序手動啓動檢查。
4. MySQL服務安裝配置
4.1 掛載drbd0分區到/data目錄
生產應用場景這裏的掛載操作是由heartbeat控制掛載和卸載的
mount /dev/drbd0
4.2 安裝mysql
cd /home/yan/tools/
........
4.3 創建數據文件目錄
mkdir -p /data/3306/data
4.4 上傳3306 my.cnf配置文件,mysql啓動腳本
4.5 授權
chown mysql:mysql /data/3306/
4.6 初始化數據庫並加700權限
chmod 700 mysql
export PATH=/application/mysql-5.5.32/bin:$PATH >> /etc/profile
./mysql_install_db --basedir=/application/mysql-5.5.32/ --datadir=/data/3306/data --user=mysql
chown -R mysql:mysql /data/
4.7 啓動數據庫
/data/3306/mysql start
或者手動啓動:
/application/mysql/bin/mysqld_safe --defaults-file=/data/3306/my.cnf
4.8 測試備節點數據庫
備節點上的MySQL僅僅執行到make install完成就不需要操作了,因爲MySQL的數據文件會被drbd運送到備節點分區裏,因此,正常情況下,我們手工模擬停止drbd服務,掛載數據分區後,MySQL服務能正常啓動纔對
我們也可以在備節點安裝數據庫,但目的僅僅是測試備節點的安裝和啓動是否正常,測試完畢後,需要把/data裏的數據移走或者刪除
4.9 創建一個多實例(3307)
mkdir -R /data/3307/data
初始化:
./mysql_install_db --basedir=/application/mysql/ --datadir=/data/3307/data/ --user=mysql
4.10 設置3307 爲3306的從庫
要使用VIP進行同步,這樣當主庫掛掉後能夠
5.
5.1 主庫宕機後恢復了,如何將宕機恢復後的主庫變爲主
啓動ha,或者hb_takevoer,ha自動接管的參數
5.2 監控方案
a.服務本身
b.主從同步狀態和延遲時間
c.裂腦監控:備節點出現VIP就認爲裂鬧了。更細緻的就是主節點宕機並且備節點VIP出現。
d.監控drbd的同步狀態