腳本后續更新及迭代將由kkitDeploy項目代替 https://github.com/luckman666/kkitdeploy_server 請大家持續關注kkitDeploy
還記得我們之前部署mysql集群有多麻煩嘛?波哥來救你們啦!~
我已將項目上傳到了我的github倉庫中,大家可以點擊倉庫地址出現的連接登錄查看相應的代碼!如果覺得不錯別忘了轉發、點贊哦!
部署步驟:
1 git clone https://github.com/luckman666/deploy_mysql_cluster.git 2 cd deploy_mysql_cluster 3 # 編輯bash.config參數 4 chmod -R 755 . 5 ./deploy_mysql_master.sh
以上幾步就完成了一套多節點多主多從故障自動切換的mysql數據庫集群。
使用及注意事項:
如果集群出現某一節點出現故障:
1、集群會立刻將其剔除集群,停止同步。
2、(主節點故障)keepalived兩秒內會感知mysql故障,從集群中踢除本節點mysql,本節點降權並將VIP漂移至完好節點,整個集群繼續提供服務。
3、(從節點故障)keepalived直接關閉該節點服務,將該節點剔除集群。
故障修復后加入集群方式:
恢復節點上執行此命令(注意修改參數):
docker run -d -p 3306:3306 -p 4444:4444 -p 4567:4567 -p 4568:4568 -e MYSQL_ROOT_PASSWORD="mysqlroot密碼" -e CLUSTER_JOIN=主節點主機名(mysql1) -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD="mysqlroot密碼" -v /opt/mysql/data:/var/lib/mysql -v /opt/mysql/backup:/data -v /etc/localtime:/etc/localtime:ro -v /var/run/docker.sock:/var/run/docker.sock --privileged -e character-set-server=utf8mb4 -e collation-server=utf8mb4_unicode_ci --name="故障節點主機名" --net=swarm_mysql docker.io/percona/percona-xtradb-cluster
同步完成后啟動再keepalived
systemctl restart keepalived
檢查keepalived啟動狀態
systemctl status keepalived
通過工具或者查看容器日志查看mysql運行是否良好!
如果發現keepalived啟動后報127異常退出的錯誤
那么請升級系統內核至4+版本腳本內容如下:
1 #!/bin/bash 2 3 setupkernel(){ 4 5 rpm --import [https://www.elrepo.org/RPM-GPG-KEY-elrepo.org](https://www.elrepo.org/RPM-GPG-KEY-elrepo.org) 6 7 rpm -Uvh [http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm](http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm) 8 9 yum --enablerepo=elrepo-kernel install -y kernel-lt kernel-lt-devel 10 11 grub2-set-default 0 12 13 reboot 14 15 } 16 17 setupkernel
設計這套mysql的集群方案主要是面向我司的賬單系統。因為都是賬單數據,對於數據的丟失的容忍度為0。所以采用多節點強制同步的PXC集群方式。部署采用docker方式,網絡方案采用swarm的overlay網絡,冗余策略是keepalived
大家可能對pxc集群方案略有陌生這里簡單給大家介紹一下:
1、傳統的Repliaction 集群方案(1主多從)
2、PXC 集群方案( Percona XtraDB Cluster 多主多從)
方案場景對比:



可以看到PXC是數據強一致性的集群,事務在所有集群節點要么同時提交,要么不提交。而Replication 采用異步復制,無法保證數據的一致性。
因為項目數據庫是主要用來存儲賬單和錢款的,所以就采用了PXC的集群方式。
為什么用了swarm?
k8s確實強大但是只適合大規模集群,對於中小集群還是swarm最為合適。畢竟是docker親生的兒子。各種角度都集成的比較好。所以在確定了mysql的集群方式為PXC后就選用了swarm來實現分布式管理(以后會單拿出一篇文章來專門寫swarm)。
為什么是keepalived而不是haproxy?
因為是PXC方式,前端代碼又沒做讀寫分離,所以就采用了keepalived的方式來進行集群故障轉移和反向代理工作,這樣所有前端應用會使用集群中的其中一台mysql寫入或讀取數據。這樣避免雙向同步的損耗!
如果您的項目是讀寫分離的,那也可以用keepalived再綁定一個VIP然后放到另一個集群節點上提供讀服務即可!
PS:
還有容器數據備份及集群調優會陸續發布,希望大家持續關注簡書或者我的公眾號哦!我會繼續努力給大家提供技術干貨和開發各種IT實用工具。不過千里之行始於足下,慢慢來吧!加油!
關注公眾號永遠走不丟!還有更實用的工具等您拿!