mycat读写分离 | MHA高可用

1、mycat部署

1.1 mycat安装目录结构说明

  • bin :mycat命令,启动、重启、停止等运行目录
  • catlet: catlet为Mycat的一个扩展功能
  • conf :mycat 配置信息,重点关注
  • lib:mycat引用的jar包,Mycat是java开发的
  • logs日志文件,包括Mycat启动的日志和运行的日志
  • version.txt :mycat版本说明

1.2 Mycat的常用配置文件

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

  • server.xml :Mycat软件本身相关的配置文件,设置账号、参数等
  • schema.xml:Mycat对应的物理数据库和数据库表的配置,读写分离、高可用、分布式策略定制、节点控制
  • rule.xml:Mycat分片(分库分表)规则配置文件,记录分片规则列表、使用方法等

1.3 Mycat日志

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

  • wrapper.log :mycat启动日志
  • mycat.log :mycat详细工作日志

1.4 mycat 读写分离实验

1.环境准备

注意:mycat服务器上不能安装mysql

服务器 地址
master服务器(mysql) 192.168.125.130
slave服务器(mysql) 192.168.125.150
mycat服务器 192.168.125.160
客户机(mysql) 192.168.125.100

2.关闭防火墙

arduino 复制代码
 systemctl stop firewalld
 setenforce 0

3.部署主从复制

  • 主mysql服务器配置(192.168.125.130)
js 复制代码
 [root@localhost ~]#vim  /etc/my.cnf
 #修改文件
 [mysqld]
 server_id=130
 log-bin=/data/mysql/mysql-bin
 ​
 [root@localhost ~]#mkdir /data/mysql/   -p
 #建立文件夹
 [root@localhost ~]#chown mysql.mysql /data/ -R
 #注意修改权限
 [root@localhost ~]#systemctl restart mysqld
 ​
 mysql -uroot -pabc123
 ​
 show master status;
 #查看二进制日志位置
 ​
 ​
 grant replication slave on *.* to test@'192.168.125.%' identified by 'Admin@123';
 #建立复制用户
 ​
 show processlist;
 #查看线程
  • 从mysql服务器配置(192.168.125.150)
js 复制代码
 [root@localhost ~]#vim  /etc/my.cnf
 #修改文件
 [mysqld]
 server_id=150
 log-bin=/data/mysql/mysql-bin
 ​
 ​
 [root@localhost ~]#mkdir /data/mysql/   -p
 #建立文件夹
 [root@localhost ~]#chown mysql.mysql /data/ -R
 #注意修改权限
 [root@localhost ~]#systemctl restart mysqld
 ​
 mysql -uroot -pabc123
 ​
 CHANGE MASTER TO
   MASTER_HOST='192.168.125.130',
   MASTER_USER='test',
   MASTER_PASSWORD='Admin@123',
   MASTER_PORT=3306,
   MASTER_LOG_FILE='mysql-bin.000001',
   MASTER_LOG_POS=154;
   注意最后分号
 ​
 ​
 start slave;
 #开启线程,开启主从复制
 ​
 show slave status\G;
 #查看设置的状态
 Seconds_Behind_Master: NULL    #目前数据差
  • 主从复制验证
js 复制代码
 `验证1:`
 create database cxk;
 #在主节点上建立数据测试
 ​
 `验证2:`
 ***********master服务器加载hellodb文件,并在从服务器上验证主从同步 **********
 ​
 #在主服务器上下载hellodb库文件,source后面加绝对路径
 [root@localhost ~]#mysql -uroot -pAdmin@123
 #下载hellodb库文件
 source hellodb_innodb.sql
 show databases;
 +--------------------+
 | Database           |
 +--------------------+
 | information_schema |
 | hellodb            |
 | mysql              |
 | performance_schema |
 | sys                |
 +--------------------+
 ​
 #在从库中查看库文件hellodb是否已经同步
 show databases;
 +--------------------+
 | Database           |
 +--------------------+
 | information_schema |
 | hellodb            |
 | mysql              |
 | performance_schema |
 | sys                |
 +--------------------+

4.安装mycat

(192.168.125.160)

mycat是基于java,非常耗内存,内存小于2G 起不来。

js 复制代码
 systemctl stop firewalld
 setenforce 0
 (1)主机上安装java(mycat基于java)
 #yum安装java
 [root@localhost ~]#yum install java -y
 #确认安装成功
 [root@localhost ~]#java -version
 openjdk version "1.8.0_131"
 OpenJDK Runtime Environment (build 1.8.0_131-b12)
 OpenJDK 64-Bit Server VM (build 25.131-b12, mixed mode)
 ​
 ​
 (2)切换至opt目录,下载mycat安装包
 [root@localhost ~]#cd /opt
 [root@localhost ~]#wget http://dl.mycat.org.cn/1.6.7.6/20210303094759/Mycat-server-1.6.7.6-release-20210303094759-linux.tar.gz   //已有安装包,可以省略!!!
 ​
 (3)创建/apps文件夹,并解压mycat包至/apps下
 [root@localhost ~]#mkdir /apps
 [root@localhost ~]#tar zxvf Mycat-server-1.6.7.4-release-20200105164103-linux.tar.gz -C /apps/
 ​
 (4)设置变量环境
 [root@localhost ~]#echo 'PATH=/apps/mycat/bin:$PATH' > /etc/profile.d/mycat.sh
 [root@localhost ~]#source /etc/profile.d/mycat.sh
 [root@localhost ~]#. /etc/profile.d/mycat.sh    //同上
 (5)启动mycat,过几秒钟可以查看启动成功,查看日志文件
 [root@localhost ~]#mycat start
 #注意内存小于2G 起不来
 Starting Mycat-server...
 ​
 [root@localhost ~]#mycat status
 ​
 [root@localhost ~]#tail -f /apps/mycat/logs/wrapper.log
 #启动成功日志末尾会出现successfully

错误案例:mycat能正常启动,但是查看日志时报错,如何解决?

  • 问题详情:

  • 解决方法:修改配置文件

js 复制代码
 [root@localhost ~]#vim ...../mycat/conf/wrapper.conf   //编辑配置文件,替换成自己的路径
 wrapper.startup.timeout=300         //设置超时时间为300秒,如果没有该项就自行添加!
 [root@localhost ~]#mycat restart                //重启!注意Mycat的重启方式与一般软件不同
 [root@localhost ~]#tail -f /apps/mycat/logs/wrapper.log
 STATUS | wrapper  | 2021/12/09 21:04:10 | --> Wrapper Started as Daemon
 STATUS | wrapper  | 2021/12/09 21:04:10 | Launching a JVM...
 INFO   | jvm 1    | 2024/07/06 13:58:21 | Wrapper (Version 3.2.3) http://wrapper.tanukisoftware.org
 INFO   | jvm 1    | 2024/07/06 13:58:21 |   Copyright 1999-2006 Tanuki Software, Inc.  All Rights Reserved.
 INFO   | jvm 1    | 2024/07/06 13:58:21 | 
 INFO   | jvm 1    | 2024/07/06 13:59:03 | MyCAT Server startup successfully. see logs in logs/mycat.log  //出现successfully即为成功!

5.客户端连接mycat

(192.168.125.100)

js 复制代码
 (6)客户端连接数据库
 #这里密码初始为123456   需要加端口
 [root@localhost bin]# mysql -uroot -p -h192.168.125.160 -P8066     //系统会提示 不要在命令行中输密码
 Enter password: 123456
 ​
 mysql> show databases;     //查看数据库,会看到一个虚拟的数据库testdb
 +----------+
 | DATABASE |
 +----------+
 | TESTDB   |
 +----------+
 1 row in set (0.00 sec)

6.修改 mycat 配置文件 server.xml

js 复制代码
 [root@localhost ~]#cp -a server.xml server.xml.bak    //要改的内容比较多,手残党注意备份!!!
 [root@localhost ~]#vim /apps/mycat/conf/server.xml
 <property name="serverPort">3306</property> <property name="managerPort">9066</property>   //修改45行端口号
 <property name="idleTimeout">300000</property> <property name="bindIp">0.0.0.0</property>
 <property name="dataNodeIdleCheckPeriod">300000</property>
 <property name="frontWriteQueueSize">4096</property> <property name="processors">32</property>
 [root@localhost ~]#mycat restart     //改完配置重启
 [root@localhost ~]#mycat status      //查看运行状态
js 复制代码
 *****参数解释说明*****
 // 配置Mycat的连接信息(账号密码),在110 和111行,可以修改,也可以继续使用默认的
 110         <user name="root" defaultAccount="true">
 111                 <property name="password">123456</property>
 112                 <property name="schemas">TESTDB</property>
 113                 <property name="defaultSchema">TESTDB</property>
 ​
 116                 <!-- 表级 DML 权限设置 -->
 117                 <!-- 
 118                 <privileges check="false">
 119                         <schema name="TESTDB" dml="0110" >
 120                                 <table name="tb01" dml="0000"></table>
 121                                 <table name="tb02" dml="1111"></table>
 122                         </schema>
 123                 </privileges>   
 124                  -->
 ​
 127         <user name="user">
 128                 <property name="password">user</property>
 129                 <property name="schemas">TESTDB</property>
 130                 <property name="readOnly">true</property>
 131                 <property name="defaultSchema">TESTDB</property>
 ​
 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文件中定义多个对应的库!

7.设置读写分离 schema.xml

schema.xml是最主要的配置项,此文件关联mysql读写分离策略,读写分离、分库分表策略、分片节点都是在此文件中配置的.MyCat作为中间件,它只是一个代理,本身并不进行数据存储,需要连接后端的MySQL物理服务器,此文件就是用来连接MySQL服务器的。

js 复制代码
 [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.59.113:3306" user="root" password="123456">
                 #host:用于标识不同实例,一般 writeHost 我们使用*M1,readHost 我们用*S1。
                 #url:后端实例连接地址。Native:地址:端口 JDBC:jdbc的url
                 #user:后端存储实例需要的用户名字
                 #password:后端存储实例需要的密码
                  <readHost host="host2" url="192.168.59.112: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
js 复制代码
 <?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.125.130:3306" user="root" password="Admin@123">
                  <readHost host="host2" url="192.168.125.150:3306" user="root" password="Admin@123"/>
                 </writeHost>
         </dataHost>
 </mycat:schema>

8. 主、从服务器 授权

(192.168.125.130、192.168.125.150)

js 复制代码
 [root@localhost ~]#mysql -uroot -pabc123
 ##授权、新建用户
 GRANT ALL ON *.* TO 'root'@'192.168.125.%' IDENTIFIED BY 'Admin@123';
 ​
 ##查看user表中的用户信息
 select user,host from mysql.user;

9.主、从服务器打开通用日志

(192.168.125.130、192.168.125.150)

js 复制代码
 [root@localhost ~]#mysql -uroot -pabc123
 (1)打开通用日志
 mysql> set global general_log=1;
 ​
 (2)查看通用查询日志是否开启
 mysql> show variables like 'general%';
 +------------------+------------------------+
 | Variable_name    | Value                  |
 +------------------+------------------------+
 | general_log      | ON                     |
 | general_log_file | /var/lib/mysql/7-5.log |
 +------------------+------------------------+
 ​
 ​
 (3)在主从服务器上实时查看通用日志
 [root@localhost ~]#tail -f /var/lib/mysql/7-5.log

10.客户端测试读写分离

js 复制代码
 [root@7-1 ~]#  mysql -uroot -p -h 192.168.125.160    //客户端登录Mycat服务器
 Enter password: 123456
 ​
 ​
 mysql> show databases;       //只能看到虚拟数据库testdb
 +----------+
 | DATABASE |
 +----------+
 | TESTDB   |
 +----------+
 ​
 ​
 mysql> select * from teachers;         //但客户端能看到真实数据库的内容
 +-----+---------------+-----+--------+
 | TID | Name          | Age | Gender |
 +-----+---------------+-----+--------+
 |   1 | Song Jiang    |  45 | M      |
 |   2 | Zhang Sanfeng |  94 | M      |
 |   3 | Miejue Shitai |  77 | F      |
 |   4 | Lin Chaoying  |  93 | F      |
 +-----+---------------+-----+--------+
 ​
 ​
 mysql> select @@server_id;      //查看当前的查询来自哪台服务器
 +-------------+
 | @@server_id |
 +-------------+
 |         130 |
 +-------------+
  • 实现读写分离
js 复制代码
 (1)客户机 插入数据,并查看主从服务器实时日志,可以看到只有主服务器上有日志变化显示
 insert into teachers values(null,'wxy',22,'M');
 ​
 `主服务器:`
 [root@7-3 ~]# tail -f /var/lib/mysql/7-3.log
 Tcp port: 3306  Unix socket: /var/lib/mysql/mysql.sock
 Time                 Id Command    Argument
 2024-07-06T08:21:54.800584Z    34 Query select user()
 2024-07-06T08:21:52.785297Z    31 Query SET names utf8;
 2024-07-06T08:21:52.785485Z    31 Query insert into teachers values(null,'wxy',22,'M')     //写
 ​
 ​
 (2)客户机 查看数据,并查看主从服务器实时日志,可以看到只有从服务器上有日志变化显示,从而实现了读写分离
 select * from teachers;
 ​
 `从服务器:`
 [root@7-5 ~]# tail -f /var/lib/mysql/7-5.log
 /usr/sbin/mysqld, Version: 5.7.44-log (MySQL Community Server (GPL)). started with:
 Tcp port: 3306  Unix socket: /var/lib/mysql/mysql.sock
 Time                 Id Command    Argument
 2024-07-06T08:19:24.814325Z    25 Query select user()
 2024-07-06T08:21:29.479181Z    28 Query SET names utf8;
 2024-07-06T08:21:29.479323Z    28 Query select * from teachers      //读

2、非关系型数据库

数据库分为:

  • 关系型数据库
  • 非关系型数据库(NOSQL)

非关系型数据库的意思是:不仅仅是关系型数据库。

3、MHA高可用

支持一主二从

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

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

js 复制代码
 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的脚本触发,无需人为操作)主要包括以下几个工具:

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

MHA配置文件:

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

3.1 MHA 实验

实验环境:

机器 作用
7-4 192.168.125.140 MHA管理节点,不需要装mysql
7-3 192.168.125.130 主 mysql(5.7.44版本)
7-5 192.168.125.150 从 mysql(5.7.44版本)
7-1 192.168.125.100 从 mysql(5.7.44版本)

准备文件

mha 需要客户端和服务端,其余只需要客户端

1.关闭防火墙selinux

js 复制代码
 systemctl stop firewalld
 setenforce 0

2.mha管理节点 安装 管理客户端工具

js 复制代码
 [root@localhost ~]#cd /opt
 [root@localhost opt]#yum install epel-release.noarch -y
 #有依赖性用yum安装  需要先安装  epel源
 ​
 [root@localhost data]#ls
 mha4mysql-manager-0.58-0.el7.centos.noarch.rpm  mha4mysql-node-0.58-0.el7.centos.noarch.rpm   //mannager和node两个
 ​
 [root@localhost opt]#yum install -y mha4mysql-node-0.58-0.el7.centos.noarch.rpm
 [root@localhost opt]#yum install -y mha4mysql-manager-0.58-0.el7.centos.noarch.rpm

报错: mha的manager节点安装报错

js 复制代码
 解决方法:
 (1)如果是缺少perl,可以在网上下载perl插件,并安装
 yum  install  perl  -y      //不用具体到安装包的名称,系统会自己找
 ​
 ​
 (2)安装插件
 yum install perl-MIME-Lite
 yum install perl-Params-Validate

小拓展: 如何将epel源切换为阿里源

js 复制代码
 yum install epel-release.noarch -y   //epel源,但是从centos7停止维护后,下载非常缓慢,甚至会经常报错
 ##改为阿里源:
 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup   //移走网络源
 wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo     //切换为阿里源

3.主、从节点 安装客户端工具

js 复制代码
 [root@localhost opt]# yum install epel-release.noarch -y
 [root@localhost data]# yum install  mha4mysql-node-0.58-0.el7.centos.noarch.rpm -y     //只有node

4. 所有节点 ssh免密登录

在mha 7-4上操作

js 复制代码
 [root@localhost data]#ssh-keygen 
 [root@localhost data]#ssh-copy-id  127.0.0.1
 #自己和自己连  实现免密钥登录
 ​
 [root@localhost data]#cd ~     //切换到家目录
 *****注意:下面的操作,必须在家目录下:
 [root@localhost ~]#rsync -a .ssh   192.168.125.130:/root/      //rsync是同步命令
 [root@localhost ~]#rsync -a .ssh   192.168.125.150:/root/
 [root@localhost ~]#rsync -a .ssh   192.168.125.100:/root/
 ​
 #注意.ssh 后不能加/    -a  保留属性

5.建立mha文件夹和配置文件(7-6)

注意对应关系!!!!

js 复制代码
 [root@localhost ~]#mkdir /etc/mastermha
 [root@localhost ~]#vim /etc/mastermha/app1.cnf    //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.125.130
 candidate_master=1
 ​
 [server2]
 hostname=192.168.125.150
 candidate_master=1
 ​
 [server3]
 hostname=192.168.125.100
 ​
 *********************************************************************************
 ​
 ​
 ​
 [server default]     //服务端默认配置
 user=mhauser         //用于远程连接mysql所有节点的用户,用户名可以自定义,但是前后必须要一致
 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       //健康性检查的时间间隔,1秒1次
 master_ip_failover_script=/usr/local/bin/master_ip_failover     //定义了脚本的位置
 check_repl_delay=0     //默认值为1,表示如果s1ave中 从库落后主库relay 1og超过100M,主库不会选择这个从库为新的master,因为这个从库进行恢复需要很长的时间,通过设置参数check_repl_delay=0,mha触发 主从切换时会忽略复制的廷时,对于设置candidate_master=1的从库非常有用,这样确保这个从库一定能成为最新的master
 master_binlog_dir=/data/mysql/     //指定二进制日志存放的文件
 ​
 ##candidate_master 指定哪个是主
 ​
 [server1]
 hostname=192.168.125.130
 candidate_master=1        //指定为主服务器
 ​
 [server2]
 hostname=192.168.125.150
 candidate_master=1       //设置为候选的主服务器,如果原主挂了,就会接管工作
 ​
 [server3]
 hostname=192.168.125.100

6 准备切换脚本

js 复制代码
 *********************** 添加脚本 ************************
 [root@localhost ~]#cp master_ip_failover   /usr/local/bin/
 # 移动文件到对应的地方 之前的配置文件中规定了脚本的位置
 [root@localhost ~]#chmod +x  /usr/local/bin/master_ip_failover 
 #加上执行权限
 ​
 [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.125.188/24';      //注意:需要修改网段
 my $gateway = '192.168.125.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";
 }
 ​
 *****上面都是脚本,脚本作用是为了 切换主从的虚拟ip*****

7实现主从复制

主从都要开启 二进制日志,因为主如果挂了,从就会成为主。

7.1主服务器操作(7-3)

js 复制代码
 [root@localhost ~]#vim  /etc/my.cnf
 #修改文件
 [mysqld]
 server_id=130
 log-bin=/data/mysql/mysql-bin
 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 -pabc123
 mysql> show master status;     //先查看,再新建用户!!!
 +------------------+----------+--------------+------------------+-------------------+
 | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
 +------------------+----------+--------------+------------------+-------------------+
 | mysql-bin.000001 |      154 |              |                  |                   |
 +------------------+----------+--------------+------------------+-------------------+
 1 row in set (0.00 sec)
 ​
 ​
 ​
 mysql> grant replication slave on *.* to test@'192.168.125.%' identified by 'Admin@123';
 #建立复制用户
 ​
 mysql> grant all on *.* to mhauser@'192.168.125.%' identified by 'Admin@123';
 #建立  mha管理账户
 ​
 flush  privileges; //记得刷新!!

7.2从服务器设置(7-5,7-1)

7.2.1 从服务器7-5配置
js 复制代码
 [root@localhost ~]#vim  /etc/my.cnf
 #修改文件
 server_id=150
 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 -pabc123
 CHANGE MASTER TO
   MASTER_HOST='192.168.125.130',
   MASTER_USER='test',
   MASTER_PASSWORD='Admin@123',
   MASTER_PORT=3306,
   MASTER_LOG_FILE='mysql-bin.000001',
   MASTER_LOG_POS=154;
   注意最后分号
   
 mysql> start slave;
 mysql> show slave status\G;
7.2.2 从服务器7-1配置
js 复制代码
 [root@localhost ~]#vim  /etc/my.cnf
 #修改文件
 server_id=100
 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 -pabc123
 CHANGE MASTER TO
   MASTER_HOST='192.168.125.130',
   MASTER_USER='test',
   MASTER_PASSWORD='Admin@123',
   MASTER_PORT=3306,
   MASTER_LOG_FILE='mysql-bin.000001',
   MASTER_LOG_POS=154;
   注意最后分号
   
 mysql> start slave;
 mysql> show slave status\G;

8.设置虚拟地址(7-3)

在 mysql 主节点上配置 虚拟地址

js 复制代码
 [root@localhost ~]# ifconfig ens33:1 192.168.125.188/24

注意:是在主节点上设置,不是mha!!!mha只是监控,监控主节点有没有挂掉

9.在运行前需要先检测环境是否符合

9.1 检测 ssh 免密登录是否成功

在管理节点mha 7-6 上执行

js 复制代码
 [root@localhost ~]#masterha_check_ssh --conf=/etc/mastermha/app1.cnf
 //全是ok就没有问题,如果不是ok就不要继续往下进行

9.2 检测主从复制

js 复制代码
 [root@localhost /]#masterha_check_repl --conf=/etc/mastermha/app1.cnf    //指明配置文件
 Checking the Status of the script.. OK 
 Fri Jul  5 00:03:44 2024 - [info]  OK.
 Fri Jul  5 00:03:44 2024 - [warning] shutdown_script is not defined.
 Fri Jul  5 00:03:44 2024 - [info] Got exit code 0 (Not master dead).
 ​
 MySQL Replication Health is OK.      //都是ok就没问题

报错

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

9.3 查看状态未开启

在管理节点mha 7-6 上执行

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

10.开启mha

js 复制代码
 #开启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.测试

11.1 查看mha 日志

js 复制代码
 [root@localhost ~]# tail  -f  /data/mastermha/app1/manager.log
 ​
 IN SCRIPT TEST====/sbin/ifconfig ens33:1 down==/sbin/ifconfig ens33:1 192.168.125.188/24;/sbin/arping -I ens33 -c 3 -s 192.168.125.188/24 192.168.125.2 >/dev/null 2>&1===
 ​
 Checking the Status of the script.. OK 
 Sun Jul  7 14:13:06 2024 - [info]  OK.
 Sun Jul  7 14:13:06 2024 - [warning] shutdown_script is not defined.
 Sun Jul  7 14:13:06 2024 - [info] Set master ping interval 1 seconds.
 Sun Jul  7 14:13:06 2024 - [warning] secondary_check_script is not defined. It is highly recommended setting it to check master reachability from two or more routes.
 Sun Jul  7 14:13:06 2024 - [info] Starting ping health check on 192.168.125.130(192.168.125.130:3306)..
 Sun Jul  7 14:13:06 2024 - [info] Ping(SELECT) succeeded, waiting until MySQL doesn't respond..  //正常

11.2 模拟 mysql 主节点故障

js 复制代码
 [root@7-3 ~]# systemctl stop mysqld      //模拟主节点故障

切换的过程 会将 从服务器的 read_only的指令,从1打开,改成0关闭

js 复制代码
 mysql> select @@read_only;
 +-------------+
 | @@read_only |
 +-------------+
 |           0 |
 +-------------+
 1 row in set (0.00 sec)

在最后一个从节点(7-1)上 查看slave 信息 可以看到指向新的主7-5

js 复制代码
 mysql> show slave status\G;
 ​

mha再次查看日志

js 复制代码
 [root@localhost ~]# tail  -f  /data/mastermha/app1/manager.log 
 ​
 ----- Failover Report -----
 ​
 app1: MySQL Master failover 192.168.125.100(192.168.125.100:3306) to 192.168.125.101(192.168.125.101:3306) succeeded
 ​
 Master 192.168.125.100(192.168.125.100:3306) is down!
 ​
 Check MHA Manager logs at localhost.localdomain:/data/mastermha/app1/manager.log for details.
 ​
 Started automated(non-interactive) failover.
 Invalidated master IP address on 192.168.125.100(192.168.125.100:3306)
 The latest slave 192.168.125.101(192.168.125.101:3306) has all relay logs for recovery.
 Selected 192.168.125.101(192.168.125.101:3306) as a new master.
 192.168.125.101(192.168.125.101:3306): OK: Applying all logs succeeded.
 192.168.125.101(192.168.125.101:3306): OK: Activated master IP address.
 192.168.125.102(192.168.125.102:3306): This host has the latest relay log events.
 Generating relay diff files from the latest slave succeeded.
 192.168.125.102(192.168.125.102:3306): OK: Applying all logs succeeded. Slave started, replicating from 192.168.125.101(192.168.125.101:3306)
 192.168.125.101(192.168.125.101:3306): Resetting slave info succeeded.
 #   Master failover to 192.168.125.101(192.168.125.101:3306) completed successfully.

12.如何再次打开MHA

mha只提供一次性服务,主备切换过后,mha就结束了,那么如何再次打开呢?

js 复制代码
 mha管理节点:
 (1)删除app1下面的文件
 rm -rf /data/mastermha/app1/app1.failover.complete
 ​
 (2)修改配置文件
 vim /etc/mastermha/.app1.cnf.swp
 [server1]
 ##改成现在的主
 [server2]
 ##改成原来的主
相关推荐
这可就有点麻烦了几秒前
强化学习笔记之【TD3算法】
linux·笔记·算法·机器学习
DY009J1 分钟前
深度探索Kali Linux的精髓与实践应用
linux·运维·服务器
翔云1234568 分钟前
MVCC(多版本并发控制)
数据库·mysql
程序员-珍12 分钟前
虚拟机ip突然看不了了
linux·网络·网络协议·tcp/ip·centos
静听山水1 小时前
mysql语句执行过程
数据库·mysql
码农小白1 小时前
linux驱动:(22)中断节点和中断函数
linux·运维·服务器
4647的码农历程1 小时前
Linux网络编程 -- 网络基础
linux·运维·网络
Q_w77422 小时前
一个真实可用的登录界面!
javascript·mysql·php·html5·网站登录
C++忠实粉丝2 小时前
Linux环境基础开发工具使用(2)
linux·运维·服务器
康熙38bdc3 小时前
Linux 环境变量
linux·运维·服务器