溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

MHA實現MySQL高可用集群架構

發布時間:2020-08-16 19:16:28 來源:ITPUB博客 閱讀:303 作者:18141908802 欄目:MySQL數據庫

轉轉連接

https://www.cnblogs.com/tanxiaojun/p/10424699.html

MHA簡介

MHA(Master HighAvailability)目前在MySQL高可用方面是一個相對成熟的解決方案,它由日本DeNA公司youshimaton(現就職于Facebook公司)開發,是一套優秀的作為MySQL高可用性環境下故障切換和主從提升的高可用軟件。在MySQL故障切換過程中,MHA能做到在0~30秒之內自動完成數據庫的故障切換操作,并且在進行故障切換的過程中,MHA能在最大程度上保證數據的一致性,以達到真正意義上的高可用。

MHA里有兩個角色一個是MHA Node(數據節點)另一個是MHA Manager(管理節點)。

MHA Manager可以單獨部署在一機器立的機器上管理多個master-slave集群,也可以部署在一臺slave節點上。MHA Node運行在每臺MySQL服務器上,MHA Manager會定時探測集群中的master節點,當master出現故障時,它可以自動將最新數據的slave提升為新的master,然后將所有其他的slave重新指向新的master。整個故障轉移過程對應用程序完全透明
在MHA自動故障切換過程中,MHA試圖從宕機的主服務器上保存二進制日志,最大程度的保證數據的不丟失,但這并不總是可行的。例如,如果主服務器硬件故障或無法通過ssh訪問,MHA沒法保存二進制日志,只進行故障轉移而丟失了最新的數據。使用MySQL 5.5的半同步復制,可以大大降低數據丟失的風險。MHA可以與半同步復制結合起來。如果只有一個slave已經收到了最新的二進制日志,MHA可以將最新的二進制日志應用于其他所有的slave服務器上,因此可以保證所有節點的數據一致性

異步復制(Asynchronous replication)

MySQL默認的復制即是異步的,主庫在執行完客戶端提交的事務后會立即將結果返給給客戶端,并不關心從庫是否已經接收并處理,這樣就會有一個問題,主如果crash掉了,此時主上已經提交的事務可能并沒有傳到從上,如果此時,強行將從提升為主,可能導致新主上的數據不完整。

全同步復制(Fully synchronousreplication)

指當主庫執行完一個事務,所有的從庫都執行了該事務才返回給客戶端。因為需要等待所有從庫執行完該事務才能返回,所以全同步復制的性能必然會收到嚴重的影響。

半同步復制(Semisynchronous replication)

介于異步復制和全同步復制之間,主庫在執行完客戶端提交的事務后不是立刻返回給客戶端,而是等待至少一個從庫接收到并寫到relay log中才返回給客戶端。相對于異步復制,半同步復制提高了數據的安全性,同時它也造成了一定程度的延遲,這個延遲最少是一個TCP/IP往返的時間。所以,半同步復制最好在低延時的網絡中使用。
下面來看看半同步復制的原理圖:
MHA實現MySQL高可用集群架構

總結:異步與半同步異同

默認情況下MySQL的復制是異步的,Master上所有的更新操作寫入Binlog之后并不確保所有的更新都被復制到Slave之上。異步操作雖然效率高,但是在Master/Slave出現問題的時候,存在很高數據不同步的風險,甚至可能丟失數據。
MySQL5.5引入半同步復制功能的目的是為了保證在master出問題的時候,至少有一臺Slave的數據是完整的。在超時的情況下也可以臨時轉入異步復制,保障業務的正常使用,直到一臺salve追趕上之后,繼續切換到半同步模式。

工作原理

相較于其它HA軟件,MHA的目的在于維持MySQL Replication中Master庫的高可用性,其最大特點是可以修復多個Slave之間的差異日志,最終使所有Slave保持數據一致,然后從中選擇一個充當新的Master,并將其它Slave指向它。

-從宕機崩潰的master保存二進制日志事件(binlogevents)。  -識別含有最新更新的slave。  -應用差異的中繼日志(relay log)到其它slave。  -應用從master保存的二進制日志事件(binlogevents)。  -提升一個slave為新master。  -使其它的slave連接新的master進行復制。

目前MHA主要支持一主多從的架構,要搭建MHA,要求一個復制集群中必須最少有三臺數據庫服務器,一主二從,即一臺充當master,一臺充當備用master,另外一臺充當從庫,因為至少需要三臺服務器。
相關軟件包

  1. MHA監控服務器安裝:mha4mysql-manager-0.55-1.el5.noarch,mha4mysql-node-0.54-1.el5.noarch
  2. 其他主從集群服務器安裝:mha4mysql-node-0.54-1.el5.noarch

MHA軟件包官網地址:  https://code.google.com/archive/p/mysql-master-ha/
使用到如下包:

mha4mysql-manager-0.55-1.el5.noarchmha4mysql-node-0.54-1.el5.noarch

二、構建集群架構基礎環境

實現環境:

角色 IP地址 主機名 Server Id 類型 OS
Manager 192.168.64.37 manager
管理節點 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對外提供寫服務,備選master(實際的slave,主機名master2)提供讀服務,slave也提供相關的讀服務,一旦master宕機,將會把備選master提升為新的master,slave指向新的master,manager作為管理服務器。

1、 在配置好所有主機IP地址后檢查selinux,firewalld設置,關閉所有主機selinux ,firewalld 服務以方便后期主從同步不出錯

vim /etc/sysconfig/selinux
SELINUX=disabled   本行替換為
systemctl stop firewalld   關閉防火墻

2.同步服務器時間

vim /etc/chrony.conf
server 192.168.64.7 iburst   master2 slave配置與master1時間同步

3、
在四臺主機上都配置epel源
官網下載地址:點擊打開鏈接 wget  https://mirrors.ustc.edu.cn/epel/7/x86_64/Packages/e/epel-release-7-11.noarch.rpm
4.在四臺主機上建立ssh無交互登錄環境

[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   其它主機可以分別測試下

三、 配置MySQL的主從復制

1、在主從節點安裝node節點包(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服務器已經存在,只是后期才搭建從MYSQL服務器,在置配數據同步前應先將主MYSQL服務器的要同步的數據庫拷貝到從MYSQL服務器上(如先在主MYSQL上備份數據庫,再用備份在從MYSQL服務器上恢復)
(1.)master1的主機配置:

innodb_file_per_table
log_bin
read_only
server_id=0
skip_name_resolve=1

(2.)master2的主機配置:

innodb_file_per_table
server_id=2
skip_name_resolve=1
read_only
relay_log_purge=0
log_bin

(3)slave的主機配置:

innodb_file_per_table
server_id=3
skip_name_resolve=1
read_only
relay_log_purge=0
log_bin

注意:重啟所有主機的mariadb服務?。?!

(3.)創建用于主從復制的賬號“mharep”,在(master1、master2)主機上創建即可,創建MHA管理賬號“manager”在所有mysql服務器上都要創建。
master1、master2主機上的配置:

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主機上的配置:

mysql> GRANT ALL ON *.* TO 'mhauser'@'192.168.64.%' IDENTIFIED BY 'centos';

開始創建主從復制:

查看master1的節點:

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主機上的配置:

創建主從復制,并開啟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主機從的狀態,以下兩個值必須為yes,代表從服務器能正常連接主服務器

Slave_IO_Running:Yes  Slave_SQL_Running:Yes

slave主機上的配置:

創建主從復制,并開啟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主機從的狀態,以下兩個值必須為yes,代表從服務器能正常連接主服務器

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命令是創建一個用于主從復制的帳號repluser,在master1和master2的主機上創建即可。

第二條grant命令是創建MHA管理賬號manager,所有mysql服務器上都需要創建。MHA會在配置文件里要求能遠程登錄到數據庫,所以要進行必要的賦權。

四、安裝配置mysql-MHA

mha包括manager節點和data節點,data節點包括原有的MySQL復制結構中的主機,至少3臺,即1主2從,當masterfailover后,還能保證主從結構;主從復制集群只需安裝node包。

manager server:運行監控腳本,負責monitoring和 auto-failover;mha manager節點需要安裝node包和manager包。
1、在manager主機上需要安裝( mha4mysql-manager-0.55-0.el6.noarch.rpm和 mha4mysql-node-0.54-0.el6.noarch.rpm)兩個操作管理節點, 在3臺數據庫主機上只需要安裝MHA的node節點即可。

[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*

其他三臺數據庫節點需要安裝MHA的node節點(過程略)?。?!

  1. 配置MHA

與絕大多數Linux應用程序類似,MHA的正確使用依賴于合理的配置文件。MHA的配置文件與mysql的my.cnf文件配置相似,采取的是param=value的方式來配置,配置文件位于管理節點,通常包括每一個mysql server的主機名,mysql用戶名,密碼,工作目錄等等。

(1.)編輯/etc/masterha/app1.conf,內容如下:

[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

配置項的解釋:

manager_workdir=/masterha/app1 //設置manager的工作目錄  
manager_log=/masterha/app1/manager.log //設置manager的日志  
user=manager//設置監控用戶manager  
password=123456  //監控用戶manager的密碼  
ssh_user=root  //ssh連接用戶  
repl_user=mharep  //主從復制用戶  
repl_password=123.abc //主從復制用戶密碼  
ping_interval=1   //設置監控主庫,發送ping包的時間間隔,默認是3秒,嘗試三次沒有回應的時候自動進行railover  
master_binlog_dir=/usr/local/mysql/data   //設置master 保存binlog的位置,以便MHA可以找到master的日志,我這里的也就是mysql的數據目錄  
candidate_master=1//設置為候選master,如果設置該參數以后,發生主從切換以后將會將此從庫提升為主庫。

SSH 有效性驗證:

[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.

集群復制的有效性驗證:

注意:mysql數據庫必須都啟動

[root@manager ~]# masterha_check_repl --conf=/etc/mastermha/app1.cnf

注意:驗證成功的話會自動識別出所有服務器和主從狀況?。?!

在驗證時,若遇到這個錯誤:Can't exec "mysqlbinlog" ......

解決方法是在所有服務器上執行:

[css] view plain copy
ln -s /usr/local/mysql/bin/* /usr/local/bin/

啟動 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..

注意:在應用Unix/Linux時,我們一般想讓某個程序在后臺運行,于是我們將常會用&在程序結尾來讓程序自動運行。比如我們要運行mysql在后臺: /usr/local/mysql/bin/mysqld_safe –user=mysql&??墒怯泻芏喑绦虿⒉幌雖ysqld一樣,這樣我們就需要nohup命令,

五、模擬故障,檢測狀態轉移

1、停掉master1 的mariadb服務

[root@master ~]#  systemctl stop mariadb

(2.)查看 MHA 日志
上面的配置文件中指定了日志位置為/data /masterha/app1/manager.log

[root@manager ~]# cat/masterha/app1/manager.log

從日志信息中可以看到master failover 已經成功了,并可以看出故障轉移的大體流程

(3)檢查 slave 的復制
登錄 slave(192.168.64.27)的Mysql,查看 slave 狀態

mysql> show slave status\G;

可以看到master 的 IP 現在為 192.168.64.17,已經切換到和192.168.64.27同步了,本來是和192.168.64.7同步的,說明 MHA 已經把Candicatemaster(master2)提升為了新的master,IO線程和SQL線程也正確運行,MHA 搭建成功!!!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女