MySQL主從服務器
實現方式: MySQL REPLICATION
Replication可以實現將數據從一台數據庫服務器(master)復制到一台或多台數據庫服務器(slave)
默認情況下這種情況屬於異步復制,無需維持長連接
通過配置,可以復制所有庫或者幾個庫,甚至庫中的一些表
它是MySQL內建的,自帶
Replication的原理
主服務器master將數據庫的改變寫入二進制日志文件,從服務器slave同步這些二進制日志,並生成中繼日志,從服務器根據中繼日志,執行這些改變
DML:SQL操作語句,update,insert,delete
Relay log :中繼日志
工程流程(見下圖)
整體來說,分三步:
1). Master將改變記錄到二進制日志(binary log)中.
(這些記錄叫做二進制日志事件,binary log events);
2). Slave將Master的binary log events拷貝到它的中繼日志(Relay log);
# 本過程由Slave的I/O線程來完成
3). Slave重做中繼日志中的事件,修改Slave上的數據
# 本過程由Slave的SQL線程來完成
# 故,這里有個前提,就是在搭建環境時,Master和Slave數據一致
更詳細的解釋如下:
mysql主從復制中:
第一步:master記錄二進制日志。在每個事務更新數據完成之前,master在二進制日志記錄這些改變。MySQL將事務寫入二進制日志,即使事務中的語句都是交叉執行的。在事件寫入二進制日志完成后,master通知存儲引擎提交事務。
第二步:slave將master的binary log拷貝到它自己的中繼日志。首先,slave開始一個工作線程——I/O線程。I/O線程在master上打開一個普通的連接,然后開始binlog dump process。Binlog dump process從master的二進制日志中讀取事件,如果已經執行完master產生的所有文件,它會睡眠並等待master產生新的事件。I/O線程將這些事件寫入中繼日志。
第三步:SQL slave thread(SQL從線程)處理該過程的最后一步。SQL線程從中繼日志讀取事件,並重新執行其中的事件而更新slave的數據,使其與master中的數據一致。
此外,在master中也有一個工作線程和其它MySQL的連接一樣,slave在master中打開一個連接也會使得master開始一個線程。復制過程有一個很重要的限制——復制在slave上是串行化的,也就是說master上的並行更新操作不能在slave上並行操作。
Replication的作用
1. Fail Over 故障切換
2. Backup Server 備份服務,無法對SQL語句執行產生的故障恢復,有限備份
3. High Performance 高性能,可以多台Slave,實現讀寫分離
Replication常見方案:
1、One master and Muti salve 一主多備
一般用來做讀寫分離的,master寫,其他slave讀
這種架構最大問題I/O壓力集中
在Master上<多台同步影響IO>
2、M-S-S
使用一台slave作為中繼,分擔Master的壓力,slave中繼需要開啟bin-log,並配置log-slave-updates
Slave中繼可使用Black-hole存儲引擎,不會把數據存儲到磁盤,只記錄二進制日志
3、M-M 雙主互備
很多人誤以為這樣可以做到MySQL負載均衡,實際什么沒什么好處,每個服務器需要做同樣的同步更新,破壞了事物的隔離性和數據的一致性
4、M-M-M
監控三台機器互相做對方的master
天生的缺陷:復制延遲,slave上同步要慢於master,如果大並發的情況那延遲更嚴重
Mysql在5.6已經自身可以實現fail over
5、One slave Muti master 一從對多主
好處:節省成本,將多個master數據自動化整合
缺陷:對庫和表數據的修改較多
四:部署MySQL主從同步 <M-S>
環境准備:
主機名 |
IP |
系統 / MySQL版本 |
角色 |
xiaogan64 |
192.168.31.64 |
CentOS6.8 / 5.5.53 |
Master |
xiaogan63 |
192.168.31.63 |
CentOS6.8 / 5.5.53 |
slave |
模式:C/S
端口:3306
配置主數據庫服務器xiaogan64
創建需要同步的數據庫:
mysql> create database Test;
mysql> use Test;
mysql> create table xiaogan(id int,name varchar(20));
service mysqld stop
配置my.cnf:
vim /etc/my.cnf
log-bin=mysql-bin-master #啟用二進制日志,開啟log-bin 並設置為master
server-id=1 #本機數據庫ID 標示 默認就是1,這里不用改
binlog-do-db=Test #可以被從服務器復制的庫。二進制需要同步的數據庫名
binlog-ignore-db=mysql #不可以被從服務器復制的庫
重啟mysql:
service mysqld restart
授權:
mysql> grant replication slave on *.* to slave@192.168.31.64 identified by "123456";
查看狀態信息:
mysql> show master status;
查看二進制日志:
ls /usr/local/mysql/data/
mysql> show binlog events\G
復制前要保證同步的數據庫一致
mysqldump -uroot -p123456 Test >Test.sql
#也可以導出數據庫
將導出的數據庫傳給從服務器
方法一:scp Test.sql 192.168.31.63:/root
方法二:使用nc命令
NetCat,它短小精悍、功能實用,被設計為一個簡單、可靠的網絡工具,可通過TCP或UDP協議傳輸讀寫數據。同時,它還是一個網絡應用Debug分析器,因為它可以根據需要創建各種不同類型的網絡連接。
語法:
服務器端:nc發送數據的語法: nc -l 端口 < 要傳輸的文件
客戶端: nc接受數據的語法: nc 遠程nc服務器端IP 端口 > 文件名
開始傳送:
[root@xiaogan64 ~]# nc -l 888 < test.sql
[root@xiaogan64 ~]# lsof -i :888
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nc 3464 root 3u IPv4 18662 0t0 TCP *:cddbp (LISTEN)
開始接收:
記得清空兩台服務器的iptables,要不然端口不能通信
iptables –F
/etc/init.d/iptables save
nc 192.168.31.64 888 > test.sql
配置從數據庫服務器xiaogAN63
兩台數據庫服務器mysql版本要一致
mysql> show variables like '%version%';
測試連接到主服務器是否成功
mysql -uslave -p123456 -h 192.168.31.64
只有復制的權限
導入數據庫,和主數據庫服務器保持一致
mysql> create database Test;
mysql -uroot -p123456 Test<Test.sql
修改從服務器配置文件:
從服務器沒必要開啟bin-log日志
service mysqld stop
vim /etc/my.cnf
server-id=2
#從服務器ID號,不要和主ID相同 ,如果設置多個從服務器,每個從服務器必須有一個唯一的server-id值,必須與主服務器的以及其它從服務器的不相同。可以認為server-id值類似於IP地址:這些ID值能唯一識別復制服務器群集中的每個服務器實例。
mysql> change master to master_host='192.168.31.64',master_user='slave',master_password='123456'; # 注,是,號連接
mysql> start slave;
mysql> show slave status\G 查看狀態
Slave_IO_Running :一個負責與主機的io通信
Slave_SQL_Running:負責自己的slave mysql進程
文本框是mysql5.1的配置
再到主服務器 xiaogan64 上查看狀態:
mysql> show processlist \G
插入數據測試同步:
mysql> insert into Test.xiaogan values (11,'ganbugan');
從數據庫上查看:
排錯:
如果遇到主從不同步,看一下主從bin-log的位置,然后再同步。
從服務器 xiaogan63 上執行MySQL命令如下:
mysql> slave stop; #先停止slave服務
mysql> change master to master_log_file='mysqllog.000004' ,master_log_pos=106;
#根據上面主服務器的show master status的結果,進行從服務器的二進制數據庫記錄回歸,達到同步的效果
mysql>slave start; #啟動從服務器同步服務
mysql> show slave status\G; #用show slave status\G;看一下從服務器的同步情況
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
如果都是yes,那代表已經在同步
重啟從服務器,再查看狀態:
停止從服務器slave stop;
開啟從服務器slave start;
排錯思路:
1. 二進制日志沒有開啟
2. IPTABLES 沒有放開端口
3. 對應的主機 IP地址寫錯了
SQL線程出錯
1、主從服務器數據庫結構不統一
出錯后,數據少,可以手動解決創建插入,再更新slave狀態。
注:如果主上誤刪除了。那么從上也就誤刪除了。 #因此主上要定期做mysqldump備份。
五:部署MySQL主主雙向主從復制 M-M
通過mysql主主:進行mysql 雙向同步數據庫Test的配置
mysql主:服務端:xiaogan63 IP:192.168.31.63
mysql主:服務端:xiaogan64 IP:192.168.31.64
在上面主從的基礎上進行配置
配置xiaogan63
它有兩種身份:
身份1: xiaogan63的主。 身份2: xiaogan64的從。
vim /etc/my.cnf
log-bin=mysql-bin-slave
binlog-do-db=Test
binlog-ignore-db=mysql #避免同步mysql用戶 相關配置
service mysqld restart
授權:
mysql> grant replication slave on *.* to slave@'192.168.31.64' identified by '123456';
配置xiaogan64
vim /etc/my.cnf # 不用修改
5.1的配置
5.5上的配置:
[root@xiaogan64 ~]# mysql -uroot -p123456
mysql> change master to master_host='192.168.31.64',master_user='slave',master_password='123456';
mysql> start slave;
mysql> show slave status\G
檢查:
xiaogan64上查看slave狀態
mysql> show slave status \G
xiaogan63上查看slave狀態
mysql> show slave status \G
插入數據測試:
在xiaogan63上插入數據,xiaogan64上查看
mysql> insert into T1 values(2,'天清');
在xiaogan64上插入數據,xiaogan63上查看
mysql> insert into T1 values(3,'黑客');
注意:這種M-M架構沒有什么好處,他往往給我們產生一種實現了負載均衡的錯覺
六:部署M-S-S模型
環境:
xiaogan63 master mysql5.5.53 192.168.31.63
xiaogan64 slave中繼 mysql5.5.53 192.168.31.64
xiaogan65 slave mysql5.5.53 192.168.31.65
部署master---->xiaogan63:
授權用戶:
mysql> grant replication slave on *.* to 'repl'@192.168.31.64 identified by '123456';
[root@xiaogan63 ~]# vim /etc/my.cnf #修改配置
sync-binlog=1
service mysqld restart
導出Master完整備份, mysqldump .sql
XtraBackup工具下載地址
https://www.percona.com/downloads/XtraBackup/LATEST/
提供mysql運行時備份
源碼安裝方法:
https://www.percona.com/doc/percona-xtrabackup/LATEST/installation/compiling_xtrabackup.html
YUM源安裝方法:
https://www.percona.com/doc/percona-xtrabackup/LATEST/installation/yum_repo.html
第一步:安裝percona的repo源 # Install the Percona repository
yum install http://www.percona.com/downloads/percona-release/redhat/0.1-3/percona-release-0.1-3.noarch.rpm -y
第二步: 檢查yum源是否已生效: 執行 yum list | grep percona 即可
yum list | grep ^percona-xtrabackup
第三步:安裝xtrabackup
yum -y install xtrabackup-24
依賴關系:
[root@xiaogan63 ~]# innobackupex --user=root --password=123456 /opt/backup
[root@xiaogan63 ~]# innobackupex --user-memory=500M --apply-log /opt/backup/2016-10-22_23-49-01/ # 這個目錄是上一條命令創建的
將備份拷貝至slave中繼,和slave
[root@xiaogan63 ~]# scp -r /opt/backup/ 192.168.31.64:/opt/
[root@xiaogan63 ~]# scp -r /opt/backup/ 192.168.31.65:/opt/
部署slave中繼------> xiaogan64
修改主配置文件也要開啟bin-log:
log-bin=mysql-bin-slave1
log-slave-updates=1
#把它從relay-log中讀取出來的二進制日志以及本機上執行的操作都記錄到自己的二進制日志里面,這樣才能使第三台slave通過中繼slave讀取到相應數據變化
binlog_format=row
server-id = 2
拷貝master導出的數據到data下:
[root@xiaogan64 ~]# service mysqld stop
[root@xiaogan64 ~]# rm -rf /data/*
[root@xiaogan64 ~]# mv /opt/backup/2016-10-22_23-49-010/* /data/
[root@xiaogan64 ~]# chown -R mysql:mysql /data/
授權:
mysql> change master to master_host='192.168.31.63',master_user='repl',master_password='123456';
mysql> start slave;
# 由於數據庫中的data全部是由63上考過來的,所以需要刪除原本的xiaogan數據庫,不然會報錯,知識Slave_SQL_Running 無法創建數據庫
# 登錄 64的數據庫后,刪除xiaogan數據庫
再授權一個用戶給slave:
mysql> grant replication slave on *.* to 'repl'@192.168.31.65 identified by '123456';
部署slave------>xiaogan65
導入數據:
[root@xiaogan65 ~]# service mysqld stop
[root@xiaogan65 ~]# rm -rf /data/*
[root@xiaogan65 ~]# mv /opt/backup/2016-10-22_23-49-010/* /data
[root@xiaogan65 ~]# chown -R mysql:mysql /data
修改配置:
log-bin=mysql-bin-slave2
binlog_format=row
server-id = 3
重啟服務:
[root@xiaogan65 ~]# service mysqld start
指定slave中繼作為主:
mysql> change master to master_host='192.168.31.64',master_user='repl',master_password='123456';
mysql> start slave;
從master上插入數據測試:
mysql> create table mermber(id int(4) unsigned not null auto_increment,name varcTestr(20),primary key(id));
mysql> insert into mermber values(1,'天屠'),(2,'孤葉');
然后分別在slave中繼,與slave上查看
排錯:
錯誤1:
此方法可能失效,自行驗證
mysql> show slave status\G
由結果可以看到:
Read_Master_Log_Pos: 288
Exec_Master_Log_Pos: 107
Last_SQL_Errno: 1146
Last_SQL_Error: Error executing row event: 'Table 'Test.student' doesn't exist'
因為只對Test記錄了binlog,當在mydb庫操作其它數據庫的表,但該表在slave上又不存在時就出錯了。
到master上查看事件記錄
mysql> show binlog events in 'mysql-bin-master.000002' from 107\G
由上面的結果可知,我們需要跳過兩個事務173,288
然后到salve中繼操作:
mysql> slave stop;
mysql> SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 2; 跳過一個事務
mysql> slave start;
這個搞定
或者:
它提供了一個session粒度的選項,通過關閉這個選項可以不讓主庫將打開這個選項或關閉連接前的SQL語句寫入binlog。
set sql_log_bin=off;
mysql>alter table aaa add column xxx int default 1 after yyy;
模擬故障:
由於歷史遺留問題,MySQL主從庫的表結構不一致,主庫的某個表tableA比從庫表tableA少了一個字段
當嘗試在主庫上更改表結構時,這行alter語句會隨着binlog同步到從庫,如果從庫執行這行語句時出錯,主從同步線程就會自動停止,那樣只能人為手動處理錯誤,然后再啟動slave上的主從同步線程。場景大概是下面這個樣子:
先在從庫添加這個字段:
mysql> alter table student add age int default 0 after name;
再在主庫添加這個字段:
mysql> alter table student add age int default 0 after name;修改主庫上的表結構,添加一個字段
從庫會同步主庫的,但是從庫已經純在了這個字段
查看slave狀態
解決方法1:
跳過錯誤的事物
從庫上執行:
mysql> stop slave;
set global sql_slave_skip_counter=1;
mysql> start slave;
很多slave數據庫的時候這樣改太麻煩了
解決方法2:
slave比較少的時候還可以,但是當從庫有幾十台時,逐台去處理既費時又容易出錯,怎樣在主庫這一側一勞永逸地避免呢?
那很簡單,我們不要讓主庫將alter語句記錄到binlog中就行
我們直接這主庫中關閉binlog記錄
mysql> set sql_log_bin=off;
然后我們再執行alter語句
mysql> alter table student add age int default 0 after name;
再開啟bin-log
mysql> set sql_log_bin=on;
錯誤2:
這種要求對齊binlog
先到作為它的主上查看binlog
Slave上不對應
Slave上操作:
mysql> stop slave;
mysql> cTestnge master to master_host='192.168.31.64',master_user='repl',master_password='123456',master_log_file='mysql-bin-slave1.000002',master_log_pos=415;
mysql> start slave;
Ok,恢復正常
# 拷貝完成數據后,重啟報錯
[root@xiaogan65 data]# service mysqld restart 重啟報錯
[root@xiaogan65 data]# rm ibdata1 ib_logfile0 ib_logfile1
rm: remove regular file `ibdata1'? y
rm: remove regular file `ib_logfile0'? y
rm: remove regular file `ib_logfile1'? y
[root@xiaogan65 data]# kill -9 9021
[root@xiaogan65 data]# kill -9 9312
[root@xiaogan65 data]# service mysqld restart
MySQL讀寫分離的概述
Mysql作為目前世界上使用最廣泛的免費數據庫,相信所有從事系統運維的工程師都一定接觸過。但在實際的生產環境中,由單台Mysql作為獨立的數據庫是完全不能滿足實際需求的,無論是在安全性,高可用性以及高並發等各個方面。
因此,一般來說都是通過 主從復制(Master-Slave)的方式來同步數據,再通過讀寫分離(MySQL-Proxy/Amoeba)來提升數據庫的並發負載能力 這樣的方案來進行部署與實施的。
讀寫分離工作原理:
基本的原理是讓主數據庫處理事務性增、改、刪操作(INSERT、UPDATE、DELETE),而從數據庫處理SELECT查詢操作。數據庫復制被用來把事務性操作導致的變更同步到集群中的從數據庫。
數據內部交換過程:
為什么要讀寫分離:
面對越來越大的訪問壓力,單台的服務器的性能成為瓶頸,需要分擔負載
1、 主從只負責各自的寫和讀,極大程度的緩解X鎖和S鎖爭用
2、 從庫可配置myisam引擎,提升查詢性能以及節約系統開銷
3、 增加冗余,提高可用性
實現讀寫分離的方式:
一般有兩種方式實現
應用程序層實現,網站的程序實現
應用程序層實現指的是在應用程序內部及連接器中實現讀寫分離
優點:
A:應用程序內部實現讀寫分離,安裝既可以使用
B:減少一定部署難度
C:訪問壓力在一定級別以下,性能很好
缺點:
A:架構一旦調整,代碼要跟着變
B:難以實現高級應用,如自動分庫,分表
C:無法適用大型應用場景
中間件層實現
中間件層實現是指在外部中間件程序實現讀寫分離
常見的中間件程序:
Mysql-proxy amoeba Atlas(360) Cobar(Alibaba) TDDL(Taobao)
優點:
A:架構設計更靈活
B:可以在程序上實現一些高級控制,如:透明化水平拆分,failover,監控
C:可以依靠些技術手段提高mysql性能,
D:對業務代碼的影響小,同時也安全
缺點:
需要一定的開發運維團隊的支持
MySQL-Proxy概述
MySQL Proxy是一個處於你的client端和MySQL server端之間的簡單程序,它可以監測、分析或改變它們的通信。它使用靈活,沒有限制,常見的用途包括:負載平衡,故障、查詢分析,查詢過濾和修改等等。
MySQL Proxy就是這么一個中間層代理,簡單的說,MySQL Proxy就是一個連接池,負責將前台應用的連接請求轉發給后台的數據庫,並且通過使用lua腳本,可以實現復雜的連接控制和過濾,從而實現讀寫分離和負載平衡。對於應用來說,MySQL Proxy是完全透明的,應用則只需要連接到MySQL Proxy的監聽端口即可。當然,這樣proxy機器可能成為單點失效,但完全可以使用多個proxy機器做為冗余,在應用服務器的連接池配置中配置到多個proxy的連接參數即可。
MySQL Proxy更強大的一項功能是實現“讀寫分離”,基本原理是讓主數據庫處理事務性查詢,讓從庫處理SELECT查詢。數據庫復制被用來把事務性查詢導致的變更同步到集群中的從庫。
下載: mysql-proxy
http://dev.mysql.com/downloads/mysql-proxy/
端口: mysql-proxy 默認端口:4040
部署mysql-proxy實現讀寫分離
實驗環境:
mysql-proxy服務端: xiaogan65 IP:192.168.31.65
mysql服務器(主,負責寫)服務端:xiaogan63 IP:192.168.31.63
mysql服務器(從,負責讀)客戶端:xiaogan64 IP:192.168.31.64
部署mysql-proxy服務端xiaogan65:
安裝前需要系統支持LUA語言環境:
[root@xiaogan65 ~]# yum install lua
安裝mysql-proxy:
推薦采用已經編譯好的二進制版本,因為采用源碼包進行編譯時,最新版的MySQL-Proxy對automake,glib以及libevent的版本都有很高的要求,而這些軟件包都是系統的基礎套件,不建議強行進行更新。
並且這些已經編譯好的二進制版本在解壓后都在統一的目錄內,因此建議選擇以下版本:
[root@xiaogan65 ~]# wget http://cdn.mysql.com/archives/mysql-proxy/mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz
[root@xiaogan65 ~]# tar -xf mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz -C /usr/local/
[root@xiaogan65 local]# mv mysql-proxy-0.8.5-linux-el6-x86-64bit/ mysql-proxy
修改系統環境變量:
[root@xiaogan65 local]# vim /etc/profile
export PATH=/usr/local/mysql-proxy/bin/:/usr/local/mysql/bin:$PATH
[root@xiaogan65 local]# source !$
mysql-proxy 腳本配置文件位置:
[root@xiaogan65 ~]# cd /usr/local/mysql-proxy
[root@xiaogan65 ~]# ls share/doc/mysql-proxy/
修改配置文件實現讀寫分離:
[root@xiaogan65 ~]# cd /usr/local//mysql-proxy/share/doc
[root@xiaogan65 doc]# vim mysql-proxy/rw-splitting.lua
修改
40 min_idle_connections = 4,
41 max_idle_connections = 8,
為
#修改默認連接,進行快速測試,默認最小4個以上的客戶端連接才會實現讀寫分離,最大鏈接數為8。
注:為了驗證試驗效果將他改成1 .就是當有一個鏈接的時候,就實現讀寫分離的功能。為了清晰的看到讀寫分離的效果,需要暫時關閉MySQL主從復制功能。
xiaogan63上創建數據庫和表,用於實現寫操作:
[root@xiaogan63 ~]# mysql -uroot -p123456
mysql> create database db;
mysql> use db;
mysql> create table test(id int);
mysql> insert into test values(6363);
mysql> grant all on db.* to user1@'%' identified by '123456';
xiaogan64上創建數據庫和表,用於實現讀操作:
[root@xiaogan64 ~]# mysql -uroot -p123456
mysql> create database db;
mysql> use db;
mysql> create table test(id int);
mysql> insert into test values(6464);
mysql> grant all on db.* to user1@'%' identified by '123456';
啟動服務mysql-proxy服務
[root@xiaogan65 ~]# mysql-proxy --proxy-read-only-backend-addresses=192.168.31.64:3306 --proxy-backend-addresses=192.168.31.63:3306 --proxy-lua-script=/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua &
參數說明:
--proxy-read-only-backend-addresses=192.168.31.64:3306
# 定義后端只讀服務器
--proxy-backend-addresses=192.168.31.63:3306
#定義后端mysql主服務器地址,指定mysql寫主服務器的端口
--proxy-lua-script=/usr/local/mysql-proxy/sTestre/doc/mysql-proxy/rw-splitting.lua &
#指定lua腳本,在這里,使用的是rw-splitting腳本,用於讀寫分離
當有多個只讀服務器時,可以寫多個以下參數:
--proxy-read-only-backend-addresses=192.168.31.64:3306 # 定義后端只讀服務器
--proxy-read-only-backend-addresses=192.168.31.62:3306 # 定義后端只讀服務器
#--proxy-address=192.168.31.65:3307 指定mysql proxy的監聽端口,默認為:4040
完整的參數可以運行以下命令查看:
[root@xiaogan65 ~]# mysql-proxy --help-all
查看proxy是否啟動:
[root@xiaogan65 ~]# lsof -i :4040
測試讀寫分離
測試寫操作:
[root@xiaogan65 ~]# mysql -uuser1 -p123456 -P4040 -h192.168.31.65
mysql> use db;
mysql> insert into test values(636363); 回車,沒有報錯
##看不到64數據,可以看到剛寫入的數據,說明寫操作成功。 因為是第一個客端連接,還沒有啟動讀寫分離,所以select讀時,沒有看到“6464”數據,而是看到主上“6363“數據。
接下來,多打開幾個客戶端測試一下讀。注:第一個鏈接,一定是走backend 主mysql服務器的。
測試讀操作:
[root@xiaogan63 ~]# mysql -uuser1 -p123456 -P4040 -h 192.168.31.65
[root@xiaogan64 ~]# mysql -uuser1 -p123456 -P4040 -h 192.168.31.65
我們再用65登陸,查看
[root@xiaogan65 ~]# mysql -uuser1 -p123456 -P4040 -h 192.168.31.65
這說明讀寫分離測試成功。 但是數據還沒有保持同步。 保持數據同步,可以通過mysql主從來實現。
擴展: 查看客戶端連接狀態:
mysql> show processlist;
部署mysql主從並實現讀寫分離
在之前的基礎上配置主從
配置xiaogan63為master
[root@xiaogan63 ~]# vim /etc/my.cnf
log-bin=mysql-bin-master
binlog_format=row
server-id = 1
再修改庫授權:
[root@xiaogan63 ~]# mysql -uroot -p123456
mysql> grant all on *.* to slave@'%' identified by '123456';
mysql> use db;
mysql> drop table test;
[root@xiaogan63 ~]# service mysqld restart
配置xiaogan64為slave
[root@xiaogan64 ~]# vim /etc/my.cnf
server-id = 2
[root@xiaogan64 ~]# service mysqld restart
[root@xiaogan64 ~]# mysql -uroot -p123456
mysql> change master to master_host='192.168.31.63',master_user='slave',master_password='123456';
mysql> use db;
mysql> drop table test;
mysql> start slave;
mysql> show slave status\G
主從同步測試:
1:Mysql主數據庫xiaogan63插入數據:
mysql> use db;
mysql> create table admin(id int);
mysql> insert into admin values(63);
2:Mysql從數據庫xiaogan64查看同步的數據:
同步后,測試使用mysql-proxy 能否讀到同樣的數據。
在xiaogan65上測試
[root@xiaogan65 ~]# mysql -uslave -p123456 -P4040 -h192.168.31.65
#可以查看到admin中的63記錄,說明mysql+proxy+主從讀寫分離成功。
插入數據測試:
mysql> use db;
mysql> insert into admin values(64);
在xiaogan63,xiaogan64上查看都有
當我們slave掛掉后咋樣呢
模擬故障:
[root@xiaogan64 ~]# service mysqld stop
在xiaogan65上測試讀寫
mysql> insert into admin values(65);
xiaogan63上查看連接狀態,確認關閉slave后,讀寫都是訪問xiaogan63
總結:當停止掉 slave 數據庫,proxy 的查詢就會轉移到 master 上,當把 slave 啟動后,proxy 依然在讀 master,當有新的鏈接進來的時候才會重新去讀取 slave 的數據。有時可能需要重啟下 mysql-proxy。
如果主數據庫掛了:
主從也沒了,在xiaogan65上只能查看數據
[root@xiaogan65 ~]# mysql -uuser1 -p123456 -P4040 -h192.168.31.65