1. 程式人生 > >Linux-centos之mysql讀寫分離的主從複製配置

Linux-centos之mysql讀寫分離的主從複製配置

Linux-centos之mysql讀寫分離的主從複製配置

一:概念

基本的原理:讓主資料庫處理事務性增、改、刪操作(INSERT、UPDATE、DELETE),而從資料庫處理SELECT查詢操作。通過主資料庫的資料庫複製被用來把事務性操作導致的變更同步到叢集中的從資料庫。

二:為什麼使用讀寫分離

因為資料庫的“寫”操作是比較耗時的。但是資料庫的“讀”。因為在我目前的專案中出現寫入需要耗時比較多,導致同時查詢時效率降低,所以通過讀寫分離可以改善查詢的效率。
本文只是介紹具體的配置步驟,具體原理講解請參照其他了解。

三:操作步驟

1.需要環境
(1)主伺服器:192.168.1.1;
從伺服器:192.168.1.2;
(2)主資料庫:root 123456;
從伺服器:root 111111;
生產環境下不建議使用root使用者。
A 主資料庫
2.修改主伺服器(master)的配置
vi /etc/my.cnf

[mysqld]
log-bin=mysql-bin;#【必須】啟動二進位制日誌
server-id=1;#【必須】伺服器唯一ID,可以取IP的最後數字
innodb-file-per-table=on
skip_name_resolve=on

退出儲存配置
3.重新啟動主伺服器的mysql服務

service mysqld restart

4.檢視日誌資訊
(1)檢視二進位制日誌是否開啟

show global variables like '%log%';

(2)檢視主節點二進位制日誌列表

show master logs;
輸出:
file					position
mysql-bin.000001		225143

此資料需要在從伺服器配置時使用,一定要選主伺服器的最後一個二進位制日誌資訊。
(3)檢視主節點的server id
show global variables like ‘%server%’;
(4)在主資料庫中建立有複製許可權的使用者

GRANT
REPLICATION SLAVE ON *.* to 'root'@'192.168.1.2' identified by '123456'; 注:root為主伺服器的使用者 密碼為主伺服器的使用者密碼 192.168.1.2為從伺服器ip,也可以換成%表示可以讓所有從伺服器連線主伺服器。

(5)重新整理

flush privileges;

B 從資料庫(slave)配置
1.編輯資料庫配置檔案
vi /etc/my.cnf

[mysqld]
relay-log=relay-log
relay-log-index=relay-log.index
server-id=2
innodb_file_per_table=ON
skip_name_resolve=ON
slave-skip-errors=all #跳過錯誤,當主資料庫有錯誤發生時,從資料庫會忽略錯誤資訊,繼續同步主資料庫資訊,否則,一旦出現錯誤,就會出現主從不一致無法自動實現複製。

說明:具體相關引數可參考:http://blog.51cto.com/mpflinux/2092833
2.重新啟動主伺服器的mysql服務

service mysqld restart

3.檢視從資料庫日誌資訊
(1)檢視中繼日誌是否開啟

show global variables like '%log%';
輸出:
relay_log				relay-log或者/var/lib/mysql/relay-log
relay_log_index		relay-log.index或者/var/lib/mysql/relay-log.index

(2)檢視server相關資訊

show global variables like '%server%';

4.配置從資料庫slave訪問主節點的引數資訊
(1)登入主資料庫,查詢主資料庫(master)的狀態

show master status;
輸出:
file					position
mysql-bin.000001		225143

(2)在從資料庫中配置slave

change master to master_host='192.168.1.1',master_user='root',master_password='123456',master_port=3306, master_log_file='mysql-bin.000001',master_log_pos=225143;
注:一定要保證master_log_pos為主資料庫中position為最新的值

(3)開啟從伺服器複製功能

start slave;

5.檢查從伺服器複製功能狀態:

show slave status\G;
輸出:
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.1.1
                  Master_User: root
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 239499
               Relay_Log_File: relay-log.000002
                Relay_Log_Pos: 390
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: Yes#必須為Yes
            Slave_SQL_Running: Yes#必須為Yes
注:Slave_IO及Slave_SQL程序必須正常執行,即YES狀態,否則都是錯誤的狀態(如:其中一個NO均屬錯誤)

說明:
Slave_IO_Running:連線到主庫,並讀取主庫的日誌到本地,生成本地日誌檔案
Slave_SQL_Running:讀取本地日誌檔案,並執行日誌裡的SQL命令。
C 測試主從複製
1.操作主伺服器
建立一個數據庫

create database mysql111111;
show databases;#檢視建立好的mysql111111資料庫

2.登入從伺服器
檢視資料庫

show databases;#可以看到主伺服器中建立的資料庫mysql111111;

此時主從伺服器的主從複製就完成了。
D 錯誤解析
我在配置時遇到Slave_SQL_Running: No
解決辦法:
1.關閉從資料庫(slave):stop slave;
2.到主資料庫檢視主機狀態:

show master status;
輸出:
file					position
mysql-bin.000001		225143

3.到從資料庫中執行手動同步:
change master to master_host=‘192.168.1.1’,master_user=‘root’,master_password=‘123456’,master_port=3306, master_log_file=‘mysql-bin.000001’,master_log_pos=225143;