MySQL读写分离与高可用架构MHA
目录
一. MySQL的读写分离
1.1 基本概念
MySQL读写分离是一种数据库架构设计模式,将数据库的读操作和写操作分离到不同的服务器上:
-
主服务器(Master):处理所有写操作(INSERT, UPDATE, DELETE)和事务性操作
-
从服务器(Slave):处理读操作(SELECT),通常有多个从服务器以提高读性能
1.2 为什么要读写分离
-
读写负载不均:大多数应用场景中,读操作(80-90%)远多于写操作(10-20%)
-
单机瓶颈:单台MySQL服务器难以承受高并发访问压力
-
资源竞争:读写混合在同一实例会导致锁争用(I/O、CPU、连接数等)
1.3 读写分离的原理
-
主从复制:主服务器将数据变更通过二进制日志(binlog)同步到一个或多个从服务器
-
请求路由:应用程序或中间件将写请求发送到主服务器,读请求分发到从服务器
1.4 常见实现方式
通过中间件代理MyCat实现读写分离
MyCat是一个开源的分布式数据库中间件,可以实现MySQL的读写分离、分库分表等功能。
1.5 读写分离的配置实例
准备工作
Ubuntu(192.168.52.105):用作写
Ubuntu1(192.168.52.31):用作读
Ubuntu2(192.168.52.107):作为中间代理服务器
centos7-11(192.168.52.101):用户
实验步骤:
#在centos7-11,确保可以使用mysql命令
yum install mariadb-server -y

#在Ubuntu和Ubuntu1进行主从复制
#在Ubuntu和Ubuntu1上下载相同版本的mysql
apt search mysql
apt-get update
apt install mysql-server-8.0 -y
#在Ubuntu
vim /etc/mysql/mysql.conf.d/mysqld.cnf
bind-address = 0.0.0.0
mysqlx-bind-address = 0.0.0.0
server-id=31
systemctl restart mysql
mysql登录
create user test@'192.168.52.%' identified WITH mysql_native_password by 'abc123';
grant all privileges on *.* to test@'192.168.52.%';
show master status;
#在Ubuntu1
vim /etc/mysql/mysql.conf.d/mysqld.cnf
bind-address = 0.0.0.0
mysqlx-bind-address = 0.0.0.0
server-id=32
systemctl restart mysql
mysql登录
create user test@'192.168.52.%' identified WITH mysql_native_password by 'abc123';
grant all privileges on *.* to test@'192.168.52.%';
CHANGE MASTER TO
MASTER_HOST = '192.168.52.105',
MASTER_USER = 'test',
MASTER_PASSWORD = 'abc123',
MASTER_PORT = 3306,
#以下两项由主服务器的show master status而来,不要一味复制
MASTER_LOG_FILE = 'binlog.000004',
MASTER_LOG_POS = 679;
start slave;
show slave status\G;


#在Ubuntu2下载mycat,并解压到/apps
mkdir /apps
tar xf Mycat-server-1.6.7.6-release-20210303094759-liunx.tar.gz -C /apps/
#查看是否解压到位
cd /apps/
ls


#编辑mycat命令补全路径,将其运行
vim /etc/profile.d/mycat.sh
PATH=/apps/mycat/bin/:$PATH
source /etc/profile.d/mycat.sh
#下载供mycat运行的环境
apt install openjdk-8-jdk -y

#查看Java版本
java -version
#启动mycat,查看mycat运行情况
mycat start
mycat status
tail -f /apps/mycat/logs/wrapper.log

#可以修改mycat的监听端口为3306
cd /apps/mycat/conf
vim server.xml
<property name="serverPort">3306</property>
mycat restart
mycat status

#删除原有的读写策略
cd /apps/mycat/conf
ls
rm -rf schema.xml
#编辑读写分离策略
#下载schema.xml文件
chmod 777 schema.xml
vim scheme.xml
<writeHost host="host1" url="192.168.52.105:3306" user="test" password="abc123">
<readHost host="host2" url="192.168.52.31:3306" user="test" password="abc123" />
mycat restart

#在Ubuntu和Ubuntu1下载hellodb
mysql < hellodb_innodb.sql

#在centos7-11登录中间服务器
mysql -uroot -p123456 -h 192.168.52.107
show databases;

use TESTDB;
show tables;

#测试
#在centos7-11
#因为是查返回的应该是只读节点的id
select @@server_id;

#在Ubuntu和Ubuntu1中开启通用日志
登录mysql
set global general_log=1;
#查看生成的通用日志名称
cd /var/lib/mysql
ls


#查看通用日志
tail -f ubuntu2205.log


#在centos7-11
inster teachers value(10,'wang',82,'M');
#在查看Ubuntu的通用日志是否发生变化


补充:
如果身为备服务器的Ubuntu1停止运行,那么Ubuntu会顶替它;可如果身为主服务器的Ubuntu停止运行,那整个系统就会崩溃。




二. 高可用架构MHA
2.1 基本概念
MHA(Master High Availability)是一种用于MySQL数据库高可用性的自动化故障转移解决方案,能在主库发生故障时快速提升一个从库为新的主库,确保数据库服务不中断。
2.2 MHA的组成
1. Manager节点(管理节点)
-
核心控制器:监控MySQL主从集群状态并协调故障转移
-
主要功能:
-
定期检查主库可用性(通过ping机制)
-
检测到故障时自动触发故障转移流程
-
协调各Node节点完成数据补偿和角色切换
-
-
部署要求:
-
通常独立部署(也可部署在非MySQL服务器上)
-
需要SSH免密登录到所有MySQL节点
-
2. Node节点(数据节点)
-
运行在每个MySQL服务器上(包括主库和从库)
2.3 mha高可用配置实例
1. 准备工作
mha服务器:Ubuntu3-192.168.52.108
master:Ubuntu2-192.168.52.107
slave1:Ubuntu1-192.168.52.31
slave2:Ubuntu-192.168.52.105
#在192.168.52.108
#修改了Bash的提示符样式,使其显示为亮黄色的[用户名@主机名 目录名]#格式
vim .bashrc
PS1="\[\e[33;1m\][\u@\h \W]#\[\e[0m\]"
. .bashrc
#设置主机名
hostnamectl set-hostname mha-master
exit
重新连接
2. 安装软件包
#拖入mha安装包
apt update
apt --fix-broken install ./mha4mysql-manager_0.58-0_all.deb -y
dpkg -l|grep mha

#在Ubuntu3
#发送给其它三台设备
scp mha4mysql-node_0.58-0_all.deb 192.168.52.107:/opt
scp mha4mysql-node_0.58-0_all.deb 192.168.52.31:/opt
scp mha4mysql-node_0.58-0_all.deb 192.168.52.105:/opt
#在Ubuntu,Ubuntu1和Ubuntu2
#接收,下载
cd /opt
apt install ./mha4mysql-node_0.58-0_all.deb -y
3. 主从复制
#三者进行主从复制
master:Ubuntu2-192.168.52.107
slave1:Ubuntu1-192.168.52.31
slave2:Ubuntu-192.168.52.105
在192.168.52.107Ubuntu2
#下载mysql
apt-get update
apt install mysql-server-8.0 -y
#配置主从复制
vim /etc/mysql/mysql.conf.d/mysqld.cnf
bind-address = 0.0.0.0
mysqlx-bind-address = 0.0.0.0
server-id=31
systemctl restart mysql
登录mysql
create user test@'192.168.52.%' identified WITH mysql_native_password by 'abc123';
grant all privileges on *.* to test@'192.168.52.%';
show master status;

在192.168.52.31Ubuntu1
#下载mysql
apt-get update
apt install mysql-server-8.0 -y
#配置主从复制
vim /etc/mysql/mysql.conf.d/mysqld.cnf
bind-address = 0.0.0.0
mysqlx-bind-address = 0.0.0.0
server-id=32
systemctl restart mysql
登录mysql
CHANGE MASTER TO
MASTER_HOST = '192.168.52.107',
MASTER_USER = 'test',
MASTER_PASSWORD = 'abc123',
MASTER_PORT = 3306,
#以下两项由主服务器的show master status而来,不要一味复制
MASTER_LOG_FILE = 'binlog.000004',
MASTER_LOG_POS = 679;
start slave;
show slave status\G;
#创建用户,主备替换时使用
create user test@'192.168.52.%' identified WITH mysql_native_password by 'abc123';
grant all privileges on *.* to test@'192.168.52.%';
#查看 MySQL 数据库中的所有用户及其对应的访问主机信息
select user,host from mysql.user;



在192.168.52.105Ubuntu
#下载mysql
apt-get update
apt install mysql-server-8.0 -y
#配置主从复制
vim /etc/mysql/mysql.conf.d/mysqld.cnf
bind-address = 0.0.0.0
mysqlx-bind-address = 0.0.0.0
server-id=33
systemctl restart mysql
登录mysql
CHANGE MASTER TO
MASTER_HOST = '192.168.52.107',
MASTER_USER = 'test',
MASTER_PASSWORD = 'abc123',
MASTER_PORT = 3306,
#以下两项由主服务器的show master status而来,不要一味复制
MASTER_LOG_FILE = 'binlog.000004',
MASTER_LOG_POS = 679;
start slave;
show slave status\G;
#查看MySQL数据库中的所有用户及其对应的访问主机信息
select user,host from mysql.user;
#创建用户,主备替换时使用
create user test@'192.168.52.%' identified WITH mysql_native_password by 'abc123';
grant all privileges on *.* to test@'192.168.52.%';



4. 配置 SSH 无密码登录
#在Ubuntu3
#生成 SSH 密钥对,包括公钥和私钥,用于安全地访问远程服务器
ssh-keygen
#一直点击确认
#将本机的SSH公钥添加到本)
ssh-copy-id 127.0.0.1
rsync -a .ssh 192.168.52.107:/root/
rsync -a .ssh 192.168.52.31:/root/
rsync -a .ssh 192.168.52.105:/root/
#查看是否可以登录
ssh 192.168.52.107
exit
ssh 192.168.52.31
exit
ssh 192.168.52.105
exit

5. 建立mha文件夹和配置文件
#Ubuntu3
#建立mha文件夹和配置文件
mkdir /etc/mastermha
vim /etc/mastermha/app1.cnf
[server default]
user=mhauser
password=abc123
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=abc123
ping_interval=1
master_ip_failover_script=/usr/local/bin/master_ip_failover
check_repl_delay=0
master_binlog_dir=/var/lib/mysql/
[server1]
hostname=192.168.52.107
candidate_master=1
[server2]
hostname=192.168.52.31
candidate_master=1
[server3]
hostname=192.168.52.105
cd /usr/local/bin/
拖入master_ip_failover
chmod +x master_ip_failover
vim master_ip_failover

#Ubuntu3
#替换原有的NodeUtil.pm文件,因为本身有问题
cd /usr/share/perl5/MHA
ls
cp NodeUtil.pm NodeUtil.pm.bak
rm -rf NodeUtil.pm
拖入NodeUtil.pm
#在Ubuntu2
apt install net-tools -y
ifconfig ens33:1 192.168.52.188/24
登录mysql
CREATE USER 'mhauser'@'192.168.52.%' IDENTIFIED WITH mysql_native_password BY 'abc123';
grant all on *.* to mhauser@'192.168.52.%';
#Ubuntu和Ubuntu1
登录mysql
grant all on *.* to mhauser@'192.168.52.%';
#在Ubuntu3
#验证实验
masterha_check_ssh --conf=/etc/mastermha/app1.cnf
masterha_check_repl --conf=/etc/mastermha/app1.cnf


#补充
#开启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
更多推荐


所有评论(0)