mha

 

准备

 

 

内存修改

主节点不涉及重启,在线修改+修改my.cnf,不需要重启。

从节点配置过程中需要重启,直接修改my.cnf,重启。

 

ssh 公钥互信准备

 

 

ssh连接调过keys处理

  • 添加公钥后,将服务器上与私钥同名的公钥删除掉,否则将在检查时将本地同名和公钥发送导致无法连接。

 

提前修改主机名

因为修改主机名会导致服务不能正常停止,可参考管理文档shutdown.md

 

 

 

创建主从

参考Percona\innobackupex.md

 

创建管理用户

过程:

  • 先在主节点创建专用用户,然后备份并恢复到从节点时从节点即不用再次创建。
  • 从innobackupex备份的日志中找到事务执行进度位置【备用】,不要从1或0开始。
  • 恢复启动slave节点。change master
  • start slave;

 

 

 

 

 

 

 

 

 

 

备份恢复数据库到从节点

xtrabackup

修改从节点参数

  • read_only = on 更多详见【2.只读的说明】,只需要将此参数添加到my.cnf
  • report_host
  • port 可以不一致
  • innodb_buffer_pool_size内存,只需要将此参数添加到my.cnf
  • server_id

 

开始同步

 

 

 

 

slave节点设置

 

Slave上的relay_log配置

MHA Failover的过程中可以了解到,MHA Manager在恢复(补齐)其他Slave数据时会用到relay-log,因此这些relay-log需要被保留。

而默认情况下,SQL线程在回放完毕后,MySQL会主动删除relay-log,需要禁用该功能,确保relay-log不被自动删除。

所有Slave节点中配置如下参数,然后重启mysql服务即可。

 

mha主配置文件与检测

 

  • 安装mha4mysql manager node包
  • 配置vip

 

mha perl

需要在节点服务器执行

配置vip

确认mha 工具包中脚本默认路径及检测

 

 

mha check 问题处理

 

配置supervisor

/etc/supervisor.conf

mha启动调整为通过supervisord监控实现。

注意:将引用/usr/bin/masterha_manager,注意修改路径,否则启动不了。

配置2

binlog_backup_app1.sh

 

supervisor服务配置

supervisorctl使用帮助,

mha_manager的工作是实现主从的切换,但是完成mysql的主从切换之后,进程mha_manager自动退出,将不再监控。如果只是2个节点(1主一从)倒是也没必要留着这个进程,但如果用在3个及以上节点时,再次的切换主从将无法实现,故引入了supervisord服务来使进程mha_manager重生。注:supervisord是一个监控nohub的很好的方案,不仅可以用在mha_manager的后台执行上。

supervisord

是服务进程

supervisordctl

是进程管理命令(执行后,exit退出),就像systemd一样,可以将加入到/etc/supervisord.conf 主配置文件中的进程进行实时的start、stop、restart、status操作。管理方式 是操作+服务名

 

 

supervisord日志查看

supervisord只是一个脚本后台自动化监控系统,本质上是调用mha4mysql工具中的/usr/bin/masterha_manager,所以真正的日志是/usr/bin/masterha_manager输出到日志中的。

即为配置文件中的

由于mha_health_check需要检测此日志文件,所有一定要查看日志输出

下面是手动安装supervisord的操作

 

 

问题处理

[root@mhamanamger ~]# supervisorctl -c /etc/supervisord.conf 由于是默认路径,可以直接用命令不加参数 unix:///var/run/supervisor.sock no such file # 是因为服务未启动,服务启动与监控的进程是否有效是无关的。 supervisor> status unix:///var/run/supervisor.sock no such file

mha_healthy_check

检查项目涉及supervisor/mha状态。

修改脚本 中的master节点名称,即可。

 

 

脚本

/root/mha_health_check.sh

  • 注意修改其中的参数:

SSH_USER="root" SSH_PORT="22" MYSQL_USER="root" MYSQL_PASSWORD="yourmysqlpassword" # root密码 MYSQL_PORT="3506" MASTER_HOST="master" #hostname mha_conf="app1"

 

 

 

只读的说明

只读(锁库锁表解锁)

https://www.linuxidc.com/Linux/2017-09/146661.htm

  • 首先只读可以从用户权限上设置,直接设置为普通用户,使用其只读

在主从中,我们设置从库只读: 1、如果只是打开read_only=on 在从库上启用确保只接受来自主库的更新,不接受来自客户端的更新。但是不能保证连到从库具有super权限误写数据。 2、mysql 5.7.8开始支持super_read_only参数,如果super_read_only=on,在从库直接受来自主库的更新,连接到从库的含有super用户权限也不能更新,确保从库不被写如异常数据。

如果设置了super_read_only =on ,那么默认的read_only 也设置为on,如果再设置super_read_only =off,此时read_only 还是on,如果主从角色发生变化注意read_only也设置为off。

  • 日常维护: 主库可读写 从库只读

  • 从库只读的两种选择:以下参数可放入my.cnf

    1、read_only = on; 2、read_only = on; super_read_only = on;

区别是如果从库也设置了super_read_only=on,可很好确保了从库不被误写数据,即便是变更时候,不小心在从库执行了super权限用户语句也会失败,不会造成主从不一致。

那么我们的从库是否一定要设置为super_read_only = on 吗?

  • 看不同的架构: 传统的主从,建议从库也设置super_read_only=on防止应用用户高权在从库写如数据,也防止变更的时候在从库误写数据。 如果是分布式架构,涉及到了专门的管理agent负责对db节点切换,那么还是不能设置为super_read_only=on,但是相关应用等不负责切换的用户务必不能具备super权限。 mgr架构,mgr内部会自动为从库设置为super_read_only=on。

从库重启后维护: 如果传统主从架构,遇到宿主机宕机虚拟机漂移后启动数据库,还是从库本身是物理机异常宕机,还是从库计划内升级系统补丁等操作重启后建议显示把从库设置为super_read_only=on只读。 如果是分布式,建议启动管理agent由管理的agent负责把从节点加入主库并且把从库设置为read_only=on。

其他问题: 如果使用nbu备份,备份策略是从库,由于备份用户需要super权限,需要在备份时候先把super_read_only=off备份结束后设置super_read_only=on。

 

innodb_read_only

在mysql 5.7中,只对innodb引擎的库表启作用,在8.0版本中也对MysqlIAM起作用。属于更底层的限制。

https://dev.mysql.com/doc/refman/5.7/en/innodb-read-only-instance.html

启动server 在read-only模式。对于分布在数据库应用或者数据设置为只读介质。

也可以用于数据仓库共享相同的数据目录在多个实例之间。

transaction_read_only(tx_read_only )

作用层面:事务

参数 tx_read_only 或者 transaction_read_only 用于设置事务的访问模式,可设置为 OFF/ON,默认值为 OFF,表示事务可读,可写,设置为 ON 表示事务只读,不可写。

transaction_read_only 参数在 5.7.20 版本引入,tx_read_only 参数在 8.0.3 版本被移除,这两个参数意义完全一样,只是名称不同,transaction_read_only 名称更加规范,在高版本 MySQL 中,建议使用 transaction_read_only。

该参数可以在全局范围内设置,也可以在 session 级设置,在全局范围内设置该参数后,对于已有的连接并不会生效,因为已有连接的 session 级参数仍然保持原样,因此需要杀掉已有连接,让应用重新建立连接,以便使该参数对所有连接生效。

如果设置 transaction_read_only 为 ON,此时向表中写入数据,会产生报错,如下: ERROR 1792 (25006): Cannot execute statement in a READ ONLY transaction.

 

锁定

 

解锁

 

主从问题处理

 

errno 1062

 

 

errno 1032断电导致数据同步问题

报错

如下

 

#按提示定位到表:edc_data_3.qrtz_scheduler_state,从库表中数据与主库不一致:

 

处理方案

清空从库表,或找到不同的地方:直接修改从库或将从库表清空,将主库备份的表还原或插入到从库表中。

但此断电影响的不同步多由于数据未即时写入binlog,出现时也一般会有多个位置未未同步,如果执行几个之后,还是不断有此种新的问题出现,可以直接将主库备份,还原到从库,重建主从关系。

 

备份表的命令:

注意:不加-d时导出sql,加-d时导出表结构。然后将其中的表insert语句复制出来即可。

 

 

确认数据一致1236

比如是恢复的数据库,还是提示不一致时,可以直接跳过

解决mysql开启GTID主从同步出现1236错误问题

https://blog.51cto.com/hnr520/1883282

 

1236问题过程

 

一致性检测

 

 

MHA

 

master_ip_failover

相关脚本

/etc/masterha/app1.conf

masterha/app1.conf

 

日志

状态查看

 

 

问题处理

 

主从同步问题处理