Docker實戰之MySQL主從複製

前言

曾幾什麼時候,看着高大上的架構和各位前輩高超的炫技,有沒有怦然心動,也想一窺究竟?每當面試的時候,拿着單應用的架構,吹着分庫分表的牛X,有沒有內心慌的一批?mysql

其實不少時候,咱們所缺乏的只是對高大上的技術的演練。沒有相關的業務需求,沒有集羣環境,而後便只是Google幾篇博文,看下原理,便算是瞭解了。然而真的明白了嗎?衆多的複製粘貼中,那篇文章纔對咱們有用,哪些又是以訛傳訛?面試

所幸容器技術的快速發展,讓各類技術的模擬成爲現實。接下來Docker相關的一系列文章,將以實戰爲主,幫助你們快速搭建測試和演練環境。sql

Docker文件編排

因爲是測試爲了演練用,這裏用docker-compose進行配置文件的編排,實際的集羣環境中並非這麼部署的。docker

  1. 編排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"
  1. 配置master配置文件my.cnf
[mysqld]
# [必須]啓用二進制日誌
log-bin=mysql-bin 
# [必須]服務器惟一ID,默認是1,通常取IP最後一段  
server-id=1
## 複製過濾:也就是指定哪一個數據庫不用同步(mysql庫通常不一樣步)
binlog-ignore-db=mysql
  1. 配置slave配置文件my.cnf
[mysqld]
# [必須]服務器惟一ID,默認是1,通常取IP最後一段  
server-id=2
  1. 啓動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

配置主從複製

  1. 配置master

  1. 配置slave

這時候就能夠運行一些 SQL 語句來驗證同步服務是否正常了。segmentfault

驗證主從複製

  1. master建立db

  1. 查看slave是否同步建立

由結果可知,已完成MySQL主從複製環境的搭建。服務器

讀寫分離

MySQL主從複製是其本身的功能,實現讀寫分離就得依靠其餘組件了,好比sharding-jdbc。可是sharding-jdbc只是實現讀寫分離,自己的權限控制仍是須要MySQL這邊來配置的。架構

  1. 配置master帳戶及權限

建立賬號並授予讀寫權限tcp

CREATE USER 'master'@'%' IDENTIFIED BY 'Password123';
GRANT select,insert,update,delete ON *.* TO 'master'@'%';
flush privileges;

  1. 配置slave帳戶及權限

建立賬號並授予只讀權限測試

use mysql;
CREATE USER 'slave'@'%' IDENTIFIED BY 'Password123';
GRANT select ON *.* TO 'slave'@'%';
FLUSH PRIVILEGES;

最後

這篇文章以搭建環境爲主,後續會繼續完善故障轉移、分庫分表、數據平滑遷移等相關演練。菜鳥博客,不盡完善,但願你們不吝賜教。

公衆號【當我趕上你】
相關文章
相關標籤/搜索