半同步复制与MHA高可用架构设计

各位道友好,鼠鼠我呀校招刚通过了移动的面试 ,但是安排的岗位是偏远县城里面的岗位,各位能给给建议吗?鼠鼠我啊真不想有时候变成销售员去卖产品!!!

半同步复制与MHA高可用架构设计

一、半同步复制

1、什么是半同步复制

所谓的半同步复制就是master每commit一个事务(简单来说就是做一个改变数据的操作),要确保slave接受完主服务器发送的binlog日志文件==并写入到自己的中继日志relay log里==,然后会给master信号,告诉对方已经接收完毕,这样master才能把事物成功==commit==。这样就保证了master-slave的==数据绝对的一致==(但是以牺牲==master的性能为代价==).但等待时间也是可以调整的。

2、半同步复制的基本实现

第一步:准备一套M-S的主从架构(建议使用基于GTIDs架构设计)

第二步:给MASTER与SLAVE安装plugin插件(`$basedir/lib/plugin/)

MASTER:

mysql> install plugin rpl_semi_sync_master soname 'semisync_master.so';
mysql> show global variables like 'rpl_semi_sync%';

SLAVE:

mysql> install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
mysql> show global variables like 'rpl_semi_sync%';

第三步:激活MASTER与SLAVE服务器中的半同步复制插件

MASTER:

mysql> set global rpl_semi_sync_master_enabled=on;
mysql> show global status like 'rpl_semi_sync%';

SLAVE:

mysql> set global rpl_semi_sync_slave_enabled=on;
mysql> show global variables like 'rpl_semi_sync%';

第四步:在SLAVE服务器中重启IO线程

mysql> stop slave IO_THREAD;
mysql> start slave IO_THREAD;

第五步:测试验证半同步复制

当slave从库的IO_Thread 线程将binlog日志接受完毕后,要给master一个确认,如果超过10s未收到slave的接收确认信号,那么就会自动转换为传统的异步复制模式。

1)master插入一条记录,查看slave是否有成功返回

mysql> insert into db_itheima.tb_student values (null,'j');
mysql> show global status like 'rpl_semi_sync%_yes_tx'; 
+-----------------------------+-------+
| Variable_name               | Value |
+-----------------------------+-------+
| Rpl_semi_sync_master_yes_tx |  1    |
表示这次事物成功从slave返回一次确认信号
+-----------------------------+-------+

2)模拟slave服务器故障

SLAVE:

# service mysqld stop

MASTER:

mysql> insert into db_itheima.tb_student values (null,'k'); 
mysql> insert into db_itheima.tb_student values (null,'l'); 
这次插入一个值需要等待10秒(默认的等待时间)
mysql> insert into db_itheima.tb_student values (null,'m'); 
现在自动转成了原来的异步模式

3)重新启动半同步复制

SLAVE:

# service mysqld start
# mysql -P 3310 -p
mysql> set global rpl_semi_sync_slave_enabled=on;
mysql> stop slave IO_THREAD;
mysql> start slave IO_THREAD;

master需要等到slave确认后才能提交,如果等不到确认消息,master等待10s种后自动变成异步同步;slave启起来后,master上改变的数据还是会自动复制过来,数据又回到一致。

3、等待时间的修改(默认10s)

mysql> set global rpl_semi_sync_master_timeout=3600000;
mysql> show global variables like 'rpl_semi_sync%';
+------------------------------------+---------+
| Variable_name                      | Value   |
+------------------------------------+---------+
| rpl_semi_sync_master_enabled       | ON      |
| rpl_semi_sync_master_timeout       | 3600000 |
| rpl_semi_sync_master_trace_level   | 32      |
| rpl_semi_sync_master_wait_no_slave | ON      |
+------------------------------------+---------+

4、卸载半同步复制插件(不需要时)

mysql> select plugin_name,load_option from information_schema.plugins;
mysql> uninstall plugin 插件名称;

补充:mysqld重启后,需要手工启动主从同步

# service mysqld stop
# service mysqld start
# mysql -P 3310 -p
mysql> show slave status\G
Slave_IO_Running: No
Slave_SQL_Running: No

以上情况代表,mysqld重启后,主从同步也会随之关闭,需要手工开启。

mysql> start slave;

二、MHA简介

1、什么是MHA

MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司youshimaton(现就职于Facebook公司)开发,是一套优秀的作为MySQL高可用性环境下==故障切换和主从提升==的高可用软件。在MySQL故障切换过程中,MHA能做到在0~30秒之内自动完成数据库的故障切换操作,并且在进行故障切换的过程中,MHA能在==较大程度==上保证数据的一致性,以达到真正意义上的高可用。

2、MHA工作原理

  1. 当master出现故障时,通过对比slave之间I/O线程读取master上binlog的位置,选取最接近的slave做为最新的slave(latest slave)。

  2. 其它slave通过与latest slave对比==生成差异中继日志,并应用==。

  3. 在latest slave上==应用从master保存的binlog==,同时将latest slave==提升为master==。

  4. 最后在其它slave上应用相应的差异中继日志并开始从新的master开始复制.

3、MHA组件

  • MHA Manager(管理节点)

    MHA Manager可以单独部署在一台独立的机器上管理多个==master-slave集群==,也可以部署在一台slave节点上。

  • MHA Node(数据节点)

    MHA Node运行在==每台MySQL服务器==上,MHA Manager会定时探测集群中的master节点,当master出现故障时,它可以自动将数据的slave提升为新的master,然后将所有其他的slave重新指向新的master。整个故障转移过程对应用程序完全透明。

4、MHA组件介绍

  • MHA Manager

运行一些工具,比如masterha_manager工具实现==自动监控MySQL Master==和实现==master故障切换==,其它工具手动实现master故障切换、在线mater转移、连接检查等等。一个Manager可以管理多 个master-slave集群

  • MHA Node

部署在所有运行MySQL的服务器上,无论是master还是slave。主要有三个作用:

1)保存二进制日志

如果能够访问故障master,会拷贝master的二进制日志

2)应用差异中继日志

从拥有最新数据的slave上生成差异中继日志,然后应用差异日志。

3)清除中继日志

在不停止SQL线程的情况下删除中继日志

5、MHA中工具介绍

㈠ Manager工具
工具说明
==masterha_check_ssh==检查MHA的SSH配置
==masterha_check_repl==检查MySQL复制
==masterha_manager==启动MHA
==masterha_check_status==检测当前MHA运行状态
masterha_master_monitor监测master是否宕机
masterha_master_switch控制故障转移(自动或手动)
masterha_conf_host添加或删除配置的server信息
㈡ Node工具
工具说明
save_binary_logs保存和复制master的二进制日志
apply_diff_relay_logs识别差异的中继日志事件并应用于其它slave
filter_mysqlbinlog去除不必要的ROLLBACK事件(MHA已不再使用这个工具)
purge_relay_logs清除中继日志(不会阻塞SQL线程)

==注意:Node这些工具通常由MHA Manager的脚本触发,无需人手操作==。

三、MHA部署架构

1、部署规划

角色IP主机名server-id功能备注
MHA-Manager10.1.1.40mha.itcast.cn管理节点
MHA-Node(Master)10.1.1.10master.itcast.cn10数据节点
MHA-Node(Slave1)10.1.1.20slave1.itcast.cn20数据节点
MHA-Node(Slave2)10.1.1.30slave2.itcast.cn30数据节点

##2、系统和软件版本

系统版本MySQL版本MHA版本
CentOS 7.6MySQL-5.7.31mha4mysql-manager-0.57 mha4mysql-node-0.57

3、系统环境初始化

第一步:克隆机器,首先启动MASTER,然后在一次启动SLAVE1、SLAVE2以及MHA

第二步:更改计算机的主机名称

# hostnamectl set-hostname master.itcast.cn
# su

# hostnamectl set-hostname slave1.itcast.cn
# su

# hostnamectl set-hostname slave2.itcast.cn
# su

# hostnamectl set-hostname mha.itcast.cn
# su

第三步:更改IP地址以及绑定主机名称及IP地址到/etc/hosts文件

# vim /etc/sysconfig/network-scripts/ifcfg-ens33
...
IPADDR=10.1.1.10、IPADDR=10.1.1.20、IPADDR=10.1.1.30、IPADDR=10.1.1.40
...

# systemctl stop NetworkManager
# systemctl disable NetworkManager

# systemctl restart network

使用MX连接4台服务器,绑定IP地址与主机名称到/etc/hosts文件中

# vim /etc/hosts
10.1.1.10 master.itcast.cn
10.1.1.20 slave1.itcast.cn
10.1.1.30 slave2.itcast.cn
10.1.1.40 mha.itcast.cn

第四步:关闭防火墙与SELinux

# systemctl stop firewalld
# systemctl disable firewalld
# setenforce 0
# sed -i '/SELINUX=enforcing/cSELINUX=disabled' /etc/selinux/config

第五步:配置YUM源

基础源(略,建议使用腾讯源)

配置epel源

# wget -O /etc/yum.repos.d/epel.repo http://mirrors.cloud.tencent.com/repo/epel-7.repo
# yum clean all
# yum makecache

配置本地自建仓库的yum源

① 上传mha-yum软件包到/soft/mha目录

# mkdir -p /soft/mha

② 配置本地yum源,当我们使用yum时,可以自动找到mha-yum这个仓库目录

# vim /etc/yum.repos.d/local.repo
[mha]
name=mha soft
baseurl=file:///soft/mha/mha-yum
enabled=1
gpgcheck=0

测试MHA依赖软件库的安装

yum -y install perl-DBD-MySQL \
perl-Config-Tiny \
perl-Time-HiRes \
perl-Mail-Sender \
perl-Mail-Sendmail \
perl-MIME-Base32 \
perl-MIME-Charset \
perl-MIME-EncWords \
perl-Params-Classify \
perl-Params-Validate.x86_64 \
perl-Log-Dispatch \
perl-Parallel-ForkManager \
net-tools

第六步:ntpdate时间同步(非常重要)

# ntpdate 182.92.12.11

4、部署MySQL主从复制环境

数据库安装位置:/usr/local/mysql

数据库的数据目录:/usr/local/mysql/data

套接字文件:/tmp/mysql.sock

端口设置:3306

配置文件位置:/usr/local/mysql/my.cnf(MySQL => 安装目录下 => /etc目录下)

☆ MASTER主服务器

第一步:上传软件到/root目录

第二步:使用脚本安装MySQL软件

# vim mysql.sh
#!/bin/bash
yum install libaio -y
tar -xf mysql-5.7.31-linux-glibc2.12-x86_64.tar.gz
mv mysql-5.7.31-linux-glibc2.12-x86_64 /usr/local/mysql
useradd -r -s /sbin/nologin mysql
rm -rf /etc/my.cnf
cd /usr/local/mysql
mkdir mysql-files
chown mysql:mysql mysql-files
chmod 750 mysql-files
bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql &> /root/password.txt
bin/mysql_ssl_rsa_setup --datadir=/usr/local/mysql/data
cp support-files/mysql.server /etc/init.d/mysqld
service mysqld start
echo 'export PATH=$PATH:/usr/local/mysql/bin' >> /etc/profile
source /etc/profile

# source mysql.sh

第三步:设置MySQL密码

# mysql -p
mysql> set password='123';
mysql> flush privileges;

第四步:进行安全初始化

# mysql_secure_installation

第五步:编写MASTER主机中my.cnf配置文件

# vim /usr/local/mysql/my.cnf
[mysqld]
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
socket=/tmp/mysql.sock
port=3306
log-error=/usr/local/mysql/data/master.err
log-bin=/usr/local/mysql/data/binlog
server-id=10
character_set_server=utf8mb4
gtid-mode=on
log-slave-updates=1
enforce-gtid-consistency

# service mysqld restart

☆ SLAVE1/SLAVE2从服务器

第一步:上传MySQL软件到服务器端

第二步:使用脚本安装MySQL,但是不需要进行初始化

# vim mysql.sh
#!/bin/bash
yum install libaio -y
tar -xf mysql-5.7.31-linux-glibc2.12-x86_64.tar.gz
rm -rf /usr/local/mysql
mv mysql-5.7.31-linux-glibc2.12-x86_64 /usr/local/mysql
useradd -r -s /sbin/nologin mysql
rm -rf /etc/my.cnf
cd /usr/local/mysql
mkdir mysql-files
chown mysql:mysql mysql-files
chmod 750 mysql-files
cp support-files/mysql.server /etc/init.d/mysqld
echo 'export PATH=$PATH:/usr/local/mysql/bin' >> /etc/profile
source /etc/profile

# source mysql.sh

第三步:使用rsync把MASTER服务器中的data数据目录同步到SLAVE1与SLAVE2

MASTER:

# rm -rf /usr/local/mysql/data/auto.cnf
# rsync -av /usr/local/mysql/data root@10.1.1.20:/usr/local/mysql/
# rsync -av /usr/local/mysql/data root@10.1.1.30:/usr/local/mysql/

第四步:给SLAVE1与SLAVE2配置my.cnf文件

SLAVE1:

# vim /usr/local/mysql/my.cnf
[mysqld]
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
socket=/tmp/mysql.sock
port=3306
log-error=/usr/local/mysql/data/slave1.err
log-bin=/usr/local/mysql/data/binlog
relay-log=/usr/local/mysql/data/relaylog
server-id=20
character_set_server=utf8mb4
gtid-mode=on
log-slave-updates=1
enforce-gtid-consistency
skip-slave-start

SLAVE2:

# vim /usr/local/mysql/my.cnf
[mysqld]
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
socket=/tmp/mysql.sock
port=3306
log-error=/usr/local/mysql/data/slave2.err
log-bin=/usr/local/mysql/data/binlog
relay-log=/usr/local/mysql/data/relaylog
server-id=30
character_set_server=utf8mb4
gtid-mode=on
log-slave-updates=1
enforce-gtid-consistency
skip-slave-start

配置完成后,启动MySQL软件

# service mysqld restart

☆ 配置主从数据同步

第一步:在MASTER服务器中创建一个slave同步账号

mysql> create user 'slave'@'10.1.1.%' identified by '123';
mysql> grant replication slave on *.* to 'slave'@'10.1.1.%';
mysql> flush privileges;

第二步:创建一个mha账号(方便后期MHA监控主从同步状态)

mysql> create user 'mha'@'10.1.1.40' identified by '123';
mysql> grant all privileges on *.* to 'mha'@'10.1.1.40';
mysql> flush privileges;

第三步:在SLAVE1与SLAVE2中配置主从数据同步

mysql> change master to master_host='10.1.1.10',master_port=3306,master_user='slave',master_password='123',master_auto_position=1;

mysql> start slave;
mysql> show slave status\G

到此整个一主两从就配置完毕了!

5、MHA软件的安装

㈠ 不同节点安装软件

说明:在所有节点安装 ==mha-node== 软件包,在 ==mha 管理==端再安装 mha-manager 软件包

[root@mha ~]# yum –y install mha4mysql-node-0.57-0.el7.noarch.rpm
[root@master ~]# yum –y install mha4mysql-node-0.57-0.el7.noarch.rpm
[root@slave1 ~]# yum -y install mha4mysql-node-0.57-0.el7.noarch.rpm
[root@slave2 ~]# yum –y install mha4mysql-node-0.57-0.el7.noarch.rpm

[root@mha ~]# yum –y install mha4mysql-manager-0.57-0.el7.noarch.rpm

如果已经提前安装依赖软件,则大家可以使用rpm -ivh直接安装

㈡ 配置ssh互信(免密登录)

说明:

  1. 在生产环境中几乎都是禁止root远程登陆服务器的,所以ssh免密码登陆要在admin用户下进行配置,这是处于安全角度考虑出发。

  2. admin用户可以是任意普通用户

  3. 该普通用户用于mha的管理节点远程访问mysql复制组中的所有主机,完成一些其他工作

第一步:在所有机器上创建一个普通账号admin,密码123

# useradd admin
# echo 123|passwd --stdin admin

第二步:配置mha主机到其他主机的admin用户互信

mha端:
[root@mha ~]# su - admin
[admin@mha ~]$ ssh-keygen -P "" -f ~/.ssh/id_rsa
[admin@mha ~]$ cd .ssh/
[admin@mha .ssh]$ ls
id_rsa  id_rsa.pub
[admin@mha .ssh]$ mv id_rsa.pub authorized_keys
[admin@mha .ssh]$ for i in 10 20 30;do scp -r ../.ssh/ 10.1.1.$i:~/;done

测试免密登录:
[admin@mha .ssh]$ ssh 10.1.1.10
[admin@mha .ssh]$ ssh 10.1.1.20
[admin@mha .ssh]$ ssh 10.1.1.30

疑问:SSH免密只需要拷贝公钥,但是以上代码是把整个.ssh目录拷贝过去了。

答:因为MHA的互信,要求不仅仅是MHA免密到MASTER、SLAVE1、SLAVE2,MASTER也要免密到MHA、SLAVE1、SLAVE2...

㈢ 配置admin用户的sudo权限

MASTER主机上:

[root@master ~]# vim /etc/sudoers.d/admin
#User_Alias  表示具有sudo权限的用户列表; Host_Alias表示主机的列表
User_Alias MYSQL_USERS = admin
#Runas_Alias  表示用户以什么身份登录
Runas_Alias MYSQL_RUNAS = root
#Cmnd_Alias  表示允许执行命令的列表(命令需要使用完整路径)
Cmnd_Alias MYSQL_CMNDS = /sbin/ifconfig,/sbin/arping
MYSQL_USERS ALL = (MYSQL_RUNAS) NOPASSWD: MYSQL_CMNDS

把这个权限分发给SLAVE1与SLAVE2一份(当故障发生时,从服务器也可以自己设置VIP)

[root@master ~]# for i in 20 30;do scp /etc/sudoers.d/admin 10.1.1.$i:/etc/sudoers.d/;done

测试admin用户是否可以挂载VIP(只能在MASTER机器上挂载VIP)

# su - admin
[admin@master ~]$ sudo /sbin/ifconfig ens33:1 10.1.1.100 broadcast 10.1.1.255 netmask 255.255.255.0
[admin@master ~]$ sudo /sbin/arping -fqc 5 -w 5 -I ens33 -s 10.1.1.100 -U 10.1.1.10
[admin@master ~]$ ip a 

补充:
arping:用来向局域网内的其它主机发送ARP请求的指令,可以用来测试局域网内的某个IP是否已被使用。

-f:收到第一个响应包后退出。
-q:quite模式,不显示输出。 
-c:发送指定的count个ARP REQUEST包后停止。如果指定了-w参数,则会等待相同数量的ARP REPLY包,直到超时为止。
-w:指定一个超时时间,单位为秒,arping在到达指定时间后退出,无论期间发送或接收了多少包。在这种情况下,arping在发送完指定的count(-c)个包后并不会停止,而是等待到超时或发送的count个包都进行了回应后才会退出。 
-I:指定设备名,用来发送ARP REQUEST包的网络设备的名称。
-D:重复地址探测模式,用来检测有没有IP地址冲突,如果没有IP冲突则返回0。 
-s:设置发送ARP包的IP资源地址
-U:无理由的(强制的)ARP模式去更新别的主机上的ARP CACHE列表中的本机的信息,不需要响应。
-h:显示帮助页。 

㈣ 创建mha相关配置文件

MHA服务器:创建工作目录

[root@mha ~]# mkdir /etc/mha/
[root@mha ~]# mkdir -p /data/mha/masterha/app1
[root@mha ~]# chown -R admin. /data/mha

创建mha局部配置文件:

[root@mha ~]# vim /etc/mha/app1.conf
[server default]
# 设置监控用户和密码(修改1)
user=mha
password=123
# 设置复制环境中的复制用户和密码(修改2)
repl_user=slave
repl_password=123
# 设置ssh的登录用户名(修改3)
ssh_user=admin
# 设置监控主库,发送ping包的时间间隔,默认是3秒,尝试三次没有回应的时候自动进行failover
ping_interval=3
# 设置mgr的工作目录
manager_workdir=/data/mha/masterha/app1
# 设置mysql master保存binlog的目录,以便MHA可以找到master的二进制日志(修改4)
master_binlog_dir=/usr/local/mysql/data
# 设置master的pid文件(修改5)
master_pid_file=/usr/local/mysql/data/master.itcast.cn.pid
# 设置mysql master在发生切换时保存binlog的目录(在mysql master上创建这个目录)
remote_workdir=/data/mysql/mha
# 设置mgr日志文件(MHA遇到问题,主要看这个日志)
manager_log=/data/mha/masterha/app1/app1-3306.log
# MHA到master的监控之间出现问题,MHA Manager将会尝试从slave1和slave2登录到master上
secondary_check_script=/usr/bin/masterha_secondary_check -s 10.1.1.20 -s 10.1.1.30 --user=admin --port=22 --master_host=10.1.1.10 --master_port=3306
# 设置自动failover时候的切换脚本(故障发生时,自动挂载VIP到SLAVE1或SLAVE2)
master_ip_failover_script="/etc/mha/master_ip_failover.sh 10.1.1.100 1"
# 设置手动切换时候的切换脚本
#master_ip_online_change_script="/etc/mha/master_ip_online_change.sh 10.1.1.100 1"
# 设置故障发生后关闭故障主机脚本
# shutdown_script="/etc/mha/power_manager"
[server1]
hostname=10.1.1.10
port= 3306
candidate_master=1
[server2]
hostname=10.1.1.20
port= 3306
candidate_master=1
[server3]
hostname=10.1.1.30
port= 3306
candidate_master=1

㈤ 上传相应脚本/etc/mha目录,然后更改配置信息,授权

[root@mha ~]# ls /etc/mha/
app1.conf  master_ip_failover.sh
注意:脚本内容中要修改网卡名字和连接用户为admin
my $vip  = shift;
my $interface = 'ens33';		网卡名(38行)
my $key = shift;
...
sub stop_vip() {
    my $ssh_user = "admin";		用户名(110行)
    print "=======$ssh_stop_vip==================\n";
    `ssh $ssh_user\@$orig_master_host \" $ssh_stop_vip \"`;
}

[root@mha ~]# chmod +x /etc/mha/master_ip_*

6、检测SSH互信以及MySQL主从状态

MHA:

# su - admin
# 检测SSH互信
[admin@mha ~]$ masterha_check_ssh --conf=/etc/mha/app1.conf
# 检测集群状态
[admin@mha ~]$ masterha_check_repl --conf=/etc/mha/app1.conf

7、检查MHA状态,然后运行MHA(监控开始)

MHA:

[admin@mha ~]$ masterha_check_status --conf=/etc/mha/app1.conf
app1 is stopped(2:NOT_RUNNING).

开启MHA Manager监控(关键,代表启动MHA):
[admin@mha ~]$ nohup masterha_manager --conf=/etc/mha/app1.conf --remove_dead_master_conf --ignore_last_failover &

再次查看监控状态:
[admin@mha ~]$ masterha_check_status --conf=/etc/mha/app1.conf
app1 (pid:8913) is running(0:PING_OK), master:10.1.1.10


注意:
1. 如果正常,会显示”PING_OK ”,否则会显示”NOT_RUNNING ”,说明 MHA监控没有开启
2. 使用admin用户启动监控,否则会报权限拒绝
3. 手动停止监控命令:masterha_stop --conf=/etc/mha/app1.conf

其实到此,咱们MHA就已经配置完毕了!

四、自动Failover测试

1、在MASTER服务器安装测试工具

[root@master ~]# yum -y install sysbench

2、插入测试数据

master服务器上创建测试库test
mysql> create database test charset utf8mb4;
Query OK, 1 row affected (0.17 sec)

mysql> grant all on *.* to 'mha'@'localhost' identified by '123'; 
Query OK, 0 rows affected (0.14 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.11 sec)

mysql> exit
Bye



[root@master ~]# sysbench /usr/share/sysbench/oltp_read_only.lua \
 --mysql-host=10.1.1.10  --mysql-port=3306  --mysql-user=mha \
 --mysql-password=123  --mysql-socket=/tmp/mysql.sock \
 --mysql-db=test  --db-driver=mysql  --tables=1 \
 --table-size=100000 --report-interval=10 --threads=128 --time=120 prepare
 
mysql> select count(*) from sbtest1;
+----------+
| count(*) |
+----------+
|   100000 |
+----------+
1 row in set (0.01 sec)

3、拍摄快照

MHA、MASTER、SLAVE1、SLAVE2

4、模拟MASTER服务器故障

MHA服务器:监控日志

[root@mgr ~]# tail -f /data/mha/masterha/app1/app1-3306.log

MASTER服务器:

# service mysqld stop

MHA日志显示结果:

故障切换:

VIP漂移:

常见问题

###1、管理节点配置文件错误

[root@mgr ~]# cat /etc/mha/app1.conf
[server default]
# 设置监控用户和密码,该用户是master上创建的数据库管理账号,拥有所有权限
user=mha
password=123
# 设置复制环境中的复制用户和密码,注意需要有以下权限:
#REPLICATION SLAVE和REPLICATION CLIENT
repl_user=slave
repl_password=123
# 设置ssh的登录用户名
ssh_user=admin
....
[server1]
hostname=10.1.1.10
port= 3306
candidate_master=1
[server2]
hostname=10.1.1.20
port= 3306
candidate_master=1
[server3]
hostname=10.1.1.30
port= 3306
candidate_master=1
注意:一定要配置正确的IP和端口号

2、配置MHA时数据只读设置

解决办法:设置从服务器为只读

mysql> set @@global.read_only=1;
Query OK, 0 rows affected (0.00 sec)

mysql> show variables like 'read_only';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| read_only     | ON    |
+---------------+-------+
1 row in set (0.00 sec)

3、复制用户权限密码错误

原因:

  1. 复制用户slave没有相关权限,REPLICATION SLAVE和==REPLICATION CLIENT==

  2. 从服务器没有创建复制用户

###4、其他错误

MHA集群至少需要2个slave,所以如果只有一台slave的话,检查也是通不过的!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/205058.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

np.random.uniform() 采样得到的是一个高维立方体,而不是球体,为什么?

在代码中,采样是通过以下方式完成的: samples self.center np.random.uniform(-self.radius, self.radius, (num_samples, len(self.center))) 这里,np.random.uniform函数在每个维度独立地生成了一个介于-self.radius和self.radius之间的…

掌握Python BentoML:构建、部署和管理机器学习模型

更多资料获取 📚 个人网站:ipengtao.com BentoML是一个开源的Python框架,旨在简化机器学习模型的打包、部署和管理。本文将深入介绍BentoML的功能和用法,提供详细的示例代码和解释,帮助你更好地理解和应用这个强大的工…

ssm的鲜花销售系统(有报告)。Javaee项目。

演示视频: ssm的鲜花销售系统(有报告)。Javaee项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构,通过Spring SpringMvc Mybatis…

springboot 2.x集成h2数据库

1.引入pom.xml <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency><groupId>com.h2database</groupId><artifactId>h2<…

pythonselenium自动化测试实战项目

说明&#xff1a;本项目采用流程控制思想&#xff0c;未引用unittest&pytest等单元测试框架 一.项目介绍 目的 测试某官方网站登录功能模块可以正常使用 用例 1.输入格式正确的用户名和正确的密码&#xff0c;验证是否登录成功&#xff1b; 2.输入格式正确的用户名和不…

机械臂仿真之vrep如添加视觉传感器

基于视觉的机械臂作业任务&#xff0c;如何在vrep中加入视觉传感器&#xff0c;并获取画面&#xff1f;

AIGC(生成式AI)试用 14 -- 画画

AIGC&#xff0c;内容生成&#xff0c;多多少少都可以达成&#xff0c;好与坏就看你如何引导、如何生成。 画画&#xff1f;本不想让写文本的去生成图片&#xff0c;但忍不住诱惑&#xff0c;小试一把&#xff0c;毕竟文档也是会要个插图的。 CSDN创作助手显然为文字生成而…

【LeetCode刷题笔记】160.相交链表

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; 更多算法知识专栏&#xff1a;算法分析&#x1f525; 给大家跳段街舞感谢…

PLC:200smart(13-16章)

PLC&#xff1a;200smart 第十三章2、带参子程序3、将子程序设置成库文件 第十三章 项目ValueValue主程序MAIN一个项目只能有一个&#xff0c;循环扫描子程序SBR_0项目中最多有128个&#xff0c;只有在调用时 才执行&#xff08;子程序可以嵌套其他子程序&#xff0c;最多八层…

【vue实战项目】通用管理系统:信息列表,信息录入

本文为博主的vue实战小项目系列中的第六篇&#xff0c;很适合后端或者才入门的小伙伴看&#xff0c;一个前端项目从0到1的保姆级教学。前面的内容&#xff1a; 【vue实战项目】通用管理系统&#xff1a;登录页-CSDN博客 【vue实战项目】通用管理系统&#xff1a;封装token操作…

JDK 动态代理从入门到掌握

快速入门 本文介绍 JDK 实现的动态代理及其原理&#xff0c;通过 ProxyGenerator 生成的动态代理类字节码文件 环境要求 要求原因JDK 8 及以下在 JDK 9 之后无法使用直接调用 ProxyGenerator 中的方法&#xff0c;不便于将动态代理类对应的字节码文件输出lombok为了使用 Sne…

Linux:docker的网络通信(7)

1.端口映射 端口映射---端口映射机制将容器内的服务提供给外部网络访问 启动容器时&#xff0c;不指定对应的端口&#xff0c;在容器外无法通过网络访问容器内的服务 可随机或指定映射端口范围 -P ---------大写P&#xff0c;开启随机端口 -p 宿主机端口&#xff1a;容器端口…

【java扫盲贴】final修饰变量

引用类型&#xff1a;地址不可变 //Java中的引用类型分为类&#xff08;class&#xff09;、接口&#xff08;interface&#xff09;、数组&#xff08;array&#xff09;和枚举&#xff08;enum&#xff09;。//string是特殊的引用类型&#xff0c;他的底层是被final修饰的字…

Python下利用Selenium获取动态页面数据

利用python爬取网站数据非常便捷&#xff0c;效率非常高&#xff0c;但是常用的一般都是使用BeautifSoup、requests搭配组合抓取静态页面&#xff08;即网页上显示的数据都可以在html源码中找到&#xff0c;而不是网站通过js或者ajax异步加载的&#xff09;&#xff0c;这种类型…

【排序,直接插入排序 折半插入排序 希尔插入排序】

文章目录 排序排序方法的分类插入排序直接插入排序折半插入排序希尔插入排序 排序 将一组杂乱无章的数据按照一定规律排列起来。将无序序列排成一个有序序列。 排序方法的分类 储存介质&#xff1a; 内部排序&#xff1a;数据量不大&#xff0c;数据在内存&#xff0c;无需…

学习笔记-接口测试(postman、jmeter)

一、什么是接口测试 通常做的接口测试指的是系统对外的接口&#xff0c;比如你需要从别的系统来获取到或者同步资源与信息&#xff0c;他们会提供给你一个写好的接口方法供你调用&#xff0c;比如常用的app&#xff0c;用户同步这些在处理数据的时候需要通过接口进行调用。 w…

一文讲透Python函数中的局部变量和全局变量

变量的作用域就是变量能够发挥作用的区域&#xff0c;超出既定区域后就无法发挥作用。根据变量的作用域可以将变量分为局部变量和全局变量。 1.局部变量 局部变量是在函数内部定义并使用的变量&#xff0c;也就是说只有在函数内部&#xff0c;在函数运行时才会有效&#xff0…

Flask SocketIO 实现动态绘图

Flask-SocketIO 是基于 Flask 的一个扩展&#xff0c;用于简化在 Flask 应用中集成 WebSocket 功能。WebSocket 是一种在客户端和服务器之间实现实时双向通信的协议&#xff0c;常用于实现实时性要求较高的应用&#xff0c;如聊天应用、实时通知等&#xff0c;使得开发者可以更…

#zookeeper集群+kafka集群

kafka3.0之前是依赖于zookeeper的。 zookeeper是开源&#xff0c;分布式的架构。提供协调服务&#xff08;Apache项目&#xff09; 基于观察者模式涉及的分布式服务管理架构。 存储和管理数据。分布式节点上的服务接受观察者的注册。一旦分布式节点上的数据发生变化&#xf…

【Linux学习】文件描述符重定向缓冲区

目录 九.文件描述符 9.1 文件描述符概念 9.2 文件描述符的分配规则 9.3 重定向 9.3.1 常见的重定向操作 9.3.2 重定向的原理 9.4 缓冲区 9.4.1 缓冲区概念 9.4.2 缓冲区刷新策略 9.4.3 C语言的缓冲区在哪里? 九.文件描述符 9.1 文件描述符概念 在上一篇讲到基础IO时,我们说到…