数据库读写分离

实现 MySQL 的读写分离主要可以通过以下几种方式:

  1. 一主多从架构

    • 设置一个主数据库(Master)来处理写操作(如 INSERT、UPDATE、DELETE)。

    • 设置多个从数据库(Slave)来处理读操作(如 SELECT)。

    • 主数据库通过复制功能(如 MySQL 的主从复制)将数据变更同步到从数据库上。

  2. 使用中间件

    • 中间件如 MyCat、ProxySQL、MaxScale 等,它们位于应用程序和数据库服务器之间,负责处理读写请求的路由。

    • 中间件根据配置的策略(如基于 SQL 语句的类型、用户、时间等)将读请求发送到从数据库,将写请求发送到主数据库。

    • 中间件通常还提供负载均衡、故障转移等功能。

  3. 数据库自带功能

    • 一些数据库管理系统(如 MySQL 的 Group Replication 或 MariaDB 的 Galera Cluster)提供了内置的读写分离和故障转移功能。

    • 这些功能通常更加稳定可靠,但可能受到数据库管理系统版本的限制。

以下是实现读写分离的一般步骤:

  1. 配置主从复制

    • 在主数据库上配置二进制日志(binary logging)和服务器 ID。

    • 在从数据库上配置主数据库的 IP 地址、端口、用户名、密码等信息,并启动复制进程。

    • 验证从数据库是否成功从主数据库复制数据。

  2. 配置中间件(如果使用):

    • 根据所选的中间件进行配置,包括数据库连接信息、读写分离策略、负载均衡策略等。

    • 启动中间件服务,并验证其是否正常工作。

  3. 修改应用程序(如果使用基于应用程序的读写分离):

    • 修改应用程序的代码,使其根据业务需求将读请求发送到从数据库,将写请求发送到主数据库。

    • 这可能需要修改数据库连接字符串、添加路由逻辑等。

  4. 监控和日志

    • 对读写分离架构进行持续的监控,包括主从数据库的同步状态、性能指标等。

    • 记录相关的日志信息,以便在出现问题时能够快速定位和解决问题。

环境

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 Server

Copyright (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 event
                   Master_Host: 192.168.200.128
                   Master_User: slave
                   Master_Port: 3306
                 Connect_Retry: 60
               Master_Log_File: mysql_bin.000001
           Read_Master_Log_Pos: 659
                Relay_Log_File: mariadb-relay-bin.000002
                 Relay_Log_Pos: 958
         Relay_Master_Log_File: mysql_bin.000001
              Slave_IO_Running: Yes
             Slave_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.lua
 log-file=/usr/local/mysql-proxy-0.8.5-linux-el6-x86-64bit/mysql-proxy.log
 log-level=debug
 keepalive=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 then
 39         proxy.global.config.rwsplit = {
 40                 min_idle_connections = 1,   //1,只要有⼀个连接,就进⾏读写分离。
 41                 max_idle_connections = 8,
 42 
 43                 is_debug = false
 44         }
 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 Server

Copyright (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 Server

Copyright (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 Server

Copyright (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)]> 

  • 19
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值