首页 > 数据库 >6.MySQL中间件mycat和MHA高可用

6.MySQL中间件mycat和MHA高可用

时间:2023-07-11 23:33:03浏览次数:51  
标签:16 0.0 中间件 MHA master mysql mycat root

MySQL中间件代理服务器

数据切分方式
垂直切分
水平切分
MyCAT数据库中间件
实现数据分库,读写分离

java程序要运行必须有jvm


安装mycat

1.下载安装Java
yum -y install java              
2.安装mycat和配置
Mycat-server-1.6.7.6-release-20220524173810-linux.tar.gz
解压
[16:15:37 root@rocky8 ~]# mkdir /apps/
[16:16:39 root@rocky8 ~]# tar xf Mycat-server-1.6.7.6-release-20220524173810-linux.tar.gz -C /apps/
PATH变量
[16:17:48 root@rocky8 ~]# echo 'PATH=/apps/mycat/bin:$PATH' > /etc/profile.d/mycat.sh
[16:20:08 root@rocky8 ~]# .  /etc/profile.d/mycat.sh
启动mycat
[16:22:21 root@rocky8 ~]# file /apps/mycat/bin/mycat
[16:25:27 root@rocky8 ~]# mycat start
日志出现successfully表示成功启动
[16:27:13 root@rocky8 ~]# tail /apps/mycat/logs/wrapper.log 
STATUS | wrapper  | 2022/09/03 16:26:53 | --> Wrapper Started as Daemon
STATUS | wrapper  | 2022/09/03 16:26:54 | Launching a JVM...
INFO   | jvm 1    | 2022/09/03 16:27:04 | Wrapper (Version 3.2.3) http://wrapper.tanukisoftware.org
INFO   | jvm 1    | 2022/09/03 16:27:04 |   Copyright 1999-2006 Tanuki Software, Inc.  All Rights Reserved.
INFO   | jvm 1    | 2022/09/03 16:27:04 | 
INFO   | jvm 1    | 2022/09/03 16:27:10 | Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.
INFO   | jvm 1    | 2022/09/03 16:27:16 | MyCAT Server startup successfully. see logs in logs/mycat.log
查看端口,默认是8066
[16:29:54 root@rocky8 ~]# ss -ntl
State       Recv-Q      Send-Q             Local Address:Port              Peer Address:Port      Process      
LISTEN      0           128                      0.0.0.0:111                    0.0.0.0:*                      
LISTEN      0           32                 192.168.122.1:53                     0.0.0.0:*                      
LISTEN      0           128                      0.0.0.0:22                     0.0.0.0:*                      
LISTEN      0           5                      127.0.0.1:631                    0.0.0.0:*                      
LISTEN      0           128                    127.0.0.1:6010                   0.0.0.0:*                      
LISTEN      0           1                      127.0.0.1:32000                  0.0.0.0:*                      
LISTEN      0           128                         [::]:111                       [::]:*                      
LISTEN      0           128                         [::]:22                        [::]:*                      
LISTEN      0           5                          [::1]:631                       [::]:*                      
LISTEN      0           128                        [::1]:6010                      [::]:*                      
LISTEN      0           50                             *:33567                        *:*                      
LISTEN      0           50                             *:1984                         *:*                      
LISTEN      0           128                            *:8066                         *:*            

客户端通过8066端口可以直接连接macat的MySQL
[16:03:28 root@rocky8 ~]# mysql -uroot -p123456 -h 10.0.0.128 -P8066

在mycat服务器上修改server.xml文件配置mycat的连接信息
vim /apps/mycat/conf/server.xml
 <property name="serverPort">8066</property>
 修改成 <property name="serverPort">3306</property>
# 也可以修改密码等   mycat上的MySQL要关闭服务,否则占用3306端口

修改schema.xml实现读写分离策略
vim /apps/mycat/conf/schema.xml  #直接复制粘贴进去,服务器IP改成自己的
<?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="10.0.0.140:3306" user="wang" password="12345678">
         <readHost host="host2" url="10.0.0.132:3306" user="wang" password="12345678" />
        </writeHost>
    </dataHost>
</mycat:schema>            #账户密码建好后修改

主服务器创建账户
mysql> create user wang@'10.0.0.%' identified by '12345678';
赋予hellodb的权限
mysql> grant all on hellodb.* to wang@'12345678';
#从服务器会自动复制账户和密码,不用单独创建

重启mycat
[17:12:38 root@rocky8 ~]# mycat restart
Stopping Mycat-server...
Stopped Mycat-server.
Starting Mycat-server...

主从服务器开启通用日志
mysql> set global general_log=on;
在主和从服务器分别启用通用日志,查看读写分离,查看主从是否健康
[17:38:24 root@rocky8 ~]# tail -f /var/lib/mysql/rocky8.log

mysql高可用

MHA

首先有一个单独的管理节点
工作原理:
1. MHA利用 SELECT 1 As Value 指令判断master服务器的健康性,一旦master 宕机,MHA 从宕机崩溃的master保存二进制日志事件(binlog events) 
2. 识别含有最新更新的slave 
3. 应用差异的中继日志(relay log)到其他的slave 
4. 应用从master保存的二进制日志事件(binlog events)到所有slave节点 
5. 提升一个slave为新的master 
6. 使其他的slave连接新的master进行复制 
7. 故障服务器自动被剔除集群(masterha_conf_host),将配置信息去掉 
8. 旧的Master的 VIP 漂移到新的master上,用户应用就可以访问新的Master 
9. MHA是一次性的高可用性解决方案,Manager会自动退出
选举新的Master 
1.如果设定权重(candidate_master=1),按照权重强制指定新主,但是默认情况下如果一个slave落后 master 二进制日志超过100M的relay logs,即使有权重,也会失效.如果设置check_repl_delay=0, 即使落后很多日志,也强制选择其为新主 
2.如果从库数据之间有差异,最接近于Master的slave成为新主 
3.如果所有从库数据都一致,按照配置文件顺序最前面的当新主
relay_log_purge=0不清除


配置MHA  (管理节点用centos7)
在管理节点上:
安装(课件有,先拖进去)在管理节点上安装两个包mha4mysql-manager和mha4mysql-node
然后yum安装
yum -y install  mha4mysql-manager-0.58- 0.el7.centos.noarch.rpm mha4mysql-node-0.58-0.el7.centos.noarch.rpm

在所有MySQL主从节点上:
安装 mha4mysql-node
yum -y install  mha4mysql-node-0.58-0.el7.centos.noarch.rpm


所有节点彼此在ssh key验证
在每个节点上跑脚本
PASS=centos1
#设置网段最后的地址,4-255之间,越小扫描越快
END=254

IP=`ip a s eth0 | awk -F'[ /]+' 'NR==3{print $3}'`
NET=${IP%.*}.

. /etc/os-release

rm -f /root/.ssh/id_rsa
[ -e ./SCANIP.log ] && rm -f SCANIP.log

for((i=3;i<="$END";i++));do
    ping -c 1 -w 1  ${NET}$i &> /dev/null  && echo "${NET}$i" >> SCANIP.log &
done
wait

ssh-keygen -P "" -f /root/.ssh/id_rsa
if [ $ID = "centos" -o $ID = "rocky" ];then
    rpm -q sshpass || yum -y install sshpass
else
    dpkg -i sshpass &> /dev/null ||{ apt update; apt -y install sshpass; }
fi

sshpass -p $PASS ssh-copy-id -o StrictHostKeyChecking=no $IP 

AliveIP=(`cat SCANIP.log`)
for n in ${AliveIP[*]};do
    sshpass -p $PASS scp -o StrictHostKeyChecking=no -r /root/.ssh root@${n}:
done

#把.ssh/known_hosts拷贝到所有主机,使它们第一次互相访问时不需要输入回车
for n in ${AliveIP[*]};do
    scp /root/.ssh/known_hosts ${n}:.ssh/
done

创建mha配置文件
mkdir /etc/mastermha   #名字无所谓
vim /etc/mastermha/app1.cnf
[server default]
check_repl_delay=0
manager_log=/data/mastermha/app1/manager.log
manager_workdir=/data/mastermha/app1/
master_binlog_dir=/data/mysql/
master_ip_failover_script=/usr/local/bin/master_ip_failover
password=123456
ping_interval=1
remote_workdir=/data/mastermha/app1/
repl_password=123456
repl_user=repluser
report_script=/usr/local/bin/sendmail.sh
ssh_user=root
user=mhauser

[server2]
hostname=10.0.0.18

[server3]
candidate_master=1
hostname=10.0.0.28

主服务器配置
vim /etc/my.cnf
[mysqld] 
server_id=1 
log-bin=/data/mysql/mysql-bin  #开启二进制日志
skip_name_resolve=1    #禁止反向解析
创建所有主从日志目录
mkdir -p /data/mysql
chown mysql.mysql vim /etc/my.cnf
创建账号
create user mhauser@'10.0.0.%' identified by '123456';
grant all on *.* to mhauser@'10.0.0.%';

在管理节点上
进入目录cd /usr/local/bin
拖入脚本master_ip_failover  #实现IP地址迁移
在脚本里确认VIP和网卡名
加权限  chmod +x master_ip_failover

在主服务器上
ifconfig eth0:1  10.0.0.100/24   #vip
#当主服务器坏了,VIP会自动飘到新的主服务器上

在管理节点上配置发邮件的脚本
进入目录cd /usr/local/bin
拖入脚本sendmail.sh
vim  sendmail.sh
echo "MHA is failover!" | mail -s "MHA Warning" 790453987@qq.com
#收件人邮箱
加权限:chmod +x sendmail.sh
实现互联网发邮件
下载mailx
vim /etc/mail.rc
在最后写:
set from=461624736@qq.com
set smtp=smtp.qq.com
set smtp-auth-user=461624736@qq.com
set smtp-auth-password=vtoxaegxqxrlcabc    #发件人邮箱


所有从服务器配置
vim /etc/my.cnf
[mysqld] 
log-bin=/data/mysql/mysql-bin   #开启二进制日志
relay_log_purge=0       #不清理二进制日志
skip_name_resolve=1    #禁止反向解析
general_log             #方便观察的设置
重启服务器
systemctl restart mysql


检查MHA的环境
[root@mha-manager ~]#masterha_check_ssh --conf=/etc/mastermha/app1.cnf     #检查SSH
[root@mha-manager ~]#masterha_check_repl --conf=/etc/mastermha/app1.cnf     #检查复制
查看状态
[root@mha-manager ~]#masterha_check_status --conf=/etc/mastermha/app1.cnf

启动MHA
nohup masterha_manager --conf=/etc/mastermha/app1.cnf --remove_dead_master_conf --ignore_last_failover &> /dev/null
生产环境一般为后台执行

测试环境
#masterha_manager --conf=/etc/mastermha/app1.cnf --remove_dead_master_conf -- ignore_last_failover



标签:16,0.0,中间件,MHA,master,mysql,mycat,root
From: https://blog.51cto.com/lmm01/6693241

相关文章

  • 【.NET源码解读】深入剖析中间件的设计与实现
    合集-.NET源码解读系列(4) 1..NET通过源码深究依赖注入原理05-172.【.NET源码解读】Configuration组件及自动更新05-303..NET源码解读kestrel服务器及创建HttpContext对象流程06-164.【.NET源码解读】深入剖析中间件的设计与实现06-29收起 .NET本身就是一个基于......
  • aspnetcore 中间件执行顺序
    这是用例和返回结果输出的结果是对称的当我第一眼看着这个操作时满脑子不解:一个方法是怎么扳成2截来使用的要是我来做肯定让用户传2个委托完整实现代码classProgram{staticList<Action<Action>>middlewareList=newList<Action<Action>>();staticvoidUse(......
  • web中间件漏洞之(3)fastjson反序列化漏洞
    引言fastjson可以将Java对象序列化为json格式,也可将json反序列化为Java对象。在请求包里面中发送恶意的json格式payload,fastjson在处理json对象时使用了autotype机制,允许在反序列化时通过@type指定反序列化的类,调用指定类的set和get方法。攻击者可以通过rmi或ldap服务,将ldap......
  • Mycat2
    1先安装服务, 2安装完成后,需要修改配置文件mycat/config/datasource/prototypeDs.datasource.json 3启动服务 ......
  • JWT令牌是中间件吗?(不是)
    JSONWebToken(JWT)是一种用于在网络应用中传递声明(Claims)的开放标准。它通过对声明进行数字签名,以确保声明的完整性和可信任性,从而实现安全而可靠的身份验证和授权机制。JWT本身不属于中间件,而是一种用于身份验证和授权的令牌机制。然而,JWT可以在中间件中使用,以实现身份验证和......
  • 什么是中间件?
    中间件(middleware)是指在软件系统中,处于两个或多个组件之间的一个层,用于处理请求和响应。它常用于处理系统级别的功能,如请求认证、日志记录、错误处理等。中间件允许开发人员将这些功能从应用程序的核心逻辑中解耦出来,使得系统更易于维护和扩展。在Web开发中,中间件可以被插入到请......
  • 【.NET源码解读】深入剖析中间件的设计与实现
    .NET本身就是一个基于中间件(middleware)的框架,它通过一系列的中间件组件来处理HTTP请求和响应。在之前的文章《.NET源码解读kestrel服务器及创建HttpContext对象流程》中,已经通过源码介绍了如何将HTTP数据包转换为.NET的HttpContext对象。接下来,让我们深入了解一下.NET是如何设计中......
  • mysql MHA
    一:主从复制作用和缺点2.MHA的作用特点3.MHA节点的类型 本文用到的软件包在以下链接中https://pan.baidu.com/s/11ikNZ5sJcXRJA3sRMfUfaA?pwd=lomn使用的系统版本为centos7.4版本,mysql版本为8.0.32,本文使用四台centos7.4虚拟机安装mysql不再赘述,可翻阅博主以前的博客二:创建主从复制......
  • mycat分库分表
     master:主节点,replicas:从节点       readBalanceType:负载均衡策略    分片值是:具体字段的值(比如用于分库的type的值) 1个docker容器里面可以放两个mysql数据库(master和slave) ......
  • 局部敏感哈希LSH(SimHash与MinHash)
    SimHash1.算法思想假设我们有海量的文本数据,我们需要根据文本内容将它们进行去重。对于文本去重而言,目前有很多NLP相关的算法可以在很高精度上来解决,但是我们现在处理的是大数据维度上的文本去重,这就对算法的效率有着很高的要求。而局部敏感hash算法可以将原始的文本内容映射为......