一.背景
1.什麼是讀寫分離
讀寫分離從字面上就很好理解,讀數據庫和寫數據庫的操作分別執行,讀或寫操作分別用不同的計算機或計算機組來承擔任務。可以參考下基礎的架構圖。

2.為什麼要讀寫分離
還不是為了安全,讀寫分離為主從同步的一種備份方案,當主數據庫出現問題的時候,從數據庫可以代替主數據庫,避免數據丟失,從而更加的安全。
進一步而言,當配置好主從複製後,我們就可以把兩台機器做不同的用途,由於從機寫入數據時不會同步到主機,因此把主機做寫服務器,從機做讀服務器,得以分散壓力,使得數據庫更穩定高效。(一般情況都是讀操作更多)
3.下一步?
如果有多個讀寫服務器組,可以使用多主多從的方式建立,然後使用Nginx代理讀和寫組服務器,或使用HaProxy或LVS等來組建統一的訪問入口,交給開發訪問。
二、搭建
主從複製在前一期在復現過,這裡來詳細闡述my.cnf幾個參數。
# 開啟二進制日誌
log-bin=mysql-bin
# 設置服務器id
server-id=1
# 使用binlog在每N次寫入後與硬盤同步
sync-binlog=1
# 5天後自動清理二進制日誌
expire_log_days=1
我在這裡簡單搭建:
# 主服務器
docker run
-p 12345:3306
--name mysql_master
-v /opt/docker/mysql_master/conf:/etc/mysql/conf.d
-v /opt/docker/mysql_master/logs:/logs
-v /opt/docker/mysql_master/data:/var/lib/mysql
-e MYSQL_ROOT_PASSWORD=123456
-d mysql:5.7
docker run
-p 12346:3306
--name mysql_node
-v /opt/docker/mysql_node/conf:/etc/mysql/conf.d
-v /opt/docker/mysql_node/logs:/logs
-v /opt/docker/mysql_node/data:/var/lib/mysql
-e MYSQL_ROOT_PASSWORD=123456
-d mysql:5.7

配置文件,分別執行下面兩條命令。
cat > /opt/docker/mysql_master/conf/my.cnf << EOF
[mysqld]
# 開啟二進制日誌
log-bin=mysql-bin
# 設置服務器id
server-id=1
# 使用binlog在每N次寫入後與硬盤同步
sync-binlog=1
# 5天後自動清理二進制日誌
expire_logs_days=5
EOF
cat > /opt/docker/mysql_node/conf/my.cnf << EOF
[mysqld]
server-id=2
EOF
重啟生效
主節點上操作: 執行以下命令,主節點新建立用戶,用於同步。
docker exec -it mysql_master /bin/bash
mysql -uroot -p123456
mysql> CREATE USER 'repl'@'%' identified by '123456';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
docker restart mysql_master
docker restart mysql_node
# 回到shell 操作界面
quit
exit
從節點上操作:執行以下命令
docker exec -it mysql_node /bin/bash
# 把下面的ip換成你主節點的ip和端口
mysql -uroot -p123456
mysql> CHANGE MASTER TO MASTER_HOST='192.168.0.187', MASTER_PORT=12345,MASTER_USER='repl',MASTER_PASSWORD='123456';
# 啟動同步
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
2-2-4:查看同步狀態
mysql> show slave status G;
如果沒有報錯,則部署成功。

驗證
在主master上去創建數據庫或新建表,加入數據,從節點很快接受到同步,同樣的,如果在從node節點上去插入數據的話,主節點的數據無變化。這樣就做好了讀寫分離的實驗,後面我們把主master作為讀/寫節點,nodes作為讀節點就好了。
原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/221753.html
微信掃一掃
支付寶掃一掃