曾幾什麼時候,看着高大上的架構和各位前輩高超的炫技,有沒有怦然心動,也想一窺究竟?每當面試的時候,拿着單應用的架構,吹着分庫分表的牛X,有沒有內心慌的一批?mysql
其實不少時候,咱們所缺乏的只是對高大上的技術的演練。沒有相關的業務需求,沒有集羣環境,而後便只是Google幾篇博文,看下原理,便算是瞭解了。然而真的明白了嗎?衆多的複製粘貼中,那篇文章纔對咱們有用,哪些又是以訛傳訛?面試
所幸容器技術的快速發展,讓各類技術的模擬成爲現實。接下來Docker相關的一系列文章,將以實戰爲主,幫助你們快速搭建測試和演練環境。sql
因爲是測試爲了演練用,這裏用docker-compose進行配置文件的編排,實際的集羣環境中並非這麼部署的。docker
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"
[mysqld] # [必須]啓用二進制日誌 log-bin=mysql-bin # [必須]服務器惟一ID,默認是1,通常取IP最後一段 server-id=1 ## 複製過濾:也就是指定哪一個數據庫不用同步(mysql庫通常不一樣步) binlog-ignore-db=mysql
[mysqld] # [必須]服務器惟一ID,默認是1,通常取IP最後一段 server-id=2
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
這時候就能夠運行一些 SQL 語句來驗證同步服務是否正常了。segmentfault
由結果可知,已完成MySQL主從複製環境的搭建。服務器
MySQL主從複製是其本身的功能,實現讀寫分離就得依靠其餘組件了,好比sharding-jdbc
。可是sharding-jdbc
只是實現讀寫分離,自己的權限控制仍是須要MySQL這邊來配置的。架構
建立賬號並授予讀寫權限tcp
CREATE USER 'master'@'%' IDENTIFIED BY 'Password123'; GRANT select,insert,update,delete ON *.* TO 'master'@'%'; flush privileges;
建立賬號並授予只讀權限測試
use mysql; CREATE USER 'slave'@'%' IDENTIFIED BY 'Password123'; GRANT select ON *.* TO 'slave'@'%'; FLUSH PRIVILEGES;
這篇文章以搭建環境爲主,後續會繼續完善故障轉移、分庫分表、數據平滑遷移等相關演練。菜鳥博客,不盡完善,但願你們不吝賜教。
公衆號【當我趕上你】