十年網(wǎng)站開發(fā)經(jīng)驗 + 多家企業(yè)客戶 + 靠譜的建站團隊
量身定制 + 運營維護+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
1. 概述
專注于為中小企業(yè)提供成都做網(wǎng)站、網(wǎng)站建設服務,電腦端+手機端+微信端的三站合一,更高效的管理,為中小企業(yè)修文免費做網(wǎng)站提供優(yōu)質(zhì)的服務。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動了上千多家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設實現(xiàn)規(guī)模擴充和轉(zhuǎn)變。
我們在考慮MySQL數(shù)據(jù)庫的高可用的架構時,主要要考慮如下幾方面:
關于對高可用的分級在這里我們不做詳細的討論,這里只討論常用高可用方案的優(yōu)缺點以及高可用方案的選型。
2. 高可用方案
2.1. 主從或主主半同步復制
使用雙節(jié)點數(shù)據(jù)庫,搭建單向或者雙向的半同步復制。在5.7以后的版本中,由于lossless replication、logical多線程復制等一些列新特性的引入,使得MySQL原生半同步復制更加可靠。
常見架構如下:
通常會和proxy、keepalived等第三方軟件同時使用,即可以用來監(jiān)控數(shù)據(jù)庫的 健康 ,又可以執(zhí)行一系列管理命令。如果主庫發(fā)生故障,切換到備庫后仍然可以繼續(xù)使用數(shù)據(jù)庫。
優(yōu)點:
缺點:
2.2. 半同步復制優(yōu)化
半同步復制機制是可靠的。如果半同步復制一直是生效的,那么便可以認為數(shù)據(jù)是一致的。但是由于網(wǎng)絡波動等一些客觀原因,導致半同步復制發(fā)生超時而切換為異步復制,那么這時便不能保證數(shù)據(jù)的一致性。所以盡可能的保證半同步復制,便可提高數(shù)據(jù)的一致性。
該方案同樣使用雙節(jié)點架構,但是在原有半同復制的基礎上做了功能上的優(yōu)化,使半同步復制的機制變得更加可靠。
可參考的優(yōu)化方案如下:
半同步復制由于發(fā)生超時后,復制斷開,當再次建立起復制時,同時建立兩條通道,其中一條半同步復制通道從當前位置開始復制,保證從機知道當前主機執(zhí)行的進度。另外一條異步復制通道開始追補從機落后的數(shù)據(jù)。當異步復制通道追趕到半同步復制的起始位置時,恢復半同步復制。
搭建兩條半同步復制通道,其中連接文件服務器的半同步通道正常情況下不啟用,當主從的半同步復制發(fā)生網(wǎng)絡問題退化后,啟動與文件服務器的半同步復制通道。當主從半同步復制恢復后,關閉與文件服務器的半同步復制通道。
優(yōu)點:
缺點:
2.3. 高可用架構優(yōu)化
將雙節(jié)點數(shù)據(jù)庫擴展到多節(jié)點數(shù)據(jù)庫,或者多節(jié)點數(shù)據(jù)庫集群。可以根據(jù)自己的需要選擇一主兩從、一主多從或者多主多從的集群。
由于半同步復制,存在接收到一個從機的成功應答即認為半同步復制成功的特性,所以多從半同步復制的可靠性要優(yōu)于單從半同步復制的可靠性。并且多節(jié)點同時宕機的幾率也要小于單節(jié)點宕機的幾率,所以多節(jié)點架構在一定程度上可以認為高可用性是好于雙節(jié)點架構。
但是由于數(shù)據(jù)庫數(shù)量較多,所以需要數(shù)據(jù)庫管理軟件來保證數(shù)據(jù)庫的可維護性??梢赃x擇MMM、MHA或者各個版本的proxy等等。常見方案如下:
MHA Manager會定時探測集群中的master節(jié)點,當master出現(xiàn)故障時,它可以自動將最新數(shù)據(jù)的slave提升為新的master,然后將所有其他的slave重新指向新的master,整個故障轉(zhuǎn)移過程對應用程序完全透明。
MHA Node運行在每臺MySQL服務器上,主要作用是切換時處理二進制日志,確保切換盡量少丟數(shù)據(jù)。
MHA也可以擴展到如下的多節(jié)點集群:
優(yōu)點:
缺點:
Zookeeper使用分布式算法保證集群數(shù)據(jù)的一致性,使用zookeeper可以有效的保證proxy的高可用性,可以較好的避免網(wǎng)絡分區(qū)現(xiàn)象的產(chǎn)生。
優(yōu)點:
缺點:
2.4. 共享存儲
共享存儲實現(xiàn)了數(shù)據(jù)庫服務器和存儲設備的解耦,不同數(shù)據(jù)庫之間的數(shù)據(jù)同步不再依賴于MySQL的原生復制功能,而是通過磁盤數(shù)據(jù)同步的手段,來保證數(shù)據(jù)的一致性。
SAN的概念是允許存儲設備和處理器(服務器)之間建立直接的高速網(wǎng)絡(與LAN相比)連接,通過這種連接實現(xiàn)數(shù)據(jù)的集中式存儲。常用架構如下:
使用共享存儲時,MySQL服務器能夠正常掛載文件系統(tǒng)并操作,如果主庫發(fā)生宕機,備庫可以掛載相同的文件系統(tǒng),保證主庫和備庫使用相同的數(shù)據(jù)。
優(yōu)點:
缺點:
DRBD是一種基于軟件、基于網(wǎng)絡的塊復制存儲解決方案,主要用于對服務器之間的磁盤、分區(qū)、邏輯卷等進行數(shù)據(jù)鏡像,當用戶將數(shù)據(jù)寫入本地磁盤時,還會將數(shù)據(jù)發(fā)送到網(wǎng)絡中另一臺主機的磁盤上,這樣的本地主機(主節(jié)點)與遠程主機(備節(jié)點)的數(shù)據(jù)就可以保證實時同步。常用架構如下:
當本地主機出現(xiàn)問題,遠程主機上還保留著一份相同的數(shù)據(jù),可以繼續(xù)使用,保證了數(shù)據(jù)的安全。
DRBD是linux內(nèi)核模塊實現(xiàn)的快級別的同步復制技術,可以與SAN達到相同的共享存儲效果。
優(yōu)點:
缺點:
2.5. 分布式協(xié)議
分布式協(xié)議可以很好解決數(shù)據(jù)一致性問題。比較常見的方案如下:
MySQL cluster是官方集群的部署方案,通過使用NDB存儲引擎實時備份冗余數(shù)據(jù),實現(xiàn)數(shù)據(jù)庫的高可用性和數(shù)據(jù)一致性。
優(yōu)點:
缺點:
基于Galera的MySQL高可用集群, 是多主數(shù)據(jù)同步的MySQL集群解決方案,使用簡單,沒有單點故障,可用性高。常見架構如下:
優(yōu)點:
缺點:
Paxos 算法解決的問題是一個分布式系統(tǒng)如何就某個值(決議)達成一致。這個算法被認為是同類算法中最有效的。Paxos與MySQL相結(jié)合可以實現(xiàn)在分布式的MySQL數(shù)據(jù)的強一致性。常見架構如下:
優(yōu)點:
缺點:
3. 總結(jié)
隨著人們對數(shù)據(jù)一致性的要求不斷的提高,越來越多的方法被嘗試用來解決分布式數(shù)據(jù)一致性的問題,如MySQL自身的優(yōu)化、MySQL集群架構的優(yōu)化、Paxos、Raft、2PC算法的引入等等。
而使用分布式算法用來解決MySQL數(shù)據(jù)庫數(shù)據(jù)一致性的問題的方法,也越來越被人們所接受,一系列成熟的產(chǎn)品如PhxSQL、MariaDB Galera Cluster、Percona XtraDB Cluster等越來越多的被大規(guī)模使用。
隨著官方MySQL Group Replication的GA,使用分布式協(xié)議來解決數(shù)據(jù)一致性問題已經(jīng)成為了主流的方向。期望越來越多優(yōu)秀的解決方案被提出,MySQL高可用問題可以被更好的解決。
分布式解決方案 tidb
多主 多備 master lvs做vip 讀寫分離中間件
操作方法如下:1、首先需要在mysql管理工具上面新建一個表,也可以用mysql命令創(chuàng)建,表建立完成之后,需要將表中的字段名字告訴給填寫excel表的人員。
2、打開excel表,按照程序提供的字段填寫相應的數(shù)據(jù),需要跟程序提供的一樣,其他的描述。.
3、使用的mysql管理工具Navicatfor MySQL,打開工具,選擇表所在的數(shù)據(jù)庫,然后點擊數(shù)據(jù)庫名字,右鍵數(shù)據(jù),出來下拉菜單選擇import wizard ,有漢化版本的更明確.彈出一個選擇界面,選擇excel file文件。
4、點擊next(下一步),選擇對應的excel文件就行,然后再下面選文件內(nèi)容在哪一個sheet中,也就是內(nèi)容寫在excel什么地方,這點需要注意,也是關鍵的地方。
5、點擊next (此步驟也是關鍵步驟),需要注意2點: 1:filedname row 就是字段所在excel中的位置,也就是第幾行(簡單辦法,一般就是英文對應的那一列).2:first data row(從哪一行開始執(zhí)行),數(shù)據(jù)從哪一行開始。.
6、點擊next選擇 targettable 目標對應的數(shù)據(jù)庫,選擇要導入到哪個數(shù)據(jù)庫中表中。
7、如果到上面一步?jīng)]有問題的話,默認next到最后 就行了.然后打開表就能看到數(shù)據(jù)跟excel表中的一樣。
1、 mysqldump命令備份數(shù)據(jù)
在MySQL中提供了命令行導出數(shù)據(jù)庫數(shù)據(jù)以及文件的一種方便的工具mysqldump,我們可以通過命令行直接實現(xiàn)數(shù)據(jù)庫內(nèi)容的導出dump,首先我們簡單了解一下mysqldump命令用法:
#MySQLdump常用
mysqldump -u root -p --databases 數(shù)據(jù)庫1 數(shù)據(jù)庫2 xxx.sql
2、 mysqldump常用操作實例
2.1備份全部數(shù)據(jù)庫的數(shù)據(jù)和結(jié)構
mysqldump -uroot -p123456 -A /data/mysqlDump/mydb.sql
2.2備份全部數(shù)據(jù)庫的結(jié)構(加 -d 參數(shù))
mysqldump -uroot -p123456 -A -d /data/mysqlDump/mydb.sql
2.3 備份全部數(shù)據(jù)庫的數(shù)據(jù)(加 -t 參數(shù))
mysqldump -uroot -p123456 -A -t /data/mysqlDump/mydb.sql
2.4 備份單個數(shù)據(jù)庫的數(shù)據(jù)和結(jié)構(,數(shù)據(jù)庫名mydb)
mysqldump -uroot-p123456 mydb /data/mysqlDump/mydb.sql
2.5 備份單個數(shù)據(jù)庫的結(jié)構
mysqldump -uroot -p123456 mydb -d /data/mysqlDump/mydb.sql
2.6 備份單個數(shù)據(jù)庫的數(shù)據(jù)
mysqldump -uroot -p123456 mydb -t /data/mysqlDump/mydb.sql2
2.7 備份多個表的數(shù)據(jù)和結(jié)構(數(shù)據(jù),結(jié)構的單獨備份方法與上同)
mysqldump -uroot -p123456 mydb t1 t2 /data/mysqlDump/mydb.sql
2.8 一次備份多個數(shù)據(jù)庫
mysqldump -uroot -p123456 --databases db1 db2 /data/mysqlDump/mydb.sql
MySQL是一個關系型數(shù)據(jù)庫管理系統(tǒng),由瑞典MySQL AB 公司開發(fā),目前屬于 Oracle 旗下產(chǎn)品。MySQL 是最流行的關系型數(shù)據(jù)庫管理系統(tǒng)之一,在 WEB 應用方面,MySQL是最好的 RDBMS (Relational Database Management System,關系數(shù)據(jù)庫管理系統(tǒng)) 應用軟件。
MySQL是一種關系數(shù)據(jù)庫管理系統(tǒng),關系數(shù)據(jù)庫將數(shù)據(jù)保存在不同的表中,而不是將所有數(shù)據(jù)放在一個大倉庫內(nèi),這樣就增加了速度并提高了靈活性。
MySQL所使用的 SQL 語言是用于訪問數(shù)據(jù)庫的最常用標準化語言。MySQL 軟件采用了雙授權政策,分為社區(qū)版和商業(yè)版,由于其體積小、速度快、總體擁有成本低,尤其是開放源碼這一特點,一般中小型網(wǎng)站的開發(fā)都選擇 MySQL 作為網(wǎng)站數(shù)據(jù)庫。
由于其社區(qū)版的性能卓越,搭配 PHP 和 Apache 可組成良好的開發(fā)環(huán)境。
由于MySQL是開放源碼軟件,對于一般的個人使用者和中小型企業(yè)來說,MySQL提供的功能綽綽有余,可以大大降低開發(fā)成本。
Linux作為操作系統(tǒng),Apache 或Nginx作為 Web 服務器,MySQL 作為數(shù)據(jù)庫,PHP/Perl/Python作為服務器端腳本解釋器。由于這四個軟件都是免費或開放源碼軟件(FLOSS),因此使用這種方式不用花一分錢(除開人工成本)就可以建立起一個穩(wěn)定、免費的網(wǎng)站系統(tǒng),被業(yè)界稱為“LAMP“或“LNMP”組合。
//最快的方法?10000記錄?23MS
public?static?void?insert()?{??
//?開時時間??
Long?begin?=?new?Date().getTime();??
//?sql前綴??
String?prefix?=?"INSERT?INTO?tb_big_data?(count,?create_time,?random)?VALUES?";??
try?{??
//?保存sql后綴??
StringBuffer?suffix?=?new?StringBuffer();??
//?設置事務為非自動提交??
conn.setAutoCommit(false);??
//?Statement?st?=?conn.createStatement();??
//?比起st,pst會更好些??
PreparedStatement?pst?=?conn.prepareStatement("");??
//?外層循環(huán),總提交事務次數(shù)??
for?(int?i?=?1;?i?=?100;?i++)?{??
//?第次提交步長??
for?(int?j?=?1;?j?=?10000;?j++)?{??
//?構建sql后綴??
suffix.append("("?+?j?*?i?+?",?SYSDATE(),?"?+?i?*?j??
*?Math.random()?+?"),");??
}??
//?構建完整sql??
String?sql?=?prefix?+?suffix.substring(0,?suffix.length()?-?1);??
//?添加執(zhí)行sql??
pst.addBatch(sql);??
//?執(zhí)行操作??
pst.executeBatch();??
//?提交事務??
conn.commit();??
//?清空上一次添加的數(shù)據(jù)??
suffix?=?new?StringBuffer();??
}??
//?頭等連接??
pst.close();??
conn.close();??
}?catch?(SQLException?e)?{??
e.printStackTrace();??
}??
//?結(jié)束時間??
Long?end?=?new?Date().getTime();??
//?耗時??
System.out.println("cast?:?"?+?(end?-?begin)?/?1000?+?"?ms");??
}
1、MySQL數(shù)據(jù)庫沒有增量備份的機制,當數(shù)據(jù)量太大的時候備份是一個很大的問題。還好MySQL數(shù)據(jù)庫提供了一種主從備份的機制,其實就是把主數(shù)據(jù)庫的所有的數(shù)據(jù)同時寫到備份數(shù)據(jù)庫中。實現(xiàn)MySQL數(shù)據(jù)庫的熱備份。
2、要想實現(xiàn)雙機的熱備首先要了解主從數(shù)據(jù)庫服務器的版本的需求。要實現(xiàn)熱備MySQL的版本都要高于3.2,還有一個基本的原則就是作為從數(shù)據(jù)庫的數(shù)據(jù)庫版本可以高于主服務器數(shù)據(jù)庫的版本,但是不可以低于主服務器的數(shù)據(jù)庫版本。
3、設置主數(shù)據(jù)庫服務器:
a.首先查看主服務器的版本是否是支持熱備的版本。然后查看my.cnf(類Unix)或者my.ini(Windows)中MySQLd配置塊的配置有沒有l(wèi)og-bin(記錄數(shù)據(jù)庫更改日志),因為MySQL的復制機制是基于日志的復制機制,所以主服務器一定要支持更改日志才行。然后設置要寫入日志的數(shù)據(jù)庫或者不要寫入日志的數(shù)據(jù)庫。這樣只有您感興趣的數(shù)據(jù)庫的更改才寫入到數(shù)據(jù)庫的日志中。
server-id=1 //數(shù)據(jù)庫的id這個應該默認是1就不用改動 log-bin=log_name //日志文件的名稱, //這里可以制定日志到別的目錄 如果沒有設置則默認主機名的一個日志名稱 binlog-do-db=db_name //記錄日志的數(shù)據(jù)庫 binlog-ignore-db=db_name //不記錄日志的數(shù)據(jù)庫
以上的如果有多個數(shù)據(jù)庫用","分割開
然后設置同步數(shù)據(jù)庫的用戶賬號
MySQL GRANT REPLICATION SLAVE ON *.* - TO 'repl'@'%.mydomain.com' IDENTIFIED BY 'slavepass';
4.0.2以前的版本, 因為不支持REPLICATION 要使用下面的語句來實現(xiàn)這個功能
MySQL GRANT FILE ON *.* - TO 'repl'@'%.mydomain.com' IDENTIFIED BY 'slavepass';
設置好主服務器的配置文件后重新啟動數(shù)據(jù)庫
b.鎖定現(xiàn)有的數(shù)據(jù)庫并備份現(xiàn)在的數(shù)據(jù)
鎖定數(shù)據(jù)庫
MySQL FLUSH TABLES WITH READ LOCK;
備份數(shù)據(jù)庫有兩種辦法一種是直接進入到MySQL的data目錄然后打包你需要備份數(shù)據(jù)庫的文件夾,第二種是使用MySQLdump的方式來備份數(shù)據(jù)庫但是要加上"--master-data " 這個參數(shù),建議使用第一種方法來備份數(shù)據(jù)庫
c.查看主服務器的狀態(tài)
MySQL show master status\G; +---------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +---------------+----------+--------------+------------------+ | MySQL-bin.003 | 73 | test | manual,MySQL | +---------------+----------+--------------+------------------+
記錄File 和 Position 項目的值,以后要用的。
d.然后把數(shù)據(jù)庫的鎖定打開
MySQL UNLOCK TABLES;
4、設置從服務器
a.首先設置數(shù)據(jù)庫的配置文件
server-id=n //設置數(shù)據(jù)庫id默認主服務器是1 //可以隨便設置但是如果有多臺從服務器則不能重復。 master-host=db-master.mycompany.com //主服務器的IP地址或者域名 master-port=3306 //主數(shù)據(jù)庫的端口號 master-user=pertinax //同步數(shù)據(jù)庫的用戶 master-password=freitag //同步數(shù)據(jù)庫的密碼 master-connect-retry=60 //如果從服務器發(fā)現(xiàn)主服務器斷掉,重新連接的時間差 report-host=db-slave.mycompany.com //報告錯誤的服務器
b.把從主數(shù)據(jù)庫服務器備份出來的數(shù)據(jù)庫導入到從服務器中
c.然后啟動從數(shù)據(jù)庫服務器,如果啟動的時候沒有加上"--skip-slave-start"這個參數(shù)則進入到MySQL中
MySQL slave stop; //停止slave的服務
d.設置主服務器的各種參數(shù)
MySQL CHANGE MASTER TO - MASTER_HOST='master_host_name', //主服務器的IP地址 - MASTER_USER='replication_user_name', //同步數(shù)據(jù)庫的用戶 - MASTER_PASSWORD='replication_password', //同步數(shù)據(jù)庫的密碼 - MASTER_LOG_FILE='recorded_log_file_name', //主服務器二進制日志的文件名(前面要求記住的參數(shù)) - MASTER_LOG_POS=recorded_log_position; //日志文件的開始位置(前面要求記住的參數(shù))
e.啟動同步數(shù)據(jù)庫的線程
MySQL slave start;
查看數(shù)據(jù)庫的同步情況吧。如果能夠成功同步那就恭喜了!
查看主從服務器的狀態(tài)
MySQL SHOW PROCESSLIST\G //可以查看MySQL的進程看看是否有監(jiān)聽的進程
如果日志太大清除日志的步驟如下:
1.鎖定主數(shù)據(jù)庫
MySQL FLUSH TABLES WITH READ LOCK;
2.停掉從數(shù)據(jù)庫的slave
MySQL slave stop;
3.查看主數(shù)據(jù)庫的日志文件名和日志文件的position
show master status; +---------------+----------+--------------+------------------+ | File | Position | Binlog_do_db | Binlog_ignore_db | +---------------+----------+--------------+------------------+ | louis-bin.001 | 79 | | MySQL | +---------------+----------+--------------+------------------+
4.解開主數(shù)據(jù)庫的鎖
MySQL unlock tables;
5.更新從數(shù)據(jù)庫中主數(shù)據(jù)庫的信息
MySQL CHANGE MASTER TO - MASTER_HOST='master_host_name', //主服務器的IP地址 - MASTER_USER='replication_user_name', //同步數(shù)據(jù)庫的用戶 - MASTER_PASSWORD='replication_password', //同步數(shù)據(jù)庫的密碼 - MASTER_LOG_FILE='recorded_log_file_name', //主服務器二進制日志的文件名(前面要求記住的參數(shù)) - MASTER_LOG_POS=recorded_log_position; //日志文件的開始位置(前面要求記住的參數(shù))
6.啟動從數(shù)據(jù)庫的slave
MySQL slave start;