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]
##改成原来的主