Docker學習二-MySQL雙主互備 https://blog.csdn.net/rajayu/article/details/88840234
主從複製原理
主從複製原理圖:
執行主從複製三步:
①master將改變記錄到二進制日誌(Binary log)
②Slave訪問IO Thread將Master的Bibary log 記錄拷貝到Slave的中繼日誌(Relay log)
③Slave的SQL thread線程執行Relay log的事件,將改變執行一遍,同步到Slave的數據庫中
環境要求
- win10系統,或者Linux系統做參考
- docker for windows, win10以上電腦纔可使用
- mysql5.7,可以只安裝MySQL Server,也不是必需品
- Navicat
一直知道docker是個神奇的東西,想要學習下使用,去年的時候,安裝windows版本的docker還是會有一大堆問題,啓動的時候就會出一大堆問題,而現在新版本的docker已經完全沒有問題,可以正常使用,安裝過程我在這裏不做贅述,大家可以度娘。
下載鏡像
- 搜索官方鏡像 ,命令:
docker search mysql
- 下載鏡像,命令:
docker pull mysql:5.7.21
3. 常用命令:
- docker images |grep “*” #本地鏡像列表中查找對應REPOSITORY爲*的鏡像
- docker run [OPTIONS] IMAGE [COMMAND] [ARG...] #創建一個本地容器,並啓動容器中實例
- docker start/stop/restart #啓動/停止/重啓實例
- docker exec [OPTIONS] CONTAINER COMMAND [ARG...] #在運行的容器中執行命令
- docker exec -i -t mysql01 /bin/bash #在容器mysql01 中開啓一個交互模式的終端
- docker ps #查看正在運行的容器
- docker logs --tail="100" mysql01 #查看mysql01容器中的日誌,倒數100行
啓動mysql容器
- 啓動主庫,容器名:mysql01
docker run -p 3308:3306 --name mysql01 -v D:\Docker\mysql\mysql01:/docker
-e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6
字段解釋:
-p 3308:3306:將容器的 3306 端口映射到主機(本地電腦)的 3308 端口。
–name mysql01:容器名配置爲mysql01
-v D:\Docker\mysql\mysql01:/docker:將主機的D:\Docker\mysql\mysql01目錄掛載到容器的/docker
-e MYSQL_ROOT_PASSWORD=123456:初始化 root 用戶的密碼。
-d mysql:5.6:使用的鏡像
注: 如果要目錄掛載,必須在docker中做這樣的配置,用於共享驅動器,我們共享的是D盤的文件夾,這裏共享的驅動器就是D盤。
2. 啓動從庫,容器名:mysql02
docker run -p 3309:3306 --name mysql02 -v D:\Docker\mysql\mysql02:/docker
-e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6
和主庫一樣。
配置
主庫配置
- 修改mysql配置
mysql鏡像中的默認的配置文件爲/etc/mysql/mysql.conf.d/mysqld.cnf,根據需要配置其參數即可。這裏我們主要配置主從複製相關參數。
第一步,在容器mysql01中實例啓動的時候操作,先將/etc/mysql/mysql.conf.d/mysqld.cnf複製到掛載的D:\Docker\mysql\mysql02下面;
第二步,修改配置文件,添加如下內容:
server-id=1 #採用自然數,保持唯一即可
read-only=0 #0代表讀寫均可
binlog-do-db=test-copy #代表需要進行同步的數據庫
binlog-ignore-db=mysql #不同步的數據庫
binlog-ignore-db=sys
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
log-bin=mysql-bin #二進制日誌
##不加binlog-do-db和binlog_ignore_db,那就表示備份全部數據庫。
第三步,將修改好的配置文件,複製到/etc/mysql/mysql.conf.d/mysqld.cnf,覆蓋原有的文件
docker exec -it mysql01 cp /docker/mysqld.cnf /etc/mysql/mysql.conf.d/mysqld.cnf
第四步,重啓容器中實例。
2. 配置同步的從庫,在主服務器新建一個用戶賦予“REPLICATION SLAVE”的權限
grant replication slave on *.* to [email protected] identified by '123456';
3. 查看主庫狀態
show master status;
需記住File、Position,配置從庫時會用到
從庫配置
- 修改mysql配置
mysql鏡像中的默認的配置文件爲/etc/mysql/mysql.conf.d/mysqld.cnf,根據需要配置其參數即可。這裏我們主要配置主從複製相關參數。
第一步,在容器mysql01中實例啓動的時候操作,先將/etc/mysql/mysql.conf.d/mysqld.cnf複製到掛載的D:\Docker\mysql\mysql02下面;
第二步,修改配置文件,添加如下內容:
server-id=2 #從庫,所以不能和主庫一致
read-only=1
replicate-do-db=test-copy
replicate-ignore-db=mysql
replicate-ignore-db=sys
replicate-ignore-db=information_schema
replicate-ignore-db=performance_schema
第三步,將修改好的配置文件,複製到/etc/mysql/mysql.conf.d/mysqld.cnf,覆蓋原有的文件
docker exec -it mysql01 cp /docker/mysqld.cnf /etc/mysql/mysql.conf.d/mysqld.cnf
第四步,重啓容器中實例。
2. 配置主庫信息
change master to master_host='10.238.64.31',master_port=3308,master_user='root',master_password='123456',
master_log_file='mysql-bin.000001',master_log_pos=329;
- 啓動並查看從庫狀態
start slave;
show slave status \G;
其中Slave_IO_Running、Slave_SQL_Running均爲Yes代表配置成功
測試主從複製
主庫新建test-copy(與前面配置文件中要同步的數據庫名一致)數據庫
新建完成後,刷新從庫,從庫也會存在test-copy數據庫,代表主從複製配置成功,之後主庫的讀寫操作均會同步至從庫
注意事項
- 如果出現Slave_IO_Running:Yes,Slave_SQL_Running:No的情況,可能是因爲刪了主庫的數據庫,同步到從庫的時候沒有庫導致的,錯誤日誌:
這樣修改就可以了:
- 如果Slave_IO_Running: Connecting,一直處於這種狀態,並且看日誌,Error_code是1045。
錯誤日誌:
目前的解決方案:
修改主庫中這個用戶的權限
grant replication slave on . to slave@’%’ identified by ‘123456’;