前言 曾幾何時,看著高大上的架構和各位前輩高超的炫技,有沒有怦然心動,也想一窺究竟?每當面試的時候,拿著單應用的架構,吹著分庫分表的牛X,有沒有心裡慌的一批? 其實很多時候,我們所缺少的只是對高大上的技術的演練。沒有相關的業務需求,沒有集群環境,然後便只是Google幾篇博文,看下原理,便算是瞭解了 ...
前言
曾幾何時,看著高大上的架構和各位前輩高超的炫技,有沒有怦然心動,也想一窺究竟?每當面試的時候,拿著單應用的架構,吹著分庫分表的牛X,有沒有心裡慌的一批?
其實很多時候,我們所缺少的只是對高大上的技術的演練。沒有相關的業務需求,沒有集群環境,然後便只是Google幾篇博文,看下原理,便算是瞭解了。然而真的明白了嗎?眾多的複製粘貼中,那篇文章才對我們有用,哪些又是以訛傳訛?
所幸容器技術的快速發展,讓各種技術的模擬成為現實。接下來Docker相關的一系列文章,將以實戰為主,幫助大家快速搭建測試和演練環境。
Docker文件編排
由於是測試為了演練用,這裡用docker-compose進行配置文件的編排,實際的集群環境中並不是這麼部署的。
- 編排docker-compose-mysql-cluster.yml,安裝master和slave節點
version: '3'
services:
mysql-master:
image: mysql:5.7
container_name: mysql-master
environment:
- MYSQL_ROOT_PASSWORD=root
ports:
- "3307:3306"
volumes:
- "./mysql/master/my.cnf:/etc/my.cnf"
- "./mysql/master/data:/var/lib/mysql"
links:
- mysql-slave
mysql-slave:
image: mysql:5.7
container_name: mysql-slave
environment:
- MYSQL_ROOT_PASSWORD=root
ports:
- "3308:3306"
volumes:
- "./mysql/slave/my.cnf:/etc/my.cnf"
- "./mysql/slave/data:/var/lib/mysql"
- 配置master配置文件my.cnf
[mysqld]
# [必須]啟用二進位日誌
log-bin=mysql-bin
# [必須]伺服器唯一ID,預設是1,一般取IP最後一段
server-id=1
## 複製過濾:也就是指定哪個資料庫不用同步(mysql庫一般不同步)
binlog-ignore-db=mysql
- 配置slave配置文件my.cnf
[mysqld]
# [必須]伺服器唯一ID,預設是1,一般取IP最後一段
server-id=2
- 啟動docker-compose,創建docker鏡像文件
docker-compose -f docker-compose-mysql-cluster.yml up -d
docker ps
查看進程,可以看到2個實例已啟動。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1f4ad96b4d5e mysql:5.7 "docker-entrypoint.s…" 48 seconds ago Up 46 seconds 33060/tcp, 0.0.0.0:3307->3306/tcp mysql-master
8e2214aacc43 mysql:5.7 "docker-entrypoint.s…" 49 seconds ago Up 47 seconds 33060/tcp, 0.0.0.0:3308->3306/tcp mysql-slave
配置主從複製
- 配置master
- 配置slave
這時候就可以運行一些 SQL 語句來驗證同步服務是否正常了。
驗證主從複製
- master創建db
- 查看slave是否同步創建
由結果可知,已完成MySQL主從複製環境的搭建。
讀寫分離
MySQL主從複製是其自己的功能,實現讀寫分離就得依靠其他組件了,比如sharding-jdbc
。但是sharding-jdbc
只是實現讀寫分離,本身的許可權控制還是需要MySQL這邊來配置的。
- 配置master賬戶及許可權
創建帳號並授予讀寫許可權
CREATE USER 'master'@'%' IDENTIFIED BY 'Password123';
GRANT select,insert,update,delete ON *.* TO 'master'@'%';
flush privileges;
- 配置slave賬戶及許可權
創建帳號並授予只讀許可權
use mysql;
CREATE USER 'slave'@'%' IDENTIFIED BY 'Password123';
GRANT select ON *.* TO 'slave'@'%';
FLUSH PRIVILEGES;
最後
這篇文章以搭建環境為主,後續會繼續完善故障轉移、分庫分表、數據平滑遷移等相關演練。菜鳥博客,不盡完善,希望大家不吝賜教。
公眾號 【當我遇上你】