1. 程式人生 > >[mysql終極優化]之主從複製與讀寫分離詳細設定教程

[mysql終極優化]之主從複製與讀寫分離詳細設定教程

記下File及Position下的值。以備在配置從伺服器時使用。 注:File:當前binlog的檔名,每重啟一次mysql,就會生成一個新binlog檔案       Position:當前binlog的指標位置 三、從伺服器配置 1、配置mysql.cnf # vi /etc/my.cnf (1)修改server-id=2(該值不能與主伺服器的server-id同。如果有多個從伺服器,則該值順延) (2)新增如下兩行: relay-log-index=slave-relay-bin.index (中繼日誌的索引檔案) relay-log=slave-relay-bin  (中繼日誌的檔案字首) (3)重啟mysql使上述配置生效 # /etc/init.d/mysql restart (4)登入mysql # mysql -uroot -p你的密碼 (5)停止主從複製服務 mysql> stop slave (6)主從關聯配置 mysql> change master to master_host='10.121.0.110', #主伺服器IP master_user='slave_account ',  #主伺服器訪問從伺服器的使用者,即上述第三條第2小條第2子條所述帳號
master_password='123456', #主伺服器訪問從的密碼,即上述第三條第2小條第2子條所述密碼 master_log_file='mysql-bin.000008',   #主伺服器起始的binlog檔名,即圖2的file master_log_pos=107; #主伺服器binlog起始位置,即圖2的postion 上述每行都特別重要,錯一個字元都不行 (7)啟動從服務 mysql> start slave (8) 檢視從服務的狀態,判斷從服務是否生效 mysql> show slave status\G;  (G引數為縱向顯示結果) 會顯示如下結果                 Slave_IO_State: Waiting for master to send event                   Master_Host: 192.168.0.110                   Master_User: slave_account                   Master_Port: 3306                 Connect_Retry: 60               Master_Log_File: mysql-bin.00008           Read_Master_Log_Pos: 107                Relay_Log_File: slave-relay-bin.000002                 Relay_Log_Pos: 253         Relay_Master_Log_File: mysql-bin.00008              Slave_IO_Running: Yes             Slave_SQL_Running: Yes               Replicate_Do_DB:           Replicate_Ignore_DB:            Replicate_Do_Table:        Replicate_Ignore_Table:       Replicate_Wild_Do_Table:   Replicate_Wild_Ignore_Table:                    Last_Errno: 0                    Last_Error:                  Skip_Counter: 0           Exec_Master_Log_Pos: 264               Relay_Log_Space: 409               Until_Condition: None                Until_Log_File:                 Until_Log_Pos: 0            Master_SSL_Allowed: No            Master_SSL_CA_File:            Master_SSL_CA_Path:               Master_SSL_Cert:             Master_SSL_Cipher:                Master_SSL_Key:         Seconds_Behind_Master: 0 Master_SSL_Verify_Server_Cert: No                 Last_IO_Errno: 0                 Last_IO_Error:                Last_SQL_Errno: 0                Last_SQL_Error:   Replicate_Ignore_Server_Ids:              Master_Server_Id: 1 如果Slave_IO_Running和Slave_SQL_Running都顯示YES,則表示從與主的讀寫通訊正常、主動複製已經執行,則表明我們主從複製已經設定成功。如果出現故障,則看下節“故障排除”。 然後,你再在主伺服器插入一條資料,看看從伺服器相應資料庫裡有沒有做相應更新。如果有,則大功告成。 四、許可權配置 
雖然某些mysql版本不進行如下操作,可能也能正常執行,但我還是強列建議你設定。否則,必有安全之慮。 1、為master分配select、insert、update、delete許可權 mysql>GRANT SELECT,INSERT,UPDATE,DELETE ON *.* TO '資料庫的帳號'@'WEB伺服器的IP'  identified by '密碼'。 注意,雖然master只負責寫,但也必須有select許可權。原因是使用事務時,需要從master查詢,二是update/delete這些命令都需要使用select許可權。 2、為slave分配select許可權  mysql> GRANT SELECT ON *.* TO '資料庫的帳號'@'WEB伺服器的IP'  identified by '密碼'; 這樣設定也有一個弊端,就是當主宕機時,讀寫分離機制分主動將寫操作轉到從上來,這時,就會出現寫不正常的情況。所以,slave要分配哪些許可權,還看你自己選擇。 五、防火牆配置
剛才我們為了除錯方便,先關閉了防火牆,但這樣做,非常很不安全。特別是資料庫伺服器,關係公司的身家性命,更不可小視。 主從複製的防火牆,還是比較好設定的,如果你只有一臺web伺服器,則只需要在主、從伺服器的iptables裡開放2個授權即可。先在主伺服器執行如下命令: # iptables INPUT -s 10.121.0.220 -j ACCEPT  (允許從伺服器訪問) # iptables INPUT -s 10.121.2.142 -j ACCEPT   (允許web伺服器訪問) # service iptables save (儲存上述規則) # service iptables restart  (重啟iptables) 在從中將第一條換成主的IP即可。 設定完後,再在從上用show slave status看看主從複製是否正常。 六、一些故障排除 設定過程中,可能會出現如下幾個故障 (1) Slave_IO_Running: No (2) Slave_IO_Running: Connect (3)Last_IO_Error: error connecting to master '[email protected]:3306' - retry-time: 60  retries: 8640 其實上述故障,都是由IO不正常造成的,請從如下幾個步驟著手檢查。 a.配置完主或從的my.cnf後,是否重啟了mysql服務。如果重啟還不成功,則可以用reboot命令重啟伺服器後再試 b.change master那一步所填寫的資訊是否正確。 (4)Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server ids; these ids must be different for replication to work (or the --replicate-same-server-id option must be used on slave but this does not always make sense; please check the manual before using it). 如上是說主、從使用了相同的server-id,進入my.cnf檢查,改正之,然後重啟mysql服務。 七、php設定 在php的資料庫連線配置檔案裡作如下設定即可      //該行讀寫分離支援     'DB_DEPLOY_TYPE'=> 1,       'DB_RW_SEPARATE'=>true,       //主、從資料庫的IP地址,前為主,後從     'DB_HOST'   => '10.121.0.110,10.121,0.220',     // 資料庫型別     'DB_TYPE'   => 'mysql',     // 使用者名稱,如果主和從的使用者名稱相同,則 可省略一個     'DB_USER'   => 'root root',     // 使用者名稱,如果主和從密碼相同,則可省略一個     'DB_PWD'    => '123456 123456',     // 使用者名稱,如果主和從資料庫相同,則可省略一個     'DB_NAME'   => 'test test', 其他設定請參照本人的《使TP框架在主從複製下“支援事務”》