這篇文章只是讓大家瞭解一下mysql的主從複製,並且實現了一個案例
但是這個案例不是典型的案例
後面會在寫其他的配置方法
主從複製解決的問題
- 數據分佈
- 負載均衡
- 備份
- 高可用和故障切換
在這個案例中,我們只實現了備份 。其他幾個點,我們後邊一個一個實現,就不寫概念了
主從複製是如何工作的
這裏寫的只是簡單的實現過程,具體細節是很麻煩的,建議大家都去了解了解
- 主庫會把數據的更改記錄在一個二進制文件
- 從庫會把主庫的二進制文件複製到複製到自己的中繼日誌上(MySQL的日誌類型有6中,不清楚的可以看看這篇文章【MySQL】日誌分類)
- 從庫讀取中繼日誌的時間,然後重新放到備庫的數據庫上
開始準備
這是使用docker安裝MySQL的流程
這裏我們假定大部分配置採用默認值即可,在主庫和備庫都是全新
安裝並且擁有同樣的數據時這樣的假設是合理的。接下來我們將展示如何一步步配置複製:假設有服務
器server1(IP地址172.10.0.2)和服務器server2(IP地址172.10.0.3)
在使用docker把MySQL8.0的主節點安裝好後在創建倆個MySQL的從節點
分別執行下面語句,這倆個語句分別是創建mysql_slave 和 mysql_slave1的容器
docker run -itd --name mysql-slave -p 3307:3306 --net mynetwork --ip 172.10.0.3 -e MYSQL_ROOT_PASSWORD=123456 mysql
docker run -itd --name mysql-slave1 -p 3308:3306 --net mynetwork --ip 172.10.0.4 -e MYSQL_ROOT_PASSWORD=123456 mysql
可以看到我們現在創建了三個MySQL的容器
- 第一個是mysql-master
- 第二個是mysql-slave
- 第三個是mysql-slave1
然後三臺節點都進入到各自的容器裏
docker exec -it id /bin/bash
開始配置主從複製
創建賬號
# 創建一個賬號
CREATE USER 'master'@'172.10.0.%' IDENTIFIED WITH mysql_native_password BY '123456';
# 給予複製權限
GRANT REPLICATION SLAVE ON *.* TO 'master'@'172.10.0.%';
修改主節點和從節點的配置文件在/etc.mysql/my.cnf
添加
server-id=1
這個server_id 主機跟從機的值堅決不可以一樣 一般這個值是根據ip地址的後幾位來確定
授權給從節點
CHANGE MASTER TO
MASTER_HOST='172.10.0.2',
MASTER_USER='master',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='binlog.000002',
MASTER_LOG_POS=0;
然後查看主從同步狀態
Slave_IO_State、Slave_IO_Running和Slave_SQL_Running這三列
顯示當前備庫複製尚未運行。
開啓主從複製
# 開啓主從同步
start slave
# 停止主從複製
stop slave
然後在查看一下主從同步狀態
最後一步開始測試主從複製
先給master創建一個數據庫 kaka_test_master_slave
create datebase kaka_test_master_slave;
然後查看mysql_slave的數據庫看有沒有創建出來kaka_test_master_slave這個數據庫
測試添加數據
創建表和添加測試數據
CREATE TABLE IF NOT EXISTS `phone` (
`phoneid` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`card` INT(10) UNSIGNED NOT NULL,
PRIMARY KEY (phoneid)
);
INSERT INTO phone(card) VALUES(FLOOR(1 + (RAND() * 20)));
INSERT INTO phone(card) VALUES(FLOOR(1 + (RAND() * 20)));
INSERT INTO phone(card) VALUES(FLOOR(1 + (RAND() * 20)));
INSERT INTO phone(card) VALUES(FLOOR(1 + (RAND() * 20)));
INSERT INTO phone(card) VALUES(FLOOR(1 + (RAND() * 20))); I
INSERT INTO phone(card) VALUES(FLOOR(1 + (RAND() * 20)));
查看mysql_slave的數據狀態
數據一切正常
總結:
- 在這個案例中
- 我們只配置了一個master_slave 從機
- master_slave1這個從機沒有配置
- 配置跟master_slave是一致的
- 在配置過程中我們需要注意幾個問題
- 第一個:給主機創建用戶和給予權限時版本不同是有區別的
- 第二個:在從機的my.cnf裏邊配置的server_id沒有生效問題(咔咔暫時是用set global方式來做的,但是數據庫重啓就會失效),這個問題在這篇文章寫完解決
- 第三個:對docker的配置一定要對啊!要不就完犢子了