dw做網(wǎng)站常用標(biāo)簽傳智播客培訓(xùn)機(jī)構(gòu)官網(wǎng)
雙主雙從(MM-SS)
前言
-
避免單一主服務(wù)器宕機(jī),集群寫(xiě)入能力缺失
-
從 1 復(fù)制 主1 ,從 2 復(fù)制 主 2
主 1 復(fù)制 主 2,主 2 復(fù)制主 1
也就是 主 1 和主 2 互為主從。主1主2互為主從,
是為了以下情景,主1掛了,主2自動(dòng)升級(jí)為主數(shù)據(jù)庫(kù),當(dāng)主1恢復(fù)后,主1則變成次主數(shù)據(jù)庫(kù)。
圖示
-
四臺(tái)服務(wù)器,每臺(tái)服務(wù)器上安裝了 mysql8 數(shù)據(jù)庫(kù)
舉例說(shuō)明
1、在主1創(chuàng)建了一個(gè)mydb2數(shù)據(jù)庫(kù),從1自動(dòng)“復(fù)制”主1生成數(shù)據(jù)庫(kù),
2、因?yàn)橹?也是主1 的從數(shù)據(jù)庫(kù),所以主2也“復(fù)制”主1生成數(shù)據(jù)庫(kù),
3、主2有了數(shù)據(jù)庫(kù),從2自動(dòng)“復(fù)制”主2生成數(shù)據(jù)庫(kù);
最后,四臺(tái)服務(wù)器數(shù)據(jù)庫(kù)都創(chuàng)建了數(shù)據(jù)庫(kù)。
操作步驟
-
清理四臺(tái)數(shù)據(jù)庫(kù)服務(wù)器數(shù)據(jù)
-
數(shù)據(jù)庫(kù)恢復(fù)到初始情況,未安裝的安裝,安裝的清除數(shù)據(jù)
-
systemctl stop mysqld
-
rm -rf /var/lib/mysql/*
-
systemctl start mysqld
-
grep password /var/log/mysqld.log
-
mysqladmin 修改默認(rèn)密碼
-
主1
-
master1下的my.cnf 添加如下配置
-
清除上次實(shí)驗(yàn)的配置:
這四項(xiàng)全部刪除
# bin log 日志
# 開(kāi)啟二級(jí)制日志 并聲明二進(jìn)制日志名稱(chēng)
log-bin=/var/lib/mysql/binlog
# 服務(wù)id
server-id=1
#主從復(fù)制忽略的數(shù)據(jù)庫(kù) 這些默認(rèn)庫(kù)都有 沒(méi)有必要都拷貝 所以忽略
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
#開(kāi)啟主從復(fù)制的數(shù)據(jù)庫(kù) 如果還需要其他庫(kù)就繼續(xù)用這個(gè)屬性 跟其他的數(shù)據(jù)庫(kù)名即可
binlog-do-db=mydb2# bin log 日志格式
#STATEMENT:記錄主庫(kù)執(zhí)行的SQL復(fù)制到從庫(kù); 調(diào)用時(shí)間函數(shù)時(shí)會(huì)導(dǎo)致主從數(shù)據(jù)不一致
# 即 以sql語(yǔ)句的形式記錄
#ROW:記錄主庫(kù)每一行的變化;效率低
#MIXED:修復(fù)一些主從數(shù)據(jù)不一致情況;本地變量調(diào)用還會(huì)存在問(wèn)題;@@hostname#日志格式 默認(rèn)statement
binlog_format=statement
#二進(jìn)制日志自動(dòng)刪除/過(guò)期的天數(shù)。默認(rèn)值為0,表示不自動(dòng)刪除
expire_logs_days=7
#跳過(guò)主從復(fù)制中遇到的所有錯(cuò)誤或指定類(lèi)型的錯(cuò)誤
slave_skip_errors=1062
#在作為從數(shù)據(jù)庫(kù)時(shí)候,有寫(xiě)入操作也要更新二進(jìn)制日志文件
log-slave-updates
#標(biāo)識(shí)自增長(zhǎng)字段每次遞增的量,也就是步長(zhǎng) 日志中的標(biāo)記at2 at4
auto-increment-increment=2
#表示自增長(zhǎng)從哪個(gè)數(shù)開(kāi)始
auto-increment-offset=1
#這條語(yǔ)句,課程中并未出現(xiàn)。為增強(qiáng)練習(xí)環(huán)境所設(shè)置。含義是增加mysql的連接數(shù)
max_connect_errors=1000
systemctl restart mysqld
主 2
-
master2 my.cnf 添加如下配置
-
清楚之前的配置:
# bin log 日志
log-bin=/var/lib/mysql/binlog
# # 服務(wù)id
server-id=2
# #主從復(fù)制忽略的數(shù)據(jù)庫(kù)
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
# #開(kāi)啟主從復(fù)制的數(shù)據(jù)庫(kù)
binlog-do-db=mydb2
# # bin log 日志格式
# #STATEMENT:記錄主庫(kù)執(zhí)行的SQL復(fù)制到從庫(kù); 調(diào)用時(shí)間函數(shù)時(shí)會(huì)導(dǎo)致主從數(shù)據(jù)不一致
# #ROW:記錄主庫(kù)每一行的變化;效率低
# #MIXED:修復(fù)一些主從數(shù)據(jù)不一致情況;本地變量調(diào)用還會(huì)存在問(wèn)題;@@hostname
binlog_format=statement
# #二進(jìn)制日志自動(dòng)刪除/過(guò)期的天數(shù)。默認(rèn)值為0,表示不自動(dòng)刪除
expire_logs_days=7
# #跳過(guò)主從復(fù)制中遇到的所有錯(cuò)誤或指定類(lèi)型的錯(cuò)誤
slave_skip_errors=1062
# #在作為從數(shù)據(jù)庫(kù)時(shí)候,有寫(xiě)入操作也要更新二進(jìn)制日志文件
log-slave-updates
# #標(biāo)識(shí)自增長(zhǎng)字段每次遞增的量,也就是步長(zhǎng)
auto-increment-increment=2
# #表示自增長(zhǎng)從哪個(gè)數(shù)開(kāi)始
auto-increment-offset=2
-
主1主2配置的不同地方在:server-id 和 auto-increment-offset
-
systemctl restart mysqld
-
從1 slave1
-
my.cnf 添加如下配置
-
# 服務(wù)id server-id=3 # 用中繼日志 指定中繼日志的名字位relay relay-log=mysql-relay
-
systemctl restart mysqld
-
-
從2 slave2
-
my.cnf 添加如下配置
-
# 服務(wù)id server-id=4 #啟用中繼日志 指定中繼日志名稱(chēng) relay-log=mysql-relay
-
# systemctl restart mysqld
-
-
創(chuàng)建同步賬號(hào)并授權(quán)
-
主1、主2 數(shù)據(jù)庫(kù):
創(chuàng)建主主同步賬號(hào)repl_user
主從同步賬號(hào)slave_sync_user
master1和master2都分別執(zhí)行一遍下面內(nèi)容
mysql> CREATE USER 'repl-user'@'192.168.145.%' IDENTIFIED WITH mysql_native_password BY 'Lixinyi@123'; Query OK, 0 rows affected (0.03 sec)mysql> CREATE USER 'slave-sync-user'@'192.168.145.%' IDENTIFIED WITH mysql_native_password BY 'Lixinyi@123'; Query OK, 0 rows affected (0.01 sec)mysql> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'repl-user'@'192.168.145.%';Query OK, 0 rows affected (0.00 sec)mysql> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave-sync-user'@'192.168.145.%';Query OK, 0 rows affected (0.00 sec)
-
注釋:
WITH mysql_native_password 表示這是一個(gè)本地賬號(hào) 如果有人來(lái)用這個(gè)賬號(hào)登陸,那么服務(wù)器只在本地 尋找密碼看是否匹配。
-
-
配置主從同步
-
主1(M) --> 從1(S)
-
master1 -->slave1
-
主1 mysql 查看2進(jìn)制日志位置
mysql>show master status;
-
-
-
記住 binlog 文件 和 偏移量,后面會(huì)用到
?
-
從1mysql (slave1)
mysql> CHANGE MASTER TO MASTER_HOST='192.168.145.141', MASTER_USER='slave-sync-user', MASTER_PASSWORD='Lixinyi@123', MASTER_LOG_FILE='binlog.000001', MASTER_LOG_POS=1209;
mysql> start slave;
mysql> show slave status \G;
遇到不是兩個(gè) Yes (下面截圖這種情況)怎么辦,別慌,執(zhí)行下面命令:
stop slave;reset master;然后再 CHANGE MASTER .....
-
主2(M) --> 從2(S)
-
master2 -->slave2
-
主2 mysql -作為主服務(wù)器
show master status;
-
-
-
從 2 mysql -作為從服務(wù)器
CHANGE MASTER TO MASTER_HOST='192.168.145.142', MASTER_USER='slave-sync-user', MASTER_PASSWORD='Lixinyi@123', MASTER_LOG_FILE='binlog.000001', MASTER_LOG_POS=157;
start slave;
show slave status \G;
-
-
主1(M) --> 主2(S)
-
主1 mysql 下
-
show master status;
主2 mysql 下
-
-
-
CHANGE MASTER TO MASTER_HOST='192.168.145.141', MASTER_USER='rep-user', MASTER_PASSWORD='Lixinyi@123', MASTER_LOG_FILE='binlog.000001', MASTER_LOG_POS=1305;
-
start slave;
-
show slave status \G;
-
-
主2(M) --> 主1(S)
-
主2 mysql 下
-
show master status;
-
-
主1 mysql 下
-
CHANGE MASTER TO MASTER_HOST='192.168.145.142', MASTER_USER='repl-user', MASTER_PASSWORD='Lixinyi@123', MASTER_LOG_FILE='binlog.000001', MASTER_LOG_POS=156;
-
start slave;
-
show slave status \G;
-
-
-
-
主1 mysql 下創(chuàng)建數(shù)據(jù)庫(kù) mydb2,創(chuàng)建表 books,插入一條數(shù)據(jù):
-
create database mydb2;
-
create table mydb2.books(id int primary key auto_increment, name varchar(50));
-
insert into mydb2.books(name) values("MySQL 8");
-
select * from mydb2.books;
?
- 查看 主1 主2 從1 從2 是否同步生成數(shù)據(jù)庫(kù)、表、數(shù)據(jù)。