Linux運維學習之數據庫的主從的複製

     上週咱們介紹了關於數據庫的備份與恢復,你們也差很少能夠在平常生產中作到數據的保障,可是若是咱們的數據庫服務器真的宕機或者各類問題崩潰,等咱們恢復過來也會損失不少的用戶或者交易額,這是生產中能夠避免就避免的問題,因此今天咱們來介紹數據庫的主從複製,實現數據庫的高可用和備份效果,減小時間庫的維護時間,增長可用時間!mysql

    通常的生產環境中,都是一個主庫加一個從庫,還有一個遠程的災備庫,當咱們因爲各類緣由宕機崩潰時,還能夠至少有一個庫對外提供服務,不至於全盤over。sql

    咱們首先提供三臺機器,分別爲一主兩從,分別安裝mariadb-server。數據庫

    修改主數據庫的配置文件:vim /etc/my.cnfvim

    [mysqld]後端

    server-id=1                #給數據庫指定惟一id
centos

    log-bin=mysql-bin    #開啓mysql的二進制日誌安全

    skip-name-resolve    #跳過名詞解析,非必須服務器

    systemctl restart mariadb網絡

    mysql < show master stauts;  #查看二進制日誌狀態,寫哪一個File,從那個Position開始異步

    mysql < grant replication slave,replication client on *.* to slave@'slave_server_ip' identified by 'centos';      #創建一個備份使用的用戶,給予複製的權限

    修改從數據庫的配置文件:vim /etc/my.cnf

    [mysqld]

    server-id=2

    log-bin=mysql-bin

    read-only=1             #開啓只讀,雙寫會問題

    relay-log=mysql-relay-log   #開啓中繼日誌

     log-slave-updates=1       #開啓從跟隨主二進制日誌更新

    systemctl restart mariadb

    mysql < change master to master_host = 'master_server ip',   #指定主庫的ip

    < change master_user='slave'        #上面定義的用戶

    < change master_password='centos'     #上面定義的密碼

    < change master_log_file='File'           

    < change master_log_pos='Position';

    start slave;

    show slave status\G;

    Slave_IO_Running: Yes     #I/O線程正常運行
     Slave_SQL_Running: Yes    #SQL線程正常運行

    當咱們配置完成後咱們可使用數據的各類的SQL語句,測試一下是否會自動複製同步!

    這裏的好多有人要問了,爲何這麼配置?從庫的不可寫是由於當兩個數據庫同時寫到一個block塊上是,文件系統會所以崩潰,這個問題是困擾咱們的雙寫的最大問題之一;當咱們的數據庫發生改變時,會先寫入二進制日誌,二進制日誌等知足條件時寫入硬盤中去,當咱們的在從上開啓兩個線程:I/O線程和SQl線程。其中I/O線程是當發現二進制日誌數據更新時,自動拉取日誌,寫入到中繼日誌,中繼日誌又經過SQL線程,寫入本機的mysql數據庫中,此時,兩個庫的操做同步,但有個問題誕生了,若是咱們的二進制日誌被拉取走,主數據庫是等待二進制回來,再返回用戶寫入操做ok,仍是不等待直接返回ok呢?這裏就牽涉到咱們的mysql的同步異步機制了。

    mysql的默認爲異步機制,也就是當用戶的寫入操做完成後,記入二進制日誌,咱們就返回ok,無論從服務器的是否拉取,是否完成,這樣就誕生了一個問題,若是咱們此時的數據庫崩潰,當咱們的數據庫從主數據庫切換到從數據庫時,數據會丟失,致使主從數據不一致。

    而同步機制呢,是咱們的主數據在被寫入後,等待後端的全部從數據庫複製完成,而咱們的從數據庫有時不僅有一個,加上網絡的消耗,服務時間上很漫長,而客戶不會有那麼多的耐心去等待該過程的完成,由此會致使客戶流失。

    可是解決的方法也很簡單,就是兩者取中,半同步機制應運而生,它只要有一個從數據複製完成,就當即返回客戶寫入ok,即強化了安全性,又減小了等待時間,並且半同步機制還能夠設置超時時間,若是必定的時間內沒有複製完成,就無論直接返回給客戶結果。

    那麼咱們如何切換到mysql的半同步呢?

    咱們的mysql中支持的多種插件在/usr/lib64/mysql/plugins/下,咱們在其中能夠看到有兩個semisync_master.so和semisync_slave.so庫,因此咱們直接在數據庫中安裝便可。

    主庫:

    mysql < install plugin rpl_semi_sync_master soname 'semisync_master.so';

    mysql < show global variables like 'rpl_semi%';

    mysql < set global rpl_semi_sync_master_enabled =1 #開啓主半同步

    從庫:

    mysql < install global rpl_semi_sync_slave soname 'semisync_slave.so';

    mysql < show global varialbes like 'rpl_semi%';

    mysql < set global rpl_semi_sync_slave_enabled=1 #開啓從半同步

    mysql < stop slave;

    mysql < start slave;

    查看mysql的錯誤日誌會看到改變的信息,mysql的錯誤日誌通常在/var/log/mariadb/mariadb.log

    Slave I/O thread: Start semi-sync replication to master 'slave@172.17.254.111:3306' in log 'mysql-bin.000003' at position 809

     看到這時咱們的半同步就算是完成了。

      今天的主從複製就到此結束,大家學到了嗎?

相關文章
相關標籤/搜索