实现 MySQL 的读写分离主要可以通过以下几种方式:
-
一主多从架构:
-
设置一个主数据库(Master)来处理写操作(如 INSERT、UPDATE、DELETE)。
-
设置多个从数据库(Slave)来处理读操作(如 SELECT)。
-
主数据库通过复制功能(如 MySQL 的主从复制)将数据变更同步到从数据库上。
-
-
使用中间件:
-
中间件如 MyCat、ProxySQL、MaxScale 等,它们位于应用程序和数据库服务器之间,负责处理读写请求的路由。
-
中间件根据配置的策略(如基于 SQL 语句的类型、用户、时间等)将读请求发送到从数据库,将写请求发送到主数据库。
-
中间件通常还提供负载均衡、故障转移等功能。
-
-
数据库自带功能:
-
一些数据库管理系统(如 MySQL 的 Group Replication 或 MariaDB 的 Galera Cluster)提供了内置的读写分离和故障转移功能。
-
这些功能通常更加稳定可靠,但可能受到数据库管理系统版本的限制。
-
以下是实现读写分离的一般步骤:
-
配置主从复制:
-
在主数据库上配置二进制日志(binary logging)和服务器 ID。
-
在从数据库上配置主数据库的 IP 地址、端口、用户名、密码等信息,并启动复制进程。
-
验证从数据库是否成功从主数据库复制数据。
-
-
配置中间件(如果使用):
-
根据所选的中间件进行配置,包括数据库连接信息、读写分离策略、负载均衡策略等。
-
启动中间件服务,并验证其是否正常工作。
-
-
修改应用程序(如果使用基于应用程序的读写分离):
-
修改应用程序的代码,使其根据业务需求将读请求发送到从数据库,将写请求发送到主数据库。
-
这可能需要修改数据库连接字符串、添加路由逻辑等。
-
-
监控和日志:
-
对读写分离架构进行持续的监控,包括主从数据库的同步状态、性能指标等。
-
记录相关的日志信息,以便在出现问题时能够快速定位和解决问题。
-
环境
Redhat 9.2
192.168.200.133 mysql-proxy
192.168.200.128 master
192.168.200.129 slave
步骤
1、修改主机名,关闭防火墙
[root@localhost ~]# hostnamectl hostname master
[root@localhost ~]# bash
[root@master ~]# systemctl stop firewalld.service
[root@master ~]# systemctl disable firewalld.service
Removed "/etc/systemd/system/multi-user.target.wants/firewalld.service".
Removed "/etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service".
[root@master ~]# setenforce 0
[root@master ~]#[root@localhost ~]# hostnamectl hostname slave
[root@localhost ~]# bash
[root@slave ~]# systemctl stop firewalld.service
[root@slave ~]# systemctl disable firewalld.service
Removed "/etc/systemd/system/multi-user.target.wants/firewalld.service".
Removed "/etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service".
[root@slave ~]# setenforce 0
[root@slave ~]# [root@admin ~]# hostnamectl hostname mysql_proxy
[root@admin ~]# bash
[root@mysqlproxy ~]# systemctl stop firewalld.service
[root@mysqlproxy ~]# systemctl disable firewalld.service
Removed "/etc/systemd/system/multi-user.target.wants/firewalld.service".
Removed "/etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service".
[root@mysqlproxy ~]# setenforce 0
[root@mysqlproxy ~]#
2、安装数据库软件
[root@master ~]# yum -y install mariadb*
[root@master ~]# systemctl restart mariadb.service
[root@master ~]# systemctl enable mariadb.service
Created symlink /etc/systemd/system/mysql.service → /usr/lib/systemd/system/mariadb.service.
Created symlink /etc/systemd/system/mysqld.service → /usr/lib/systemd/system/mariadb.service.
Created symlink /etc/systemd/system/multi-user.target.wants/mariadb.service → /usr/lib/systemd/system/mariadb.service.
[root@master ~]# mysql_secure_installation [root@slave ~]# yum -y install mariadb*
[root@slave ~]# systemctl restart mariadb.service
[root@slave ~]# systemctl enable mariadb.service
Created symlink /etc/systemd/system/mysql.service → /usr/lib/systemd/system/mariadb.service.
Created symlink /etc/systemd/system/mysqld.service → /usr/lib/systemd/system/mariadb.service.
Created symlink /etc/systemd/system/multi-user.target.wants/mariadb.service → /usr/lib/systemd/system/mariadb.service.
[root@slave ~]#
[root@slave ~]# mysql_secure_installation
3、对两台机器做主从同步
#master配置
[root@master ~]# vim /etc/my.cnf.d/mariadb-server.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mariadb/mariadb.log
pid-file=/run/mariadb/mariadb.pid
log_bin=mysql_bin //添加
binlog_ignore_db=mysql //添加
server_id=200 //添加
[root@master ~]# systemctl restart mariadb.service #slave
[root@slave ~]# vim /etc/my.cnf.d/mariadb-server.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mariadb/mariadb.log
pid-file=/run/mariadb/mariadb.pid
log_bin=mysql_bin //添加如下
binlog_ignore_db=mysql
server_id=201
[root@slave ~]# systemctl restart mariadb.service
4、创建登录用户并授权
[root@master ~]# mysql -uroot -p
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 4
Server version: 10.5.16-MariaDB-log MariaDB ServerCopyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.MariaDB [(none)]> create user 'slave'@'%' identified by '1';
Query OK, 0 rows affected (0.001 sec)MariaDB [(none)]> grant replication slave on *.* to 'slave'@'%' identified by '1';
Query OK, 0 rows affected (0.001 sec)
5、在slave上开启同步
MariaDB [(none)]> change master to master_host='192.168.200.128',master_user='slave',master_password='1';
Query OK, 0 rows affected (0.007 sec)MariaDB [(none)]> start slave;
Query OK, 0 rows affected (0.001 sec)MariaDB [(none)]> show slave status \G;
*************************** 1. row ***************************Slave_IO_State: Waiting for master to send eventMaster_Host: 192.168.200.128Master_User: slaveMaster_Port: 3306Connect_Retry: 60Master_Log_File: mysql_bin.000001Read_Master_Log_Pos: 659Relay_Log_File: mariadb-relay-bin.000002Relay_Log_Pos: 958Relay_Master_Log_File: mysql_bin.000001Slave_IO_Running: YesSlave_SQL_Running: Yes
......
6、给mysql-proxy主机安装lua解析器
安装解析器和mariadb
[root@mysqlproxy ~]# yum -y install mariadb*
[root@mysqlproxy ~]# systemctl restart mariadb.service
[root@mysqlproxy ~]# mysql_secure_installation
[root@mysqlproxy ~]# yum -y install lua*
#下载Mysql-proxy软件⼯具
[root@mysqlproxy ~]# wget https://cdn.mysql.com/archives/mysql-proxy/mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz
[root@mysqlproxy ~]# ls
公共 模板 视频 图片 文档 下载 音乐 桌面 anaconda-ks.cfg mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz
[root@mysqlproxy ~]#
#解压
[root@mysqlproxy ~]# tar -xvf mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz -C /usr/local/
[root@mysqlproxy ~]# cd /usr/local/mysql-proxy-0.8.5-linux-el6-x86-64bit/
[root@mysqlproxy mysql-proxy-0.8.5-linux-el6-x86-64bit]# ls
bin include lib libexec licenses share
[root@mysqlproxy mysql-proxy-0.8.5-linux-el6-x86-64bit]#
#配置环境变量
[root@mysqlproxy ~]# export PATH=$PATH:$HOME/bin:/usr/local/mysql-proxy-0.8.5-linux-el6-x86-64bit/bin
7、增加配置文件
[root@mysqlproxy ~]# vim /usr/local/mysql-proxy-0.8.5-linux-el6-x86-64bit/mysql_proxy.conf
[mysql-proxy]plugins=proxy //代理插件proxy-address=192.168.200.133:4040 // 定义 MySQL Proxy 监听的地址和端口,客户端应该连接到这个地址和端口来访问 MySQL 服务proxy-backend-addresses=192.168.200.129:3306 // 主服务器地址进行写操作proxy-read-only-backend-addresses=192.168.200.128:3306 //从服务器地址进行读操作proxy-lua-script=/usr/local/mysql-proxy-0.8.5-linux-el6-x86-64bit//share/doc/mysql- proxy/rw-splitting.lualog-file=/usr/local/mysql-proxy-0.8.5-linux-el6-x86-64bit/mysql-proxy.loglog-level=debugkeepalive=true //保持连接daemon=true#修改权限[root@mysqlproxy ~]# chmod 660 /usr/local/mysql-proxy-0.8.5-linux-el6-x86-64bit/mysql_proxy.conf
[root@mysqlproxy ~]#
8、启动mysql_proxy服务
启动后修改读写分离配置文件
[root@mysqlproxy ~]# mysql-proxy --defaults-file=/usr/local/mysql-proxy-0.8.5-linux-el6-x86-64bit/mysql_proxy.conf
[root@mysqlproxy ~]# ss -anltp | grep mysql-proxy
LISTEN 0 128 192.168.200.133:4040 0.0.0.0:* users:(("mysql-proxy",pid=84175,fd=10))
[root@mysqlproxy ~]#
[root@mysqlproxy ~]# vim /usr/local/mysql-proxy-0.8.5-linux-el6-x86-64bit/share/doc/mysql-proxy/rw-splitting.lua 38 if not proxy.global.config.rwsplit then39 proxy.global.config.rwsplit = {40 min_idle_connections = 1, //1,只要有⼀个连接,就进⾏读写分离。41 max_idle_connections = 8,42 43 is_debug = false44 }45 end
[root@mysqlproxy ~]# pkill mysql-proxy //终止进程
[root@mysqlproxy ~]# mysql-proxy --defaults-file=/usr/local/mysql-proxy-0.8.5-linux-el6-x86-64bit/mysql_proxy.conf
[root@mysqlproxy ~]#
9、主从服务器为mysqlproxy数据库账户授权
[root@master ~]# mysql -uroot -p
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 6
Server version: 10.5.16-MariaDB-log MariaDB ServerCopyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.MariaDB [(none)]> GRANT ALL ON *.* TO 'mysqlproxy'@'%' IDENTIFIED BY '1';
Query OK, 0 rows affected (0.001 sec)MariaDB [(none)]> [root@slave ~]# mysql -uroot -p
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 7
Server version: 10.5.16-MariaDB-log MariaDB ServerCopyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.MariaDB [(none)]> GRANT ALL ON *.* TO 'mysqlproxy'@'%' IDENTIFIED BY '1';
Query OK, 0 rows affected (0.001 sec)MariaDB [(none)]>
10、测试
[root@mysqlproxy ~]# mysql -umysqlproxy -p -P 4040 -h 192.168.200.133
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 13
Server version: 10.5.16-MariaDB-log MariaDB ServerCopyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.MariaDB [(none)]>