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