Linux環境下mysql讀寫分離以及主從配置(不錯可以的)
阿新 • • 發佈:2019-01-03
記下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框架在主從複製下“支援事務”》
(該文系HANYUCQ原創,歡迎轉載,但請保留該資訊。)