知名高端網(wǎng)站設(shè)計企業(yè)百度網(wǎng)站檢測
原理
一、一主一從
準備工作
1.主庫配置
1、修改配置文件 /etc/my.cnf
#mysql 服務(wù)ID,保證整個集群環(huán)境中唯一,取值范圍:1-232-1,默認為
server-id=1
#是否只讀,1 代表只讀,0代表讀寫
read-only=0
#忽略的數(shù)據(jù),指不需要同步的數(shù)據(jù)庫
#binlog-ignore-db=mysql
#指定同步的數(shù)據(jù)庫
#binlog-do-db=db01
2.重啟MySQL服務(wù)器
systemctl restart mysqld
3、登錄mysql,創(chuàng)建遠程連接的賬號,并授予主從復(fù)制權(quán)限hostname
服務(wù)器名Root@123 處事話密碼 8位數(shù) 需要特殊字符和大小寫
CREATE USER 'hostname'@'%' IDENTIFIED WITH mysql_native_password By 'Root@123';
4、為’hostname’@‘%’ 用戶分配主從復(fù)制權(quán)限
GRANT REPLICATION SLAVE ON *.* TO 'hostname'@'%';
5、通過指令,查看二進制日志坐標
show master status
字段含義說明:
file:從哪個日志文件開始推送日志文件
position:從哪個位置開始推送日志
binlog ignore db:指定不需要同步的數(shù)據(jù)庫
2.從庫配置
1.修改配置文件 /etc/my.cnf
#mysql服務(wù)ID,保證整個集群環(huán)境中唯一,取值范圍:1-2^32-1,和主庫不一樣即可
server-id-2
是否只讀,1代表只讀,0代表讀寫
read-only-1
2.重啟服務(wù)器
systemctl restart mysqld
3.登錄mysql 設(shè)置主庫配置
# 8.0.23版本以下執(zhí)行
CHANGE MASTER TOMASTER_HOST = '主庫的IP地址',MASTER_USER = '用于復(fù)制的用戶名',MASTER_PASSWORD = '該用戶對應(yīng)的密碼',MASTER_LOG_FILE = '主庫二進制日志文件名',MASTER_LOG_POS = 主庫二進制日志位置;
# 8.0.23版本以上
CHANGE REPLICATION SOURCE TOSOURCE_HOST = '主庫的IP地址',SOURCE_USER = '用于復(fù)制的用戶名',SOURCE_PASSWORD = '該用戶對應(yīng)的密碼',SOURCE_LOG_FILE = '主庫二進制日志文件名',SOURCE_LOG_POS = 主庫二進制日志位置;
SOURCE_LOG_FILE ,SOURCE_LOG_POS 通過主庫查詢show master status
見主庫配置5
4.開啟同步
show replica status ;
#8.0.22之后
show slave status ;
#8.0.22之前
5.查看主從同步狀態(tài)
3.遇到的問題
如果Replica_IO_Running是NO
1.檢查防火墻配置
2.從機ping主機是否連通
ping 自己的主機域名
3.如果是通過虛擬機centos
克隆的mysql
由于虛擬機克隆,克隆完之后所有的文件都是一樣的,包括IP地址、mac地址、uuid等。導致mysql的uuid一樣,在搭建主從復(fù)制的時候,如果uuid是一樣的,那么就不能搭建成功。出現(xiàn)了Slave_IO_Running:
No的情況。
解決:
1.先查看MySQL的安裝位置
show variables like 'datadir';
2.通過mysql生成一個uuid用于修改
select uuid();
3.復(fù)制生成的uuid
進入查詢的配置文件
,修改uuid
vim /var/lib/mysql/auto.cnf
4.重啟Mysql服務(wù)
systemctl restart mysqld
二、雙主雙從
原理:
1、 m1、m2主機配置
1.m1
修改配置文件 /etc/my.cnf
#mysql服務(wù)ID,保證整個集群環(huán)境中唯一,取值范圍:1-2^32-1,默認為1
server-id=1
#指定同步的數(shù)據(jù)庫
binlog-do-db=db01
binlog-do-db=db02
binlog-do-db=db03
#在作為從數(shù)據(jù)庫的時候,有寫入操作也要更新二進制日志文件
log-slave-updates
2.m2
修改配置文件 /etc/my.cnf
#mysql服務(wù)ID,保證整個集群環(huán)境中唯一,取值范圍:1-2^32-1,默認為1
server-id=3
#指定同步的數(shù)據(jù)庫
binlog-do-db=db01
binlog-do-db=db02
binlog-do-db=db03
#在作為從數(shù)據(jù)庫的時候,有寫入操作也要更新二進制日志文件
log-slave-updates
3.重啟MySQL服務(wù)器
systemctl restart mysqld
2、主機搭建
1.兩臺主庫創(chuàng)建賬戶并授權(quán)
#創(chuàng)建hostname用戶,并設(shè)置密碼,該用戶可在任意主機連接該MySQL服務(wù)
CREATE USER 'hostname'@'%' IDENTIFIED WITH mysql_native_password By 'Root@123';
2.為’hostname’@‘%’ 用戶分配主從復(fù)制權(quán)限
GRANT REPLICATION SLAVE ON *.* TO 'hostname'@'%';
3.通過指令,查看兩臺主庫的二進制日志坐標
show master status ;
3.s1、s2從庫配置
1.s1 從庫
server-id=2
2.s2從庫
server-id=4
3.重啟MySQL服務(wù)器
systemctl restart mysqld
4.鏈接主庫
需要注意s1
對應(yīng)的是m1
,s2
對應(yīng)的是m2
具體方式 參照一主一從的從庫設(shè)置主庫
# 8.0.23版本以下執(zhí)行
CHANGE MASTER TOMASTER_HOST = '主庫的IP地址',MASTER_USER = '用于復(fù)制的用戶名',MASTER_PASSWORD = '該用戶對應(yīng)的密碼',MASTER_LOG_FILE = '主庫二進制日志文件名',MASTER_LOG_POS = 主庫二進制日志位置;
# 8.0.23版本以上
CHANGE REPLICATION SOURCE TOSOURCE_HOST = '主庫的IP地址',SOURCE_USER = '用于復(fù)制的用戶名',SOURCE_PASSWORD = '該用戶對應(yīng)的密碼',SOURCE_LOG_FILE = '主庫二進制日志文件名',SOURCE_LOG_POS = 主庫二進制日志位置;
3.啟動兩臺從庫主從復(fù)制,查看從庫狀態(tài)
start slave;
show slave status \G;
3、兩臺主機相互復(fù)制 m1復(fù)制m2 m2復(fù)制m1 參照從鏈接主庫
的方式
CHANGE MASTER TOMASTER_HOST = '主庫的IP地址',MASTER_USER = '用于復(fù)制的用戶名',MASTER_PASSWORD = '該用戶對應(yīng)的密碼',MASTER_LOG_FILE = '主庫二進制日志文件名',MASTER_LOG_POS = 主庫二進制日志位置;
# 8.0.23版本以上
CHANGE REPLICATION SOURCE TOSOURCE_HOST = '主庫的IP地址',SOURCE_USER = '用于復(fù)制的用戶名',SOURCE_PASSWORD = '該用戶對應(yīng)的密碼',SOURCE_LOG_FILE = '主庫二進制日志文件名',SOURCE_LOG_POS = 主庫二進制日志位置;
3.啟動,查看狀態(tài)
start slave;
show slave status \G;
三、測試
分別在兩臺主庫m1、m2上執(zhí)行DDL、DML語句,查看涉及到的數(shù)據(jù)庫服務(wù)器的數(shù)據(jù)同步情況。
create database test;create table u2_table(
id int not null primary key,
name varchar(50) not null,
sex varchar(1)
)engine=innodb default charset=utf8mb4;insert into u2_table(id,name,sex) values(1,'Tom','1');
insert into u2_table(id,name,sex) values(2,'Trigger','0');
insert into u2_table(id,name,sex) values(3,'Dawn','1');
insert into u2_table(id,name,sex) values(4,'ack Ma','1');
insert into u2_table(id,name,sex) values(5,'Coco','0');
insert into u2_table(id,name,sex) values(6, 'jerry','1');