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]
 ##改成原来的主
相关推荐
vip4515 分钟前
Linux 经典面试八股文
linux
大霞上仙7 分钟前
Ubuntu系统电脑没有WiFi适配器
linux·运维·电脑
小兜全糖(xdqt)41 分钟前
mysql数据同步到sql server
mysql·adb
Karoku06643 分钟前
【企业级分布式系统】Zabbix监控系统与部署安装
运维·服务器·数据库·redis·mysql·zabbix
为什么这亚子1 小时前
九、Go语言快速入门之map
运维·开发语言·后端·算法·云原生·golang·云计算
划水小将军1 小时前
阿里云函数计算GBK编码
阿里云·云计算
孤客网络科技工作室1 小时前
VMware 虚拟机使用教程及 Kali Linux 安装指南
linux·虚拟机·kali linux
周全全1 小时前
MySQL报错解决:The user specified as a definer (‘root‘@‘%‘) does not exist
android·数据库·mysql
白云如幻1 小时前
MySQL的分组函数
数据库·mysql
颇有几分姿色2 小时前
深入理解 Linux 内存管理:free 命令详解
linux·运维·服务器