MySQL 多实例部署与主从、读写分离配置
MySQL 多实例部署与主从、读写分离配置
一、MySQL 多实例部署
(一)环境准备
在未安装 MySQL 的环境下,进行以下操作:
- 下载与解压软件包:
将 MySQL 软件包(如 mysql-5.7.37-linux-glibc2.12-x86_64.tar.gz)解压到 /usr/local/ 目录:
tar -xzvf mysql-5.7.37-linux-glibc2.12-x86_64.tar.gz -C /usr/local/
2.创建用户与组:
创建 mysql 组和用户,用于管理 MySQL 相关资源:
groupadd -r mysqluseradd -M -s /sbin/nologin -g mysql mysql
3.创建软链接:
为解压后的目录创建软链接,方便后续操作:
ln -s /usr/local/mysql-5.7.37-linux-glibc2.12-x86_64/ /usr/local/mysql
4.修改目录权限:
更改 MySQL 相关目录的用户和用户组为 mysql:
chown -R mysql.mysql /usr/local/mysql/
5.配置环境变量:
在 /etc/profile.d/ 下创建 mysql.sh 脚本,配置 MySQL 环境变量:
echo "export PATH=/usr/local/mysql/bin:$PATH" > /etc/profile.d/mysql.sh. /etc/profile.d/mysql.sh
6.创建数据存放目录:
创建多个实例的数据存放目录,并修改权限:
mkdir -p /opt/data/{3306..3308}chown -R mysql.mysql /opt/data/
(二)初始化实例
分别初始化 3306、3307、3308 端口对应的实例,初始化过程会生成临时密码(需保存):
mysqld --initialize --datadir=/opt/data/3306 --user=mysqlmysqld --initialize --datadir=/opt/data/3307 --user=mysqlmysqld --initialize --datadir=/opt/data/3308 --user=mysql
(三)安装依赖
安装 perl,为后续操作提供支持:
yum -y install perl
(四)配置配置文件
编辑 /etc/my.cnf,配置多实例相关参数:
[mysqld_multi]mysqld = /usr/local/mysql/bin/mysqld_safemysqladmin = /usr/local/mysql/bin/mysqladmin[mysqld3306]datadir = /opt/data/3306port = 3306socket = /tmp/mysql3306.sockpid-file = /opt/data/3306/mysql_3306.pidlog-error=/var/log/3306.log[mysqld3307]datadir = /opt/data/3307port = 3307socket = /tmp/mysql3307.sockpid-file = /opt/data/3307/mysql_3307.pidlog-error=/var/log/3307.log[mysqld3308]datadir = /opt/data/3308port = 3308socket = /tmp/mysql3308.sockpid-file = /opt/data/3308/mysql_3308.pidlog-error=/var/log/3308.log
(五)启动实例
使用 mysqld_multi 启动各个实例,并查看端口是否启用:
mysqld_multi start 3306mysqld_multi start 3307mysqld_multi start 3308ss -antl
(六)修改密码
使用初始化时保存的临时密码进入 MySQL,修改密码(以 3306 实例为例):
mysql -uroot -p'临时密码' -S /tmp/mysql3306.sockset password=password("123456");
或在命令行直接修改:
mysql -uroot -p'临时密码' -S /tmp/mysql3306.sock -e 'set password=password("123456")'
其他实例密码修改操作类似。
二、MySQL 主从复制
(一)作用
- 实时灾备,用于故障切换。
- 实现读写分离,提升查询服务性能。
- 备份数据,避免影响业务。
(二)形式
- 一主一从。
- 主主复制。
- 一主多从:扩展系统读取性能,读操作在从库进行。
- 多主一从:MySQL 5.7 及以上版本支持。
- 联级复制。
(三)复制原理
- 主库将写操作记录到 binlog 日志,生成 log dump 线程,将 binlog 传给从库的 I/O 线程。
- 从库生成 I/O 线程和 SQL 线程。
- I/O 线程请求主库 binlog,并写入中继日志(relay log)。
- SQL 线程读取中继日志,解析并执行操作,保持主从数据一致。
(四)配置步骤
1. 前提:主从数据库数据一致
- 在主库加读锁:
FLUSH TABLES WITH READ LOCK;
- 全备份主库数据:
mysqldump -uroot -p123456 --all-databases > all-20250920.sql
- 将备份发送到从库:
scp all-20250920.sql root@从库IP
- 退出主库读锁:直接执行 exit。
- 在从库恢复主库备份:
source /root/all-20250920.sql
2. 创建同步账号
在主库创建用于从库同步的账号并授权:
CREATE USER 'user'@'从库IP' IDENTIFIED BY '密码';GRANT REPLICATION SLAVE ON *.* TO 'user'@'从库IP';flush privileges;
3. 配置主库
编辑主库 /etc/my.cnf,添加以下内容:
[mysqld]datadir=/var/lib/mysqlsocket=/var/lib/mysql/mysql.socklog-bin=mysql-bin # 启用 binlog 日志server-id=1 # 主库 server-id,需小于从库symbolic-links=0log-error=/var/log/mysqld.logpid-file=/var/run/mysqld/mysqld.pid
重启主库服务:
systemctl restart mysqld
查看主库状态:
show master status;
4. 配置从库
编辑从库 /etc/my.cnf,添加以下内容:
[mysqld]datadir=/var/lib/mysqlsocket=/var/lib/mysql/mysql.sockserver-id=2 # 从库 server-id,需大于主库relay-log=mysql-relay-bin # 启用中继日志symbolic-links=0log-error=/var/log/mysqld.logpid-file=/var/run/mysqld/mysqld.pid
重启从库服务:
systemctl restart mysqld
5. 启动主从同步
在从库执行以下命令,配置并启动主从同步:
CHANGE MASTER TOMASTER_HOST='主库IP',MASTER_USER='同步账号',MASTER_PASSWORD='密码',MASTER_LOG_FILE='主库binlog文件名',MASTER_LOG_POS=主库binlog位置;start slave;
查看从库同步状态:
show slave status \G
三、MySQL 读写分离
(一)原理
基于主从复制,主库处理写操作(INSERT、UPDATE、DELETE),从库处理读操作(SELECT),提升数据库并发负载能力。解决写操作耗时影响查询效率的问题。
(二)实现方式
1. 基于程序代码内部实现
在程序代码中根据 SQL 操作类型(select、insert 等)进行路由分类。优点是性能好,无需额外硬件;缺点是对大型复杂应用,代码改动大。
2. 基于中间代理层实现
- MySQL-Proxy:通过 Lua 脚本进行 SQL 判断,需编写大量脚本。
- Atlas:基于 mysql-proxy 优化,支持事务和存储过程,360 内部广泛使用。
- Amoeba:Java 开发,阿里巴巴曾用于生产环境,不支持事务和存储过程。
- Mycat:流行的 Java 数据库中间件,支持分库分表和读写分离。
(三)Mycat 实现读写分离示例
1. 环境准备
- 主机规划:
-
- Mycat:192.168.100.30(Rocky Linux 9)。
-
- 从库(slave):192.168.100.20(Rocky Linux 9)。
-
- 主库(master):192.168.100.10(Rocky Linux 9)。
- 配置:关闭防火墙、SELinux,开启时钟同步,三台主机安装 MySQL 并完成主从配置。
- 配置 hosts 文件:
vim /etc/hosts192.168.100.10 master.example.com master192.168.100.20 slave.example.com slave192.168.100.30 mycat.example.com mycat
2. 部署 Mycat
- 在 Mycat 节点安装 Java 环境:
yum -y install java java-devel
- 解压 Mycat 软件包到 /usr/local:
tar -xzvf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz -C /usr/local/
- 定义环境变量:
echo export MYCAT_HOME=/usr/local/mycat/ >> /etc/profilesource /etc/profile
3. 配置 Mycat
- 编辑 schema.xml,设置读写分离:
<?xml version="1.0"?><!DOCTYPE mycat:schema SYSTEM "schema.dtd"><mycat:schema xmlns:mycat="http://io.mycat/"><schema name="USERDB" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn1"></schema><dataNode name="dn1" dataHost="localhost1" database="cy" /><dataHost name="localhost1" maxCon="1000" minCon="10" balance="3" dbType="mysql" dbDriver="native" writeType="0" switchType="1" slaveThreshold="100"><heartbeat>select user()</heartbeat><writeHost host="hostM1" url="主库IP:3306" user="root" password="密码"><readHost host="hostS1" url="从库IP:3306" user="root" password="密码" /></writeHost></dataHost></mycat:schema>
- 编辑 server.xml,修改用户与逻辑库:
<user name="root"><property name="password">123456</property><property name="schemas">USERDB</property></user>
4. 启动与验证
- 启动 Mycat:
cd /usr/local/mycat/bin./mycat start
- 查看端口(8066、9066)是否开启:
netstat -tulnp
- 在主,从库授权 root 用户远程登录:
use mysql;grant all privileges on *.* to 'root'@'%' identified by '密码' with grant option;
- 在 Mycat 节点验证:使用数据端口登录 MySQL,进行查询和插入操作,通过管理端口查看读写分离效果。