一、為什么要搭建主從架構(gòu)呢
1.數(shù)據(jù)安全,可以進行數(shù)據(jù)的備份。
2.讀寫分離,大部分的業(yè)務(wù)系統(tǒng)來說都是讀數(shù)據(jù)多,寫數(shù)據(jù)少,當(dāng)訪問壓力過大時,可以把讀請求給到從服務(wù)器。從而緩解數(shù)據(jù)庫訪問的壓力
3.故障轉(zhuǎn)移(高可用),當(dāng)主節(jié)點宕機之后,將從服務(wù)切換為主節(jié)點繼續(xù)提供服務(wù)。當(dāng)然要實現(xiàn)主從切換還需要其他中間件來實現(xiàn)。
二、主從數(shù)據(jù)同步原理
MySQL的主從架構(gòu)一般都是通過binlog日志實現(xiàn),binlog日志會記錄主庫的每一次操作。從庫和主庫建立連接TCP后,請求主庫將binlog傳輸過來,這是主庫有一個dump線程把binlog傳輸給從庫。
從庫將讀取到的binlog日志寫入自己的relaylog,另外一個線程讀取relaylog里面的內(nèi)容進行重放。有那么一點點像redis的AOF持久方式,也是重放操作記錄。
三、Docker搭建mysql主從
感覺用docker會方便很多,自己寫點demo之類需要構(gòu)建集群的時候確實方便很多。
1.拉鏡像,再啟動兩個mysql容器
我的docker是裝的windows版本的。
-d 后臺啟動 最后的mysql:5.7 是我自己的鏡像版本,分別映射到宿主機的3306和3307端口 方便等下使用工具連接
docker run -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSword=root -d mysql:5.7 docker run -p 3307:3306 --name mysqlslave -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7
確保兩個mysql容器都正常啟動了,可以使用工具連接3306和3307端口看看是否能夠連接上mysql。
2.修改配置,這個時候我們需要進入到docker容器內(nèi)部去修改/etc/mysql目錄下的mysql的my.cnf文件
docker exec -it 容器ID/容器名字 /bin/bash
docker容器是輕量級的嘛,所以有些操作是不支持的,我們想要修改文件一般都會使用vim命令嘛,所以我們還需要安裝一下:
先執(zhí)行
apt-get update
在執(zhí)行
apt-get install vim
master的my.cnf文件:
[mysqld] #保證唯一性 server-id=1 #開啟binlog日志并設(shè)置文件名字 log_bin=master-bin
slave的my.cnf文件:
12345 |
[mysqld]#保證唯一性server-id=2#開啟relay日志并設(shè)置文件名字relay_log=slave-relay |
配置完之后重啟兩個容器的mysql服務(wù) service mysql restart 或者重啟容器,因為重啟mysql服務(wù)容器也會停止。
windows桌面版的docker可以直接在這兒重啟容器
3.查看master狀態(tài)配置并進行連接
show master status;
可以看到binlog文件,還有文件中的索引位置。Binlog_Do_DB和Binlog_Ignore_DB這兩個字段是表示需要記錄binlog文件的庫或者不需要記錄binlog文件的庫。暫時沒有配置,就表示是針對全庫記錄日志。
在從節(jié)點上面執(zhí)行sql語句:
12345 |
change master to master_host='172.17.0.3',master_user='root',master_password='root',master_port=3306,master_log_file='master-bin.000001',<br>master_log_pos= 154; |
master_host :Master的地址,這兒需要的是容器在的獨立IP 可以進入容器查看,也可執(zhí)行docker指令查看:
1 |
docker inspect --format='{{ |
master_user master_password:用于同步的用戶的密碼,實際中肯定不能使用root用戶
master_log_file:指定 Slave 從哪個日志文件開始復(fù)制數(shù)據(jù)
master_log_pos:從哪個 Position 開始讀,都是對應(yīng)master中的值
執(zhí)行成功之后在啟動slave就可以了
start slave;
show slave status
查看從節(jié)點信息了:
現(xiàn)在去主庫建庫表,寫數(shù)據(jù),從庫都會吧數(shù)據(jù)同步過去了
四、其他
這個主從架構(gòu)師可能失敗的,如果查看slave狀態(tài)發(fā)現(xiàn)Slave_SQL_Running=no 就表示主從同步失敗了,可能是在從庫進行了些,導(dǎo)致從主庫同步過來主鍵沖突。也可能是從庫服務(wù)重啟之后有事務(wù)回滾了。如果是從庫事務(wù)回滾可以:
stop slave ; set GLOBAL SQL_SLAVE_SKIP_COUNTER=1; start slave ;
還可以重新設(shè)置主節(jié)點的binlog信息 重新指定position,可能需要處理一下從節(jié)點上面的數(shù)據(jù)
其他參數(shù):
#master: #需要同步的二進制數(shù)據(jù)庫名 binlog-do-db=masterdemo #只保留7天的二進制日志,以防磁盤被日志占滿(可選) expire-logs-days = 7 #不備份的數(shù)據(jù)庫 binlog-ignore-db=xxx1 binlog-ignore-db=xxx2 #從庫: #如果master庫名[mastdemo]與salve庫名[mastdemo01]不同,使用以下配置[需要做映射] replicate-rewrite-db = xxx -> aaa #如果不是要全部同步[默認全部同步],則指定需要同步的表 replicate-wild-do-table=xxx1 replicate-wild-do-table=xxx2
原文鏈接:
https://www.cnblogs.com/nijunyang/p/14990169.html