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