1. 程式人生 > 實用技巧 >利用 docker 快速搭建 mysql 主從複製、讀寫分離叢集

利用 docker 快速搭建 mysql 主從複製、讀寫分離叢集

利用 docker 快速搭建 mysql 叢集

搭建 一主一從 主從複製叢集

主從同步原理:

基於 binlog 日誌存放了 mysql 的操作指令

mysql主從同步相對於 redis 比較脆弱

主庫 寫入資料,從庫 讀取資料 只是一個約定,從庫依然可以寫入資料,雖然會導致資料不同步問題。

使用 XShell 訪問阿里雲伺服器:

cd ~
mkdir mysql
cd conf1
vi docker.cnf

docker.cnf

[mysqld]
server-id=1
log-bin=master-bin
character-set-server=utf8
max_connections=1024
max_connect_errors=1024
[mysql]
default-character-set=utf8
[client]
default-character-set=utf8
cd ../conf2
vi docker.cnf

docker.cnf

[mysqld]
server-id=2
log-bin=master-bin
character-set-server=utf8
max_connections=1024
max_connect_errors=1024
[mysql]
default-character-set=utf8
[client]
default-character-set=utf8
cd ..

拉取映象

docker pull mysql

建立並啟動容器

-d 後臺執行
--name 給容器起名
-p 埠對映
-v 目錄掛載

docker run -d --name mysqlmaster3306 -p 3306:3306 -v $PWD/conf1:/etc/mysql/conf.d -v $PWD/data1/:/var/lib/mysql/ --privileged=true -e MYSQL_ROOT_PASSWORD=root mysql

獲取容器的日誌記錄

docker logs -f --tail=30 mysqlmaster3306

進入容器

docker exec -it mysqlmaster3306 /bin/bash
mysql -u root -p
alter user 'root'@'%' identified with mysql_native_password by 'root';
flush privileges;

主從同步:

在主節點中,建立一個用於同步資料的賬號:

create user 'mysqlslave3307'@'%' identified with mysql_native_password by 'slave3307';
flush privileges;
grant all on *.* to 'mysqlslave3307'@'%';
flush privileges;
show master status;

記錄 binlog 日誌檔案的資料

+-------------------+----------+--------------+------------------+-------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| master-bin.000004 |      443 |              |                  |                   |
+-------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
mysql> exit
docker inspect mysqlmaster3306

登入從節點,修改 master 資料庫指向 mysqlmaster3306

docker run -d --name mysqlslave3307 -p 3307:3306 -v $PWD/conf2:/etc/mysql/conf.d -v $PWD/data2/:/var/lib/mysql/ --privileged=true -e MYSQL_ROOT_PASSWORD=root mysql
docker logs -f --tail=30 mysqlslave3307
docker exec -it mysqlslave3307 /bin/bash
mysql -u root -p
alter user 'root'@'%' identified with mysql_native_password by 'root';
flush privileges;
change master to master_host='172.18.0.6',master_port=3306,master_user='mysqlslave3307',master_password='slave3307',master_log_file='master-bin.000004',master_log_pos=443,master_connect_retry=3;

master_host、master_log_file、master_log_pos

開啟 slave 模式

從節點模式

start slave

檢視從節點狀態

show slave status \G

驗證 mysql 叢集,主從複製是否成功。

在主節點中建立一個 test 資料庫,欄位 id、name。在主節點中進行增刪改操作,在從節點中檢視資料是否同步。

一主多從

主負責寫(只有一個寫節點)
從負責讀(多個從節點負責讀)
整個mysql叢集 讀資料效能就會提高

Aop 動態切換資料來源

假設專案中使用了 一主一從 兩個 mysql 服務,那麼在 yml 中配置兩個資料來源,進行 dao 層操作的時候 需要實現一個 aop 區分攔截所有的 dao 層方法,
就可以通過方法的名字區判斷當前的dao層方法時讀還是寫,然後動態的切換資料來源。

Mycat 實現讀寫分離

什麼是 Mycat ?

資料庫中介軟體:放在資料庫(mysql Oracle sqlserver mongdb)和業務伺服器中間使用的一種軟體

Mycat 會自動識別 sql語句是 讀操作 還是寫操作