目录

一. MySQL的读写分离

1.1 基本概念

1.2 为什么要读写分离

1.3 读写分离的原理

1.4 常见实现方式

1.5 读写分离的配置实例

二. 高可用架构MHA

2.1 基本概念

2.2 MHA的组成

2.3 mha高可用配置实例 

1. 准备工作 

2. 安装软件包

3. 主从复制 

4. 配置 SSH 无密码登录

5. 建立mha文件夹和配置文件


一. MySQL的读写分离

1.1 基本概念

MySQL读写分离是一种数据库架构设计模式,将数据库的读操作和写操作分离到不同的服务器上:

  • 主服务器(Master):处理所有写操作(INSERT, UPDATE, DELETE)和事务性操作

  • 从服务器(Slave):处理读操作(SELECT),通常有多个从服务器以提高读性能

1.2 为什么要读写分离

  • 读写负载不均:大多数应用场景中,读操作(80-90%)远多于写操作(10-20%)

  • 单机瓶颈:单台MySQL服务器难以承受高并发访问压力

  • 资源竞争:读写混合在同一实例会导致锁争用(I/O、CPU、连接数等)

1.3 读写分离的原理

  1. 主从复制:主服务器将数据变更通过二进制日志(binlog)同步到一个或多个从服务器

  2. 请求路由:应用程序或中间件将写请求发送到主服务器,读请求分发到从服务器

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

 

更多推荐