您好,登錄后才能下訂單哦!
轉(zhuǎn)轉(zhuǎn)連接
MHA(Master HighAvailability)目前在MySQL高可用方面是一個(gè)相對成熟的解決方案,它由日本DeNA公司youshimaton(現(xiàn)就職于Facebook公司)開發(fā),是一套優(yōu)秀的作為MySQL高可用性環(huán)境下故障切換和主從提升的高可用軟件。在MySQL故障切換過程中,MHA能做到在0~30秒之內(nèi)自動(dòng)完成數(shù)據(jù)庫的故障切換操作,并且在進(jìn)行故障切換的過程中,MHA能在最大程度上保證數(shù)據(jù)的一致性,以達(dá)到真正意義上的高可用。
MHA里有兩個(gè)角色一個(gè)是MHA Node(數(shù)據(jù)節(jié)點(diǎn))另一個(gè)是MHA Manager(管理節(jié)點(diǎn))。
MHA Manager可以單獨(dú)部署在一機(jī)器立的機(jī)器上管理多個(gè)master-slave集群,也可以部署在一臺(tái)slave節(jié)點(diǎn)上。MHA Node運(yùn)行在每臺(tái)MySQL服務(wù)器上,MHA Manager會(huì)定時(shí)探測集群中的master節(jié)點(diǎn),當(dāng)master出現(xiàn)故障時(shí),它可以自動(dòng)將最新數(shù)據(jù)的slave提升為新的master,然后將所有其他的slave重新指向新的master。整個(gè)故障轉(zhuǎn)移過程對應(yīng)用程序完全透明
在MHA自動(dòng)故障切換過程中,MHA試圖從宕機(jī)的主服務(wù)器上保存二進(jìn)制日志,最大程度的保證數(shù)據(jù)的不丟失,但這并不總是可行的。例如,如果主服務(wù)器硬件故障或無法通過ssh訪問,MHA沒法保存二進(jìn)制日志,只進(jìn)行故障轉(zhuǎn)移而丟失了最新的數(shù)據(jù)。使用MySQL 5.5的半同步復(fù)制,可以大大降低數(shù)據(jù)丟失的風(fēng)險(xiǎn)。MHA可以與半同步復(fù)制結(jié)合起來。如果只有一個(gè)slave已經(jīng)收到了最新的二進(jìn)制日志,MHA可以將最新的二進(jìn)制日志應(yīng)用于其他所有的slave服務(wù)器上,因此可以保證所有節(jié)點(diǎn)的數(shù)據(jù)一致性
異步復(fù)制(Asynchronous replication)
MySQL默認(rèn)的復(fù)制即是異步的,主庫在執(zhí)行完客戶端提交的事務(wù)后會(huì)立即將結(jié)果返給給客戶端,并不關(guān)心從庫是否已經(jīng)接收并處理,這樣就會(huì)有一個(gè)問題,主如果crash掉了,此時(shí)主上已經(jīng)提交的事務(wù)可能并沒有傳到從上,如果此時(shí),強(qiáng)行將從提升為主,可能導(dǎo)致新主上的數(shù)據(jù)不完整。
全同步復(fù)制(Fully synchronousreplication)
指當(dāng)主庫執(zhí)行完一個(gè)事務(wù),所有的從庫都執(zhí)行了該事務(wù)才返回給客戶端。因?yàn)樾枰却袕膸靾?zhí)行完該事務(wù)才能返回,所以全同步復(fù)制的性能必然會(huì)收到嚴(yán)重的影響。
半同步復(fù)制(Semisynchronous replication)
介于異步復(fù)制和全同步復(fù)制之間,主庫在執(zhí)行完客戶端提交的事務(wù)后不是立刻返回給客戶端,而是等待至少一個(gè)從庫接收到并寫到relay log中才返回給客戶端。相對于異步復(fù)制,半同步復(fù)制提高了數(shù)據(jù)的安全性,同時(shí)它也造成了一定程度的延遲,這個(gè)延遲最少是一個(gè)TCP/IP往返的時(shí)間。所以,半同步復(fù)制最好在低延時(shí)的網(wǎng)絡(luò)中使用。
下面來看看半同步復(fù)制的原理圖:
總結(jié):異步與半同步異同
默認(rèn)情況下MySQL的復(fù)制是異步的,Master上所有的更新操作寫入Binlog之后并不確保所有的更新都被復(fù)制到Slave之上。異步操作雖然效率高,但是在Master/Slave出現(xiàn)問題的時(shí)候,存在很高數(shù)據(jù)不同步的風(fēng)險(xiǎn),甚至可能丟失數(shù)據(jù)。
MySQL5.5引入半同步復(fù)制功能的目的是為了保證在master出問題的時(shí)候,至少有一臺(tái)Slave的數(shù)據(jù)是完整的。在超時(shí)的情況下也可以臨時(shí)轉(zhuǎn)入異步復(fù)制,保障業(yè)務(wù)的正常使用,直到一臺(tái)salve追趕上之后,繼續(xù)切換到半同步模式。
工作原理
相較于其它HA軟件,MHA的目的在于維持MySQL Replication中Master庫的高可用性,其最大特點(diǎn)是可以修復(fù)多個(gè)Slave之間的差異日志,最終使所有Slave保持?jǐn)?shù)據(jù)一致,然后從中選擇一個(gè)充當(dāng)新的Master,并將其它Slave指向它。
-從宕機(jī)崩潰的master保存二進(jìn)制日志事件(binlogevents)。 -識(shí)別含有最新更新的slave。 -應(yīng)用差異的中繼日志(relay log)到其它slave。 -應(yīng)用從master保存的二進(jìn)制日志事件(binlogevents)。 -提升一個(gè)slave為新master。 -使其它的slave連接新的master進(jìn)行復(fù)制。
目前MHA主要支持一主多從的架構(gòu),要搭建MHA,要求一個(gè)復(fù)制集群中必須最少有三臺(tái)數(shù)據(jù)庫服務(wù)器,一主二從,即一臺(tái)充當(dāng)master,一臺(tái)充當(dāng)備用master,另外一臺(tái)充當(dāng)從庫,因?yàn)橹辽傩枰_(tái)服務(wù)器。
相關(guān)軟件包
MHA軟件包官網(wǎng)地址:
https://code.google.com/archive/p/mysql-master-ha/
使用到如下包:
mha4mysql-manager-0.55-1.el5.noarchmha4mysql-node-0.54-1.el5.noarch
實(shí)現(xiàn)環(huán)境:
角色 | IP地址 | 主機(jī)名 | Server Id | 類型 | OS |
---|---|---|---|---|---|
Manager | 192.168.64.37 | manager |
|
管理節(jié)點(diǎn) | Centos7.2x86_64 |
master | 192.168.64.7 | master1 | 1 | 主mysql | Centos7.2x86_64 |
Candidate master | 192.168.64.17 | master2 | 2 | 從mysql | Centos7.2x86_64 |
slave | 192.168.64.27 | slave | 3 | 從mysql | Centos7.2x86_64 |
其中master對外提供寫服務(wù),備選master(實(shí)際的slave,主機(jī)名master2)提供讀服務(wù),slave也提供相關(guān)的讀服務(wù),一旦master宕機(jī),將會(huì)把備選master提升為新的master,slave指向新的master,manager作為管理服務(wù)器。
1、 在配置好所有主機(jī)IP地址后檢查selinux,firewalld設(shè)置,關(guān)閉所有主機(jī)selinux ,firewalld 服務(wù)以方便后期主從同步不出錯(cuò)
vim /etc/sysconfig/selinux SELINUX=disabled 本行替換為 systemctl stop firewalld 關(guān)閉防火墻
2.同步服務(wù)器時(shí)間
vim /etc/chrony.conf server 192.168.64.7 iburst master2 slave配置與master1時(shí)間同步
3、
在四臺(tái)主機(jī)上都配置epel源
官網(wǎng)下載地址:點(diǎn)擊打開鏈接 wget
https://mirrors.ustc.edu.cn/epel/7/x86_64/Packages/e/epel-release-7-11.noarch.rpm
4.在四臺(tái)主機(jī)上建立ssh無交互登錄環(huán)境
[root@manager ~]# ssh-keygen -t rsa[root@manager ~]# ssh-copy-id -i id_rsa.pub 192.168.64.37[root@manager ~]# scp authorized_keys id_rsa 192.168.64.17:/root/.ssh/[root@manager ~]# scp authorized_keys id_rsa 192.168.64.27:/root/.ssh/[root@manager ~]# scp authorized_keys id_rsa 192.168.64.7:/root/.ssh/測試ssh登錄面密鑰 [root@master ~]# ssh root@192.168.64.37 其它主機(jī)可以分別測試下
1、在主從節(jié)點(diǎn)安裝node節(jié)點(diǎn)包(master1 master2,slave)
[root@master ~]# lsanaconda-ks.cfg Downloads original-ks.cfg reset.sh VideosDesktop mha4mysql-node-0.54-0.el6.noarch.rpm Pictures reset.sqlDocuments Music Public Template[root@master ~]# l yum install mha*
2、修改my.cnf文件,配置主從同步
注意:若主MYSQL服務(wù)器已經(jīng)存在,只是后期才搭建從MYSQL服務(wù)器,在置配數(shù)據(jù)同步前應(yīng)先將主MYSQL服務(wù)器的要同步的數(shù)據(jù)庫拷貝到從MYSQL服務(wù)器上(如先在主MYSQL上備份數(shù)據(jù)庫,再用備份在從MYSQL服務(wù)器上恢復(fù))
(1.)master1的主機(jī)配置:
innodb_file_per_table log_bin read_only server_id=0 skip_name_resolve=1
(2.)master2的主機(jī)配置:
innodb_file_per_table server_id=2 skip_name_resolve=1 read_only relay_log_purge=0 log_bin
(3)slave的主機(jī)配置:
innodb_file_per_table server_id=3 skip_name_resolve=1 read_only relay_log_purge=0 log_bin
注意:重啟所有主機(jī)的mariadb服務(wù)?。。?/p>
(3.)創(chuàng)建用于主從復(fù)制的賬號(hào)“mharep”,在(master1、master2)主機(jī)上創(chuàng)建即可,創(chuàng)建MHA管理賬號(hào)“manager”在所有mysql服務(wù)器上都要?jiǎng)?chuàng)建。
master1、master2主機(jī)上的配置:
mysql>GRANT REPLICATION SLAVE ON *.* TO 'repluser'@'192.168.64.%' IDENTIFIED BY 'centos';mysql> GRANT ALL ON *.* TO 'mhauser'@'192.168.64.%' IDENTIFIED BY 'centos';
slave主機(jī)上的配置:
mysql> GRANT ALL ON *.* TO 'mhauser'@'192.168.64.%' IDENTIFIED BY 'centos';
開始創(chuàng)建主從復(fù)制:
查看master1的節(jié)點(diǎn):
MariaDB [(none)]> show master logs; +--------------------+-----------+| Log_name | File_size | +--------------------+-----------+ | mariadb-bin.000001 | 502 || mariadb-bin.000002 | 487 | | mariadb-bin.000003 | 504 || mariadb-bin.000004 | 245 | +--------------------+-----------+ 4 rows in set (0.04 sec)
master2主機(jī)上的配置:
創(chuàng)建主從復(fù)制,并開啟slave功能
mysql>CHANGE MASTER TO MASTER_HOST='192.168.64.7',MASTER_USER='repluser' ,MASTER_PASSWORD='centos',MASTER_LOG_FILE='mariadb-bin.000004',MASTER_LOG_POS=245;mysql> start slave;
查看master2主機(jī)從的狀態(tài),以下兩個(gè)值必須為yes,代表從服務(wù)器能正常連接主服務(wù)器
Slave_IO_Running:Yes Slave_SQL_Running:Yes
slave主機(jī)上的配置:
創(chuàng)建主從復(fù)制,并開啟salve功能
mysql>CHANGE MASTER TO MASTER_HOST='192.168.64.7',MASTER_USER='repluser' ,MASTER_PASSWORD='centos',MASTER_LOG_FILE='mariadb-bin.000004',MASTER_LOG_POS=245;mysql> start slave;
查看slave主機(jī)從的狀態(tài),以下兩個(gè)值必須為yes,代表從服務(wù)器能正常連接主服務(wù)器
Slave_IO_Running:Yes Slave_SQL_Running:Yes
MariaDB [(none)]> show slave status\G;*************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.64.7 Master_User: repluser Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mariadb-bin.000004 Read_Master_Log_Pos: 245 Relay_Log_File: mariadb-relay-bin.000002 Relay_Log_Pos: 531 Relay_Master_Log_File: mariadb-bin.000004 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 245 Relay_Log_Space: 827 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 0Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 11 row in set (0.00 sec) ERROR: No query specified
注意:
第一條grant命令是創(chuàng)建一個(gè)用于主從復(fù)制的帳號(hào)repluser,在master1和master2的主機(jī)上創(chuàng)建即可。
第二條grant命令是創(chuàng)建MHA管理賬號(hào)manager,所有mysql服務(wù)器上都需要?jiǎng)?chuàng)建。MHA會(huì)在配置文件里要求能遠(yuǎn)程登錄到數(shù)據(jù)庫,所以要進(jìn)行必要的賦權(quán)。
mha包括manager節(jié)點(diǎn)和data節(jié)點(diǎn),data節(jié)點(diǎn)包括原有的MySQL復(fù)制結(jié)構(gòu)中的主機(jī),至少3臺(tái),即1主2從,當(dāng)masterfailover后,還能保證主從結(jié)構(gòu);主從復(fù)制集群只需安裝node包。
manager server:運(yùn)行監(jiān)控腳本,負(fù)責(zé)monitoring和 auto-failover;mha manager節(jié)點(diǎn)需要安裝node包和manager包。
1、在manager主機(jī)上需要安裝( mha4mysql-manager-0.55-0.el6.noarch.rpm和 mha4mysql-node-0.54-0.el6.noarch.rpm)兩個(gè)操作管理節(jié)點(diǎn), 在3臺(tái)數(shù)據(jù)庫主機(jī)上只需要安裝MHA的node節(jié)點(diǎn)即可。
[root@manager ~]# ls192.168.64.17 cobbler.ks mha4mysql-manager-0.55-0.el6.noarch.rpm192.168.64.27 ks-post.log mha4mysql-node-0.54-0.el6.noarch.rpm192.168.64.7 ks-post-nochroot.log original-ks.cfganaconda-ks.cfg ks-pre.log[root@manager ~]# yum install mha*
其他三臺(tái)數(shù)據(jù)庫節(jié)點(diǎn)需要安裝MHA的node節(jié)點(diǎn)(過程略)?。。?/p>
與絕大多數(shù)Linux應(yīng)用程序類似,MHA的正確使用依賴于合理的配置文件。MHA的配置文件與mysql的my.cnf文件配置相似,采取的是param=value的方式來配置,配置文件位于管理節(jié)點(diǎn),通常包括每一個(gè)mysql server的主機(jī)名,mysql用戶名,密碼,工作目錄等等。
(1.)編輯/etc/masterha/app1.conf,內(nèi)容如下:
[root@manager ~]# vim /etc/mastermha/app1.cnf [server default]user=mhauserpassword=centosmanager_workdir=/data/mastermha/app1/manager_log=/data/mastermha/app1/manager.logremote_workdir=/data/mastermha/app1/ssh_user=rootrepl_user=repluserrepl_password=centosping_interval=1[server1]hostname=192.168.64.7candidate_master=1[server2]hostname=192.168.64.17candidate_master=1[server3]hostname=192.168.64.27candidate_master=1
配置項(xiàng)的解釋:
manager_workdir=/masterha/app1 //設(shè)置manager的工作目錄 manager_log=/masterha/app1/manager.log //設(shè)置manager的日志 user=manager//設(shè)置監(jiān)控用戶manager password=123456 //監(jiān)控用戶manager的密碼 ssh_user=root //ssh連接用戶 repl_user=mharep //主從復(fù)制用戶 repl_password=123.abc //主從復(fù)制用戶密碼 ping_interval=1 //設(shè)置監(jiān)控主庫,發(fā)送ping包的時(shí)間間隔,默認(rèn)是3秒,嘗試三次沒有回應(yīng)的時(shí)候自動(dòng)進(jìn)行railover master_binlog_dir=/usr/local/mysql/data //設(shè)置master 保存binlog的位置,以便MHA可以找到master的日志,我這里的也就是mysql的數(shù)據(jù)目錄 candidate_master=1//設(shè)置為候選master,如果設(shè)置該參數(shù)以后,發(fā)生主從切換以后將會(huì)將此從庫提升為主庫。
SSH 有效性驗(yàn)證:
[root@manager ~]# masterha_check_ssh --conf=/etc/mastermha/app1.cnf Sun Apr 22 06:36:33 2018 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping. /etc/masterha/app1.cnf:No such file or directory at /usr/share/perl5/vendor_perl/MHA/SSHCheck.pm line 148.[root@manager ~]# masterha_check_ssh masterha_check_ssh [root@manager ~]# masterha_check_ssh --conf=/etc/mastermha/app1.cnf Sun Apr 22 06:37:13 2018 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping. Sun Apr 22 06:37:13 2018 - [info] Reading application default configurations from /etc/mastermha/app1.cnf.. Sun Apr 22 06:37:13 2018 - [info] Reading server configurations from /etc/mastermha/app1.cnf.. Sun Apr 22 06:37:13 2018 - [info] Starting SSH connection tests.. Sun Apr 22 06:37:18 2018 - [debug] Sun Apr 22 06:37:14 2018 - [debug] Connecting via SSH from root@192.168.64.27(192.168.64.27:22) to root@192.168.64.7(192.168.64.7:22).. Sun Apr 22 06:37:16 2018 - [debug] ok. Sun Apr 22 06:37:16 2018 - [debug] Connecting via SSH from root@192.168.64.27(192.168.64.27:22) to root@192.168.64.17(192.168.64.17:22).. Sun Apr 22 06:37:17 2018 - [debug] ok. Sun Apr 22 06:37:18 2018 - [debug] Sun Apr 22 06:37:14 2018 - [debug] Connecting via SSH from root@192.168.64.17(192.168.64.17:22) to root@192.168.64.7(192.168.64.7:22).. Sun Apr 22 06:37:16 2018 - [debug] ok. Sun Apr 22 06:37:16 2018 - [debug] Connecting via SSH from root@192.168.64.17(192.168.64.17:22) to root@192.168.64.27(192.168.64.27:22).. Sun Apr 22 06:37:17 2018 - [debug] ok. Sun Apr 22 06:37:18 2018 - [debug] Sun Apr 22 06:37:13 2018 - [debug] Connecting via SSH from root@192.168.64.7(192.168.64.7:22) to root@192.168.64.17(192.168.64.17:22).. Sun Apr 22 06:37:17 2018 - [debug] ok. Sun Apr 22 06:37:17 2018 - [debug] Connecting via SSH from root@192.168.64.7(192.168.64.7:22) to root@192.168.64.27(192.168.64.27:22).. @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! Someone could be eavesdropping on you right now (man-in-the-middle attack)! It is also possible that a host key has just been changed. The fingerprint for the ECDSA key sent by the remote host isSHA256:080GPU/VjQmyb/Ije4lASHgZDXJv5E/QOqAcAv0wfV0. Please contact your system administrator. Add correct host key in /root/.ssh/known_hosts to get rid of this message. Offending ECDSA key in /root/.ssh/known_hosts:1Keyboard-interactive authentication is disabled to avoid man-in-the-middle attacks. Sun Apr 22 06:37:18 2018 - [debug] ok. Sun Apr 22 06:37:18 2018 - [info] All SSH connection tests passed successfully.
集群復(fù)制的有效性驗(yàn)證:
注意:mysql數(shù)據(jù)庫必須都啟動(dòng)
[root@manager ~]# masterha_check_repl --conf=/etc/mastermha/app1.cnf
注意:驗(yàn)證成功的話會(huì)自動(dòng)識(shí)別出所有服務(wù)器和主從狀況?。?!
在驗(yàn)證時(shí),若遇到這個(gè)錯(cuò)誤:Can't exec "mysqlbinlog" ......
解決方法是在所有服務(wù)器上執(zhí)行:
[css] view plain copy ln -s /usr/local/mysql/bin/* /usr/local/bin/
啟動(dòng) manager:
[root@manager ~]# masterha_manager --conf=/etc/mastermha/app1.cnf Sun Apr 22 06:39:35 2018 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping. Sun Apr 22 06:39:35 2018 - [info] Reading application default configurations from /etc/mastermha/app1.cnf.. Sun Apr 22 06:39:35 2018 - [info] Reading server configurations from /etc/mastermha/app1.cnf..
注意:在應(yīng)用Unix/Linux時(shí),我們一般想讓某個(gè)程序在后臺(tái)運(yùn)行,于是我們將常會(huì)用&在程序結(jié)尾來讓程序自動(dòng)運(yùn)行。比如我們要運(yùn)行mysql在后臺(tái): /usr/local/mysql/bin/mysqld_safe –user=mysql&??墒怯泻芏喑绦虿⒉幌雖ysqld一樣,這樣我們就需要nohup命令,
1、停掉master1 的mariadb服務(wù)
[root@master ~]# systemctl stop mariadb
(2.)查看 MHA 日志
上面的配置文件中指定了日志位置為/data /masterha/app1/manager.log
[root@manager ~]# cat/masterha/app1/manager.log
從日志信息中可以看到master failover 已經(jīng)成功了,并可以看出故障轉(zhuǎn)移的大體流程
(3)檢查 slave 的復(fù)制
登錄 slave(192.168.64.27)的Mysql,查看 slave 狀態(tài)
mysql> show slave status\G;
可以看到master 的 IP 現(xiàn)在為 192.168.64.17,已經(jīng)切換到和192.168.64.27同步了,本來是和192.168.64.7同步的,說明 MHA 已經(jīng)把Candicatemaster(master2)提升為了新的master,IO線程和SQL線程也正確運(yùn)行,MHA 搭建成功!!!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。