前一篇的Mysql面試仍是很是給力的,很是的乾貨,有興趣的能夠看一下[],雖然不是我寫的,可是內容確實是很是的乾貨,4萬字解決你Mysql面試中存在的問題,好的文章仍是要推薦給你們。node
講完了單機版的Mysql問題,來講一說集羣,這不寫了一篇Mysql主從的搭建,注意片主要講主從的原理,以及本身實踐搭建主從,對於尚未接觸主從的程序員,仍是很是友好的,文章內容通俗易懂。mysql
在實際的上產中,爲了解決Mysql的單點故障已經提升MySQL的總體服務性能,通常都會採用「主從複製」。程序員
好比:在複雜的業務系統中,有一句sql執行後致使鎖表,而且這條sql的的執行時間有比較長,那麼此sql執行的期間致使服務不可用,這樣就會嚴重影響用戶的體驗度。web
主從複製中分爲「主服務器(master)「和」從服務器(slave)」,「主服務器負責寫,而從服務器負責讀」,Mysql的主從複製的過程是一個「異步的過程」。面試
這樣讀寫分離的過程可以是總體的服務性能提升,即便寫操做時間比較長,也不影響讀操做的進行。sql
首先放一張Mysql主從複製的原理圖,總的來講Mysql的主從複製原理仍是比較好理解的,原理很是的簡單。 Mysql的主從複製中主要有三個線程:
master(binlog dump thread)、slave(I/O thread 、SQL thread)
,Master一條線程和Slave中的兩條線程。數據庫
master(binlog dump thread)
主要負責Master庫中有數據更新的時候,會按照binlog
格式,將更新的事件類型寫入到主庫的binlog
文件中。centos
而且,Master會建立log dump
線程通知Slave主庫中存在數據更新,這就是爲何主庫的binlog日誌必定要開啓的緣由。服務器
I/O thread
線程在Slave中建立,該線程用於請求Master,Master會返回binlog的名稱以及當前數據更新的位置、binlog文件位置的副本。併發
而後,將binlog
保存在 「relay log(中繼日誌)」 中,中繼日誌也是記錄數據更新的信息。
SQL線程也是在Slave中建立的,當Slave檢測到中繼日誌有更新,就會將跟新的內容同步到Slave數據庫中,這樣就保證了主從的數據的同步。
以上就是主從複製的過程,固然,主從複製的過程有不一樣的策略方式進行數據的同步,主要包含如下幾種:
對於不一樣的業務需求,有不一樣的策略方案,可是通常都會採用最終一致性,不會要求強一致性,畢竟強一致性會嚴重影響性能。
下面咱們就來實操搭建主從,使用的是兩臺centos7而且安裝的是Mysql 8來搭建主從,有一臺centos 7而後直接克隆就好了。
(1)首先檢查centos 7裏面的Mysql安裝包和依賴包:
rpm -qa |grep mysql
複製代碼
執行後,在我本機上的顯示以下: (2)接着能夠刪除上面的安裝包和依賴包:
sudo yum remove mysql*
複製代碼
(3)繼續檢查一下是否存在Mariadb,如果存在直接刪除Mariadb
// 檢查是否存在Mariadb rpm -qa |grep mariadb // 刪除Mariadb sudo rpm -e --nodeps mariadb-libs-5.5.56-2.el7.x86_64 複製代碼
(4)而後,就是刪除Mysql的配置文件,可使用下面的命令查找Msqyl配置文件的路徑:
sudo find / -name mysql
複製代碼
在我本機上的顯示的Mysql配置文件的路徑以下:
(5)而後,經過下面的命令,將他們逐一刪除:
sudo rm -rf /usr/lib64/mysql ...... 複製代碼
(6)接着就開始安裝Mysql 8了,使用wget命令下載Mysql 8的repo源,而且執行安裝:
wget https://repo.mysql.com//mysql80-community-release-el7-3.noarch.rpm sudo yum -y install mysql80-community-release-el7-3.noarch.rpm 複製代碼
安裝完後會在/etc/yum.repos.d/目錄下生成下面的兩個文件,說明安裝成功了:
mysql-community.repo mysql-community-source.repo 複製代碼
(7)安裝完Mysql8後,接着來更新一下yum源,而且查看yum倉庫中的Mysql:
// 更新yum源 yum clean all yum makecache // 查看yum倉庫中的Mysql yum list | grep mysql 複製代碼
(8)能夠查看到倉庫中存在mysql-community-server.x86_64,直接安裝就好了:
sudo yum -y install mysql-community-server
複製代碼
(9)接着啓動Mysql,並檢查Mysql的狀態:
// 啓動Mysql systemctl start mysqld.service // 檢查Mysql的狀態 systemctl status mysqld 複製代碼
確保查看Mysql的狀態是active(running)
,表示正在運行,而且配置一下Mysql開機啓動:
systemctl enable mysqld
複製代碼
(10)由於Mysql是新安裝的,因此要修改一下初始密碼,先查看一下初始密碼:
grep "password" /var/log/mysqld.log
複製代碼
你可能找出來有多個,多是你以前安裝卸載後的文件沒有刪乾淨,這裏你就直接看時間,時間對應你如今的時間,就是你的初始密碼: (11)而後使用初始密碼,登錄數據庫,而且修改密碼:
mysql -uroot -p
ALTER USER 'root'@'localhost' IDENTIFIED BY 'LDCldc@123095; 複製代碼
(12)此時在建立一個能夠用於給兩一臺centos鏈接的用戶,默認的root用戶只有本機才能鏈接:
// 建立鏈接用戶
create user 'test'@'%' identified by 'LDCldc-2020'; // 而且把防火牆給關了,或者配置一下3306端口 systemctl stop firewalld.service; // 設置防火牆開機自動關閉 systemctl disable firewalld.service; 複製代碼
(13)測試:到這裏就Mysql的安裝教程就就講完了,能夠測試一下,兩臺centos是否能夠ping通:
ping 192.168.163.156
複製代碼
我這裏的兩臺機是能夠互通的,
Master:192.168.163.156,Slave:192.168.163.155
,而且Slave使用下面的命令能夠登錄到Master的Mysql:
mysql -u[user] -p[密碼] -h[遠程主機ip]
複製代碼
確保了這兩項測試成功後,就能夠進行下面的主從搭建了。
(14)我這裏使用的使用兩臺centos 7的vmware的ip分別是192.168.163.155(Slave)
和192.168.163.156(Master)
做爲測試,首先在192.168.163.156(Master)中建立一個測試庫test:
// 建立測試庫
create database test default character set utf8mb4 collate utf8mb4_general_ci; // 而且受權 grant all privileges on test.* to 'test'@'%'; 複製代碼
(15)而後編輯Master中的my.cnf文件,此文件位於/etc/my.cnf,執行下面的sql,並添加下面的信息:
sudo vi /etc/my.cnf
==========如下是配置文件中的信息============= # 配置編碼爲utf8 character_set_server=utf8mb4 init_connect='SET NAMES utf8mb4' # 配置要給Slave同步的數據庫 binlog-do-db=test # 不用給Slave同步的數據庫,通常是Mysql自帶的數據庫就不用給Slave同步了 binlog-ignore-db=mysql binlog-ignore-db=information_schema binlog-ignore-db=performance_schema binlog-ignore-db=sys # 自動清理30天前的log文件 expire_logs_days=30 # 啓用二進制日誌 log-bin=mysql-bin # Master的id,這個要惟一,惟一是值,在主從中惟一 server-id=3 複製代碼
(16)配置完後重啓Mysql服務,並查看Mysql的log_bin日誌是否啓動成功:
systemctl restart mysqld
# 查看log_bin日誌是否啓動成功 show variables like '%log_bin%'; 複製代碼
(17)接着查看Master的狀態:
show master status;
複製代碼
這兩個數據
File
和Position
要記住,後面配置Slave的時候要使用到這兩個數據。
(18)最後登錄Master的數據庫,並建立一個用戶用於同步數據:
create user 'backup'@'%' IDENTIFIED BY 'Purepgmr-2020';
grant file on *.* to 'backup'@'%'; GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* to 'backup'@'%'; 複製代碼
到這裏Master的配置就配置完了,後面就進行Slave的配置。
(19)在Slave中一樣要建立test數據庫,而且受權給test用戶:
# 建立同步數據的test數據庫
create database test default character set utf8mb4 collate utf8mb4_general_ci; # 受權 grant all privileges on test.* to 'test'@'%'; 複製代碼
(20)接着編輯Slave中my.cnf文件,一樣是在/etc/my.cnf路徑下,加入以下配置:
# 配置從服務器的ID,惟一的
server-id=4 #加上如下參數能夠避免更新不及時,SLAVE 重啓後致使的主從複製出錯。 read_only = 1 master_info_repository=TABLE relay_log_info_repository=TABLE 複製代碼
(21)而且重啓Slave中的Mysql服務:
systemctl restart mysqld
複製代碼
(22)在Slave中添加Master的信息:
# master_host是Master的ip,master_log_file和master_log_pos就是配置以前查看Master狀態時顯示的File和Position信息
change master to master_host='192.168.163.156',master_port=3306,master_user='backup',master_password='Purepgmr-2020',master_log_file='mysql-bin.000001',master_log_pos=1513; 複製代碼
(23)最後查看Slave的狀態:
show slave status\G
複製代碼
當看到
Slave_IO_Running
和Slave_SQL_Running
都是yes的時候,這表示主從配置成功。
「Slave_IO_Running也就是Slave中的IO線程用於請求Master,Slave_SQL_Running時sql線程將中繼日誌中更新日誌同步到Slave數據庫中。」
到那時,有時候Slave_IO_Running會爲no,而Slave_SQL_Running爲yes,這時候須要檢查一下緣由,由於我本身初次搭建的時候,也是出現這個問題。
首先看重啓一下Slave
的MySQL服務:systemctl restart mysqld
,而後執行:
stop slave; start slave; 複製代碼
這樣就可以使Slave_IO_Running
和Slave_SQL_Running
顯示都是yes了。
(24)最後就是測試了,測試使用的是以前建立的test庫,Master是用來寫的,在Master的test庫中隨機建立一個表,你會發現Slave也會有這個表,插入數據也同樣,都會被同步到Slave中。
❝Mysql主從有什麼優勢?爲何要選擇主從?
❞
❝如果主從複製,達到了寫性能的瓶頸,你是怎麼解決的呢?
❞
主從模式對於寫少讀多的場景確實很是大的優點,可是總會寫操做達到瓶頸的時候,致使性能提不上去。
這時候能夠在設計上進行解決採用分庫分表的形式,對於業務數據比較大的數據庫能夠採用分表,使得數據表的存儲的數據量達到一個合理的狀態。
也能夠採用分庫,按照業務進行劃分,這樣對於單點的寫,就會分紅多點的寫,性能方面也就會大大提升。
❝主從複製的過程有數據延遲怎麼辦?致使Slave被讀取到的數據並非最新數據。
❞
主從複製有不一樣的複製策略,對於不一樣的場景的適應性也不一樣,對於數據的實時性要求很高,要求強一致性,能夠採用同步複製策略,可是這樣就會性能就會大打折扣。
如果主從複製採用異步複製,要求數據最終一致性,性能方面也會好不少。只能說,對於數據延遲的解決方案沒有最好的方案,就看你的業務場景中哪一種方案使比較適合的。