mysql5.7的安裝及其主從複製的原理與配置

操作環境

操作系統:RHEL6.5
master主機:server1——172.25.66.1,安裝mysql5.7
slave主機1:server2——172.25.66.2,安裝mysql5.7
slave主機2:server3——172.25.66.3,安裝mysql5.7
selinux、iptables關閉且關閉開機自啓動

安裝mysql5.7

在master與所有slave主機都安裝mysql5.7,安裝過程所有主機相同,這裏演示master中mysql5.7的安裝
1:下載含有mysql5.7所有安裝包的壓縮包並解壓
在這裏插入圖片描述
2:yum install mysql-community-client-5.7.17-1.el6.x86_64.rpm mysql-community-common-5.7.17-1.el6.x86_64.rpm mysql-community-libs-5.7.17-1.el6.x86_64.rpm mysql-community-libs-compat-5.7.17-1.el6.x86_64.rpm mysql-community-server-5.7.17-1.el6.x86_64.rpm -y
在這裏插入圖片描述
3:打開mysql
/etc/init.d/mysqld start #應該會慢一點,因爲要初始化和設置密碼
在這裏插入圖片描述
4:與5.7之前的版本相比,5.7安裝完之後是有一個自動生成的密碼的,在日誌文件 /var/log/mysqld.log 中
使用命令cat /var/log/mysqld.log | grep temp查看
在這裏插入圖片描述
5:如果在看到密碼之前日誌文檔被誤刪了,得不到密碼,就要以安全方式登錄mysql,然後修改密碼。
解決步驟:
在配置文件裏添加登陸不檢測密碼:
vim /etc/my.cnf
添加在最後一行:
skip-grant-tables
重啓服務,就能直接登陸了(不要密碼登陸),登錄上mysql後在修改密碼然後到配置文件註釋或者刪除掉上面添加的內容即可
所有master與slave主機都按以上步驟安裝好mysql5.7

mysql5.7-主從複製

主從複製原理

MySQL的Replication是一個異步複製的過程(mysql5.1.7以上版本分爲異步複製和半同步兩種模式),它是從一個Mysql instance(instance英文爲實例)(我們稱之爲Master)複製到另一個Mysql instance(我們稱之slave)。在master與slave之間實現整個複製過程主要由三個線程來完成,其中兩個線程(SQL線程和IO線程)在slave端,另外一個線程(IO線程)在master端。
要實現MySQL的Replication,首先必須打開master端的binlog (mysql-bin.xxxxxx)日誌功能,否則無法實現mysql的主從複製。因爲mysql的整個主從複製過程實際上就是:slave端從master端獲取binlog日誌,然後再在自己身上完全順序的執行該日誌中所記錄的各種SQL操作。

mysql主從複製的基本交互過程

1、slave端的IO線程連接上master端,並請求從指定binlog日誌文件的指定pos節點位置(或者從最開始的日誌)開始複製之後的日誌內容。
2、master端在接收到來自slave端的IO線程請求後,通知負責複製進程的IO線程,根據slave端IO線程的請求信息,讀取指定binlog日誌指定pos節點位置之後的日誌信息,然後返回給slave端的IO線程。該返回信息中除了binlog日誌所包含的信息之外,還包括本次返回的信息在master端的binlog文件名以及在該binlog日誌中的pos節點位置。
3、slave端的IO線程在接收到master端IO返回的信息後,將接收到的binlog日誌內容依次寫入到slave端的relaylog文件(mysql-relay-bin.xxxxxx)的最末端,並將讀取到的master端的binlog文件名和pos節點位置記錄到master-info(該文件存在slave端)文件中,以便在下一次讀取的時候能夠清楚的告訴master“我需要從哪個binlog文件的哪個pos節點位置開始,請把此節點以後的日誌內容發給我”。
4、slave端的SQL線程在檢測到relaylog文件中新增內容後,會馬上解析該log文件中的內容。然後還原成在master端真實執行的那些SQL語句,並在自身按順豐依次執行這些SQL語句。這樣,實際上就是在master端和slave端執行了同樣的SQL語句,所以master端和slave端的數據是完全一樣的。

實現mysql主從複製

master機(server1)相關配置

1:修改數據庫的配置文件
vim /etc/my.cnf
29 server-id=1 #數據庫中的id號,所有master與slave主機之間不能有相同的
30 log-bin=mysql-bin # 開啓二進制日誌,允許slave同步自己的二進制文件
在這裏插入圖片描述
2:重啓數據庫/etc/init.d/mysqld restart
在這裏插入圖片描述
3:進入數據庫
mysql -p ##回車後要輸入密碼,密碼就是上面我們在日誌文件中查看到的密碼cat /var/log/mysqld.log | grep temp
在這裏插入圖片描述
4:在數據庫中操作
第一步我們先要修改數據庫密碼
alter user root@localhost identified by ‘Guodong+0306’; ##這裏的密碼一定要複雜,不然修改不成功,要有大小寫字母與特殊符號
flush privileges; ##同步
show master status; ##查看master機狀態
在這裏插入圖片描述
5:在數據庫中創建用戶repl
CREATE USER repl@’%’ IDENTIFIED BY ‘Guodong+0306’;
在這裏插入圖片描述
grant replication slave on . to repl@‘172.25.66.%’ identified by ‘Guodong+0306’; ##用戶授權

slave機(server2&server3)相關配置

server2:
1:修改數據庫配置文件
vim /etc/my.cnf
server-id=2 # 三者全部不相同
log-bin=mysql-bin # 允許slave端同步自己的二進制日誌
log-slave-updates

--logs-slave-updates
通常情況,從服務器從主服務器接收到的更新不記入它的二進制日誌。該選項告訴從服務器將其SQL
線程執行的更新記入到從服務器自己的二進制日誌。爲了使該選項生效,還必須用--logs-bin選項
啓動從服務器以啓用二進制日誌。如果想要應用鏈式複製服務器,應使用--logs-slave-updates。
例如,可能你想要這樣設置:
A -> B -> C
也就是說,A爲從服務器B的主服務器,B爲從服務器C的主服務器。爲了能工作,B必須既爲主服務器
又爲從服務器。你必須用--logs-bin啓動A和B以啓用二進制日誌,並且用--logs-slave-updates
選項啓動B。

在這裏插入圖片描述
2:重啓mysql
在這裏插入圖片描述
3:同樣在日誌中查看密碼後進入mysql
mysql -p
在這裏插入圖片描述
4:在數據庫中操作
第一步同樣是先修改數據庫密碼
alter user root@localhost identified by ‘Guodong+0306’;
第二步添加自己的master(即server1端)
change master to master_host=‘172.25.66.1’,master_user=‘repl’,master_password=‘Guodong+0306’,master_log_file=‘mysql-bin.000001’,master_log_pos=550;
##master_log_file=‘mysql-bin.000001’,master_log_pos=550這兩項的值就是剛纔在master中show master status;出現的值
在這裏插入圖片描述
start slave;
show slave status\G; (查看兩個線程的狀態是否是yes)
在這裏插入圖片描述
5:因爲我們要讓slave2(server3)從slave1(server2)同步數據,所以我們在server2中也要對slave進行授權,所以server2既是master又是slave
grant REPLICATION SLAVE on . to repl@‘172.25.66.%’ identified by ‘Guodong+0306’;
show master status;
在這裏插入圖片描述
server3:
1:修改配置文件
vim /etc/my.cnf
server-id=3 # 三者全部不相同
因爲server3只做slave,所以只需要添加這一項
在這裏插入圖片描述
2:重啓mysql
/etc/init.d/mysqld restart
3:在日誌中查看密碼後進入mysql
mysql -p
在這裏插入圖片描述
4:數據庫中操作
第一步修改數據庫密碼
alter user root@localhost identified by ‘Guodong+0306’
第二步添加自己的master(即server2端)
change master to master_host=‘172.25.66.2’,master_user=‘repl’,master_password=‘Guodong+0306’,master_log_file=‘mysql-bin.000001’,master_log_pos=691;
在這裏插入圖片描述
start slave;
show slave status\G;
在這裏插入圖片描述
這樣我們就實現了一個鏈式的mysql主從同步複製,所謂鏈式就是server2複製server1中的日誌內容,server3複製server2中的日誌內容,當然,server1中操作後,server2和server3都可以同步到日誌內容

測試

master機寫入數據:
create database user;
use user;
create table usertb (username varchar(20) not null,age varchar(4) not null);
show tables;
在這裏插入圖片描述
分別在slave1(server2)與slave2(server3)中查看:
slave1(server2):
在這裏插入圖片描述
slave2(server3):
在這裏插入圖片描述
可以看到,我們在master(server1)中寫入數據後,在server2與server3中都可以同步到server1中的數據

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章