MySQL主從複製讀寫分離及奇怪的問題

聯繫郵箱:hi@jackcool.netmysql

一直都沒有寫blog的習慣,之前總以爲本身的腦子就是最好的記憶容器,如今以爲我好像有個假腦子。ios

當時是使用阿里雲鏡像,安裝了兩臺ECS,結果配置MySQL的時候出現了UUID重複問題。
先從配置主從開始吧,值得記錄。sql

文中不少部分引用了網絡上的零碎資料!shell


場景

通常應用對數據庫而言都是「讀多寫少」,也就說對數據庫讀取數據的壓力比較大,有一個思路就是說採用數據庫集羣的方案,
基本的原理是讓主數據庫處理事務性查詢,而從數據庫處理SELECT查詢。數據庫複製被用來把事務性查詢致使的變動同步到集羣中 的從數據庫。 固然,主服務器也能夠提供查詢服務。使用讀寫分離最大的做用無非是環境服務器壓力數據庫

讀寫分離的好處(資料):

1.MySQL複製另一大功能是增長冗餘,提升可用性,當一臺數據庫服務器宕機後能經過調整另一臺從庫來以最快的速度恢復服務,所以不能光看性能,也就是說1主1從也是能夠的。安全

2.多機器(集羣)的處理能力服務器

3.對於讀操做爲主的應用,使用讀寫分離是最好的場景,由於能夠確保寫的服務器壓力更小,而讀又能夠接受點時間上的延遲。網絡

4.主從只負責各自的寫和讀,極大程度的緩解X鎖和S鎖爭用併發

5.從庫可配置myisam引擎,提高查詢性能以及節約系統開銷異步

6.從庫同步主庫的數據和主庫直接寫仍是有區別的,經過主庫發送來的binlog恢復數據,可是,最重要區別在於主庫向從庫發送binlog是異步的,從庫恢復數據也是異步的

7.讀寫分離適用與讀遠大於寫的場景,若是隻有一臺服務器,當select不少時,update和delete會被這些select訪問中的數據堵塞,等待select結束,併發性能不高。 對於寫和讀比例相近的應用,應該部署雙主相互複製

8.能夠在從庫啓動是增長一些參數來提升其讀的性能,例如--skip-innodb、--skip-bdb、--low-priority-updates以及--delay-key-write=ALL。固然這些設置也是須要根據具體業務需求來定得,不必定能用上

9.分攤讀取。假如咱們有1主3從,不考慮上述1中提到的從庫單方面設置,假設如今1 分鐘內有10條寫入,150條讀取。那麼,1主3從至關於共計40條寫入,而讀取總數沒變,所以平均下來每臺服務器承擔了10條寫入和50條讀取(主庫不 承擔讀取操做)。所以,雖然寫入沒變,可是讀取大大分攤了,提升了系統性能。另外,當讀取被分攤後,又間接提升了寫入的性能。因此,整體性能提升了,說白 了就是拿機器和帶寬換性能。MySQL官方文檔中有相關演算公式:官方文檔 見6.9FAQ之「MySQL複製可以什麼時候和多大程度提升系統性能」

轉載

原理

MySQL主(稱master)從(稱slave)複製的原理:

master將數據改變記錄到二進制日誌(binary log)中,也便是配置文件log-bin指定的文件(這些記錄叫作二進制日誌事件,binary log events)

slave將master的binary log events拷貝到它的中繼日誌(relay log)

slave重作中繼日誌中的事件,將改變反映它本身的數據(數據重演)

注意

主DB server和從DB server數據庫的版本一致

主DB server和從DB server數據庫數據一致,這裏就會能夠把主的備份在從上還原,也能夠直接將主的數據目錄拷貝到從的相應數據目錄

主DB server開啓二進制日誌,主DB server和從DB server的server_id及auto.cnf中的UUID都必須惟一

操做

一、主從服務器分別做如下操做:

1.一、版本一致
  1.二、初始化表,並在後臺啓動mysql
  1.三、修改root的密碼

二、修改主服務器Master的MySQL配置文件

$ vi /etc/my.cnf(默認)
[mysqld]
log-bin=mysql-bin     //[必須]啓用二進制日誌
server-id=93      //[必須]服務器惟一ID,默認是1,通常取IP最後一段
# 指定同步的數據庫, 若是 不指定則同步所有數據庫
binlog-do-db= testdb

三、修改從服務器slave

$ vi /etc/my.cnf
[mysqld]
server-id=211      //[必須]服務器惟一ID,默認是1,通常取IP最後一段

四、重啓兩臺服務器的MySQL

$ /etc/init.d/mysql restart
或
$ service mysqld restart

五、在主服務器上創建賬戶並受權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,增強安全。

六、登陸主服務器的MySQL,查詢Master的狀態

mysql>show master status\G;

   +-------------+----------+--------------+------------+
   | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
   +-------------+----------+--------------+------------+
   | mysql-bin.000004 |      308 |              |                  |
   +-------------+----------+--------------+------------+
   1 row in set (0.00 sec)

注:執行完此步驟後不要再操做主服務器MYSQL,防止主服務器狀態值變化

七、配置從服務器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數字先後無單引號。
Mysql>start slave;    //啓動從服務器複製功能

八、檢查從服務器(Slave)複製功能狀態:

mysql> show slave status\G

   *************************** 1. row ***************************
              Slave_IO_State: Waiting for master to send event
              Master_Host: 192.168.2.222  //主服務器地址
              Master_User: slave   //受權賬戶名,儘可能避免使用root
              Master_Port: 3306    //數據庫端口,部分版本沒有此行
              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    //此狀態必須YES
              Slave_SQL_Running: Yes     //此狀態必須YES
                    ......

注:Slave_IO及Slave_SQL進程必須正常運行,即YES狀態,不然都是錯誤的狀態(如:其中一個NO均屬錯誤)。

以上操做過程,主從服務器配置完成。

十、監控:

聽說能夠編寫一shell腳本,用nagios監控slave的兩個yes(Slave_IO及Slave_SQL進程),如發現只有一個或零個yes,就代表主從有問題了。

問題

配置mysql主從時,因爲是阿里雲鏡像系統盤拷貝的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服務。

相關文章
相關標籤/搜索