1. 程式人生 > 其它 >基於docker的mysql主從同步搭建

基於docker的mysql主從同步搭建

環境

1、macbook
2、docker 20.10.17
3、docker desktop

開始搭建

* 第一步:準備容器檔案存放的物理檔案地址目錄(/Users/qeek/mydata 可以按需定義)

##### 主庫
mkdir -pv /Users/qeek/mydata/mysql-master/log
mkdir -pv /Users/qeek/mydata/mysql-master/data
mkdir -pv /Users/qeek/mydata/mysql-master/conf.d
mkdir -pv /Users/qeek/mydata/mysql-master/conf

##### 從庫
mkdir -pv /Users/qeek/mydata/mysql-slave/log
mkdir -pv /Users/qeek/mydata/mysql-slave/data
mkdir -pv /Users/qeek/mydata/mysql-slave/conf.d
mkdir -pv /Users/qeek/mydata/mysql-slave/conf

* 第二步:docker desktop(docker桌面管理工具)-> Preferences -> Resources -> File sharding

 把上面新建立的目錄新增進去後重啟docker(繫結宿主機目錄到docker容器中),否則會報目錄許可權問題。

* 第三步:設定主從服務配置

##### 主庫 
新增 /Users/qeek/mydata/mysql-master/conf/my.cnf
      
        [mysqld]
        ## 設定server_id,同一區域網中需要唯一
        server_id=101 
        ## 指定不需要同步的資料庫名稱
        binlog-ignore-db=mysql  
        ## 開啟二進位制日誌功能
        log-bin=mall-mysql-bin  
        ## 設定二進位制日誌使用記憶體大小(事務)
        binlog_cache_size=1M  
        ## 設定使用的二進位制日誌格式(mixed,statement,row)
        binlog_format=mixed  
        ## 二進位制日誌過期清理時間。預設值為0,表示不自動清理。
        expire_logs_days=7  
        ## 跳過主從複製中遇到的所有錯誤或指定型別的錯誤,避免slave端複製中斷。
        ## 如:1062錯誤是指一些主鍵重複,1032錯誤是因為主從資料庫資料不一致
        slave_skip_errors=1062

##### 從庫 
新增 /Users/qeek/mydata/mysql-slave/conf/my.cnf

        [mysqld]
        ## 設定server_id,同一區域網中需要唯一
        server_id=102
        ## 指定不需要同步的資料庫名稱
        binlog-ignore-db=mysql  
        ## 開啟二進位制日誌功能,以備Slave作為其它資料庫例項的Master時使用
        log-bin=mall-mysql-slave1-bin  
        ## 設定二進位制日誌使用記憶體大小(事務)
        binlog_cache_size=1M  
        ## 設定使用的二進位制日誌格式(mixed,statement,row)
        binlog_format=mixed  
        ## 二進位制日誌過期清理時間。預設值為0,表示不自動清理。
        expire_logs_days=7  
        ## 跳過主從複製中遇到的所有錯誤或指定型別的錯誤,避免slave端複製中斷。
        ## 如:1062錯誤是指一些主鍵重複,1032錯誤是因為主從資料庫資料不一致
        slave_skip_errors=1062  
        ## relay_log配置中繼日誌
        relay_log=mall-mysql-relay-bin  
        ## log_slave_updates表示slave將複製事件寫進自己的二進位制日誌
        log_slave_updates=1  
        ## slave設定為只讀(具有super許可權的使用者除外)
        read_only=1

* 第四步:啟動docker mysql服務

##### 主庫 
  * docker run --name mysql-master -p 3307:3306 -v /Users/qeek/mydata/mysql-master/log:/var/log/mysql -v /Users/qeek/mydata/mysql-master/data:/var/lib/mysql -v /Users/qeek/mydata/mysql-master/conf.d:/etc/mysql/conf.d/ -v /Users/qeek/mydata/mysql-master/conf:/etc/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0.31

##### 從庫 
 * docker run --name mysql-slave -p 3308:3306 -v /Users/qeek/mydata/mysql-slave/log:/var/log/mysql -v /Users/qeek/mydata/mysql-slave/data:/var/lib/mysql -v /Users/qeek/mydata/mysql-slave/conf.d:/etc/mysql/conf.d/ -v /Users/qeek/mydata/mysql-slave/conf:/etc/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0.31

##### 檢視docker映象清單 
docker container ls -a
##### 進入docker 主庫映象內
docker exec -it mysql-master bash
##### 進入docker 主庫mysql內
mysql -u root -p
##### 主庫內設定從庫讀取資料賬號
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
##### 主庫內授權賬號複製許可權
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON . TO 'slave'@'%';
##### 主庫內設定密碼加密方法(mysql8.0.4之前使用的“ mysql_native_password”認證,之後用的“ caching_sha2_password”,修改成老的加密認證方式)
ALTER USER 'slave'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
##### 檢視mysql master主庫狀態,記住“File”和“Position”值
##### "exit;"退出主庫mysql,再"exit;"退出mysql主庫映象
##### 檢視mysql主庫docker映象內ip地址
docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mysql-master
##### 進入mysql從庫映象內
docker exec -it mysql-slave bash
##### 進入從庫mysql內
mysql -uroot -p
設定從庫的主庫地址及日誌檔案、當前資料位置“master_log_file = 上面 File ”、“master_log_pos = 上面 Position”
change master to master_host='172.17.0.2', master_user='slave', master_password='123456', master_port=3306, master_log_file='mall-mysql-bin.000005', master_log_pos=157, master_connect_retry=30;
##### 啟動從庫同步
start slave;
檢視從庫同步狀態,如果“Slave_IO_State = Waiting for source to send event”,那麼恭喜你mysql主從配置完成,去主庫操作會自動同步從庫了。
show slave status;

* 第五步:最終效果