LNMP+HAProxy+Keepalived負載均衡(四)- MySQL雙機互備及自動備份

前三篇已實現了最基本的負載均衡,但是還存在問題,如兩個數據庫不同步,上傳的附件不同步,數據庫沒有制定備份計劃,負載均衡參數還有待優化等問題。這裏先把雙機互備和自動備份的內容補齊。

  • 配置MySQL數據庫的賬戶密碼(以下命令僅用參考,這裏的目的是要有一個可供內網其他服務器訪問本機數據庫的賬戶);

    # 停止數據庫服務
    service mysql stop
    # 免驗證啓動數據庫服務
    mysqld --user=mysql --skip-grant-tables --skip-networking
    # 登錄mysql
    mysql -u root mysql
    # 修改用戶密碼的幾種方式
    mysql> UPDATE user SET authentication_string=PASSWORD('dbpwd') where USER='dbadmin';
    mysql> UPDATE user SET authentication_string=PASSWORD('dbpwd') where USER='dbbaker';
    mysql> UPDATE user SET Password=PASSWORD('dbpwd') where USER='dbadmin';
    mysql> alter user user() identified by "dbpwd";
    # 使配置生效
    mysql> FLUSH PRIVILEGES;
    mysql> quit;
    
    # 重啓mysql服務,注意,這裏的mysql如果找不到服務,可以嘗試mysqld,再不行就通過ps -ef | grep mysql找到進程ID(pid),然後通過kill -9 pid停止服務;
    service mysql restart
    mysql -udbadmin -p
    # Enter password: <輸入新密碼newpassword>
    # 創建用戶並配置權限:
    mysql> GRANT ALL ON *.* TO 'dbadmin'@'%' IDENTIFIED BY 'dbpwd' WITH GRANT OPTION;
    # 移除權限
    # REVOKE ALL ON *.* TO 'dbadmin'@'%';
    FLUSH PRIVILEGES;
    # 全局層級:*.*
    # 數據庫層級:db_name.*
    # 表層級:db_name.tbl_name
    # ALL是指分配所有權限,具體權限可以通過下面的查詢語句查看
    
    # 查詢用戶權限
    select * from mysql.user \G;
    # 刪除用戶
    # delete from mysql.user where Host <> '%';
    # 至此,數據庫可以通過以上賬戶進行遠程連接了。
  • 配置MySQL的雙機互備 - 主數據庫服務器(192.168.6.200 /etc/my.cnf的配置請參考LNMP+HAProxy+Keepalived負載均衡(三)- 配置文件彙總);

    # 在主數據庫服務器上執行配置:
    vim /etc/my.cnf
    
    # 修改配置內容:
    server-id=6                           # 數據庫集羣中唯一
    lower_case_table_names=1              # 新增行,數據表不區分大小寫
    replicate_wild_do_table=sync_db_name.%   # 只同步“sync_db_name”庫下的表
    log-slave-updates=YES                # 從服務器同步後記錄日誌
    
    # 保存配置後重啓MySQL服務:
    service mysql restart
    # 進入MySQL命令行,查看主數據庫狀態信息,其中的“File”和“Position”值後面會用到:
    mysql> use sync_db_name;
    mysql> show master status;

    show master status;

  • 配置MySQL的雙機互備 - 備數據庫服務器(192.168.6.210);

    # 停止slave:
    mysql> stop slave;
    
    # 進入MySQL命令行,配置要同步的主庫來源:
    mysql> CHANGE MASTER TO MASTER_HOST='192.168.6.200',MASTER_PORT=10002,MASTER_USER='dbadmin',MASTER_PASSWORD='dbpwd',MASTER_LOG_FILE='mysql-bin.000016',MASTER_LOG_POS=1285;
    # MASTER_HOST:主數據庫的IP;
    # MASTER_PORT:主數據庫的端口(int),默認3306;
    # MASTER_USER,MASTER_PASSWORD:主數據庫賬戶、密碼;
    # MASTER_LOG_FILE:主數據庫中查詢到的“File”值;
    # MASTER_LOG_POS:主數據庫中查詢到的“Position”值;
    
    # 啓動slave:
    mysql> start slave;
    
    # 檢查slave:
    mysql> show slave status \G;
    
    # 命令行彙總:
    show master status;
    stop slave;

    Slave_IO_Running、Slave_SQL_Running 均顯示爲 Yes 說明主備同步服務正常運行,如下圖:
    show slave status G;

  • 同步數據庫的初始狀態;
    在啓動同步服務前,還需要手動同步下數據庫的初始狀態,之後可以通過修改其中主數據庫中的表來查看從數據庫是否同步變更;

    # 鎖定要同步的數據庫(192.168.6.200):
    msyql> use sync_db_name;
    msyql> flush tables with read lock;
    # 將要同步的數據庫導出腳本:
    mysqldump -udbadmin -pdbpwd sync_db_name >/home/backup/sync_db_name.sql
    # 解鎖前面鎖定的數據庫:
    msyql> unlock tables;
    
    # 將上方備份的sql拷貝到從數據庫服務器(192.168.6.210),然後創建同名數據庫,恢復數據:
    msyql> create database sync_db_name;
    msyql> use sync_db_name;
    msyql> source /home/backup/sync_db_name.sql;
  • 做雙機互備或多機循環互備;
    然後將主從數據庫服務器反轉(即將192.168.6.200和192.168.6.210的主備身份調換),然後再配置一次同步即可。即192.168.6.200變更會同步到192.168.6.210,反之亦然。簡單講就是:
    雙機互備:A主B從 + A從B主;
    多機循環互備:A主B從 + B主C從 + C主N從 + N主A從(建議不要過多,尤其是數據庫數據量大,且變更頻繁的情況下,同步畢竟也是有延遲的);
  • 數據庫的自動備份(前三步前面的文章都有提到);

    • 安裝計劃工具;

      yum -y install crontabs
    • 編輯MySQL的配置文件;

      vim /etc/my.cnf
      
      # 添加配置文件內容:
      [mysqldump]
      # 用於備份數據庫
      user=dbbaker
      password=dbpwd
    • 重啓數據庫服務;

      service mysql restart & service mysql status
    • 準備備份腳本;

      mkdir -p /home/bakup/lgd_system
      
      # 編輯bakdb.sh的內容:
      echo 'mysqldump sync_db_name | gzip > /home/backup/lgd_system/sync_db_name_$(date +%Y%m%d_%H%M%S).sql.gz' > /home/bakup/bakdb.sh
      chmod +x /home/bakcup/bakdb.sh
      
      # 解壓縮指定的備份文件:
      gunzip sync_db_name_*.gz
    • 添加備份計劃;

      # 方式一:
      crontab -e
      # 方式二:
      vim /etc/crontab
        
      # 編輯計劃:
      # Example of job definition:
      # .---------------- minute (0 - 59) *表示每分鐘
      # |  .------------- hour (0 - 23) *表示每小時
      # |  |  .---------- day of month (1 - 31) *表示每天
      # |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ... *表示每月
      # |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat *表示每天
      # |  |  |  |  |
      # *  *  *  *  * user-name(用戶名)  command to be executed(腳本路徑)
      # 30 10 * * * /home/backup/bakdb.sh # 表示每天10:30執行一次備份腳本(前方的註釋去掉即可)
    • 計劃任務常用操作命令;

      service crond start     # 啓動服務
      service crond stop      # 關閉服務
      service crond restart   # 重啓服務
      service crond reload    # 重新載入配置
      service crond status    # 查看服務狀態
      tail -f /var/log/cron   # 查看執行日誌
    • 備份文件解壓縮

      gzip命令:
      選項參數:
      -c:將壓縮後的數據顯示到屏幕上,可以用於重定向;
      -d:解壓縮的參數;
      -t:檢驗壓縮的一致性,看是否有錯誤;
      -v:顯示 源文件大小/壓縮文件大小 的壓縮比;
      -#:# 爲數字的意思,代表壓縮等級,-1 最快,但是壓縮比最差、-9 最慢,但是壓縮比最好!默認是 -6
      gzip -v  => 壓縮文件,-v查看壓縮比
      gzip -d 
      gunzip file.gz
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章