MySQL中mycat与mha应用

目录

一.Mycat代理服务器

1.Mycat应用场景

2.mycat安装目录结构说明

3.Mycat的常用配置文件

4.Mycat日志

5.mycat 实现读写分离

二.MySQL高可用

1.原理过程

2.MHA软件

3.实现MHA


一.Mycat代理服务器

1.Mycat应用场景

  • Mycat适用的场景很丰富,以下是几个典型的应用场景

    • 单纯的读写分离,此时配置最为简单,支持读写分离,主从切换

    • 分表分库,对于超过1000万的表进行分片,最大支持1000亿的单表分片

    • 多租户应用,每个应用一个库,但应用程序只连接Mycat,从而不改造程序本身,实现多租户化报表系统,借助于Mycat的分表能力,处理大规模报表的统计

    • 替代Hbase,分析大数据,作为海量数据实时查询的一种简单有效方案,比如100亿条频繁查询的记录需要在3秒内查询出来结果,除了基于主键的查询,还可能存在范围查询或其他属性查询,此时Mycat可能是最简单有效的选择

  • Mycat长期路线图

    • 强化分布式数据库中间件的方面的功能,使之具备丰富的插件、强大的数据库智能优化功能、全面的系统监控能力、以及方便的数据运维工具,实现在线数据扩容、迁移等高级功能进一步挺进大数据计算领域,深度结合Spark Stream和Storm等分布式实时流引擎,能够完成快速的巨表关联、排序、分组聚合等 OLAP方向的能力,并集成一些热门常用的实时分析算法,让工程师以及DBA们更容易用Mycat实现一些高级数据分析处理功能不断强化Mycat开源社区的技术水平,吸引更多的IT技术专家,使得Mycat社区成为中国的Apache,并将Mycat推到Apache基金会,成为国内顶尖开源项目,最终能够让一部分志愿者成为专职的Mycat开发者,荣耀跟实力一起提升

mycat 可以简单概括为:

  • 一个彻底开源的,面向企业应用开发的大数据库集群

  • 支持事务、ACID、可以替代MySQL的加强版数据库

  • 一个可以视为MySQL集群的企业级数据库,用来替代昂贵的Oracle集群

  • 一个融合内存缓存技术、NoSQL技术、HDFS大数据的新型SQL Server

  • 结合传统数据库和新型分布式数据仓库的新一代企业级数据库产品

  • 一个新颖的数据库中间件产品

2.mycat安装目录结构说明

  • bin :mycat命令,启动、重启、停止等运行目录

  • catlet: catlet为Mycat的一个扩展功能

  • conf  :mycat 配置信息,重点关注

  • lib:mycat引用的jar包,Mycat是java开发的

  • logs日志文件,包括Mycat启动的日志和运行的日志

  • version.txt :mycat版本说明

3.Mycat的常用配置文件

Mycat的配置文件都在conf目录里面,这里介绍几个常用的文件:

  • server.xml :Mycat软件本身相关的配置文件,设置账号、参数等

  • schema.xml:Mycat对应的物理数据库和数据库表的配置,读写分离、高可用、分布式策略定制、节点控制

  • rule.xml:Mycat分片(分库分表)规则配置文件,记录分片规则列表、使用方法等

4.Mycat日志

Mycat的日志文件都在logs目录里面

  • wrapper.log :mycat启动日志

  • mycat.log :mycat详细工作日志

5.mycat 实现读写分离

(1)环境准备

mycat服务器上不能装mysql

服务器地址
master服务器192.168.240.11
slave1服务器192.168.240.13
mycat服务器192.168.240.12
客户机192.168.240.14

(2)初始化环境

#每台服务器都设置关闭防火墙关闭selinux
systemctl stop  firewalld
systemctl disable --now firewalld
setenforce 0

(3)部署主从复制

主服务器配置

vim /etc/my.cnf
server-id=11
log-bin=/data/mysql/mysql-bin
mkdir /data/mysql  -p
chown  mysql.mysql  /data/  -R
systemctl restart mysqld
进入数据库
select @@server_id;
#可以查看serverid  默认都是1
show master status;
#查看二进制日志位置
grant replication slave on *.* to test@'192.168.240.%' identified by 'Admin@123';
#建立复制用户
show processlist;
#查看线程

从服务器配置

vim  /etc/my.cnf
#修改文件
[mysqld]
server_id=101
log-bin=/data/mysql/mysql-bin
relay-log=relay-log-bin
relay-log-index=slave-relay-bin.index
#read only  #只读可加
[root@localhost ~]#mkdir /data/mysql/   -p
#建立文件夹
[root@localhost ~]#chown mysql.mysql /data/ -R
#注意修改权限
[root@localhost ~]#systemctl restart mysqld
进入数据库
help change master to

CHANGE MASTER TO
  MASTER_HOST='192.168.240.11',
  MASTER_USER='test',
  MASTER_PASSWORD='Admin@123',
  MASTER_PORT=3306,
  MASTER_LOG_FILE='mysql-bin.000001',
  MASTER_LOG_POS=154;

Seconds_Behind_Master: NULL    #目前数据差

start slave;
#开启线程,开启主从复制
show slave status\G;
#查看设置的状态

(4)在主服务器上导入hellodb库文件

source  /opt/hellodb_innodb.sql

(5)安装mycat (192.168.240.12)

将mycat的rpm安装包拖入/opt目录下,创建文件夹/apps
mkdir  /apps
tar zxvf Mycat-server-1.6.7.4-release-20200105164103-linux.tar.gz -C /apps/
cd /apps
echo 'PATH=/apps/mycat/bin:$PATH' > /etc/profile.d/mycat.sh
#设置变量环境
source /etc/profile.d/mycat.sh
启动mycat
mycat start
mycat status

(6)客户端连接数据库

#这里密码初始为123456   需要加端口
[root@localhost bin]#mysql -uroot -p123456 -h 192.168.240.12 -P8066

(7)修改mycat配置文件

/apps/mycat/conf/server.xml

备份配置文件
cp /apps/mycat/conf/server.xml  /apps/mycat/conf/server.xml.bak
vim /apps/mycat/conf/server.xml
#去掉44行行注释,对应的在51行行末注释,删除50行行末注释,5 * 60 * 1000L; //连接空>    闲检查
#修改45行端口号为3306
45 <property name="serverPort">3306</property>
#配置Mycat的连接信息(账号密码),在110 和111行, 可以修改

user    用户配置节点
name    逻辑用户名,客户端登录MyCAT的用户名,也就是客户端用来连接Mycat的用户名。
password     客户端登录MyCAT的密码
schemas      数据库名,这里会和schema.xml中的配置关联,可配置多个,多个用逗号分开,例如:db1,db2
privileges   配置用户针对表的增删改查的权限
readOnly mycat   逻辑库所具有的权限。true为只读,false为读写都有,默认为false

##注意
1.#server.xml文件里登录mycat的用户名和密码可以任意定义,这个账号和密码是为客户机登录mycat时使用的账号信息
2.#逻辑库名(如上面的TESTDB,也就是登录mycat后显示的库名,切换这个库之后,显示的就是代理的真实mysql数据库的表)要在schema.xml里面也定义,否则会导致mycat服务启动失败!这里只定义了一个标签,所以把多余的都注释了。如果定义多个标签,即设置多个连接mycat的用户名和密码,那么就需要在schema.xml文件中定义多个对应的库!

修改配置文件/apps/mycat/conf/schema.xml

[root@localhost ~]#vim  /apps/mycat/conf/schema.xml
#删除所有内容,重新写入以下
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
        <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
        #schema标签:数据库设置,此数据库为逻辑数据库,name与server.xml中schema对应。
        #name:逻辑数据库名,与server.xml中的schema对应;
        #checkSQLschema: 数据库前缀相关设置,这里为false;
        #sqlMaxLimit:  select时默认的limit,避免查询全表,否则可能会遇到查询量特别大的情况造成卡 死;
        #dataNode:表存储到哪些节点,多个节点用逗号分隔。节点为下文dataNode设置的name
</schema>
        <dataNode name="dn1" dataHost="localhost1" database="hellodb" />
        #dataNode标签: 定义mycat中的数据节点,也是通常说的数据分片,也就是分库相关配置
        #name: 定义数据节点的名字,与table中dataNode对应
        #datahost: 物理数据库名,与datahost中name对应,该属性用于定义该分片属于哪个数据库实例
        #database: 物理数据库中数据库名,该属性用于定义该分片属性哪个具体数据库实例上的具体库
        <dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
        #dataHost标签: 物理数据库,真正存储数据的数据库
        #name: 物理数据库名,与dataNode中dataHost对应
        #maxCon属性指定每个读写实例连接池的最大连接。也就是说,标签内嵌套的writeHost、readHost标  签都会使用这个属性的值来实例化出连接池的最大连接数
        #minCon属性指定每个读写实例连接池的最小连接,初始化连接池的大小
        #balance: 均衡负载的方式
       
                  writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                  #writeType: 写入方式
                  #dbType: 数据库类型
                  #dbDriver指定连接后端数据库使用的 Driver,目前可选的值有 native 和 JDBC。用 native 的话,因为这个值执行的是二进制的 mysql 协议,所以可以使用 mysql 和maridb。其他类型的数据库则需要使用 JDBC 驱动来支持。
                  #switchType:  “-1” 表示不自动切换; “1” 默认值,自动切换; “2” 基于 MySQL主从同步的状态决定是否切换心跳语句为 show slave status; “3” 基于 MySQL galary cluster 的切换机制(适合集群)(1.4.1)心跳语句为 show status like ‘wsrep%’.
                <heartbeat>select user()</heartbeat>
                #heartbeat: 心跳检测语句,注意语句结尾的分号要加
                <writeHost host="host1" url="192.168.240.11:3306" user="root" password="123456">
                #host:用于标识不同实例,一般 writeHost 我们使用*M1,readHost 我们用*S1。
                #url:后端实例连接地址。Native:地址:端口 JDBC:jdbc的url
                #user:后端存储实例需要的用户名字
                #password:后端存储实例需要的密码
                 <readHost host="host2" url="192.168.240.13:3306" user="root" password="123456"/>

                </writeHost>
        </dataHost>
</mycat:schema>


#schema.xml文件中有三点需要注意:balance="1",writeType="0" ,switchType="1" 
#schema.xml中的balance的取值决定了负载均衡对非事务内的读操作的处理。balance 属性负载均衡类型,目前的取值有 4 种:
##balance="0":不开启读写分离机制,所有读操作都发送到当前可用的writeHost上,即读请求仅            发送到writeHost上
##balance="1":一般用此模式,读请求随机分发到当前writeHost对应的readHost和standby的writeHost上。即全部的readHost与stand by writeHost 参与 select 语句的负载均衡,简单的说,当双主双从模式(M1 ->S1 , M2->S2,并且 M1 与 M2 互为主备),正常情况下, M2,S1, S2 都参与 select 语句的负载均衡
##balance="2":读请求随机分发到当前dataHost内所有的writeHost和readHost上。即所有读操作都随机的在writeHost、 readhost 上分发
##balance="3":读请求随机分发到当前writeHost对应的readHost上。即所有读请求随机的分发wiriterHost 对应的 readhost 执行, writerHost 不负担读压力,注意 balance=3 只在 1.4 及其以后版本有,1.3 没有

###writeHost和readHost标签,这两个标签都指定后端数据库的相关配置给mycat,用于实例化后端连接池。唯一不同的是:writeHost指定写实例、readHost指定读实例,组着这些读写实例来满足系统的要求。在一个dataHost内可以定义多个writeHost和eadHost。但是,如果writeHost指定的后端数据库宕机,那么这个writeHost绑定的所有readHost都将不可用。另一方面,由于这个writeHost宕机系统会自动的检测到,并切换到备用的writeHost上去   
               
#PS:Mycat主从分离只是在读的时候做了处理,写入数据的时候,只会写入到writehost,需要通过mycat的主从复制将数据复制到readhost

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
        <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"></schema>
        <dataNode name="dn1" dataHost="localhost1" database="hellodb" />
        <dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
                  writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <writeHost host="host1" url="192.168.240.11:3306" user="root" password="Admin@123">
                 <readHost host="host2" url="192.168.240.13:3306" user="root" password="Admin@123"/>
                </writeHost>
        </dataHost>
</mycat:schema>

(8)主服务器授权

GRANT ALL ON *.* TO 'root'@'192.168.240.%' IDENTIFIED BY 'Admin@123';
select user,host from mysql.user;

(9)重启mycat服务,客户机连接mycat

[root@localhost apps]# mycat restart
Stopping Mycat-server...
Stopped Mycat-server.
Starting Mycat-server...
[root@localhost apps]# mycat status
Mycat-server is running (8991).
tail -f /apps/mycat/logs/wrapper.log
ss -antp|grep 3306

show databases;
use TESTDB;
show tables;
select @@server_id;

(10)客户端测试读写分离

在主从服务器上都打开通用日志

#打开通用日志
set global general_log=1;
#查看通用查询日志是否开启
show variables like 'general%';
+------------------+-------------------------------------+
| Variable_name    | Value                               |
+------------------+-------------------------------------+
| general_log      | ON                                  |
| general_log_file | /usr/local/mysql/data/localhost.log |
+------------------+-------------------------------------+

在主从服务器上实时查看通用日志

tail -f /var/lib/mysql/localhost.log

在客户机上的表中插入数据,并查看主从服务器实时日志,可以看到只有主服务器上有日志变化显示

insert into teachers values(5,'Xiao Ming',46,'F');
客户机上操作

 主服务器上查看

从服务器也开启通用日志,当客户机执行查看操作时

看从服务器日志

select * from students;

二.MySQL高可用

MHA实验

MHA集群架构

1.原理过程

  1. MHA利用 SELECT 1 As Value 指令判断master服务器的健康性,一旦master 宕机,MHA 从宕机崩溃的master保存二进制日志事件(binlog events)

  2. 识别含有最新更新的slave

  3. 应用差异的中继日志(relay log)到其他的slave

  4. 应用从master保存的二进制日志事件(binlog events)

  5. 提升一个slave为新的master

  6. 使其他的slave连接新的master进行复制

2.MHA软件

MHA软件由两部分组成,Manager工具包和Node工具包

Manager工具包主要包括以下几个工具:

masterha_check_ssh       检查MHA的SSH配置状况
masterha_check_repl     检查MySQL复制状况
masterha_manger         启动MHA
masterha_check_status   检测当前MHA运行状态
masterha_master_monitor 检测master是否宕机
masterha_master_switch 故障转移(自动或手动)
masterha_conf_host     添加或删除配置的server信息
masterha_stop  --conf=app1.cnf 停止MHA
masterha_secondary_check 两个或多个网络线路检查MySQL主服务器的可用

Node工具包:这些工具通常由MHA Manager的脚本触发,无需人为操作)主要包括以下几个工具:

save_binary_logs     #保存和复制master的二进制日志
apply_diff_relay_logs   #识别差异的中继日志事件并将其差异的事件应用于其他的slave
filter_mysqlbinlog   #去除不必要的ROLLBACK事件(MHA已不再使用此工具)
purge_relay_logs #清除中继日志(不会阻塞SQL线程)

MHA配置文件:

global配置,为各application提供默认配置,默认文件路径 /etc/masterha_default.cnf
application配置:为每个主从复制集群

3.实现MHA

服务器地址
mha 服务器192.168.240.12
master192.168.240.11
slave1192.168.240.13
slave2192.168.240.14

(1)关闭防火墙和selinux 

systemctl disable --now firewalld
setenforce 0

(2)MHA(192.168.240.12)安装管理和客户端

yum install epel-release.noarch -y
将下载好的mha的rpm安装包拖入/data下
[root@localhost data]#ls
mha4mysql-manager-0.58-0.el7.centos.noarch.rpm  mha4mysql-node-0.58-0.el7.centos.noarch.rpm

[root@localhost opt]#yum -y install mha4mysql-*.rpm

(3)其余服务器master  slave1 slave2  安装客户端

[root@localhost opt]#yum install epel-release.noarch -y
[root@localhost data]# yum install  mha4mysql-node-0.58-0.el7.centos.noarch.rpm -y

(4)所有节点基于key验证

可以使用免密登录脚本


#!/bin/bash
PASS=123
#使用此脚本免密登录,密码必须相同
#设置网段最后的地址,4-255之间,越小扫描越快
END=254
 
IP=`ip a s ens33 | awk -F'[ /]+' 'NR==3{print $3}'`
NET=${IP%.*}.
 
rm -f /root/.ssh/id_rsa
[ -e ./SCANIP.log ] && rm -f SCANIP.log
for((i=3;i<="$END";i++));do
ping -c 1 -w 1  ${NET}$i &> /dev/null  && echo "${NET}$i" >> SCANIP.log &
done
wait
 
ssh-keygen -P "" -f /root/.ssh/id_rsa
rpm -q sshpass || yum -y install sshpass
sshpass -p $PASS ssh-copy-id -o StrictHostKeyChecking=no $IP
 
AliveIP=(`cat SCANIP.log`)
for n in ${AliveIP[*]};do
sshpass -p $PASS scp -o StrictHostKeyChecking=no -r /root/.ssh root@${n}:
done

也可以使用秘钥 

[root@localhost data]#ssh-keygen 
[root@localhost data]#ssh-copy-id  127.0.0.1
#自己和自己连生成 秘钥

[root@localhost data]#cd

[root@localhost data]#rsync -a .ssh   192.168.240.11:/root/
[root@localhost data]#rsync -a .ssh   192.168.240.13:/root/
[root@localhost data]#rsync -a .ssh   192.168.240.14:/root/
#注意.ssh 后不能加/    -a  保留属性

(5)MHA服务器上建立mha文件夹和配置文件

[root@localhost ~]#mkdir /etc/mastermha
[root@localhost ~]#vim /etc/mastermha/app1.cnf
[server default]
user=mhauser
password=Admin@123
manager_workdir=/data/mastermha/app1/
manager_log=/data/mastermha/app1/manager.log
remote_workdir=/data/mastermha/app1/
ssh_user=root
repl_user=test
repl_password=Admin@123
ping_interval=1
master_ip_failover_script=/usr/local/bin/master_ip_failover
check_repl_delay=0
master_binlog_dir=/data/mysql/

[server1]
hostname=192.168.240.11
candidate_master=1

[server2]
hostname=192.168.240.13
candidate_master=1  # 这里添加这个使得当主故障时不考虑同步情况(数据差异)直接成为新主
如果不添加则是与主同步最近的,差异最少的成为新主

[server3]
hostname=192.168.240.14

(6)准备切换脚本

[root@localhost ~]#vim  master_ip_failover
#!/usr/bin/env perl
use strict;
use warnings FATAL => 'all';
use Getopt::Long;
my (
$command, $ssh_user, $orig_master_host, $orig_master_ip,
$orig_master_port, $new_master_host, $new_master_ip, $new_master_port
);
my $vip = '192.168.240.188/24';
my $gateway = '192.168.240.2';
my $interface = 'ens33';
my $key = "1";
my $ssh_start_vip = "/sbin/ifconfig $interface:$key $vip;/sbin/arping -I $interface -c 3 -s $vip $gateway >/dev/null 2>&1";
my $ssh_stop_vip = "/sbin/ifconfig $interface:$key down";
GetOptions(
'command=s' => \$command,
'ssh_user=s' => \$ssh_user,
'orig_master_host=s' => \$orig_master_host,
'orig_master_ip=s' => \$orig_master_ip,
'orig_master_port=i' => \$orig_master_port,
'new_master_host=s' => \$new_master_host,
'new_master_ip=s' => \$new_master_ip,
'new_master_port=i' => \$new_master_port,
);
exit &main();
sub main {
print "\n\nIN SCRIPT TEST====$ssh_stop_vip==$ssh_start_vip===\n\n";
if ( $command eq "stop" || $command eq "stopssh" ) {
# $orig_master_host, $orig_master_ip, $orig_master_port are passed.
# If you manage master ip address at global catalog database,
# invalidate orig_master_ip here.
my $exit_code = 1;
eval {
print "Disabling the VIP on old master: $orig_master_host \n";
&stop_vip();
$exit_code = 0;
};
if ($@) {
warn "Got Error: $@\n";
exit $exit_code;
}
exit $exit_code;
}
elsif ( $command eq "start" ) {
# all arguments are passed.
# If you manage master ip address at global catalog database,
# activate new_master_ip here.
# You can also grant write access (create user, set read_only=0, etc) here.
my $exit_code = 10;
eval {
print "Enabling the VIP - $vip on the new master - $new_master_host \n";
&start_vip();
$exit_code = 0;
};
if ($@) {
warn $@;
exit $exit_code;
}
exit $exit_code;
}
elsif ( $command eq "status" ) {
print "Checking the Status of the script.. OK \n";
`ssh $ssh_user\@$orig_master_host \" $ssh_start_vip \"`;
exit 0;
}
else {
&usage();
exit 1;
}
}
# A simple system call that enable the VIP on the new master
sub start_vip() {
`ssh $ssh_user\@$new_master_host \" $ssh_start_vip \"`;
}
# A simple system call that disable the VIP on the old_master
sub stop_vip() {
`ssh $ssh_user\@$orig_master_host \" $ssh_stop_vip \"`;
}
sub usage {
print
"Usage: master_ip_failover --command=start|stop|stopssh|status --orig_master_host=host --orig_master_ip=ip --orig_master_port=port --new_master_host=host --new_master_ip=ip --new_master_port=port\n";
}


[root@localhost ~]#cp master_ip_failover   /usr/local/bin/
# 移动文件到对应的地方 之前的配置文件中规定了地方
[root@localhost ~]#chmod +x  /usr/local/bin/master_ip_failover 
#加上执行权限

(7)实现主从复制

主服务器配置

[root@localhost ~]#vim  /etc/my.cnf
#修改文件
[mysqld]
server_id=11
log-bin=/data/mysql/mysql-bin
skip_name_resolve=1
general_log 
#通用日志
systemctl restart mysqld
show master status;
grant replication slave on *.* to test@'192.168.240.%' identified by 'Admin@123';
#建立复制用户
grant all on *.* to mhauser@'192.168.240.%' identified by 'Admin@123';
#建立  mha管理账户

从服务器1配置

[root@localhost ~]#vim  /etc/my.cnf
#修改文件
server_id=13
log-bin=/data/mysql/mysql-bin
read_only
relay_log_purge=0
skip_name_resolve=1 
general_log 

[root@localhost ~]#mkdir /data/mysql/   -p
#建立文件夹
[root@localhost ~]#chown mysql.mysql /data/ -R
#注意修改权限
[root@localhost ~]#systemctl restart mysqld
[root@localhost data]#mysql -uroot -p123123
CHANGE MASTER TO
  MASTER_HOST='192.168.240.11',
  MASTER_USER='test',
  MASTER_PASSWORD='Admin@123',
  MASTER_PORT=3306,
  MASTER_LOG_FILE='mysql-bin.000002',
  MASTER_LOG_POS=154;
  注意最后分号
  
mysql> start slave;
mysql> show slave status\G;

 从服务器2配置

[root@localhost ~]#vim  /etc/my.cnf
#修改文件
server_id=14
log-bin=/data/mysql/mysql-bin
read_only
relay_log_purge=0
skip_name_resolve=1 
general_log 

[root@localhost ~]#mkdir /data/mysql/   -p
#建立文件夹
[root@localhost ~]#chown mysql.mysql /data/ -R
#注意修改权限
[root@localhost ~]#systemctl restart mysqld
[root@localhost data]#mysql -uroot -p123123
CHANGE MASTER TO
  MASTER_HOST='192.168.240.11',
  MASTER_USER='test',
  MASTER_PASSWORD='Admin@123',
  MASTER_PORT=3306,
  MASTER_LOG_FILE='mysql-bin.000002',
  MASTER_LOG_POS=154;
  注意最后分号
  
mysql> start slave;
mysql> show slave status\G;

(8)主服务器上设置虚拟地址

在 mysql 主节点上配置 虚拟地址 也就是192.168.240.11

ifconfig ens33:1 192.168.240.188/24

(9)在MHA服务器上检测环境是否合格

检测ssh免密登录是否成功

masterha_check_ssh --conf=/etc/mastermha/app1.cnf

如果报错

[root@mha-manager ~]#masterha_check_repl --conf=/etc/mastermha/app1.cnf
#如果设置了默认字符集起不来    在  /etc/my.cnf  文件中
unknown variable 'default-character-set=utf8'

检测主从复制是否可以

[root@localhost /]#masterha_check_repl --conf=/etc/mastermha/app1.cnf
#  --conf=/etc/mastermha/app1.cnf  指明配置文件

查看状态未开启

[root@localhost /]#masterha_check_status --conf=/etc/mastermha/app1.cnf
app1 is stopped(2:NOT_RUNNING).

(10)开启MHA

#开启MHA,默认是前台运行,生产环境一般为后台执行
nohup masterha_manager --conf=/etc/mastermha/app1.cnf &> /dev/null 
#非后台
masterha_manager --conf=/etc/mastermha/app1.cnf 

#查看状态
masterha_check_status --conf=/etc/mastermha/app1.cnf  

(11)测试

mha 如何发现主节点宕机

通过发送 SELECT 1 As Value 指令 把1 设置成 value 给主, 主无法执行就认为他死了

tail -f   /var/lib/mysql/localhost.log

查看mha服务的日志

tail  -f  /data/mastermha/app1/manager.log 

(12)模拟主节点mysql故障

切换的过程 会将 从服务器的 readonly 指令改成可写

在主服务器故障之前,指定为新主的服务器(192.168.240.13)可以查看只读变量状态

select @@read_only;
+-------------+
| @@read_only |
+-------------+
|           1 |
+-------------+
1 row in set (0.00 sec)

将主服务器关闭

查看新主只读状态,已关闭

select @@read_only;

在新主(192.168.240.13)上查看状态slave 信息为空

在从服务器(192.168.240.14)上查看状态slave ,指向新主

show slave status\G;

查看MHA服务器日志上,已经将主更换为(192.168.240.13)

查看新主的IP地址,虚拟ip已经漂浮到新主(192.168.240.13)上

(13)MHA为一次性高可用如何重新启用高可用

将MHA服务器上/data/mastermha/app1
目录下的app1.failover.complete文件删除
将新的服务器或者修好的原主(192.168.240.11)配置为新的主(192.168.240.13)服务器的从服务器
不支持抢占,原主恢复不会将在主的位置
并将/etc/mastermha/app1.cnf  配置文件中server1设置为新主,原主修改到新主下面
  • 18
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
keepalived、haproxy、mycatmha都是一些常用的高可用性方案,用于确保企业应用系统在出现故障时,仍能够继续提供服务。 Keepalived是一款开源的高可用性解决方案,它可以自动将主服务器的IP地址和MAC地址转移到备份服务器以确保系统的高可用性。它支持同时监控多个服务器上的应用,并在主服务器故障时自动将流量切换到备份服务器上。 使用haproxy可以有效地将流量分发到不同的服务器上,从而提高应用系统的可扩展性和性能。haproxy是一款轻量级和高效的负载均衡工具,它支持TCP和HTTP应用,并能够检测和处理后端服务器的故障。 mycat是一款开源的分布式数据库间件,它支持基于MySQL协议的分布式架构,可以将多个MySQL实例组成一个大型数据库集群。mycat还支持读写分离、分片、分区和负载均衡等功能,从而提高应用系统的可用性和性能。 MHAMySQL High Availability)是一个开源的MySQL高可用性方案,它可以自动监测主服务器的故障并在故障发生时将流量切换到备份服务器上。MHA支持多种MySQL复制架构,并提供自动故障检测、自动故障转移、自动故障恢复等功能,从而确保MySQL数据库的高可用性。 综上所述,keepalived、haproxy、mycatmha都是一些常用的高可用性方案,它们可以有效地保障企业应用系统的稳定性和可用性,使得应用系统能够在遇到故障时仍然能够正常提供服务
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值