轉轉連接
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往返的時間。所以,半同步復制最好在低延時的網絡中使用。
下面來看看半同步復制的原理圖:
總結:異步與半同步異同
默認情況下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,另外一臺充當從庫,因為至少需要三臺服務器。
相關軟件包
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 其它主機可以分別測試下
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會在配置文件里要求能遠程登錄到數據庫,所以要進行必要的賦權。
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節點(過程略)?。?!
與絕大多數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 搭建成功!!!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。