實戰項目——mysql主從架構的實現

一主一從

1.1 環境準備:

  centos系統服務器2臺、 一臺用戶作Mysql主服務器, 一臺用於作Mysql從服務器, 配置好yum源、 防火牆關閉、 各節點時鐘服務同步、 各節點之間能夠經過主機名互相通訊html

1.2 準備步驟:

1)iptables -F && setenforce 清空防火牆策略,關閉selinux
2)拿兩臺服務器都使用yum方式安裝Mysql服務, 要求版本一致
3)分別啓動兩臺服務器mysql服務, 確保服務正常
  架構圖:
mysql

1.3 實現步驟:

1.3.1 配置master主服務器

  對master進行配置,包括打開二進制日誌,指定惟一的servr ID。例如,在配置文件加入以下值linux

server-id=1      //配置server-id,讓主服務器有惟一ID號
    log-bin=mysql-bin  //打開Mysql日誌,日誌格式爲二進制
    skip-name-resolve  //關閉名稱解析,(非必須)

1.3.2 建立複製賬號

  在 Master 的數據庫中創建一個備份賬戶:每一個 slave 使用標準的 MySQL 用戶名和密碼鏈接 master 。進行復制操做的用戶會授予 REPLICATION SLAVE 權限。sql

MariaDB [(none)]> grant replication slave,replication client on *.* to slave@'192.168.%.%' identified by 'keer';

1.3.3 查看主服務器狀態

  在 Master 的數據庫執行 show master status,查看主服務器二進制日誌狀態及位置號。
數據庫

1.3.4 配置slave從服務器

  對 slave 進行配置,打開中繼日誌,指定惟一的 servr ID,設置只讀權限。在配置文件加入以下值:vim

server-id=2                 //配置server-id,讓從服務器有惟一ID號
    relay_log = mysql-relay-bin //打開Mysql日誌,日誌格式爲二進制
    read_only = 1               //設置只讀權限
    log_bin = mysql-bin         //開啓從服務器二進制日誌
    log_slave_updates = 1       //使得更新的數據寫進二進制日誌中

1.3.5 啓動從服務器複製線程

  讓 slave 鏈接 master ,並開始重作 master 二進制日誌中的事件。centos

MariaDB [(none)]> change master to master_host='192.168.37.111', 
   >master_user='slave', 
   >master_password='keer', 
   >master_log_file='mysql-bin.000001', 
   >master_log_pos=413;

  執行start slave;,來啓動複製線程。
  安全

1.3.6 查看從服務器狀態

  可以使用SHOW SLAVE STATUS\G;查看從服務器狀態,以下所示,也可用show processlist \G;查看當前複製狀態:服務器

Slave_IO_Running: Yes       //IO線程正常運行
    Slave_SQL_Running: Yes      //SQL線程正常運行

1.3.7 測試

1)測試主從同步
  咱們在 master 服務器上建立一個數據庫,再使用該數據庫建立一個表,添加一條記錄,來看一看 slave 服務器有沒有同步成功。
  首先,咱們先來查看一下兩個服務器上有什麼數據庫:
  master:

  slave:

  如今,咱們在主服務器上建立一個數據庫「keer」:

  而後,咱們來看看從服務器是否已經更新:

  咱們能夠看出,數據庫已經同步,接下來,咱們就來建立表,並在表中插入一條記錄:

  而後,咱們來看看從服務器是否更新:
網絡

2)測試只讀屬性  
  咱們在從服務器上設置了只讀,因此咱們來試試看能不能插入數據:

  這就很尷尬了,爲何咱們設置只讀仍是能夠插入數據呢?這要如何解決呢?
  由於咱們登陸的時候使用的是root超級用戶,這個大變態是不受只讀設置影響的,因此,咱們仍是能夠往裏面去插入數據,固然,若是咱們換成其餘的普通用戶就不會出現這樣的問題了。
  解決方式也很簡單,咱們只須要把表鎖起來就能夠了:

MariaDB [keer]> flush tables with read lock;

  進行鎖表操做之後,咱們再來插入一條數據:

  這樣的話,即便咱們是超級用戶登陸進來的,也不能再插入數據了。這樣會安全不少。可是,有利就有弊,這樣的話,咱們的主從就不能實時同步了,由於咱們的主從同步是經過把主上的 sql 語句放在從上再執行一遍來實現的,但是咱們鎖表的話,sql 語句就不能執行了。想要同步方法也很簡單,直接把表解鎖就能夠了。
  咱們在主上插入一條數據:

  此時,咱們的從上就要解表之後才能實現同步:

1.4 擴展——實現一主多從

1.4.1 需求分析

  當咱們的服務器運行一段時間後,流量變得愈來愈多,這時,一主一從可以實現的高可用性和負載均衡不能知足咱們的需求,咱們就要選擇再添加一臺從服務器。
  但是如今咱們的 master 已經運行好久了,咱們也須要對新安裝的 slave 進行數據同步,甚至它沒有 master 的數據。
  此時,有幾種方法可使 slave 從另外一個服務開始,例如,從 master 拷貝數據,從另外一個 slave 克隆,從最近的備份開始一個 slave 。爲了加快 slave 與 master 同步,可用如下方式先進行數據同步:

(1)master的某個時刻的數據快照;
(2)數據庫的備份數據;
(3)master的二進制日誌文件。

  架構圖:

  接下來,咱們就來實現一下這個過程:

1.4.2 具體實現過程

1)對 master 進行徹底備份

[root@master ~]# mkdir /backup
[root@master ~]# mysqldump --all-database > /backup/mysql-backup-`date +%F-%T`-all.sql

照例查看一下主的二進制日誌狀態及位置號。

2)把徹底備份的數據發到新增的從上

[root@master ~]# scp /backup/mysql-backup-2017-11-21-10\:28\:29-all.sql @192.168.37.133:~
root@192.168.37.133's password: 
mysql-backup-2017-11-21-10:28:29-all.sql                                                           100%  504KB 503.9KB/s   00:00

3)把這個徹底備份導入從的數據庫:

4)查看從是否恢復成功:


  咱們來查看一下從的二進制日誌狀態及位置號:

  咱們的數據已經恢復成功

5)設置主從
接下來就是按照上述步驟,對該從服務器進行設置就好:

[root@slave2 ~]# vim /etc/my.cnf
    [mysqld]
    server-id = 3
    relay-log = mysql-relay-bin
    read-only = 1
    log-bin = mysql-bin
    log-slave-updates = 1

  
  而後,咱們就來設置從服務器:

[root@slave2 ~]# mysql -uroot -p
Enter password: 
MariaDB [(none)]> change master to master_host='192.168.37.111', 
   >master_user='slave', 
   >master_password='keer', 
   >master_log_file='mysql-bin.000001', 
   >master_log_pos=330;
MariaDB [(none)]> start slave;

  而後咱們來查看一下從服務器的狀態:

6)測試
  設置完畢,咱們來測試一下,當主上有操做時,從上是否更新:


  至此,咱們就完成了一主兩從。若是有須要,咱們還能夠繼續添加從服務器。

1.5 擴展——實現半同步複製

1.5.1 三種複製方式

1)同步複製
  指當主庫執行完一個事務,全部的從庫都執行了該事務才返回給客戶端。由於須要等待全部從庫執行完該事務才能返回,因此全同步複製的性能必然會收到嚴重的影響。須要有超時時間。
2)異步複製
  MySQL默認的複製便是異步的,主庫在執行完客戶端提交的事務後會當即將結果返給給客戶端,並不關心從庫是否已經接收並處理,這樣就會有一個問題,主若是crash掉了,此時主上已經提交的事務可能並無傳到從上,若是此時,強行將從提高爲主,可能致使新主上的數據不完整。
3)半同步複製
  介於異步複製和全同步複製之間,主庫在執行完客戶端提交的事務後不是馬上返回給客戶端,而是等待至少一個從庫接收到並寫到relay log中才返回給客戶端。相對於異步複製,半同步複製提升了數據的安全性,同時它也形成了必定程度的延遲,這個延遲最少是一個TCP/IP往返的時間。因此,半同步複製最好在低延時的網絡中使用。

1.5.2 實現半同步複製

  半同步複製是基於特定的模塊來實現。不過很是 nice 的一點就是,在咱們的 mariadb5.5 以上的版本默認是帶有這個模塊的。
  若是咱們的 centos7 上安裝了 mariadb ,咱們就能夠進入目錄去查看一下:

[root@master ~]# cd /usr/lib64/mysql/plugin/


  找到咱們的模塊後,咱們就能夠經過命令來安裝,而後進行簡單配置便可使用了。下面就是具體方法:
master 服務器上:

MariaDB [(none)]> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
MariaDB [(none)]> SHOW GLOBAL VARIABLES LIKE 'rpl_semi%';
MariaDB [(none)]> SET GLOBAL rpl_semi_sync_master_enabled=ON;

slave 服務器上:

MariaDB [(none)]> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
MariaDB [(none)]> SHOW GLOBAL VARIABLES LIKE 'rpl_semi%';
MariaDB [(none)]> SET GLOBAL rpl_semi_sync_slave_enabled = ON ;
MariaDB [(none)]> stop slave;   
MariaDB [(none)]> start slave;



  如今,咱們的半同步複製就開啓了,咱們能夠來查看一下日誌:

[root@slave ~]# tail -200 /var/log/mariadb/mariadb.log

  從日誌裏也能夠看出咱們的半同步複製已經開啓。


  以上,實驗一完成。

互爲主從(雙主)

  還有一種數據庫的架構爲雙主模式,也就是互爲主從,這種設定在企業中雖不經常使用,可是咱們仍是須要掌握的。
  Master-Master複製的兩臺服務器,既是master,又是另外一臺服務器的slave。這樣,任何一方所作的變動,都會經過複製應用到另一方的數據庫中。
  架構圖以下:

2.1 環境準備:

  centos系統服務器2臺、 兩臺用戶實現Mysql互爲主從, 配置好yum源、 防火牆關閉、 各節點時鐘服務同步、 各節點之間能夠經過主機名互相通訊

2.2 準備步驟:

1)iptables -F && setenforce 清空防火牆策略,關閉selinux
2)拿兩臺服務器都使用yum方式安裝Mysql服務, 要求版本一致
3)分別啓動兩臺服務器mysql服務, 確保服務正常

2.3 實現步驟:

2.3.1 配置第一臺 master 主服務器

server-id = 1      //配置server-id,讓主服務器有惟一ID號
    log-bin = mysql-bin  //打開Mysql日誌,日誌格式爲二進制
    skip-name-resolve    //關閉名稱解析,(非必須)
    relay_log = mysql-relay-bin //打開Mysql日誌,日誌格式爲二進制
    read_only = 1               //設置只讀權限
    log_slave_updates = 1       //使得更新的數據寫進二進制日誌中
    auto_increment_offset = 1    //表示自增加字段從那個數開始
    auto_increment_increment = 2  //表示自增加字段每次遞增的量

2.3.2 配置第二臺 master 主服務器

server-id = 2      //配置server-id,讓主服務器有惟一ID號
    log-bin = mysql-bin  //打開Mysql日誌,日誌格式爲二進制
    skip-name-resolve    //關閉名稱解析,(非必須)
    relay_log = mysql-relay-bin //打開Mysql日誌,日誌格式爲二進制
    read_only = 1               //設置只讀權限
    log_slave_updates = 1       //使得更新的數據寫進二進制日誌中
    auto_increment_offset = 2    //表示自增加字段從那個數開始
    auto_increment_increment = 2  //表示自增加字段每次遞增的量

2.3.3 建立複製帳號

  由於咱們實現的是雙主模式,因此咱們每一臺機器上都要建立複製帳號:

2.3.4 查看服務器狀態

  咱們分別查看兩臺服務器的狀態,從而爲咱們下一步的設置奠下基礎:

2.3.5 啓動複製線程

  咱們來分別對兩臺機器進行的設置:
  首先,先對第一臺 master 機器進行設置:

MariaDB [(none)]> change master to master_host='192.168.37.222',master_user='slave',master_password='keer',master_log_file='mysql-bin.000003',master_log_pos=245;
MariaDB [(none)]> start slave;

  接着,咱們來查看一下他的狀態:

  如今,咱們來對第二臺 master 進行設置:

MariaDB [(none)]> change master to master_host='192.168.37.111',master_user='slave',master_password='keer',master_log_file='mysql-bin.000002',master_log_pos=245;
MariaDB [(none)]> start slave;

  咱們來查看一下他的狀態:
  
  能夠看出,咱們的兩個機器都設置完畢,接下來,咱們就能夠來測試一下了。

2.3.5 測試

  在咱們的配置文件中,咱們設置了自增加字段的起始值和增加值,如今咱們去建立一個自增加的表:

MariaDB [keer]> create table test(id int PRIMARY KEY AUTO_INCREMENT,name char(20) not null);

  由於咱們設置了主從,因此在任一機器使用該命令便可。
  建立好了表之後,咱們就能夠插入數據進行測試了,咱們一個插入多條數據來看看效果:
第一個服務器:

MariaDB [keer]> insert into test(name) value('zhao'),('qian'),('sun'),('li');
Query OK, 4 rows affected (0.00 sec)
Records: 4  Duplicates: 0  Warnings: 0

第二個服務器:

MariaDB [keer]> insert into test(name) value('zhou'),('wu'),('zheng'),('wang');
Query OK, 4 rows affected (0.00 sec)
Records: 4  Duplicates: 0  Warnings: 0

  數據咱們都插入了,咱們來看看效果如何:

  能夠看出,兩個表插入的數據是不會重複的。
  可是如今也不是咱們想象的連續的 id ,這是由於,咱們兩臺機器都是同時插入4條數據,並且不是同步插入的,這樣就會有一個前後順序,第一臺機器上的 sql 語句執行結束之後才執行第二臺機器上的。因此會出現這樣的狀況。
  可是,這樣已經不會插入重複的數據了。咱們的目的也是達到了。


  以上,實驗二完成。

高可用架構MHA的實現

  具體的實現過程見個人下一篇博客mysql實現高可用架構之MHA

  若有不足之處還請你們多多指教喏٩(๑>◡<๑)۶

相關文章
相關標籤/搜索