目录
一.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.原理过程
-
MHA利用 SELECT 1 As Value 指令判断master服务器的健康性,一旦master 宕机,MHA 从宕机崩溃的master保存二进制日志事件(binlog events)
-
识别含有最新更新的slave
-
应用差异的中继日志(relay log)到其他的slave
-
应用从master保存的二进制日志事件(binlog events)
-
提升一个slave为新的master
-
使其他的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 |
master | 192.168.240.11 |
slave1 | 192.168.240.13 |
slave2 | 192.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设置为新主,原主修改到新主下面