基于Docker 配置主從服務(wù)器實(shí)現(xiàn) mysql主從復(fù)制
版本
mysql - latest(8.0)
感謝
這里感謝B站上飛哥在狂神說(shuō)java這個(gè)IP上上傳的視頻資源!
(1條消息) Docker搭建MySQL8主從復(fù)制 (全網(wǎng)最詳細(xì)版)_bright的博客-CSDN博客
ShardingShpere數(shù)據(jù)庫(kù)中間件- 專欄 -KuangStudy
(1條消息) @@GLOBAL.GTID_MODE = OFF 問(wèn)題_wangxuelei036的博客-CSDN博客
等娄琉。
同時(shí)感謝 B站欠肾、CSDN戳表、簡(jiǎn)書(shū) 等提供的平臺(tái)!
mysql - 共同配置
安裝mysql
docker pull mysql:latest
選擇你自己需要安裝的mysql版本,這這里選擇的是最新的(latest),對(duì)應(yīng) 8.0,版本這里包含了一個(gè)連接的坑,我下文會(huì)講!
如果你不是使用Docker進(jìn)行安裝,而是直接在linux下安裝mysql,我推薦教程 - (02~03)
該博客是KaungStudy飛哥提供的文檔涡上。
mysql 是否安裝成功?
查看安裝成功的鏡像
docker images
存在mysql紅框內(nèi)容就表示安裝成功!
mysql 啟動(dòng)
docker run -p 3306:3306 --name mysql-master -e MYSQL_ROOT_PASSWORD=12345678 -d mysql:latest
run : 啟動(dòng)
-p 3306:3306 : 指定映射端口, -p 外部端口:內(nèi)部端口(容器內(nèi)部)
--name mysql-master :給容器起別名,起個(gè)名稱方便以后稱呼(我用的主-mysql是mymysql)
-e MYSQL_ROOT_PASSWORD=12345678 : 設(shè)置root用戶的密碼
-d : 后臺(tái)運(yùn)行
mysql:latest : mysql:tag,tag就是你選擇的msyql版本號(hào)
查看mysql-容器是否啟動(dòng)成功?
mysql啟動(dòng)成功后,會(huì)打印出當(dāng)前運(yùn)行容器的id
或者你自己查看容器狀態(tài)!
docker ps
這樣的就表示啟動(dòng)成功了拦惋。
mysql 配置master
先進(jìn)入 mysql容器內(nèi)部,這里我的主mysql叫mymysql,命令如下:
docker exec -it mymysql /bin/bash
可以看到下一行的root@已經(jīng)不一樣了,并且該id就是你當(dāng)前進(jìn)入的容器的容器id,
查看容器內(nèi)部配置文件所在,我已經(jīng)把my.cnf所在截圖了,如下:
/etc/mysql/my.cnf (這個(gè)有用!)
OK寻仗,我感覺(jué)我是不是廢話太多了,那我們下面就加快進(jìn)度吧!
拿到路徑之后,我們先進(jìn)入my.cnf,
好吧,容器內(nèi)部沒(méi)裝vim,你可以自己去安裝。
apt-get update
apt-get install vim
我就沒(méi)有這么去安裝了我直接用了docker cp
使用 docker cp 配置 my.cnf
- 將my.cnf 從容器復(fù)制到主機(jī)上
docker cp 容器id(或容器名稱):/etc/mysql/my.cnf /docker/mysql/master(或slavel1)/my.cnf
將容器id或名稱為XXX的容器在 /etc/mysql/my.cnf 復(fù)制給主機(jī)路徑下的/docker/mysql/master/my.cnf文件
-
修改my.cnf(添加對(duì)應(yīng)的主從配置)
主節(jié)點(diǎn)如下:
[mysqld]
## 同一局域網(wǎng)內(nèi)注意要唯一
server-id=100
## 開(kāi)啟二進(jìn)制日志功能瀑凝,可以隨便刃蚵(關(guān)鍵)
log-bin=master-bin
binlog-format=ROW // 二級(jí)制日志格式,有三種 row粤咪,statement谚中,mixed
binlog-do-db=數(shù)據(jù)庫(kù)名 //同步的數(shù)據(jù)庫(kù)名稱,如果不配置,表示同步所有的庫(kù)
從節(jié)點(diǎn)如下:
[mysqld]
# 設(shè)置server_id,注意要唯一
server-id=201
# 開(kāi)啟二進(jìn)制日志功能寥枝,以備Slave作為其它Slave的Master時(shí)使用
log-bin=mysql-slave-bin
# relay_log配置中繼日志
relay_log=mysql-relay-bin
# 設(shè)置為只讀,該項(xiàng)如果不設(shè)置宪塔,表示slave可讀可寫(xiě)
read_only=1
- 將修改后的my.cnf復(fù)制回容器中
docker cp /docker/mysql/master(或slavel1)/my.cnf 容器id(或容器名稱):/etc/mysql/my.cnf
就是和步驟1的指令路徑反一下。
- 重啟服務(wù)
docker restart 容器名稱/容器id
注意每個(gè)主從節(jié)點(diǎn)的server-id都要唯一!!!
master(主)配置
經(jīng)過(guò)共同配置之后呢,我們先進(jìn)入主-mysql中,查看對(duì)應(yīng)配置從節(jié)點(diǎn)需要的信息囊拜。
進(jìn)入mysql內(nèi)部
# 進(jìn)入容器內(nèi)部
docker exec -it 容器id/容器名稱 /bin/bash
# 進(jìn)入mysql
mysql -uroot -p密碼
登錄成功
查看master服務(wù)的binlog文件名和位置(master節(jié)點(diǎn)執(zhí)行)
show master status;
OK某筐,接下來(lái)配置從節(jié)點(diǎn)。
slave(從)配置
它一開(kāi)始的步驟和主的一樣,都是共同配置,唯一不一樣的是修改 my.cnf不一樣,請(qǐng)注意!
進(jìn)入mysql內(nèi)部
# 進(jìn)入容器內(nèi)部
docker exec -it 容器id/容器名稱 /bin/bash
# 進(jìn)入mysql
mysql -uroot -p密碼
)
登錄成功
執(zhí)行 change master to
change master to master_user='root',master_password='mysql8.0',master_host='192.168.168.101',master_port=3306,get_master_public_key=1, master_log_file='master-bin.000004', master_log_pos=1097, master_connect_retry=30;
master_host :Master庫(kù)的地址
master_port:Master的端口號(hào)冠跷,指的是容器的端口號(hào)
master_user:用于數(shù)據(jù)同步的用戶
master_password:用于同步的用戶的密碼
master_log_file:指定 Slave 從哪個(gè)日志文件開(kāi)始復(fù)制數(shù)據(jù)南誊,即上文中提到的 File 字段的值
master_log_pos:從哪個(gè) Position 開(kāi)始讀,即上文中提到的 Position 字段的值
master_connect_retry:如果連接失敗蜜托,重試的時(shí)間間隔抄囚,單位是秒,默認(rèn)是60秒get_master_public_key=1: 解決 Authentication plugin 'caching_sha2_password' reported error:Authentication require secure connection 問(wèn)題導(dǎo)致的密碼插件問(wèn)題 - msyql8.0才出現(xiàn)的問(wèn)題橄务。注意: 當(dāng)前字段中說(shuō)的文中指的是 在錨點(diǎn) - 查看master服務(wù)的binlog文件名和位置(master節(jié)點(diǎn)執(zhí)行)那里查詢出來(lái)的主節(jié)點(diǎn)信息幔托。
啟動(dòng)slave
start slave;
查看是否配置成功?
show slave status \G
\G : 表示換行。
兩個(gè) YES 就成功了!
配置從節(jié)點(diǎn)時(shí),出現(xiàn)的各種問(wèn)題?
飛哥這里已經(jīng)例舉了一大部分,我就不一一講了,放置傳送門(mén): https://www.kuangstudy.com/zl/sharding#1369645557613608962
我講一下我的主機(jī)配置時(shí)出現(xiàn)的問(wèn)題?
- Authentication plugin 'caching_sha2_password' reported error:Authentication require secure connection 問(wèn)題導(dǎo)致的密碼插件問(wèn)題 - msyql8.0才出現(xiàn)的問(wèn)題蜂挪。
從配置錨點(diǎn) - 執(zhí)行 change master to里已經(jīng)加上了該解決的配置了,看 get_master_public_key=1重挑,從博客中得到的解決方法(在評(píng)論那塊)。
-
No query specified
show slave status\G;
多了個(gè)分號(hào)(;)棠涮。
-
The slave I/O thread stops because master and slave have equal MySQL server ids; these ids must be different for replication to work (or the --replicate-same-server-id option must be used on slave but this does not always make sense; please check the manual before using it).
額,我是因?yàn)槲业膹墓?jié)點(diǎn)連接主節(jié)點(diǎn)配置那里的ip地址配置錯(cuò)了谬哀。
-
Parameters MASTER_LOG_FILE, MASTER_LOG_POS, RELAY_LOG_FILE and RELAY_LOG_POS can
由于之前用的master_auto_position=1,現(xiàn)在改回0严肪,重新用pos方法change就可以了史煎。
# 停止slave stop slave; # 清楚配置 reset slave; change master to master_auto_position=0; change master to master_user='root',master_password='mysql8.0',master_host='192.168.168.101',master_port=3306,get_master_public_key=1, master_log_file='master-bin.000004', master_log_pos=1097, master_connect_retry=30; # 啟動(dòng)slave start slave;
使用 root用戶 造成從(slavel-mysql)服務(wù)器可以操作數(shù)據(jù)(crud)?
(2條消息) mysql從庫(kù)不能寫(xiě)嗎_mysql的主從復(fù)制,從庫(kù)設(shè)為只讀不能寫(xiě)_L NEO的博客-CSDN博客
我建議給從庫(kù)分配一個(gè)普通用戶賬號(hào)并僅分配對(duì)應(yīng)權(quán)限!
# 例如以下,創(chuàng)建一個(gè)名稱為 'username' 密碼為 'password' 且任何ip都可以連接的賬號(hào)
create user 'username'@'%' identified by 'password';
# 分配權(quán)限,例如我只給他 SELECT 權(quán)限
grant select on *.* to 'username'@'%';
# 需要刷新
flush privileges;
# 查看效果
show grants for 'username'@'%';
然后你就可以自己去測(cè)試了,如果先看賬號(hào)創(chuàng)建成功了嗎?
# 查詢 mysql 庫(kù)下的用戶表信息
select host,user from mysql.user;
權(quán)限分配成功后,我這邊使用navicat對(duì)'username'賬號(hào)進(jìn)行登錄,并(修改诬垂、新增劲室、刪除)數(shù)據(jù),出現(xiàn)下圖錯(cuò)誤信息!