1、介紹:mysql
大型網站中數據層仍是原來那種傳統的數據架構,或者只是淡淡靠一臺服務器來扛,如此多的數據庫鏈接操做,數據必然會崩潰,數據丟失的話,可想而知後果不堪設想。因此咱們想到不少解決方法·:一方面採用優秀的代碼框架,進行代碼的優化,採用優秀的數據緩存技術如:redis,若是資金豐厚的話,必然會想到架設服務器羣,來分擔主數據庫的壓力。而後重點到了今天介紹的:利用MySQL主從配置,實現讀寫分離,減輕數據庫壓力。這種方式,在現在不少網站裏都有使用,也不是什麼新鮮事情,今天總結一下,方便你們學習參考一下。redis
原理:主服務器(Master)負責網站NonQuery操做,從服務器負責Query操做,用戶能夠根據網站功能模特性塊固定訪問Slave服務器,或者本身寫個池或隊列,自由爲請求分配從服務器鏈接。主從服務器利用MySQL的二進制日誌文件,實現數據同步。二進制日誌由主服務器產生,從服務器響應獲取同步數據庫。sql
拓撲圖:數據庫
Master---cml5:192.168.5.103緩存
Slave---cml2:192.168.5.102bash
Slave---cml6:192.168.5.106服務器
2、配置:架構
一、首先備份主(master)主機數據庫(全備),而後倒入到從(slave)主機上:框架
[root@cml5 ~]# mysqldump -uroot -predhat--single-transaction -R --triggers -E --master-data --flush-logs--all-databases > cml.sql mysqldump:[Warning] Using a password on the command line interface can be insecure. [root@cml5 mydata]# scp cml.sql cml2:/data/ cml.sql 100% 1617 1.6KB/s 00:00 [root@cml2 data]# mysql -uroot -predhat< cml.sql mysql: [Warning] Using a password on thecommand line interface can be insecure.
二、編輯master主機的my.cnf配置文件:socket
[root@cml5 mydata]# cat /etc/my.cnf [mysqld] datadir=/usr/local/mysql/mydata socket=/usr/local/mysql/mysql.sock log_bin=/usr/local/mysql/mydata/mysql-bin server-id=1
##備註:server-id 服務器惟一標識,log_bin 啓動MySQL二進制日誌
三、主庫建立同步用戶:
mysql> grant all on *.* to 'rsync'@'%'identified by 'redhat'; Query OK, 0 rows affected, 1 warning (0.00sec) mysql> flush privileges; Query OK, 0 rows affected (0.00 sec)
四、查看主庫上數據節點:
五、修改slave上的my.cnf配置文件:
[root@cml2 mydata]# cat /etc/my.cnf [mysqld] datadir=/usr/local/mysql/mydata socket=/usr/local/mysql/mysql.sock log_bin=/usr/local/mysql/mydata/mysql-bin server-id=2 relay_log=relay-log
六、slave褲上面同步:
mysql> CHANGE MASTER TO MASTER_HOST='192.168.5.103',MASTER_USER='rsync',MASTER_PASSWORD='redhat',MASTER_LOG_FILE='mysql-bin.000011',MASTER_LOG_POS=587; Query OK, 0 rows affected, 2 warnings (0.00sec) mysql> start slave; Query OK, 0 rows affected (0.01 sec)
七、查看狀態兩個線程必須都是YES:
mysql> show slave status\G;
*************************** 1. row***************************
Slave_IO_State: Connecting tomaster
Master_Host: 192.168.5.103
Master_User: rsync
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000011
Read_Master_Log_Pos: 587
Relay_Log_File: relay-log.000001
Relay_Log_Pos: 4
Relay_Master_Log_File: mysql-bin.000011
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
八、鏈接一臺空的DB,測試數據是否同步:
server-id=3 relay_log=relay-log
###測試:
mysql> CHANGE MASTER TO MASTER_HOST='192.168.5.103',MASTER_USER='rsync',MASTER_PASSWORD='redhat',MASTER_LOG_FILE='mysql-bin.000011',MASTER_LOG_POS=587; Query OK, 0 rows affected, 2 warnings (0.01sec) mysql> start slave;
##由於以前已經建立了一張表,因此寫入確定會出錯:
mysql> show slave status\G;
*************************** 1. row***************************
Slave_IO_State: Connecting tomaster
Master_Host: 192.168.5.103
Master_User: rsync
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000011
Read_Master_Log_Pos: 587
Relay_Log_File: relay-log.000001
Relay_Log_Pos: 4
Relay_Master_Log_File: mysql-bin.000011
Slave_IO_Running: Yes
Slave_SQL_Running: no
##線上能夠直接跳過這個錯誤,可是這個事務的數據久找不到了:
mysql>stop slave; Query OK, 0 rows affected (0.00 sec) mysql> SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1 ; ##跳過一個事務,多個就改變數字。 Query OK, 0 rows affected (0.00 sec) mysql> start slave; Query OK, 0 rows affected (0.00 sec)
##重設置slave:
mysql> stop slave; Query OK, 0 rows affected (0.00sec) mysql> reset slave; Query OK, 0 rows affected (0.00sec)