mysql主从技术_MySQL主从架构的实现
目錄
一主一從
1.1 環(huán)境準備:
1.2 準備步驟:
1.3 實現(xiàn)步驟:
1.3.1 配置master主服務器
1.3.2 創(chuàng)建復制帳號
1.3.3 查看主服務器狀態(tài)
1.3.4 配置slave從服務器
1.3.5 啟動從服務器復制線程
1.3.6 查看從服務器狀態(tài)
1.3.7 測試
1.4 擴展——實現(xiàn)一主多從
1.4.1 需求分析
1.4.2 具體實現(xiàn)過程
1.5 擴展——實現(xiàn)半同步復制
1.5.1 三種復制方式
1.5.2 實現(xiàn)半同步復制
互為主從(雙主)
2.1 環(huán)境準備:
2.2 準備步驟:
2.3 實現(xiàn)步驟:
2.3.1 配置第一臺 master 主服務器
2.3.2 配置第二臺 master 主服務器
2.3.3 創(chuàng)建復制賬號
2.3.4 查看服務器狀態(tài)
2.3.5 啟動復制線程
2.3.5 測試
高可用架構MHA的實現(xiàn)
正文
一主一從
1.1 環(huán)境準備:
CentOS系統(tǒng)服務器2臺、 一臺用戶做MySQL主服務器, 一臺用于做MySQL從服務器, 配置好yum源、 防火墻關閉、 各節(jié)點時鐘服務同步、 各節(jié)點之間可以通過主機名互相通信。
1.2 準備步驟:
1)iptables -F && setenforce 清空防火墻策略,關閉selinux
2)拿兩臺服務器都使用yum方式安裝Mysql服務, 要求版本一致
3)分別啟動兩臺服務器mysql服務, 確保服務正常
架構圖:
1.3 實現(xiàn)步驟:
1.3.1 配置master主服務器
對master進行配置,包括打開二進制日志,指定唯一的servr ID。例如,在配置文件加入如下值
server-id=1 //配置server-id,讓主服務器有唯一ID號
log-bin=mysql-bin //打開Mysql日志,日志格式為二進制
skip-name-resolve //關閉名稱解析,(非必須)
1.3.2 創(chuàng)建復制帳號
在 Master 的數(shù)據(jù)庫中建立一個備份帳戶:每個 slave 使用標準的 MySQL 用戶名和密碼連接 master 。進行復制操作的用戶會授予 REPLICATION SLAVE 權限。
MariaDB [(none)]> grant replication slave,replication client on *.* to slave@'192.168.%.%' identified by 'keer';
1.3.3 查看主服務器狀態(tài)
在 Master 的數(shù)據(jù)庫執(zhí)行 show master status,查看主服務器二進制日志狀態(tài)及位置號。
1.3.4 配置slave從服務器
對 slave 進行配置,打開中繼日志,指定唯一的 servr ID,設置只讀權限。在配置文件加入如下值:
server-id=2 //配置server-id,讓從服務器有唯一ID號
relay_log = mysql-relay-bin //打開Mysql日志,日志格式為二進制
read_only = 1 //設置只讀權限
log_bin = mysql-bin //開啟從服務器二進制日志
log_slave_updates = 1 //使得更新的數(shù)據(jù)寫進二進制日志中
1.3.5 啟動從服務器復制線程
讓 slave 連接 master ,并開始重做 master 二進制日志中的事件。
MariaDB [(none)]> change master to master_host='192.168.37.111',
>master_user='slave',
>master_password='keer',
>master_log_file='mysql-bin.000001',
>master_log_pos=413;
執(zhí)行start slave;,來啟動復制線程。
1.3.6 查看從服務器狀態(tài)
可使用SHOW SLAVE STATUS\G;查看從服務器狀態(tài),如下所示,也可用show processlist \G;查看當前復制狀態(tài):
Slave_IO_Running: Yes //IO線程正常運行
Slave_SQL_Running: Yes //SQL線程正常運行
1.3.7 測試
1)測試主從同步
我們在 master 服務器上創(chuàng)建一個數(shù)據(jù)庫,再使用該數(shù)據(jù)庫創(chuàng)建一個表,添加一條記錄,來看一看 slave 服務器有沒有同步成功。
首先,我們先來查看一下兩個服務器上有什么數(shù)據(jù)庫:
master:
slave:
現(xiàn)在,我們在主服務器上創(chuàng)建一個數(shù)據(jù)庫“keer”:
然后,我們來看看從服務器是否已經(jīng)更新:
我們可以看出,數(shù)據(jù)庫已經(jīng)同步,接下來,我們就來創(chuàng)建表,并在表中插入一條記錄:
然后,我們來看看從服務器是否更新:
2)測試只讀屬性
我們在從服務器上設置了只讀,所以我們來試試看能不能插入數(shù)據(jù):
這就很尷尬了,為什么我們設置只讀還是可以插入數(shù)據(jù)呢?這要如何解決呢?
因為我們登錄的時候使用的是root超級用戶,這個大變態(tài)是不受只讀設置影響的,所以,我們還是可以往里面去插入數(shù)據(jù),當然,如果我們換成其他的普通用戶就不會出現(xiàn)這樣的問題了。
解決方式也很簡單,我們只需要把表鎖起來就可以了:
MariaDB [keer]> flush tables with read lock;
進行鎖表操作以后,我們再來插入一條數(shù)據(jù):
這樣的話,即使我們是超級用戶登錄進來的,也不能再插入數(shù)據(jù)了。這樣會安全很多。但是,有利就有弊,這樣的話,我們的主從就不能實時同步了,因為我們的主從同步是通過把主上的 sql 語句放在從上再執(zhí)行一遍來實現(xiàn)的,可是我們鎖表的話,sql 語句就不能執(zhí)行了。想要同步方法也很簡單,直接把表解鎖就可以了。
我們在主上插入一條數(shù)據(jù):
此時,我們的從上就要解表以后才能實現(xiàn)同步:
1.4 擴展——實現(xiàn)一主多從
1.4.1 需求分析
當我們的服務器運行一段時間后,流量變得越來越多,這時,一主一從能夠實現(xiàn)的高可用性和負載均衡不能滿足我們的需求,我們就要選擇再添加一臺從服務器。
可是現(xiàn)在我們的 master 已經(jīng)運行很久了,我們也需要對新安裝的 slave 進行數(shù)據(jù)同步,甚至它沒有 master 的數(shù)據(jù)。
此時,有幾種方法可以使 slave 從另一個服務開始,例如,從 master 拷貝數(shù)據(jù),從另一個 slave 克隆,從最近的備份開始一個 slave 。為了加快 slave 與 master 同步,可用以下方式先進行數(shù)據(jù)同步:
(1)master的某個時刻的數(shù)據(jù)快照;
(2)數(shù)據(jù)庫的備份數(shù)據(jù);
(3)master的二進制日志文件。
架構圖:
接下來,我們就來實現(xiàn)一下這個過程:
1.4.2 具體實現(xiàn)過程
1)對 master 進行完全備份
[root@master ~]# mkdir /backup
[root@master ~]# mysqldump --all-database > /backup/mysql-backup-`date +%F-%T`-all.sql
照例查看一下主的二進制日志狀態(tài)及位置號。
2)把完全備份的數(shù)據(jù)發(fā)到新增的從上
[root@master ~]# scp /backup/mysql-backup-2017-11-21-10\:28\:29-all.sql @192.168.37.133:~
root@192.168.37.133's password:
mysql-backup-2017-11-21-10:28:29-all.sql 100% 504KB 503.9KB/s 00:00
3)把這個完全備份導入從的數(shù)據(jù)庫:
4)查看從是否恢復成功:
我們來查看一下從的二進制日志狀態(tài)及位置號:
我們的數(shù)據(jù)已經(jīng)恢復成功
5)設置主從
接下來就是按照上述步���,對該從服務器進行設置就好:
[root@slave2 ~]# vim /etc/my.cnf
[mysqld]
server-id = 3
relay-log = mysql-relay-bin
read-only = 1
log-bin = mysql-bin
log-slave-updates = 1
然后,我們就來設置從服務器:
[root@slave2 ~]# mysql -uroot -p
Enter password:
MariaDB [(none)]> change master to master_host='192.168.37.111',
>master_user='slave',
>master_password='keer',
>master_log_file='mysql-bin.000001',
>master_log_pos=330;
MariaDB [(none)]> start slave;
然后我們來查看一下從服務器的狀態(tài):
6)測試
設置完畢,我們來測試一下,當主上有操作時,從上是否更新:
至此,我們就完成了一主兩從。如果有需要,我們還可以繼續(xù)添加從服務器。
1.5 擴展——實現(xiàn)半同步復制
1.5.1 三種復制方式
1)同步復制
指當主庫執(zhí)行完一個事務,所有的從庫都執(zhí)行了該事務才返回給客戶端。因為需要等待所有從庫執(zhí)行完該事務才能返回,所以全同步復制的性能必然會收到嚴重的影響。需要有超時時間。
2)異步復制
MySQL默認的復制即是異步的,主庫在執(zhí)行完客戶端提交的事務后會立即將結果返給給客戶端,并不關心從庫是否已經(jīng)接收并處理,這樣就會有一個問題,主如果crash掉了,此時主上已經(jīng)提交的事務可能并沒有傳到從上,如果此時,強行將從提升為主,可能導致新主上的數(shù)據(jù)不完整。
3)半同步復制
介于異步復制和全同步復制之間,主庫在執(zhí)行完客戶端提交的事務后不是立刻返回給客戶端,而是等待至少一個從庫接收到并寫到relay log中才返回給客戶端。相對于異步復制,半同步復制提高了數(shù)據(jù)的安全性,同時它也造成了一定程度的延遲,這個延遲最少是一個TCP/IP往返的時間。所以,半同步復制最好在低延時的網(wǎng)絡中使用。
1.5.2 實現(xiàn)半同步復制
半同步復制是基于特定的模塊來實現(xiàn)。不過非常 nice 的一點就是,在我們的 mariadb5.5 以上的版本默認是帶有這個模塊的。
如果我們的 centos7 上安裝了 mariadb ,我們就可以進入目錄去查看一下:
[root@master ~]# cd /usr/lib64/mysql/plugin/
找到我們的模塊后,我們就可以通過命令來安裝,然后進行簡單配置即可使用了。下面就是具體方法:
master 服務器上:
MariaDB [(none)]> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
MariaDB [(none)]> SHOW GLOBAL VARIABLES LIKE 'rpl_semi%';
MariaDB [(none)]> SET GLOBAL rpl_semi_sync_master_enabled=ON;
slave 服務器上:
MariaDB [(none)]> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
MariaDB [(none)]> SHOW GLOBAL VARIABLES LIKE 'rpl_semi%';
MariaDB [(none)]> SET GLOBAL rpl_semi_sync_slave_enabled = ON ;
MariaDB [(none)]> stop slave;
MariaDB [(none)]> start slave;
現(xiàn)在,我們的半同步復制就開啟了,我們可以來查看一下日志:
[root@slave ~]# tail -200 /var/log/mariadb/mariadb.log
從日志里也可以看出我們的半同步復制已經(jīng)開啟。
以上,實驗一完成。
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結
以上是生活随笔為你收集整理的mysql主从技术_MySQL主从架构的实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ISO9000 质量管理和质量保证系列国
- 下一篇: mybatis --入门 单表增删改查-