第14周做業

一、使用mysqldump備份數據庫並經過備份及二進制日誌還原數據(備份完後再寫入數據,而後再刪庫)mysqldump -A --single-transaction -F --master-data=2 > /data/backup/mysql.sql  選項:-A 備份全部數據庫     -F 刷新日誌node

--single-stransaction開啓事務備份 --master-data=2記錄二進制日誌位置 備份前的數據庫 
備份後在表裏插入新數據
刪庫 mysql
-e 'drop database hellodb'
開始還原數據庫,在還原前臨時禁用二進制日誌,避免記錄還原過程,引發數據錯亂
還原數據庫 source
/data/backup/mysql.sql
查看數據庫,徹底備份的數據還原成功

繼續還原在徹底備份以後的數據。 查看
/backup/mysql.sql文件的二進制日誌的記錄點
發現最後一次的徹底備份是日誌編號06,位置爲245。 用mysqlbinlog導出二進制日誌
mysqlbinlog
/var/lib/mysql/centos7-bin.000006 -v > /data/backup/log.sql 編輯日誌,將日誌文件中的drop database hellodb 刪除 而後在數據庫中導入生成的二進制日誌。
查看數據庫數據,全部數據還原成功。


 

二、使用xtrabackup備份數據並還原python

安裝:
yum install percona-xtrabackup (epel)源

建立一個臨時目錄存放xtrabackup的備份文件
mkdir /data/backups

在要備份的機器上執行備份命令。將預準備文件存放在一個臨時目錄
xtrabackup --backup --target-dir=/data/backups/

臨時生成的文件

(
1)xtrabackup_info:innobackupex工具執行時的相關信息,包括版本,備份選項,備份時長,備份LSN(log sequence number日誌序列號),BINLOG的位置 (2)xtrabackup_checkpoints:備份類型(如徹底或增量)、備份狀態(如是否已經爲prepared狀態)和LSN範圍信息,每一個InnoDB頁(一般爲16k大小)都會包含一個日誌序列號LSN。LSN是整個數據庫系統的系統版本號,每一個頁面相關的LSN可以代表此頁面最近是如何發生改變的 (3)xtrabackup_binlog_info:MySQL服務器當前正在使用的二進制日誌文件及至備份這一刻爲止二進制日誌事件的位置,可利用實現基於binlog的恢復 (4)backup-my.cnf:備份命令用到的配置選項信息 (5)xtrabackup_logfile:備份生成的日誌文件 將備份文件拷貝到目標機器 scp -r /data/backups/ 192.168.242.129:/data/ 還原注意事項: 1.datadir 目錄必須爲空。除非指定innobackupex --force-non-empty-directorires選項指定,不然--copy-backup選項不會覆蓋 2.在restore以前,必須shutdown MySQL實例,不能將一個運行中的實例restore到datadir目錄中 3.因爲文件屬性會被保留,大部分狀況下須要在啓動實例以前將文件的屬主改成mysql,這些文件將屬於建立備份的用戶 chown -R mysql:mysql /data/mysql 以上須要在用戶調用innobackupex以前完成 在目標主機執行xtrabackup --prpare --target-dir=/data/backups (預準備工做) 生成了數據庫文件
xtrabackup
--copy-back --target-dir=/backups/ 將目錄中的文件拷貝到數據庫/var/lib/mysql中 修改文件屬性爲mysql 開始將目錄中的全部的數控文件拷貝到系統的數據目錄中
由於是從另外一臺機器拷貝過來的數據,須要修改文件屬性
還原成功


 

三、MySQL數據備份企業實戰(shell或python腳本實現)mysql

 使用xtrabackup以每週爲一個備份週期作備份(數據庫+二進制日誌,備份至本地/data/backup)react

 提示: 週一某個時間點作一次徹底備份,周2、3、4、5、6、日增量sql

  備份存儲目錄"/data/backup/2018/52/1/備份數據" 目錄解釋"/data/backup/年/本年度的第幾周/本週的第幾天/數據" 一年52週一周7天shell

 (Andy老師提供python備份腳本參考)數據庫

 

#!/bin/bash

for i in `seq 0 6`;do #循環6次

a=/data/backup/`date +%Y`/`date +%U`/ #存儲目錄變量

mkdir -p $a$i # #建立目錄

t=`date +%w` #定義星期

if [ "$t" == "1" ];then #匹配星期 週一爲徹底備份

        xtrabackup --backup --target-dir=/data/backup &> /dev/null &&  echo backup ok

else

        if [ "$t" == "2" ];then  #匹配星期 週二爲增量備份

                xtrabackup --backup --target-dir="$a"1 --incremental-basedir=/data/backup &> /dev/null &&  echo backup ok

        elif [ "$t" == "3" ];then

                xtrabackup --backup --target-dir="$a"2 --incremental-basedir="$a"1 &> /dev/null &&  echo backup ok

        elif [ "$t" == "4" ];then

                xtrabackup --backup --target-dir="$a"3 --incremental-basedir="$a"2 &> /dev/null &&  echo backup ok

        elif [ "$t" == "5" ];then

                xtrabackup --backup --target-dir="$a"4 --incremental-basedir="$a"3 &> /dev/null &&  echo backup ok

        elif [ "$t" == "6" ];then

                xtrabackup --backup --target-dir="$a"5 --incremental-basedir="$a"4 &> /dev/null &&  echo backup ok

        elif [ "$t" == "0" ];then

                xtrabackup --backup --target-dir="$a"6 --incremental-basedir="$a"5 &> /dev/null &&  echo backup ok

        fi

fi

done

將腳本寫入計劃任務。每日2時執行一遍備份。如逢週一則徹底備份
[root@centos7 ~]# crontab -l

0 2 * * * root /root/b.sh &>/dev/null

四、描述MySQL複製工做原理並實現主從,主主,主從級聯及半同步複製vim

 

一臺mysql數據庫的併發鏈接數是有限的,當併發訪問量大的時候,可能形成一臺服務器因爲壓力太大而形成的宕機,這將產生數據丟失的風險和較差的用戶體驗。因此,咱們能夠利
用mysql的binlog日誌和複製功能,組成一臺主機,多臺從機的集羣,當集羣中的一臺主數據庫寫入數據時,將主服務器的二進制日誌複製到其餘從服務器上,繼而實現同步過程。
若是主服務器宕機,則自動從多臺從服務器挑選一臺充當主服務器. 複製原理
當主服務器收到數據更新請求時,會將更新過程寫入二進制日誌中。在主服務器中,有一個專門的dump線程將二進制日誌發給從服務器。從服務器中,有一個io thread線程將接
收到的binlog寫入到relay log (相似二進制日誌)日誌中 ,而後再將relay log交給sql thread在從服務器中更改數據
主從複製

在主服務器配置文件

log-bin=/data/logbin/mysql-bin #啓用二進制日誌

server-id=1 #指定服務器編號
在從服務器配置 server
-id=2 #區別於主服務器編號 read_only=on #爲了安全從服務器設置爲只讀,防止修改 在主服務器建立並受權複製帳號 grant replication slave on *.* to test@'192.168.64.%' identified by 'centos';
主服務器數據庫
從服務器數據庫
在從服務器執行主服務器修改master 信息
CHANGE MASTER TO MASTER_HOST
='192.168.64.128', #主服務ip MASTER_USER='test', #用那個帳號複製 MASTER_PASSWORD='centos', #帳戶口令 MASTER_PORT=3306, #端口 MASTER_LOG_FILE='mysql-bin.000003', #從那個二進制日誌開始複製 MASTER_LOG_POS=245; #從二進制日誌的開始內容複製 查看從節點信息
start slave;從服務器執行復制以後就不須要在執行 複製成功

級聯複製:
主服務器複製給從服務器,做爲中間節點,再經過中間節點從服務器複製給其餘從服務器

主服務器的配置文件不變
建立並受權複製帳號 grant replication slave on
*.* to test@'192.168.64.%' identified by 'centos'; 在中間節點上修改配置文件 加入log_slave_updates將主節點二進制日誌記錄到本身的日誌中 並開啓二進制日誌,須要將日誌複製給下一個節點
修改master to 信息 CHANGE MASTER TO MASTER_HOST
='192.168.64.128', MASTER_USER='test', MASTER_PASSWORD='centos', MASTER_PORT=3306, MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=245; start slave; 開啓複製 主服務器導入表
中間節點開始導入數據
在最後一個節點修改配置文件,關閉二進制日誌,從中間節點複製二進制日誌
啓動數據庫,修改master信息爲中間節點 CHANGE MASTER TO MASTER_HOST
='192.168.64.130', MASTER_USER='test', MASTER_PASSWORD='centos', MASTER_PORT=3306, MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=245;
同步成功
主主複製:互爲主從

容易產生的問題:兩臺數據庫都寫入數據,會形成數據不一致,所以慎用

考慮要點:自動增加id

配置一個節點使用奇數id

auto_increment_offset=1 開始點

auto_increment_increment=2 增加幅度

另外一個節點使用偶數id

auto_increment_offset=2

auto_increment_increment=2

修改主配置文件

修改另外一臺主配置文件
建立帳號 grant replication slave on
*.* to test@'192.168.64.%' identified by 'centos'; 在第二臺主機修改master 信息 CHANGE MASTER TO MASTER_HOST='192.168.64.128', MASTER_USER='test', MASTER_PASSWORD='centos', MASTER_PORT=3306, MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=245;
在第一臺主機配置 CHANGE MASTER TO MASTER_HOST
='192.168.64.130', MASTER_USER='test', MASTER_PASSWORD='centos', MASTER_PORT=3306, MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=245; 啓動複製 start slave;
半同步複製

默認狀況下,MySQL的複製功能是異步的,異步複製能夠提供最佳的性能,主

庫把binlog日誌發送給從庫即結束,並不驗證從庫是否接收完畢。這意味着當

主服務器或從服務器端發生故障時,有可能從服務器沒有接收到主服務器發送

過來的binlog日誌,這就會形成主服務器和從服務器的數據不一致,甚至在恢

復時形成數據的丟失

須要在主服務器安裝一個半同步插件模塊semisync_master.so';

首先,實現標準的主從複製

而後在主服務器安裝插件/usr/lib64/mysql/plugin/semisync_master.so

INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';

在配置文件加入配置
在從節點安裝插件semisync_slave.so INSTALL PLUGIN rpl_semi_sync_slave SONAME
'semisync_slave.so';
並寫入配置文件 查看插件狀態是否啓動 SHOW GLOBAL VARIABLES LIKE
'%semi%'; SHOW GLOBAL STATUS LIKE '%semi%'; 從新啓動線程 stop slave; start slave;實現半同步複製

五、描述MySQL Proxy原理並實現讀寫分離後端

 

MySQL Proxy處於客戶端應用程序和MySQL服務器之間,經過截斷、改變並轉發客戶端和後端數據庫之間的通訊來實現其功能,這和WinGate 之類的網絡代理服務器的基本思想是同樣的。代理服務器是和TCP/IP協議打交道,而要理解MySQL Proxy的工做機制,一樣要清楚MySQL客戶端和服務器之間的通訊協議,MySQL Protocol 包括認證和查詢兩個基本過程:

認證過程包括:

    客戶端向服務器發起鏈接請求

    服務器向客戶端發送握手信息

    客戶端向服務器發送認證請求

    服務器向客戶端發送認證結果

    若是認證經過,則進入查詢過程:

    客戶端向服務器發起查詢請求

    服務器向客戶端返回查詢結果

固然,這只是一個粗略的描述,每一個過程當中發送的包都是有固定格式的,想詳細瞭解MySQL Protocol的同窗,能夠去這裏 看看。MySQL Proxy要作的,就是介入協議的各個過程。
首先MySQL Proxy以服務器的身份接受客戶端請求,根據配置對這些請求進行分析處理,而後以客戶端的身份轉發給相應的後端數據庫服務器,再接受服務器的信息,返回給客戶端。
因此MySQL Proxy須要同時實現客戶端和服務器的協議。因爲要對客戶端發送過來的SQL語句進行分析,還須要包含一個SQL解析器。能夠說MySQL Proxy至關於一個輕量級的MySQL
了,實際上,MySQL Proxy的admin server是能夠接受SQL來查詢狀態信息的 在調度器安裝proxysql 調度器 配置一下yum源 cat
<<EOF | tee /etc/yum.repos.d/proxysql.repo [proxysql_repo] name= ProxySQL YUM repository baseurl=http://repo.proxysql.com/ProxySQL/proxysql-1.4.x/centos/\$releasever gpgcheck=1 gpgkey=http://repo.proxysql.com/ProxySQL/repo_pub_key EOF yum install proxysql 安裝調度器 調度器配置爲數據庫方式,因此要啓動數據庫 啓動服務 準備:實現讀寫分離前,先實現主從複製 注意:slave節點須要設置read_only=1 啓動ProxySQL:service proxysql start 啓動後會監聽兩個默認端口 6032:ProxySQL的管理端口 6033:ProxySQL對外提供服務的端口 使用mysql客戶端鏈接到ProxySQL的管理接口6032,默認管理員用戶和密碼都 是admin: mysql -uadmin -padmin -P6032 -h127.0.0.1 在數據庫中插入數據庫服務器的地址和編號,這裏編號統一爲10,後面會本身識別主從服務器 根據數據庫的配置文件read-only這項來區分
MySQL
> load mysql servers to runtim MySQL > save mysql servers to disk; 加載配置並存盤 在主數據庫建立帳號讓proxysql 監控並自動調整讀組和寫組 grant replication client on *.* to monitor@'192.168.64.%' identified by 'centos'; 在proxysql調度器加入監控帳號和密碼。而且加載生效
將都組和寫組寫入表中。test爲描述無關緊要 insert into mysql_replication_hostgroups values(
10,20,"test");
分組成功,若是不成功,可手寫如記錄改變編號
建立測試帳號在主服務器 grant all on
*.* to sqluser@'192.168.64.%' identified by 'centos'; 在proxysql服務器加入到mysq_user中 在ProxySQL配置,將用戶sqluser添加到mysql_users表中, default_hostgroup默認 組設置爲寫組10,當讀寫分離的路由規則不符合時,會訪問默認組的數據庫 insert into mysql_users(username,password,default_hostgroup)values('sqluser','centos',10); 保存並生效 load mysql users to runtim; save mysql users to disk; 在proxysql調度器上用sqluser帳戶鏈接,利用6033端口。 默認sqluser在10這個主機組。也就是mysql的主數據庫 默認全部操做都在主數據庫上操做。
配置路由規則。實現讀寫分離 與規則有關的表:mysql_query_rules和mysql_query_rules_fast_routing, 插入路由規則:將select語句分離到20的讀組,select語句中有一個特殊語句 SELECT...FOR UPDATE它會申請寫鎖,應路由到10的寫組 insert into mysql_query_rules (rule_id,active,match_digest,destination_hostgroup,apply)VALUES (
1,1,'^SELECT.*FOR UPDATE$',10,1),(2,1,'^SELECT',20,1); ##除了讀操做發往從節點,其餘操做都發往主節點 到此,讀寫分離配置完成 驗證。讀爲從服務器 mysql -usqluser -pcentos -P6033 -h127.0.0.1 -e 'select @@server_id'
利用事物查看,爲主服務器


六、使用MHA及galera實現MySQL的高可用性centos

MHA工做原理

1 從宕機崩潰的master保存二進制日誌事件(binlog events)

2 識別含有最新更新的slave

3 應用差別的中繼日誌(relay log)到其餘的slave

4 應用從master保存的二進制日誌事件(binlog events)

5 提高一個slave爲新的master

6 使其餘的slave鏈接新的master進行復制



mha實驗前

skip-name-resolv建議在全部主從節點加上這項,跳過名字解析,避免mha實驗出現解析問題

MHA軟件由兩部分組成,Manager(管理節點)工具包和Node(被管理節點)工具包 https:
//code.google.com/archive/p/mysql-master-ha/ 可在官網下載 搭建步驟: 在主數據庫節點建立一個管理帳號 grant all on *.* to mhauser@'192.168.64.%’identified by‘centos'; 在從節點數據庫中加入 vim /etc/my.cnf [mysqld] server_id=2 #不一樣節點此值各不相同 log-bin #啓用二進制,實現高可用 read_only #由於上面創建的帳號可自動關閉這個選項,也能夠不加入配置文件 relay_log_purge=0 #中繼日誌,若是主服務宕機數據沒拷貝過去從的話須要啓用中繼 skip_name_resolve=1 #跳過名字解析 而後在全部機器實現sshkey驗證,若是主節點出現問題,可用ssh協議將主服務器的配置文件拷出來 生成密鑰
ssh
-copy-id 192.168.64.133 到本身的機器上,在將生成的文件拷貝到其餘機器上實現key驗證
在管理節點上安裝兩個包: mha4mysql
-manager mha4mysql-node 在被管理節點安裝: mha4mysql-node 在管理節點創建配置文件寫入被管理節點的信息 vim /etc/mastermha/app1.cnf [server default] user=mhauser #主節點受權的帳號 password=centos #密碼 manager_workdir=/data/mastermha/app1/ #管理目錄 manager_log=/data/mastermha/app1/manager.log#日誌 remote_workdir=/data/mastermha/app1/ #在遠程節點建立的目錄 ssh_user=root #利用ssh帳號遠處管理節點 repl_user=repluser repl_password=centos ping_interval=1 [server1] #須要監控的節點信息 hostname=192.168.64.130 candidate_master=1 #表示這兩臺服務器有能力當主節點 [server2] hostname=192.168.64.131 candidate_master=1 [server3] hostname=192.168.64.132 Mha驗證和啓動
masterha_check_ssh
--conf=/etc/mastermha/app1.cnf #測試ssh協議是否聯通 調用咱們上面寫的配置文件 masterha_check_repl --conf=/etc/mastermha/app1.cnf masterha_manager --conf=/etc/mastermha/app1.cnf 配置完成
galera cluster實現高可用性

Galera Cluster:集成了Galera插件的MySQL集羣,是一種新型的,數據

不共享的,高度冗餘的高可用方案,目前Galera Cluster有兩個版本,分

別是Percona Xtradb Cluster及MariaDB Cluster,Galera自己是具備多

主特性的,即採用multi-master的集羣架構,是一個既穩健,又在數據一

致性、完整性及高性能方面有出色表現的高可用解決方案

Galera Cluster特色

多主架構:真正的多點讀寫的集羣,在任什麼時候候讀寫數據,都是最新的

同步複製:集羣不一樣節點之間數據同步,沒有延遲,在數據庫掛掉以後,數據

不會丟失

併發複製:從節點APPLY數據時,支持並行執行,更好的性能

故障切換:在出現數據庫故障時,因支持多點寫入,切換容易

熱插拔:在服務期間,若是數據庫掛了,只要監控程序發現的夠快,不可服務

時間就會很是少。在節點故障期間,節點自己對集羣的影響很是小

自動節點克隆:在新增節點,或者停機維護時,增量數據或者基礎數據不須要

人工手動備份提供,Galera Cluster會自動拉取在線節點數據,最終集羣會變爲

一致

對應用透明:集羣的維護,對應用程序是透明的

gelare須要安裝專門的數據庫 且不能裝mariadb數據庫

配置yum源,下載MariaDB-Galera-server

vim /etc/yum.repos.d/base.repo

[base]

baseurl=https://mirrors.tuna.tsinghua.edu.cn/mariadb/mariadb-5.5.64/yum/centos7-amd64/

gpgcheck=0

複製到其餘主機上。最少三臺


修改配置文件 vim
/etc/my.cnf.d/server.cnf [galera] wsrep_provider = /usr/lib64/galera/libgalera_smm.so #提供的庫文件路勁 wsrep_cluster_address="gcomm://192.168.64.128,192.168.64.130.,192.168.64.131"#集羣服務器的節點分別是誰 binlog_format=row #二進制日誌爲行顯示 default_storage_engine=InnoDB #默認存儲引擎 innodb_autoinc_lock_mode=2 #加鎖的模式 bind-address=0.0.0.0 首次啓動時,須要初始化集羣,在其中一個節點上執行命令 /etc/init.d/mysql start --wsrep-new-cluster 然後正常啓動其它節點 service mysql start 配置完成。
相關文章
相關標籤/搜索