mysql主从集群高可用架构-----MHA
来源:互联网 发布:sqlserver generator 编辑:程序博客网 时间:2024/04/29 22:11
原理:
MHA(Master High Availability)是现在解决mysql高可用的一个相对成熟的方案
它是由两部分组成,管理端(master manager)和节点端(node manager),管理端可以单独布置在一台机器上,整个mysql主从集群就是它的各个节点,
管理端对所有节点进行监控,当master宕机之后,管理端会根据自己配置文件里的设定,将某一个从节点升为主节点,(如果没有设置,它会自己比对,将最新数据的节点升为主节点),然后将其他节点自动指向提升上来的新的主节点,在提升的过程中,所有结点之间必须可以无密码ssh连接,管理端可以对所有的节点ssh无密码连接.
在MHA自动故障切换的过程中,如果宕掉的 master 无法ssh连接上,则无法同步最新的二进制日志,也就无法获得最新的数据,造成数据丢失,因此,为了避免这中情况发生,MHA一般配合半同步复制.可以最大程度的保存数据.
为了避免在更换主节点时同步日志出错(pos模式下更换节点,日志同步会出错),我们开启GTID模式
目前MHA支持一主多从,整个MHA架构最少有三个节点,一台master 一台slave做备用master 一台slave只做同步,当然,为了充分利用资源,集群可以做读写分离(master做写操作,slave做读操作)
本次实验我们准备了四台机器,一台做master manager 剩下三台node做一主2从配置,
实验准备
操作系统:
redhat 6.5
节点:
server1: 172.25.12.1 master master-node
server2: 172.25.12.2 slave master-node
server3: 172.25.12.3 slave master-node
server4: 172.25.12.4 master-manager
数据库版本:
mysql 5.7
防火墙及selinux:
关闭
配置master-manager
在server4 上(172.25.12.4)
安装包:
yum install -ymha4mysql-manager-0.56-0.el6.noarch.rpmmha4mysql-node-0.56-0.el6.noarch.rpmperl-Config-Tiny-2.12-7.1.el6.noarch.rpmperl-Email-Date-Format-1.002-5.el6.noarch.rpmperl-Log-Dispatch-2.27-1.el6.noarch.rpmperl-Mail-Sender-0.8.16-3.el6.noarch.rpmperl-Mail-Sendmail-0.79-12.el6.noarch.rpmperl-MIME-Lite-3.027-2.el6.noarch.rpmperl-MIME-Types-1.28-2.el6.noarch.rpmperl-Parallel-ForkManager-0.7.9-1.el6.noarch.rpm
创建配置文件及其目录:
mkdir /etc/mhavim /etc/mha/mha.conf
配置文件如下:
[server default]manager_workdir=/usr/local/mha #设置manager的工作目录manager_log=/usr/local/mha/mha.log #设置manager的日志master_binlog_dir=/var/lib/mysql #设置master 保存binlog的位置,以便MHA可以找到master的日志,我这里的也就是mysql的数据目录user=root #设置监控用户root,这个用户在mysql里存在password=Yang@123 #设置mysql中监控用户的那个密码ping_interval=1 #设置监控主库,发送ping包的时间间隔,默认是3秒,尝试三次没有回应的时候自动进行railoverremote_workdir=/tmp #设置远端mysql在发生切换时binlog的保存位置repl_user=mha #设置同步用户mharepl_password=Yang@123 #设置mha的密码ssh_user=root #设置ssh的登录用户名[server1] hostname=172.25.12.1port=3306[server2]hostname=172.25.12.2port=3306candidate_master=1 #设置为候选master,如果设置该参数以后,发生主从切换以后将会将此从库提升为主库,即使这个主库不是集群中事件最新的slavecheck_repl_delay=0 #默认情况下如果一个slave落后master 100M的relay logs的话,MHA将不会选择该slave作为一个新的master,因为对于这个slave的恢复需要花费很长时间,通过设置check_repl_delay=0,MHA触发切换在选择一个新的master的时候将会忽略复制延时,这个参数对于设置了candidate_master=1的主机非常有用,因为这个候选主在切换的过程中一定是新的master[server3]hostname=172.25.12.3port=3306#no_master=1 #一定不会是master
检测配置:
masterha_check_repl --conf=/etc/mha/mha.conf
配置ssh:
ssh-keygen ssh-copy-id 172.25.12.1ssh-copy-id 172.25.12.2ssh-copy-id 172.25.12.3scp -rp ~/.ssh/ root@172.25.12.1:/rootscp -rp ~/.ssh/ root@172.25.12.2:/rootscp -rp ~/.ssh/ root@172.25.12.3:/root
检测ssh状态:
masterha_check_ssh --conf=/etc/mha/mha.conf[root@server4 MHA]# masterha_check_ssh --conf=/etc/mha/mha.conf..Mon Jun 26 20:19:12 2017 - [debug] Connecting via SSH from root@172.25.12.1(172.25.12.1:22) to root@172.25.12.2(172.25.12.2:22)..Mon Jun 26 20:19:12 2017 - [debug] ok.Mon Jun 26 20:19:12 2017 - [debug] Connecting via SSH from root@172.25.12.1(172.25.12.1:22) to root@172.25.12.3(172.25.12.3:22)..Mon Jun 26 20:19:13 2017 - [debug] ok.Mon Jun 26 20:19:13 2017 - [debug] Mon Jun 26 20:19:13 2017 - [debug] Connecting via SSH from root@172.25.12.2(172.25.12.2:22) to root@172.25.12.1(172.25.12.1:22)..Mon Jun 26 20:19:13 2017 - [debug] ok.Mon Jun 26 20:19:13 2017 - [debug] Connecting via SSH from root@172.25.12.2(172.25.12.2:22) to root@172.25.12.3(172.25.12.3:22)..Mon Jun 26 20:19:13 2017 - [debug] ok.Mon Jun 26 20:19:14 2017 - [debug] Mon Jun 26 20:19:13 2017 - [debug] Connecting via SSH from root@172.25.12.3(172.25.12.3:22) to root@172.25.12.1(172.25.12.1:22)..Mon Jun 26 20:19:13 2017 - [debug] ok.Mon Jun 26 20:19:13 2017 - [debug] Connecting via SSH from root@172.25.12.3(172.25.12.3:22) to root@172.25.12.2(172.25.12.2:22)..Mon Jun 26 20:19:14 2017 - [debug] ok.Mon Jun 26 20:19:14 2017 - [info] All SSH connection tests passed successfully.
master-node配置:
先安装node:
yum install -y mha4mysql-node-0.56-0.el6.noarch.rpm
mysql5.7安装请看下面链接:
redhat6.5下的mysql5.7安装教程
主从集群配置(因为所有的节点都有可能升至master,所以几乎所有节点的配置都一样):
主从复制详细原理请参考下面链接:
mysql5.7主从复制原理及基本配置
先在各个节点上安装半同步插件(server1,server2,server3都执行)
登陆数据库,在数据库里执行下面命令:
mysql> install plugin rpl_semi_sync_master soname 'semisync_master.so';mysql> install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
所有节点配置文件都一样,除了里面的参数 server-id 其他的都必须一致,因为所有节点都有可能升至master
[root@server2 ~]# cat /etc/my.cnf | grep -v "#"[mysqld]datadir=/var/lib/mysqlsocket=/var/lib/mysql/mysql.socksymbolic-links=0log-error=/var/log/mysqld.logpid-file=/var/run/mysqld/mysqld.pidserver-id=2 #各个节点的sever-id不能一样log-bin=mysql-binbinlog-do-db=testbinlog-ignore-db=mysqlgtid-mode=ON #开启gtidenforce-gtid-consistencyrpl_semi_sync_master_enabled=ON #开启半同步复制rpl_semi_sync_slave_enabled=ONslave-parallel-type=LOGICAL_CLOCKslave-parallel-workers=16master-info_repository=TABLErelay_log_info_repository=TABLErelay_log_recovery=ON
在所有节点上都设置监控用户以及同步用户(server1,server3,server3都执行):
先登陆mysql:
mysql> grant replication slave on *.* to mha@'172.25.12.%' identified by 'Yang@123';mysql> grant all on *.* to root@'172.25.12.%' identified by 'Yang@123';
现在先设置server1为master:
在server2,server3上执行下面命令,让他们去同步server1
mysql> stop slave;mysql> change master to master_host='172.25.12.1',master_user='mha',master_password='Yang@123',master_auto_position=1;mysql> start slave;
查看各个节点的状态:
server1:
mysql> show master status;
server2,server3:
mysql> show slave status\G;看下面这两个线程是否开启 Slave_IO_Running: Yes Slave_SQL_Running: Yes
自此,高可用集群配置完毕,下面我们来检测下:
高可用检测:
先在server4上开启master-manager:
[root@server4 mha]# nohup masterha_manager --conf=/etc/mha/mha.conf --ignore_last_failover 2>&1 &
将server1 停掉:
[root@server1 ~]# /etc/init.d/mysqld stopStopping mysqld: [ OK ]
在server2上观察:
一开始是这样:
mysql> show slave status\G;*************************** 1. row *************************** Slave_IO_State: Master_Host: 172.25.12.1 Master_User: mha Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000008 Read_Master_Log_Pos: 194 Relay_Log_File: server2-relay-bin.000002 Relay_Log_Pos: 367 Relay_Master_Log_File: mysql-bin.000008 Slave_IO_Running: Connecting Slave_SQL_Running: Yes
几秒后:
mysql> show slave status\G;*************************** 1. row *************************** Slave_IO_State: Master_Host: 172.25.12.1 Master_User: mha Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000008 Read_Master_Log_Pos: 194 Relay_Log_File: server2-relay-bin.000002 Relay_Log_Pos: 367 Relay_Master_Log_File: mysql-bin.000008 Slave_IO_Running: No Slave_SQL_Running: No
再过几秒:
mysql> show slave status\G;Empty set (1.11 sec)ERROR: No query specified
因为它切换成了master
在server3上观察:
mysql> show slave status\G;*************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 172.25.12.2 Master_User: mha Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000004 Read_Master_Log_Pos: 194 Relay_Log_File: server3-relay-bin.000002 Relay_Log_Pos: 367 Relay_Master_Log_File: mysql-bin.000004 Slave_IO_Running: Yes Slave_SQL_Running: Yes
自动切换成功
将server1上的mysql重启后,它不能自动加入到集群里,而且,他的状态默认还是master
这时,就要手动更改他的状态,将他加入到集群:
mysql> change master to master_host='172.25.12.2',master_user='mha',master_password='Yang@123',master_auto_position=1;Query OK, 0 rows affected, 2 warnings (1.10 sec)mysql> start slave;
查看:
mysql> show slave status\G;*************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 172.25.12.2 Master_User: mha Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000004 Read_Master_Log_Pos: 194 Relay_Log_File: server1-relay-bin.000002 Relay_Log_Pos: 367 Relay_Master_Log_File: mysql-bin.000004 Slave_IO_Running: Yes Slave_SQL_Running: Yes
手动切换:
使用手动切换时,不用开启master-manager
#热切换masterha_master_switch --conf=/etc/mha/mha.conf --master_state=alive --new_master_host=172.25.12.1 --new_master_port=3306 --orig_master_is_new_slave --running_updates_limit=1000#冷切换masterha_master_switch --conf=/etc/mha/mha.conf --master_state=dead --dead_master_host=172.25.12.1 --dead_master_port=3306 --new_master_host=172.25.12.2 --new_master_port=3306 --ignore_last_failover
MHA运行过程:
1.配置文件检查阶段,这个阶段会检查整个集群配置文件配置
masterha_check_repl –conf=/etc/mha/mha.conf
masterha_check_ssh –conf=/etc/mha/mha.conf
2.宕机的master处理
3.复制dead maste和最新slave相差的relay log,并保存到MHA Manger具体的目录下
4.识别含有最新更新的slave
5.应用从master保存的二进制日志事件(binlog events)
6.提升一个slave为新的master进行复制
7.使其他的slave连接新的master进行复制
- mysql主从集群高可用架构-----MHA
- mysql高可用 主从MHA
- mysql高可用集群——MHA架构
- MySQL MHA 高可用架构
- MySQL高可用架构 --- MHA
- MySQL高可用架构之MHA(可用)
- MySQL高可用架构之MHA
- mysql mha高可用架构的安装
- MySQL高可用架构之MHA
- MySQL高可用架构之MHA
- MySQL高可用架构之MHA
- MySQL高可用架构之MHA
- MySQL高可用架构之MHA
- MySQL高可用架构之MHA
- mysql MHA高可用架构安装
- MySQL高可用架构之MHA
- MySQL高可用架构之MHA
- Mysql高可用架构之MHA
- Banner的使用
- Java字符串处理之StringBuilder
- JavaScript学习之路--前言
- Linux下僵尸进程与孤儿进程
- poj 哈夫曼树相关之3253 Fence Repair
- mysql主从集群高可用架构-----MHA
- siganl与sigaction注册信号处理函数的区别
- 【Cocos2d-x】Cocos2d-X网络编程-HttpRequest/HttpClient/HttpResponse
- 如何实现一个malloc
- 我的Java学习日记
- Linux中的进程
- Java 笔记
- React-Native极光推送全程教程android和ios
- HTML、js:如何利用Location对象的常用属性和方法重新加载、刷新页面