利用 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語句是 讀操作 還是寫操作