摘要:當(dāng)時(shí)是使用阿里云鏡像,安裝了兩臺(tái),結(jié)果配置的時(shí)候出現(xiàn)了重復(fù)問(wèn)題。以上操作過(guò)程,主從服務(wù)器配置完成。監(jiān)控?fù)?jù)說(shuō)可以編寫一腳本,用監(jiān)控的兩個(gè)及進(jìn)程,如發(fā)現(xiàn)只有一個(gè)或零個(gè),就表明主從有問(wèn)題了。
聯(lián)系郵箱:hi@jackcool.net
一直都沒(méi)有寫blog的習(xí)慣,以前總覺(jué)得自己的腦子就是最好的記憶容器,現(xiàn)在覺(jué)得我好像有個(gè)假腦子。
當(dāng)時(shí)是使用阿里云鏡像,安裝了兩臺(tái)ECS,結(jié)果配置MySQL的時(shí)候出現(xiàn)了UUID重復(fù)問(wèn)題。
先從配置主從開(kāi)始吧,值得記錄。
文中很多部分引用了網(wǎng)絡(luò)上的零碎資料!
場(chǎng)景一般應(yīng)用對(duì)數(shù)據(jù)庫(kù)而言都是“讀多寫少”,也就說(shuō)對(duì)數(shù)據(jù)庫(kù)讀取數(shù)據(jù)的壓力比較大,有一個(gè)思路就是說(shuō)采用數(shù)據(jù)庫(kù)集群的方案,
基本的原理是讓主數(shù)據(jù)庫(kù)處理事務(wù)性查詢,而從數(shù)據(jù)庫(kù)處理SELECT查詢。數(shù)據(jù)庫(kù)復(fù)制被用來(lái)把事務(wù)性查詢導(dǎo)致的變更同步到集群中 的從數(shù)據(jù)庫(kù)。 當(dāng)然,主服務(wù)器也可以提供查詢服務(wù)。使用讀寫分離最大的作用無(wú)非是環(huán)境服務(wù)器壓力
1.MySQL復(fù)制另外一大功能是增加冗余,提高可用性,當(dāng)一臺(tái)數(shù)據(jù)庫(kù)服務(wù)器宕機(jī)后能通過(guò)調(diào)整另外一臺(tái)從庫(kù)來(lái)以最快的速度恢復(fù)服務(wù),因此不能光看性能,也就是說(shuō)1主1從也是可以的。
2.多機(jī)器(集群)的處理能力
3.對(duì)于讀操作為主的應(yīng)用,使用讀寫分離是最好的場(chǎng)景,因?yàn)榭梢源_保寫的服務(wù)器壓力更小,而讀又可以接受點(diǎn)時(shí)間上的延遲。
4.主從只負(fù)責(zé)各自的寫和讀,極大程度的緩解X鎖和S鎖爭(zhēng)用
5.從庫(kù)可配置myisam引擎,提升查詢性能以及節(jié)約系統(tǒng)開(kāi)銷
6.從庫(kù)同步主庫(kù)的數(shù)據(jù)和主庫(kù)直接寫還是有區(qū)別的,通過(guò)主庫(kù)發(fā)送來(lái)的binlog恢復(fù)數(shù)據(jù),但是,最重要區(qū)別在于主庫(kù)向從庫(kù)發(fā)送binlog是異步的,從庫(kù)恢復(fù)數(shù)據(jù)也是異步的
7.讀寫分離適用與讀遠(yuǎn)大于寫的場(chǎng)景,如果只有一臺(tái)服務(wù)器,當(dāng)select很多時(shí),update和delete會(huì)被這些select訪問(wèn)中的數(shù)據(jù)堵塞,等待select結(jié)束,并發(fā)性能不高。 對(duì)于寫和讀比例相近的應(yīng)用,應(yīng)該部署雙主相互復(fù)制
8.可以在從庫(kù)啟動(dòng)是增加一些參數(shù)來(lái)提高其讀的性能,例如--skip-innodb、--skip-bdb、--low-priority-updates以及--delay-key-write=ALL。當(dāng)然這些設(shè)置也是需要根據(jù)具體業(yè)務(wù)需求來(lái)定得,不一定能用上
9.分?jǐn)傋x取。假如我們有1主3從,不考慮上述1中提到的從庫(kù)單方面設(shè)置,假設(shè)現(xiàn)在1 分鐘內(nèi)有10條寫入,150條讀取。那么,1主3從相當(dāng)于共計(jì)40條寫入,而讀取總數(shù)沒(méi)變,因此平均下來(lái)每臺(tái)服務(wù)器承擔(dān)了10條寫入和50條讀取(主庫(kù)不 承擔(dān)讀取操作)。因此,雖然寫入沒(méi)變,但是讀取大大分?jǐn)偭耍岣吡讼到y(tǒng)性能。另外,當(dāng)讀取被分?jǐn)偤螅珠g接提高了寫入的性能。所以,總體性能提高了,說(shuō)白 了就是拿機(jī)器和帶寬換性能。MySQL官方文檔中有相關(guān)演算公式:官方文檔 見(jiàn)6.9FAQ之“MySQL復(fù)制能夠何時(shí)和多大程度提高系統(tǒng)性能”
原理MySQL主(稱master)從(稱slave)復(fù)制的原理:
master將數(shù)據(jù)改變記錄到二進(jìn)制日志(binary log)中,也即是配置文件log-bin指定的文件(這些記錄叫做二進(jìn)制日志事件,binary log events)
slave將master的binary log events拷貝到它的中繼日志(relay log)
slave重做中繼日志中的事件,將改變反映它自己的數(shù)據(jù)(數(shù)據(jù)重演)
注意主DB server和從DB server數(shù)據(jù)庫(kù)的版本一致
主DB server和從DB server數(shù)據(jù)庫(kù)數(shù)據(jù)一致,這里就會(huì)可以把主的備份在從上還原,也可以直接將主的數(shù)據(jù)目錄拷貝到從的相應(yīng)數(shù)據(jù)目錄
主DB server開(kāi)啟二進(jìn)制日志,主DB server和從DB server的server_id及auto.cnf中的UUID都必須唯一
操作1、主從服務(wù)器分別作以下操作:
1.1、版本一致 1.2、初始化表,并在后臺(tái)啟動(dòng)mysql 1.3、修改root的密碼
2、修改主服務(wù)器Master的MySQL配置文件
$ vi /etc/my.cnf(默認(rèn)) [mysqld] log-bin=mysql-bin //[必須]啟用二進(jìn)制日志 server-id=93 //[必須]服務(wù)器唯一ID,默認(rèn)是1,一般取IP最后一段 # 指定同步的數(shù)據(jù)庫(kù), 如果 不指定則同步全部數(shù)據(jù)庫(kù) binlog-do-db= testdb
3、修改從服務(wù)器slave
$ vi /etc/my.cnf [mysqld] server-id=211 //[必須]服務(wù)器唯一ID,默認(rèn)是1,一般取IP最后一段
4、重啟兩臺(tái)服務(wù)器的MySQL
$ /etc/init.d/mysql restart 或 $ service mysqld restart
5、在主服務(wù)器上建立帳戶并授權(quán)slave:
$ /usr/local/mysql/bin/mysql -uroot -p 或直接 mysql -u root -p mysql>GRANT REPLICATION SLAVE ON *.* to "slave"@"%" identified by "123456"; mysql>flush privileges; //一般不用root帳號(hào),%表示所有客戶端都可能連,只要帳號(hào)、密碼正確,此處可用具體客戶端IP代替,如192.168.145.226,加強(qiáng)安全。
6、登錄主服務(wù)器的MySQL,查詢Master的狀態(tài)
mysql>show master statusG; +-------------+----------+--------------+------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +-------------+----------+--------------+------------+ | mysql-bin.000004 | 308 | | | +-------------+----------+--------------+------------+ 1 row in set (0.00 sec)
注:執(zhí)行完此步驟后不要再操作主服務(wù)器MYSQL,防止主服務(wù)器狀態(tài)值變化
7、配置從服務(wù)器Slave:
mysql>change master to master_host="192.168.145.222",master_user="slave",master_password="123456", master_log_file="mysql-bin.000004",master_log_pos=308; //注意不要斷開(kāi),308數(shù)字前后無(wú)單引號(hào)。 Mysql>start slave; //啟動(dòng)從服務(wù)器復(fù)制功能
8、檢查從服務(wù)器(Slave)復(fù)制功能狀態(tài):
mysql> show slave statusG *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.2.222 //主服務(wù)器地址 Master_User: slave //授權(quán)帳戶名,盡量避免使用root Master_Port: 3306 //數(shù)據(jù)庫(kù)端口,部分版本沒(méi)有此行 Connect_Retry: 60 Master_Log_File: mysql-bin.000004 Read_Master_Log_Pos: 600 //#同步讀取二進(jìn)制日志的位置,大于等于Exec_Master_Log_Pos Relay_Log_File: ddte-relay-bin.000003 Relay_Log_Pos: 251 Relay_Master_Log_File: mysql-bin.000004 Slave_IO_Running: Yes //此狀態(tài)必須YES Slave_SQL_Running: Yes //此狀態(tài)必須YES ...... 注:Slave_IO及Slave_SQL進(jìn)程必須正常運(yùn)行,即YES狀態(tài),否則都是錯(cuò)誤的狀態(tài)(如:其中一個(gè)NO均屬錯(cuò)誤)。 以上操作過(guò)程,主從服務(wù)器配置完成。
10、監(jiān)控:
據(jù)說(shuō)可以編寫一shell腳本,用nagios監(jiān)控slave的兩個(gè)yes(Slave_IO及Slave_SQL進(jìn)程),如發(fā)現(xiàn)只有一個(gè)或零個(gè)yes,就表明主從有問(wèn)題了。問(wèn)題
配置mysql主從時(shí),由于是阿里云鏡像系統(tǒng)盤拷貝的MySQL目錄,導(dǎo)致主從MySQL UUID相同, Slave_IO無(wú)法啟動(dòng),報(bào)錯(cuò)信息如下:
The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work.
解決辦法:
mysql>show variables like "%log_error%";//查看配置的日志地址,查看日志
修改MySQL data 目錄下auto.cnf 文件中uuid的值,使兩臺(tái)MySQL不同即可,
$ find / -name auto.cnf 或 find / -name "auto.cnf"
修改后重啟MySQL服務(wù)。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/67236.html
閱讀 7579·2023-04-25 14:36
閱讀 1747·2021-11-22 09:34
閱讀 2136·2019-08-30 15:55
閱讀 3138·2019-08-30 11:19
閱讀 1301·2019-08-29 15:17
閱讀 544·2019-08-29 12:47
閱讀 2984·2019-08-26 13:38
閱讀 2621·2019-08-26 11:00