Replication能夠實現將數據從一臺數據庫服務器(master)複製到一臺或多臺數據庫服務器(slave) html
默認狀況下這種狀況屬於異步複製,無需維持長鏈接 mysql
經過配置,能夠複製全部庫或者幾個庫,甚至庫中的一些表 linux
它是MySQL內建的,自帶 sql
主服務器master將數據庫的改變寫入二進制日誌文件,從服務器slave同步這些二進制日誌,並生成中繼日誌,從服務器根據中繼日誌,執行這些改變 數據庫
DML:SQL操做語句,update,insert,delete vim
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上並行操做。
1. Fail Over 故障切換
2. Backup Server 備份服務,沒法對SQL語句執行產生的故障恢復,有限備份
3. High Performance 高性能,能夠多臺Slave,實現讀寫分離
通常用來作讀寫分離的,master寫,其餘slave讀
這種架構最大問題I/O壓力集中
在Master上<多臺同步影響IO>
使用一臺slave做爲中繼,分擔Master的壓力,slave中繼須要開啓bin-log,並配置log-slave-updates
Slave中繼可以使用Black-hole存儲引擎,不會把數據存儲到磁盤,只記錄二進制日誌
不少人誤覺得這樣能夠作到MySQL負載均衡,實際什麼沒什麼好處,每一個服務器須要作一樣的同步更新,破壞了事物的隔離性和數據的一致性
監控三臺機器互相作對方的master
天生的缺陷:複製延遲,slave上同步要慢於master,若是大併發的狀況那延遲更嚴重
Mysql在5.6已經自身能夠實現fail over
好處:節省成本,將多個master數據自動化整合
缺陷:對庫和表數據的修改較多
主機名 |
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
建立須要同步的數據庫:
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
兩臺數據庫服務器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線程出錯
一、主從服務器數據庫結構不統一
出錯後,數據少,能夠手動解決建立插入,再更新slave狀態。
注:若是主上誤刪除了。那麼從上也就誤刪除了。 #所以主上要按期作mysqldump備份。
經過mysql主主:進行mysql 雙向同步數據庫Test的配置
mysql主:服務端:xiaogan63 IP:192.168.31.63
mysql主:服務端:xiaogan64 IP:192.168.31.64
在上面主從的基礎上進行配置
它有兩種身份:
身份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';
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架構沒有什麼好處,他每每給咱們產生一種實現了負載均衡的錯覺
環境:
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
受權用戶:
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/
修改主配置文件也要開啓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';
導入數據:
[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;
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上查看
此方法可能失效,自行驗證
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;
這種要求對齊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做爲獨立的數據庫是徹底不能知足實際需求的,不管是在安全性,高可用性以及高併發等各個方面。
所以,通常來講都是經過 主從複製(Master-Slave)的方式來同步數據,再經過讀寫分離(MySQL-Proxy/Amoeba)來提高數據庫的併發負載能力 這樣的方案來進行部署與實施的。
基本的原理是讓主數據庫處理事務性增、改、刪操做(INSERT、UPDATE、DELETE),而從數據庫處理SELECT查詢操做。數據庫複製被用來把事務性操做致使的變動同步到集羣中的從數據庫。
數據內部交換過程:
面對愈來愈大的訪問壓力,單臺的服務器的性能成爲瓶頸,須要分擔負載
一、 主從只負責各自的寫和讀,極大程度的緩解X鎖和S鎖爭用
二、 從庫可配置myisam引擎,提高查詢性能以及節約系統開銷
三、 增長冗餘,提升可用性
通常有兩種方式實現
應用程序層實現指的是在應用程序內部及鏈接器中實現讀寫分離
優勢:
A:應用程序內部實現讀寫分離,安裝既可使用
B:減小必定部署難度
C:訪問壓力在必定級別如下,性能很好
缺點:
A:架構一旦調整,代碼要跟着變
B:難以實現高級應用,如自動分庫,分表
C:沒法適用大型應用場景
中間件層實現是指在外部中間件程序實現讀寫分離
常見的中間件程序:
Mysql-proxy amoeba Atlas(360) Cobar(Alibaba) TDDL(Taobao)
優勢:
A:架構設計更靈活
B:能夠在程序上實現一些高級控制,如:透明化水平拆分,failover,監控
C:能夠依靠些技術手段提升mysql性能,
D:對業務代碼的影響小,同時也安全
缺點:
須要必定的開發運維團隊的支持
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服務端: xiaogan65 IP:192.168.31.65
mysql服務器(主,負責寫)服務端:xiaogan63 IP:192.168.31.63
mysql服務器(從,負責讀)客戶端:xiaogan64 IP:192.168.31.64
安裝前須要系統支持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主從複製功能。
[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';
[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';
[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;
在以前的基礎上配置主從
[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
[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查看同步的數據:
在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上查看都有
模擬故障:
[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