實現 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)]>