1. 程式人生 > >Mysql資料庫之主從分離配置

Mysql資料庫之主從分離配置

每日一句

There is a Chinese saying which goes, "It takes ten years to grow a tree." 
中國有句話叫“十年樹木”。

介紹

MySQL資料庫設定讀寫分離,可以使對資料庫的寫操作和讀操作在不同伺服器上執行,提高併發量和響應速度。現在的網站一般大點的,都採用有資料庫主從分離、讀寫分離,既起到備份作用也可以減輕資料庫的讀寫的壓力,一直聽說過這些,但是從來沒有親自動手實踐過,今天有時間實踐一下,記錄下過程。

環境準備

我準備了兩臺伺服器,一個是本機PC,一個是遠端伺服器,分別在兩臺機子上裝有Mysql資料庫。
MySQL安裝我就不介紹了,這裡需要注意的是:MySQL安裝的版本最好一致,如果不一致,低版本向高版本讀的時候可能有問題,最好保持一致。

主庫master
伺服器:172.10.10.69  centos 7 Linux系統 ,  mysql版本  5.6.35

從庫slave
本機:172.10.10.240  Win7系統,  mysql版本  5.6.35

主庫配置

 一、建立使用者

在主庫中建立一個使用者root,用於從庫讀取主庫的執行日誌。
需要在mysql命令列裡執行,需要先登入命令列

1、GRANTREPLICATIONSLAVEON *.* TO'root'@'192.10.10.240'IDENTIFIEDBY'123456';
2、flush privileges; 

 二、修改my.cnf

Linux系統在 /etc/my.cnf中;windows在

C:\Program Files\MySQL\MySQL Server 5.6\my.ini中。

在my.cnf檔案裡增加一下程式碼

server-id = 1  #資料庫ID號
log-bin=master-bin  #啟用二進位制日誌
log-bin-index=master-bin.index  #二進位制日誌名稱

這裡注意不要放在檔案的末尾,要放在前面,即[mysqld]後,這裡放上我的my.cnf內容

[mysqld]
server-id=1
log-bin=master-bin
log-bin-index=master-bin.index

datadir=/var/lib/mysql
socket
=/var/lib/mysql/mysql.sock user=mysql symbolic-links=0 max_allowed_packet=100M [mysqld_safe] log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid

 三、檢視狀態

登陸mysql命令列後,輸入show master status,如果出現下面資訊代表主庫配置完成.

mysql> show master status;
+-------------------+----------+--------------+------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+------------------+
| master-bin.000001 |   120 |              |                  |
+-------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

記錄下File和Position兩個內容,從庫配置的時候會用到這個。

從庫配置

在本機PC(從庫)上找到my.cnf(windows上為my.ini)檔案,然後新增以下內容,這個配置和主庫的配置意思是一樣的

server-id=2
relay-log=slave-relay-bin
relay-log-index=slave-relay-bin.index

注意確定和主庫的位置一樣,我就因為位置放置在末尾導致一直關聯不上。

 一、關聯主從庫

最後一步很重要,登入從庫的MySQL命令列,執行以下程式碼,主要是關聯主庫的一些資訊。

change master to master_host='192.10.10.69',   #Master 伺服器Ip
master_port=3306,
master_user='root',
master_password='123456', 
master_log_file='master-bin.000001',  #Master日誌檔名
master_log_pos=120; #Master日誌同步開始位置

注意是否執行成功,如果執行失敗就好好檢查下程式碼,看看哪裡寫錯了。
如果執行正常,就啟動從庫slave,並檢視下連線狀態。

//需要再mysql命令列執行 
start slave; 
show slave status; //檢視slave連線狀態

狀態資訊

               Slave_IO_State: Waiting for master to send event
                  Master_Host: 45.78.57.4
                  Master_User: test
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: master-bin.000001
          Read_Master_Log_Pos: 672913
               Relay_Log_File: slave-relay-bin.000044
                Relay_Log_Pos: 504
        Relay_Master_Log_File: master-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

注意!配置過程中會碰到以下問題:

1、在Mysql5.6.35中,my.ini檔案在C:\ProgramData\MySQL\MySQL Server 5.6目錄下面,且已經預設配置了server-id=1,需要註釋掉。 2、如果碰到【Slave failed to initialize relay log info structure from the repository】錯誤提示,需要在slave中執行命令【reset slave; 3、在命令列中可以通過【show variables like 'server_id';】檢視server_id資訊。 4、修改Mysql配置後,需要重啟Mysql服務.

5、下面這兩個狀態必須為Yes才算成功,如果不是,則檢查上面步驟那一步配置錯誤。

Slave_IO_Running: Yes
Slave_SQL_Running: Yes

測試

現在在主庫上新增一條資料,看看從庫上是否有一個相同的資料,如果有則配置正常,功能使用正常。

主從分離的原理主要是:開啟主庫的執行日誌功能,然後從庫讀取主庫的日誌資訊,然後將主庫執行過的SQL語句在從庫上面執行一遍就做到主從分離,主從資料保持一致,起到備份資料的功能。