Mysql分佈式系統:
CAP標準:分佈式系統最多能夠實現其中的兩點,經常使用的有AP和AC;
C:一致性
A:可用性
P:網絡分區(分裂)容錯性
mysql的切分:
垂直切分:將一個數據庫中的多張表分散到多個mysql服務器中(儘可能讓那些須要作聯合查詢的表位於同一個mysql數據庫中,好比JOIN操做,而且儘可能讓使用頻繁的表位於不一樣mysql數據庫);
水平切分:將某個表按行切分之後分佈到不一樣的數據庫中;
Mysql複製之主節點的高可用:
MMM:Multi Master MySQL
MHA:Master HA
安裝包下載:https://blog.csdn.net/debimeng/article/details/80542521
MHA Manager:一般單獨部署在一臺獨立機器上,管理多個master/slave集羣,每一個master/slave集羣稱做一個application;
包含的組件:
masterha_check_ssh:MHA依賴的環境監測工具;
masterha_check_repo:mysql複製環境監測工具;
MHA manager要有擁有控制每一個slave數據庫的權限,從而才能對其執行切換主節點、將新晉主節點設置爲可寫(由於從節點通常默認是不可寫的(read_only));
masterha_manager:MHA服務主程序;
masterha_check_status:MHA運行狀態探測工具;
masterha_master_monitor:mysql master節點可用性監測工具;
masterha_master_switch:master節點切換工具;
masterha_conf_host:添加或刪除配置節點;
masterha_stop:關閉MHA服務的工具;
MHA Node:運行在每臺mysql服務器上(master/slave/manager),它經過監控具有解析和清理logs功能的腳原本加快故障轉移;
包含的組件:
save_binary_logs:保存和複製master的二進制日誌;
apply_diff_relay_logs:識別差別的中繼日誌事件並應用於其它slave;
在提高一個從節點爲主節點時,會事先合併全部從節點中的中繼日誌事件,而後將其應用到一個從節點上,使其做爲新的主節點;
purge_relay_logs:清除中繼日誌(不會阻塞SQL線程)
VIP(IP地址漂移):當新的主節點接替故障主節點工做時,不只是須要更新新晉主節點的數據,其IP地址也要進行改變,進程原來主節點的IP,才能繼續提供服務;咱們能夠他經過keepalived來實現IP地址的切換,也可使用MHA自帶的腳原本實現IP地址的切換;
自定義擴展功能:
secondary_check_script:經過多條網絡路由檢測master的可用性;
master_ip_failover_script:更新application使用的masterip;
shutdown_script:強制關閉master節點;
report_script:發送報告;
init_conf_load_script:加載初始配置參數;
master_ip_online_change_script:更新master節點的ip地址;
MHA自身提供了管理端和節點端,其中管理端本身運行在一個主機上,每一個集羣中的mysql服務器都要運行節點端,其實現高可用的方式就是經過管理端監控(能夠是心跳信息等方式)mysql複製集羣中的主節點,當發現主節點故障之後,就會自動的在從節點中選取(通常是數據比較全面的)一臺mysql服務器,做爲主節點,而後讓剩下的從節點以新節點爲主節點,進而從其繼續複製數據;當原來的主節點從新上線之後,其也不能搶佔現有主節點,而是做爲從節點提供服務;此技術是用於mysql的主從複製結構中的;
html
Galera Cluster:與MMM或MHA不一樣,其是基於wresp協議來完成高可用的;
Galera Cluster不是基於mysql的各類複製結構來實現可用性的(即不是經過mysql協議讀取二進制日誌文件來傳輸數據的),而是經過更底層的wresp協議將mysql服務器節點(不區分主從節點)上的發生變化的數據同步到其餘節點;
引入中間件:
能夠經過中間件實現讀寫分離,在中間件中對發來的mysql數據請求作分析,若是過是讀請求就發送給從服務器,若是是寫請求就發送給寫服務器,而且還以能夠經過中間件作負載均衡,將讀請求分散的發送到衆多的從服務器中,對於主節點的可用性,能夠佈置多個主節點,當中間件調度寫請求時,同時對多個主節點進行寫操做,從而實現數據的同步,也增長了主節點的可用性;當請求過可能是還能夠在中間件中建立等待隊列,緩解mysql服務器的壓力;不過這種中間件通常都要本身開發,有必定的難度;
示例:
1.MHA
拓撲結構:一共四個節點,一個MHA Manager節點、一個Mysql主節點、兩個Mysql從節點;
a.配置hosts文件,使其可以經過主機名通訊;
~]# cat /etc/hosts
192.168.80.143 master
192.168.80.136 manager
192.168.80.131 slave1
192.168.80.134 slave2
b.設置主節點的配置文件(配置同下面從節點)及添加複製時使用的受權用戶;
systemctl start mariadb.service
MariaDB [(none)]> show master status;
MariaDB [(none)]> grant replication slave,replication client on *.* to 'repluser'@'192.168.80.%' identified by 'replpass';
MariaDB [(none)]> flush privileges;
c.設置從節點的配置文件;
~]# cat /etc/my.cnf
# The MariaDB server
[mysqld]
skip_name_resolve = ON
innodb_file_per_table = ON
log_bin = master-bin
relay_log = relay-log
server_id = 2
read_only = 1
relay_log_purge = 0
d.配置主從複製,將主節點的數據複製到從節點;
mysql> change master to master_host='192.168.80.143',master_user='repluser',master_password='replpass',master_log_file='master-bin.000004',master_log_pos=498;
將上面MariaDB [(none)]> show master status;命令輸出的pos位置填入,便可一塊兒將受權帳號一併複製過來了,或者本身手動添加也行;
mysql> start slave;
e.在主節點上添加一個給MHA使用的帳號;
MariaDB [(none)]> grant all on *.* to 'mhauser'@'192.168.80.%' identified by 'mhapqss';
MariaDB [(none)]> flush privileges;
f.配置全部節點能夠經過ssh互通;
~]# ssh-keygen -t rsa -P ''
~]# cat .ssh/id_rsa.pub >> .ssh/authorized_keys
~]# chmod og= .ssh/authorized_keys
~]# scp -p .ssh/id_rsa .ssh/authorized_keys .ssh/id_rsa.pub centos7:/root/.ssh/
g.在manager主機上安裝mha4mysql-manager和mha4mysql-node、在master和slave節點上安裝mha4mysql-node;(安裝以前須要配置好epel源)
~]# yum install ./mha4mysql-node-0.58-0.el7.centos.noarch.rpm
~]# yum install ./mha4mysql-manager-0.58-0.el7.centos.noarch.rpm
h.編輯MHA的配置文件;配置文件路徑須要本身建立:mkdir /etc/masterha/
global配置:全局配置,爲各application提供默認配置;
user=NAME:指定mysql中的帳戶;
password=PASSWORD:指定帳戶密碼;
manager_workdir=PATH:指定其管理的app存放數據的目錄;
manager_log=PATH:指定某個app的日誌文件位置;
remote_workdir=PATH:管理遠端節點的工做目錄;
ssh_user=NAME:指定登陸ssh的用戶;
repl_user=NAME:指定mysql中具備主從複製權限的用戶;
repl_password=PASSWORD:指定用戶密碼;
ping_interval=1:用於檢測主節點是否在線的間隔時間;
application配置:用來指定單個application的信息;
server#:標記每一個節點;
hostname=IP_ADDR:指定每一個節點的IP地址;
ssh_port=PORT:指定ssh的端口號;
candidate_master=1|0:是否能夠參與稱爲主節點;
Note:更多參數請查看官方文檔;
示例:
~]# mkdir /etc/masterha/
~]# cat /etc/masterha/app.cnf
[server default]
user=mhauser
password=mhapass
manager_workdir=/data/masterha/app
master_log=/data/masterha/app/manager.log
remote_workdir=/data/masterha/app
ssh_user=root
repl_user=repluser
repl_password=replpass
ping_interval=1
[server1]
hostname=192.168.80.143
candidate_master=1
[server2]
hostname=192.168.80.131
candidate_master=1
[server3]
hostname=192.168.80.134
candidate_master=1
~]# masterha_check_ssh --conf=/etc/masterha/app.cnf
測試ssh遠程登陸是否可用;
~]# masterha_check_repl --conf=/etc/masterha/app.cnf
~]# nohup master_manager --conf=/etc/masterha/app.cnf > /data/masterha/app/manager.log 2>&1 &
啓動MHA;
~]# masterha_check_status --conf=/etc/masterha/app.cnf
檢查MHA的狀態;
模擬主節點故障:會發現從節點中有一個會接替主節點繼續工做;
Note:當故障的主節點修復之後,能夠當作從節點從新上線,上線步驟爲:先從現有的主節點的備份中複製一份數據,指向新的主節點,而後再經過二進制日誌文件重作最新的數據,而後上線便可,而且設置read_only爲1;
錯誤借鑑:https://blog.51cto.com/arthur376/1812640
https://www.cnblogs.com/polestar/p/5371080.htmlnode
Note:根據馬哥視頻作的學習筆記,若有錯誤,歡迎指正;侵刪mysql