1、編寫腳本,支持讓用戶自主選擇,使用mysqldump還是xtraback全量備份议街。
[root@centos7 ~]# cat backup_mysql.sh
#!/bin/bash
BACKUP_DIR=/data/backup
USER=root
PASSWD=root
[ -d $BACKUP_DIR ] || mkdir $BACKUP_DIR
while true;do
cat <<EOF
Please input a number to choice you back up tool:
1.mysqldump
2.xtrabackup
3.quit
EOF
read -p "Your choose: " choose
case "$choose" in
? 1)
? ? mysqldump -u$USER -p$PASSWD -A -F -E -R --single-transaction --master-data=1 --flush-privileges --triggers --default-character-set=utf8 --hex-blob > $BACKUP_DIR/fullbak_$(date +%F_%T).sql
? ? ;;
? 2)
? ? innobackupex --user=$USER --password=$PASSWD $BACKUP_DIR
? ? ;;
? 3)
? ? echo "Bye!" && exit 2
? ? ;;
? *)
? ? echo "Choose Error !" && exit 3
? ? ;;
esac
done
2、配置Mysql主從同步
主機(jī):兩臺璧榄,一臺當(dāng)主服務(wù)器master(192.168.17.27)特漩,一臺當(dāng)從服務(wù)器(192.168.17.37)
(1)安裝啟動(dòng)數(shù)據(jù)庫,并設(shè)置密碼
yum -y install mysql mysql-server mysql-devel
service mysqld restart? ? ? ? ? ? ? ? ?#啟動(dòng)數(shù)據(jù)庫
mysqladmin -u root password '123456'? ? ? ? ? #設(shè)置root用戶密碼
(2)修改主庫my.cnf主要設(shè)置個(gè)不一樣的ID骨杂,以及同步的數(shù)據(jù)庫的名字涂身,我一般用vim 來完成,vim /etc/my.cnf 在[mysqld]中加入內(nèi)容如下
server_id = 1 #主數(shù)據(jù)庫端ID號
log-bin = mysql-bin? #開啟二進(jìn)制日志? ? ? ? ? ? ? ? ? ?
binlog-do-db = db? ? ? #需要復(fù)制的數(shù)據(jù)庫名搓蚪,如果復(fù)制多個(gè)數(shù)據(jù)庫蛤售,重復(fù)設(shè)置這個(gè)選項(xiàng)即可? ? ? ? ? ? ? ?
log-slave-updates? ? ? #將從服務(wù)器從主服務(wù)器收到的更新記入到從服務(wù)器自己的二進(jìn)制日志文件中? ? ? ? ? ? ? ? ? ?
sync_binlog = 1? ? ? #控制binlog的寫入頻率。每執(zhí)行多少次事務(wù)寫入一次(這個(gè)參數(shù)性能消耗很大,但可減小MySQL崩潰造成的損失)? ? ? ? ? ? ?
auto_increment_offset = 1? ? ? ? #這個(gè)參數(shù)一般用在主主同步中悍抑,用來錯(cuò)開自增值, 防止鍵值沖突?
auto_increment_increment = 1? ? ? ? #這個(gè)參數(shù)一般用在主主同步中,用來錯(cuò)開自增值, 防止鍵值沖突? ?
expire_logs_days = 7? ? ? #二進(jìn)制日志自動(dòng)刪除的天數(shù)杜耙,默認(rèn)值為0,表示“沒有自動(dòng)刪除”搜骡,啟動(dòng)時(shí)和二進(jìn)制日志循環(huán)時(shí)可能刪除? ? ? ? ? ? ?
log_bin_trust_function_creators = 1? #將函數(shù)復(fù)制到slave? ?
(3)登錄主庫賦予從庫權(quán)限賬號,允許用戶在主庫上讀取日志(用戶名:admin佑女,密碼:123456)
mysql -uroot -p123456 #創(chuàng)建slave賬號admin记靡,密碼123456
grant replication slave on *.* to 'admin'@'192.168.100.20' identified by '123456';? ? #更新數(shù)據(jù)庫權(quán)限
mysql>flush privileges;?
(4)鎖主庫表,顯示主庫信息
flush tables with read lock;
顯示主庫信息
show master status;
mysql> show master status;
+---------------+----------+--------------+------------------+
| File? ? ? ? ? | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+---------------+----------+--------------+------------------+
| binlog.000002 |? ? ? 106 | haocheng? |? ? ? ? ? ? ? ? ? |
+---------------+----------+--------------+------------------+
1 row in set (0.00 sec)
(記錄file团驱、position,從庫設(shè)置將會(huì)用到)
(5)修改從庫my.cnf?
server_id = 2
log-bin = mysql-bin
log-slave-updates
sync_binlog = 0
innodb_flush_log_at_trx_commit = 0? ? ? #log buffer將每秒一次地寫入log file中摸吠,并且log file的flush(刷到磁盤)操作同時(shí)進(jìn)行。該模式下在事務(wù)提交的時(shí)候嚎花,不會(huì)主動(dòng)觸發(fā)寫入磁盤的操作?
replicate-do-db = db? #指定slave要復(fù)制哪個(gè)庫? ? ?
#MySQL主從復(fù)制的時(shí)候寸痢,當(dāng)Master和Slave之間的網(wǎng)絡(luò)中斷,但是Master和Slave無法察覺的情況下(比如防火墻或者路由問題)紊选。Slave會(huì)等待slave_net_timeout設(shè)置的秒數(shù)后啼止,才能認(rèn)為網(wǎng)絡(luò)出現(xiàn)故障,然后才會(huì)重連并且追趕這段時(shí)間主庫的數(shù)據(jù)
slave-net-timeout = 60? ? ? ? ? ? ? ? ? ?
log_bin_trust_function_creators = 1
#master-host=192.168.100.10
#master-user=admin
#master-password=123456
(6)在從庫上設(shè)置同步
#執(zhí)行同步命令兵罢,設(shè)置主服務(wù)器ip献烦,同步賬號密碼,同步位置
mysql -u root -p123456
mysql>slave stop;
mysql>change master to master_host='10.10.20.111',master_user='account',master_password='123456',master_log_file='mysql-bin.000033',master_log_pos=337523;
#開啟同步功能
mysql>start slave;
(7)查看從服務(wù)器狀態(tài)
3卖词、使用MHA實(shí)現(xiàn)Mysql高可用
192.168.17.238 mha-manager
192.168.17.239 mysql-master
192.168.17.240 mysql-slave1
192.16817.241 mysql-slave2
1)mysql主服務(wù)器配置巩那,編輯mysql配置文件/etc/my.cnf,在mysqld下添加如下選項(xiàng)
? ? vim /etc/my.cnf
? ? [mysqld]
? ? server_id = 1? ? ? ? ? ? ? ? #主從唯一標(biāo)識此蜈,主從架構(gòu)中的mysql實(shí)例該選項(xiàng)值必須唯一
? ? log-bin _ mysql-bin? ? ? #開啟二進(jìn)制日志文件
? ? skip_name_resolve=1
2)登錄mysql master實(shí)例創(chuàng)建主從同步賬號即横,在mysql主從集群所有節(jié)點(diǎn)執(zhí)行此操作
? ? ? create user 'repl'@'192.168.17.%' identified by 'repl';
? ? ? grant replication slave on *.* to 'repl'@'192.168.17.%';
? ? ? flush privileges;
? ? ? 重啟mariadb服務(wù)
? ? ? ? systemctl restart mysqld
? ? ? 登錄數(shù)據(jù)庫查看二進(jìn)制文件及位置
? ? ? ? MariaDB [(none)]> show master logs;
? ? ? ? ? +------------------+-----------+
? ? ? ? ? | Log_name? ? ? ? | File_size |
? ? ? ? ? +------------------+-----------+
? ? ? ? ? | mysql-bin.000001 |? ? ? 375 |
? ? ? ? ? | mysql-bin.000002 |? ? 1968 |
? ? ? ? ? +------------------+-----------+
3)mysql從節(jié)點(diǎn)配置 (多個(gè)從節(jié)點(diǎn)使用相同的方法進(jìn)行配置)
? ? vim /etc/my.cnf? 增加如下選項(xiàng)
? ? [mysqld]
? ? ? server_id = 2
? ? ? relay_log = relay-log? ? ? ? #啟用中繼日志
? ? ? read_only? ? ? ? ? ? ? ? ? ? ? ? #mysql的從節(jié)點(diǎn)開啟只讀
? ? ? relay_log_purge=0
? skip_name_resolve=1
? ? 重啟mysql服務(wù)
? ? ? systemctl restart mysqld
? 使用有復(fù)制權(quán)限的用戶賬號連接至主服務(wù)器,并啟動(dòng)復(fù)制線程
? ? ? CHANGE MASTER TO
? ? ? ? ? ? ? ? MASTER_HOST='192.168.17.239',
? ? ? ? ? ? ? ? MASTER_USER='repl',
? ? ? ? ? ? ? ? MASTER_PASSWORD='repl',
? ? ? ? ? ? ? ? MASTER_PORT=3306,
? ? ? ? ? ? ? ? MASTER_LOG_FILE='mysql-bin.000002',
? ? ? ? ? ? ? ? MASTER_LOG_POS=1968;
? ? 啟動(dòng)slave的sql和IO線程
? ? ? MariaDB [(none)]> start slave;
? 查詢slave的sql和IO線程是否正常
? ? MariaDB [(none)]> show slave status \G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.17.239
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000002
Read_Master_Log_Pos: 1968
Relay_Log_File: relay-log.000002
Relay_Log_Pos: 555
Relay_Master_Log_File: mysql-bin.000002
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
4)在主節(jié)點(diǎn)上導(dǎo)入數(shù)據(jù)驗(yàn)證主從數(shù)據(jù)是否同步
? ? mysql-master上導(dǎo)入hellodb庫
? ? MariaDB [hellodb]> source /root/hellodb_innodb.sql
? ? mysql-salve從節(jié)點(diǎn)檢查數(shù)據(jù)同步正常
? ? MariaDB [(none)]> show databases;
? ? ? +--------------------+
? ? ? | Database? ? ? ? ? |
? ? ? +--------------------+
? ? ? | hellodb? ? ? ? ? ? |
? ? ? | information_schema |
? ? ? | mysql? ? ? ? ? ? ? |
? ? ? | performance_schema |
? ? ? | test? ? ? ? ? ? ? |
? ? ? +--------------------+
5)在MHA-Manager管理幾點(diǎn)上安裝依賴包和mha4mysql-manager? mha4mysql-node包舶替,在mha集群的其他節(jié)點(diǎn)上安裝mha4mysql-node包令境。
? yum install -y perl-Mail-Sender perl-Email-Date-Format perl-MIME-Types perl-MIME-Lite perl-Parallel-ForkManager perl-Mail-Sendmail perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager perl-YAML-Tiny perl-PAR-Dist perl-Module-ScanDeps perl-Module-CoreList perl-Module-Build perl-CPAN perl-YAML perl-CPANPLUS perl-File-Remove perl-Module-Install
? ? yum -y install mha4mysql-manager-0.58-0.el7.centos.noarch.rpm mha4mysql-node-0.58-0.el7.centos.noarch.rpm
? ? 軟件包下載地址:
? ? ? ? ? ? https://github.com/yoshinorim/mha4mysql-manager
? ? ? ? ? ? https://github.com/yoshinorim/mha4mysql-node
6)在集群所有的節(jié)點(diǎn)上相互配置ssh基于key驗(yàn)證,這里配置集群所有的主機(jī)使用同一個(gè)公鑰和私鑰
? ssh-keygen
? ssh-copy-id 127.0.0.1
? scp -r /root/.ssh? root@remoteIp:/root/
7)在管理節(jié)點(diǎn)建立配置文件
? ? ? 創(chuàng)建存放配置文件的目錄 mkdir -p /etc/mastermha
? ? ? vim /etc/mastermha/app1.conf
? ? ? [server default]
? ? ? user=mhauser
? ? ? password=mhauser
? ? ? manager_workdir=/data/mastermha/app1/
? ? ? manager_log=/data/mastermha/app1/manager.log
? ? ? remote_workdir=/data/mastermha/app1/
? ? ? ssh_user=root
? ? ? repl_user=repl
? ? ? repl_password=repl
? ? ? ping_interval=1
? ? ? [server1]
? ? ? hostname=192.168.17.239
? ? ? candidate_master=1
? ? ? [server2]
? ? ? hostname=192.168.17.240
? ? ? candidate_master=1
? ? ? [server3]
? ? ? hostname=192.168.17.241
8)登錄mysql master創(chuàng)建mha管理賬號
? ? ? create user 'mhauser'@'192.168.17.%' identified by 'mhauser';
? ? ? grant all on *.* to 'mhauser'@'192.168.17.%';
9)使用的是二進(jìn)制方式安裝mysql顾瞪,需要設(shè)置mysql命令的軟鏈接舔庶,否則執(zhí)行檢查會(huì)提示命令找不到錯(cuò)誤。
? ? ln -s /usr/local/mysql/bin/mysqlbinlog /usr/local/bin/mysqlbinlog
ln -s /usr/local/mysql/bin/mysql /usr/local/bin/mysql
10)Mha驗(yàn)證和啟動(dòng)
? ? ? 驗(yàn)證節(jié)點(diǎn)之間ssh key相互登錄
? ? ? masterha_check_ssh --conf=/etc/mastermha/app1.cnf
? ? ? 顯示如下結(jié)果為成功
? ? ? Sun Feb 23 16:17:15 2020 - [info] All SSH connection tests passed successfully.
? ? ? mha主從復(fù)制測試
? ? ? masterha_check_repl --conf=/etc/mastermha/app1.cnf
? ? ? Sat Feb 29 15:13:16 2020 - [info] Checking replication health on 192.168.17.240..
? ? ? Sat Feb 29 15:13:16 2020 - [info]? ok.
? ? Sat Feb 29 15:13:16 2020 - [info] Checking replication health on 192.168.17.241..
? ? Sat Feb 29 15:13:16 2020 - [info]? ok.
? ? Sat Feb 29 15:13:16 2020 - [warning] master_ip_failover_script is not defined.
? ? Sat Feb 29 15:13:16 2020 - [warning] shutdown_script is not defined.
? ? Sat Feb 29 15:13:16 2020 - [info] Got exit code 0 (Not master dead).
? ? MySQL Replication Health is OK.
? ? ? 啟動(dòng)mha陈醒,使用后臺運(yùn)行
? ? ? nohup masterha_manager --conf=/etc/mastermha/app1.cnf &> /dev/null &
? ? ? ps -aux|grep mha
? ? ? root? ? 24329? 2.6? 0.4 207436 21948 pts/1? ? S? ? 15:17? 0:00 perl /usr/bin/masterha_manager --conf=/etc/mastermha/app1.cnf
模擬17.239主服務(wù)器故障惕橙,集群自動(dòng)提升其他節(jié)點(diǎn)為主節(jié)點(diǎn),停止17.239mysql服務(wù)钉跷,查看mha日志自動(dòng)將配置文件中定義的候選節(jié)點(diǎn)240替身為mysql master弥鹦。
Started automated(non-interactive) failover.
The latest slave 192.168.17.240(192.168.17.240:3306) has all relay logs for recovery.
Selected 192.168.17.240(192.168.17.240:3306) as a new master.
192.168.17.240(192.168.17.240:3306): OK: Applying all logs succeeded.
192.168.17.241(192.168.17.241:3306): This host has the latest relay log events.
Generating relay diff files from the latest slave succeeded.
192.168.17.241(192.168.17.241:3306): OK: Applying all logs succeeded. Slave started, replicating from 192.168.17.240(192.168.17.240:3306)
192.168.17.240(192.168.17.240:3306): Resetting slave info succeeded.
Master failover to 192.168.17.240(192.168.17.240:3306) completed successfully.