高性能mysql主存架構

MySQL ReplicationMaster與Slave基本原理及配置)mysql

主從mysql工做原理:
1:過程:
(1)Mysql的複製(replication)是一個異步的複製,從一個Mysql節點複製到另外一個Mysql節點。實現整個複製操做主要由三個進程完成的,其中兩個進程在Slave(Sql進程和IO進程)另一個進程在 Master(IO進程)上。
(2)要實施複製,首先必須打開Master端的binary log功能,不然沒法實現。由於整個複製過程實際上就是Slave從Master端獲取該日誌而後再在本身身上徹底順序的執行日誌中所記錄的各類操做。
2:複製的基本過程以下:
(1)Slave上面的IO進程鏈接上Master,並請求從指定日誌文件的指定位置(或者從最開始的日誌)以後的日誌內容;
(2)Master接收到來自Slave的IO進程的請求後,經過負責複製的IO進程根據請求信息讀取制定日誌指定位置以後的日誌信息,返回給Slave 的IO進程。返回信息中除了日誌所包含的信息以外,還包括本次返回的信息已經到Master端的bin-log文件的名稱以及bin-log的位置;
(3)Slave的IO進程接收到信息後,將接收到的日誌內容依次添加到Slave端的relay-log文件的最末端,並將讀取到的Master端的 bin-log的文件名和位置記錄到master-info文件中,以便在下一次讀取的時候可以清楚的高速Master「我須要從某個bin-log的哪一個位置開始日後的日誌內容,請發給我」;
(4)Slave的Sql進程檢測到relay-log中新增長了內容後,會立刻解析relay-log的內容成爲在Master端真實執行時候的那些可執行的內容,並在自身執行。
3:主從結論
(1)主從間的數據庫不是實時同步,就算網絡鏈接正常,也存在瞬間,主從數據不一致。 
(2)若是主從的網絡斷開,從會在網絡正常後,批量同步。 
(3)若是對從進行修改數據,那麼極可能從在執行主的bin-log時出現錯誤而中止同步,這個是很危險的操做。因此通常狀況下,很是當心的修改從上的數據。 
(4)還有一個mysql配置是雙主,互爲主從配置,只要雙方的修改不衝突,能夠工做良好。 
(5)若是須要多主的話,能夠用環形配置,這樣任意一個節點的修改均可以同步到全部節點。
4:搭建mysql主從服務器
(1)實驗環境
操做系統:Red Hat Enterprise Linux Server release 6.4
數據庫版本: 5.6.21
(2)主機地址:
master:192.168.10.130
slave:192.168.10.120
(3)安裝數據mysql數據庫
略
(4)配置master的my.cnf文件
[mysqld] 
log_bin = mysql-bin                #開啓binlog日誌
basedir = /usr/local/mysql         #指定mysql的安裝目錄
datadir = /data/mysql              #指定mysql數據庫的數據存放位置
port = 3306                        #指定端口,默認是3306,若是一個主機有兩個數據庫需指定不一樣端口
server_id = 1                      #指定server-id,必須與slave端的server-id不一樣
bind-address = 0.0.0.0             #默認是127.0.0.1,更改成0.0.0.0,不然Slave將沒法連接到 Master
expire_logs_days = 10              #終止日誌的時間,以天爲單位,默認是30天
max_binlog_size = 100M             #存放日誌最大容量
sync-binlog=1                      #容許日誌同步
(5)重啓mysql服務
[root@localhost ~]# service mysqld restart
(6)本地登陸mysql數據庫,向slave受權並查看當前使用的binlog日誌與偏移量
mysql> grant replication client,replication slave on *.* to 'repluser'@'192.168.10.120' identified by '123456';
語意:容許用戶repluser以密碼123456在192.168.10.120主機,登錄本機數據庫同步數據;
(7)查看master狀態
mysql> show master status \G;
*************************** 1. row ***************************
File: mysql-bin.000015             #binlog日誌
Position: 211                      #偏移量
Binlog_Do_DB:
Binlog_Ignore_DB:
Executed_Gtid_Set:
1 row in set (0.00 sec)
ERROR:  
No query specified
錯誤顯示:
mysql>show master status;
Empty set (0.02 sec)
查詢若是出現以上提示表示配置有問題;
(8)配置slave服務器my.cnf文件
[mysqld]
basedir = /usr/local/mysql
datadir = /data/mysql
port = 3306
server_id = 2                      #指定server-id,必須與master端的server-id不一樣
sync-binlog=1                      #容許日誌同步
read-only=1                        #設置只讀
(9)重啓mysql服務
[root@localhost ~]# service mysqld restart
(10)本地登陸mysql數據庫,指定從服務器的主服務器並開啓slave功能
執行如下操做必須關閉slave功能
mysql> stop slave;
Query OK, 0 rows affected (0.00 sec)
mysql> change master to
 -> master_host='192.168.10.130',        #指定主服務器地址
 -> master_port=3306,                    #指定端口,默認是3306,不須要指定
 -> master_user='repluser',              #指定同步時使用的用戶名
 -> master_password='123456',            #指定同步用戶的密碼
 -> master_log_file='mysql-bin.000015',  #指定當前的主服務器使用的binlog日誌
 -> master_log_pos=120;                   #指定當前主服務器上的位偏移量
Query OK, 0 rows affected (0.00 sec)
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
(11)查看slave是否正常工做
mysql> show slave status \G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.10.130
                  Master_User: repluser
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000015
          Read_Master_Log_Pos: 120
               Relay_Log_File: localhost-relay-bin.000002
                Relay_Log_Pos: 283
        Relay_Master_Log_File: mysql-bin.000015
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
(12)測試
在master建立wql數據
mysql> create database wql;
Query OK, 1 row affected (0.00 sec)
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
| wordpress          |
| wql                |
+--------------------+
6 rows in set (0.00 sec)
在slave數據查看是否有該數據庫
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
| wql                |
+--------------------+
5 rows in set (0.00 sec)

 Mysql主從同步搭建完成且能夠正常工做,但其中有幾點須要注意:sql

(1)設置slave服務器時在指定其主服務器時要在每一個項目後面加逗號分隔
(2)如需更改slave服務器的主服務器的設置須要先中止slave服務,而後再更改,使用命令stop slave能夠中止slave服務
(3)只有Slave_IO_Running與Slave_SQL_Running兩個進程的狀態全爲Yse時才代表slave服務正常工做,不然都表示其工做異常。
Slave_IO_Running進程狀態爲NO的緣由:
(1)鏈接不上主數據庫服務器(物理線路,安全設置問題,受權問題)
(2)當前binlog日誌名和pos點和主服務器的不一致
Slave_SQL_Running進程狀態爲NO的緣由:從服務器本機沒有主數據庫上的庫和表或者表結構不一致。
13:主從複製如何提升可靠性

(1)主從單向複製,從服務器只是實時的保存了主服務器的一個副本。當主服務器發生故障時,能夠切換到從服務器繼續作查詢,但不能更新。數據庫

(2)若是採用雙向複製,即兩臺mysql服務器即做爲主服務器,又做爲從服務器。那麼二者均可以執行更新操做並能實現負載均衡,當一方出現故障時,另外一方不受影響。可是,除非能保證任何更新操做順序都是安全的,不然雙向複製會致使失敗。安全

但願瀆者多提意見,
聯繫方式QQ:1486483698
QQ交流羣:431392633

相關文章
相關標籤/搜索