一、前言:
1.在企業(yè)應(yīng)用中,成熟的業(yè)務(wù)通常數(shù)據(jù)量都比較大
2.單臺(tái)MySQL在安全性、 高可用性和高并發(fā)方面都無法滿足實(shí)際的需求
3.配置多臺(tái)主從數(shù)據(jù)庫服務(wù)器以實(shí)現(xiàn)讀寫分離
二、主從復(fù)制原理
1.MySQL的復(fù)制類型
- 基于語句的復(fù)制(STATEMENT, MySQL默認(rèn)類型)
- 基于行的復(fù)制(ROW)
- 混合類型的復(fù)制(MIXED)
2. MySQL主從復(fù)制的工作過程;
兩日志、三線程
(1)在每個(gè)事務(wù)更新數(shù)據(jù)完成之前,Master 在二進(jìn)制日志(Binary log)記錄這些改變。寫入二進(jìn)制日志完成后,Master 通知存儲(chǔ)引擎提交事務(wù)。
(2)Slave 將 Master 的復(fù)制到其中繼日志(Relay log)。首先slave 開始一個(gè)工作線程(I/O),I/O線程在 Master 上打開一個(gè)普通的連接,然后開始 Binlog dump process。Binlog dump process 從 Master 的二進(jìn)制日志中讀取事件,如果已經(jīng)跟上 Master,它會(huì)睡眠并等待 Master 產(chǎn)生新的事件,I/O線程將這些事件寫入中繼日志。
(3)SQL slave thread(SQL從線程)處理該過程的最后一步,SQL線程從中繼日志讀取事件,并重放其中的事件而更新 Slave 數(shù)據(jù),使其與 Master 中的數(shù)據(jù)一致,只要該線程與 I/O 線程保持一致,中繼日志通常會(huì)位于 OS 緩存中,所以中繼日志的開銷很小。
復(fù)制過程有一個(gè)很重要的限制,即復(fù)制在 Slave 上是串行化的,也就是說 Master 上的并行更新操作不能在 Slave 上并行操作。
3.MySQL主從復(fù)制延遲
1、master服務(wù)器高并發(fā),形成大量事務(wù)
2、網(wǎng)絡(luò)延遲
3、主從硬件設(shè)備導(dǎo)致
cpu主頻、內(nèi)存io、硬盤io
4、本來就不是同步復(fù)制、而是異步復(fù)制 。。。。。。。。。。。。。。。。。。。。。。。
從庫優(yōu)化Mysql參數(shù)。比如增大innodb_buffer_pool_size,讓更多操作在Mysql內(nèi)存中完成,減少磁盤操作。
從庫使用高性能主機(jī)。包括cpu強(qiáng)悍、內(nèi)存加大。避免使用虛擬云主機(jī),使用物理主機(jī),這樣提升了i/o方面性。
從庫使用SSD磁盤
網(wǎng)絡(luò)優(yōu)化,避免跨機(jī)房實(shí)現(xiàn)同步
-
問題解決方法:
-
半同步復(fù)制- 解決數(shù)據(jù)丟失的問題
-
并行復(fù)制—解決從庫復(fù)制延遲的問題
4. MySQL 有幾種同步方式:
1、異步復(fù)制(Async Replication)
2、同步復(fù)制(sync Replication)
3、半同步復(fù)制(Async Replication)
4、增強(qiáng)半同步復(fù)制(lossless Semi-Sync Replication)、無損復(fù)制
(1)異步復(fù)制(Async Replication)
主庫將更新寫入Binlog日志文件后,不需要等待數(shù)據(jù)更新是否已經(jīng)復(fù)制到從庫中,就可以繼續(xù)處理更多的請(qǐng)求。Master將事件寫入binlog,但并不知道Slave是否或何時(shí)已經(jīng)接收且已處理。在異步復(fù)制的機(jī)制的情況下,如果Master宕機(jī),事務(wù)在Master上已提交,但很可能這些事務(wù)沒有傳到任何的Slave上。假設(shè)有Master->Salve故障轉(zhuǎn)移的機(jī)制,此時(shí)Slave也可能會(huì)丟失事務(wù)。MySQL復(fù)制默認(rèn)是異步復(fù)制,異步復(fù)制提供了最佳性能。
(2)同步復(fù)制(Sync Replication)
主庫將更新寫入Binlog日志文件后,需要等待數(shù)據(jù)更新已經(jīng)復(fù)制到從庫中,并且已經(jīng)在從庫執(zhí)行成功,然后才能返回繼續(xù)處理其它的請(qǐng)求。同步復(fù)制提供了最佳安全性,保證數(shù)據(jù)安全,數(shù)據(jù)不會(huì)丟失,但對(duì)性能有一定的影響。
(3)半同步復(fù)制(Semi-Sync Replication)
主庫提交更新寫入二進(jìn)制日志文件后,等待數(shù)據(jù)更新寫入了從服務(wù)器中繼日志中,然后才能再繼續(xù)處理其它請(qǐng)求。該功能確保至少有1個(gè)從庫接收完主庫傳遞過來的binlog內(nèi)容已經(jīng)寫入到自己的relay log里面了,才會(huì)通知主庫上面的等待線程,該操作完畢。
半同步復(fù)制,是最佳安全性與最佳性能之間的一個(gè)折中。
MySQL 5.5版本之后引入了半同步復(fù)制功能,主從服務(wù)器必須安裝半同步復(fù)制插件,才能開啟該復(fù)制功能。如果等待超時(shí),超過rpl_semi_sync_master_timeout參數(shù)設(shè)置時(shí)間(默認(rèn)值為10000,表示10秒),則關(guān)閉半同步復(fù)制,并自動(dòng)轉(zhuǎn)換為異步復(fù)制模式。當(dāng)master dump線程發(fā)送完一個(gè)事務(wù)的所有事件之后,如果在rpl_semi_sync_master_timeout內(nèi),收到了從庫的響應(yīng),則主從又重新恢復(fù)為增強(qiáng)半同步復(fù)制。
ACK (Acknowledge character)即是確認(rèn)字符。
(4)增強(qiáng)半同步復(fù)制(lossless Semi-Sync Replication、無損復(fù)制)
增強(qiáng)半同步是在MySQL 5.7引入,其實(shí)半同步可以看成是一個(gè)過渡功能,因?yàn)槟J(rèn)的配置就是增強(qiáng)半同步,所以,大家一般說的半同步復(fù)制其實(shí)就是增強(qiáng)的半同步復(fù)制,也就是無損復(fù)制。
增強(qiáng)半同步和半同步不同的是,等待ACK時(shí)間不同rpl_semi_sync_master_wait_point = AFTER_SYNC(默認(rèn))
半同步的問題是因?yàn)榈却鼳CK的點(diǎn)是Commit之后,此時(shí)Master已經(jīng)完成數(shù)據(jù)變更,用戶已經(jīng)可以看到最新數(shù)據(jù),當(dāng)Binlog還未同步到Slave時(shí),發(fā)生主從切換,那么此時(shí)從庫是沒有這個(gè)最新數(shù)據(jù)的,用戶看到的是老數(shù)據(jù)。
增強(qiáng)半同步將等待ACK的點(diǎn)放在提交Commit之前,此時(shí)數(shù)據(jù)還未被提交,外界看不到數(shù)據(jù)變更,此時(shí)如果發(fā)送主從切換,新庫依然還是老數(shù)據(jù),不存在數(shù)據(jù)不一致的問題。
5.Mysql應(yīng)用場景
mysql 數(shù)據(jù)庫
主要的性能是讀和寫,一般場景來說讀請(qǐng)求更多。
根據(jù)主從復(fù)制可以演變成讀寫分離,因?yàn)樽x寫分離基于主從復(fù)制,使用讀寫分離從而解決高并發(fā)的問題。
mysql架構(gòu)演變的方向:
1、單臺(tái)mysql有單點(diǎn)故障
2、集群—》 主從復(fù)制
3、主從復(fù)制渡河寫的壓力不均衡
4、讀寫分離
5、讀寫分離的基礎(chǔ)是主從復(fù)制
6、mysql的高可用架構(gòu)MHA(master HA高可用) MGR MMM
三、主從復(fù)制實(shí)驗(yàn)
整個(gè)實(shí)驗(yàn)的環(huán)境 以及服務(wù)器信息
- 環(huán)境部署 cetos7.6
- 虛擬機(jī)服務(wù)環(huán)境
Master服務(wù)器:192.168.174.15 mysql5.7
slave1服務(wù)器:192.168.174.18 mysql5.7
Slave2服務(wù)器:192.168.174.19 mysql5.7
Amoeba服務(wù)器:192.168.174.80 (預(yù)備機(jī)器) jdk1.6
客戶端服務(wù)器:192.168.174.12 測試
1.主從服務(wù)器時(shí)間同步
1.1 master服務(wù)器配置
① 安裝ntp、修改配置文件
[root@master ~]# yum install ntp -y
[root@master ~]# yum -y install ntpdate ntp #安裝ntp軟件
[root@master ~]# ntpdate ntp.aliyun.com #時(shí)間同步
[root@master ~]# vim /etc/ntp.conf #編輯配置文件
fudge 127.127.1.0 stratum 10
#設(shè)置本機(jī)的時(shí)間層級(jí)為10級(jí),0級(jí)表示時(shí)間層級(jí)為0級(jí),是向其他服務(wù)器提供時(shí)間同步源的意思,不要設(shè)置為0級(jí)
server 127.127.1.0 #設(shè)置本機(jī)為時(shí)間同步源
systemctl restart mysqld.service
② 開啟NTP服務(wù)、關(guān)閉防火墻和增強(qiáng)性安全功能
[root@master ~]# systemctl start ntpd
[root@master ~]# systemctl stop firewalld.service
[root@master ~]# setenforce 0
1.2 兩臺(tái)SLAVE服務(wù)器配置
① 安裝ntp、ntpdate服務(wù)
[root@localhost ~]# yum install ntp ntpdate -y
② 開啟ntp服務(wù),關(guān)閉防火墻、增強(qiáng)性安全功能
systemctl stop firewalld.service
setenforce 0
systemctl start ntpd
③ 時(shí)間同步master服務(wù)器
ntpdate 192.168.174.15
④ 兩臺(tái)slave服務(wù)器配置相同
#master服務(wù)器同步阿里云時(shí)鐘服務(wù)器
ntpdate ntp.aliyun.com
ntpdate 192.168.174.15
crontab -e
*/10 * * * * /usr/sbin/ntpdate 192.168.174.15
2.配置主從同步
① master服務(wù)器修改配置文件
[root@master ~]# vim /etc/my.cnf
#在mysqld模塊下修改一下內(nèi)容
#開啟二進(jìn)制日志文件(之后生成的日志名為master-bin)
log_bin=master-bin
#開啟從服務(wù)器日志同步
log_slave-updates=true
#主服務(wù)器id為1(不可重復(fù))
server_id = 1
--------》wq
重啟服務(wù)
[root@master ~]# systemctl restart mysqld
配置規(guī)則
[root@master ~]# mysql -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
mysql> GRANT REPLICATION SLAVE ON *.* TO 'myslave'@'192.168.174.%' IDENTIFIED BY 'abc123';
Query OK, 0 rows affected (0.00 sec)
#刷新權(quán)限表
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
規(guī)則解析:GRANT REPLICATION SLAVE ON *.* TO ‘myslave’@‘192.168.10.%’ IDENTIFIED BY ‘123456’;
給從服務(wù)器提權(quán),允許使用slave的身份復(fù)制master的所有數(shù)據(jù)庫的所有表,并指定密碼為123456
查看master數(shù)據(jù)庫狀態(tài)
mysql> show master status;
+-------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| master-bin.000001 | 604 | | | |
+-------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
mysql>
#以上可見產(chǎn)生了master-bin.000001日志文件,定位為604
#從服務(wù)器需要定位到此處進(jìn)行復(fù)制
② 從服務(wù)器配置
[root@slave1 ~]# vim /etc/my.cnf
#開啟二進(jìn)制日志文件
log-bin=master-bin
#設(shè)置server id為2,slave2 為3
server_id = 22
#從主服務(wù)器上同步日志文件記錄到本地
relay-log=relay-log-bin
#定義relay-log的位置和名稱(index索引)
relay-log-index=slave-relay-bin.index
--------》wq
systemctl restart mysqld.service
log_bin=master-bin
server_id = 2
relay-log=relay-log-bin
relay-log-index=slave-relay-bin.index
開啟從服務(wù)器功能
[root@slave1 ~]# mysql -uroot -pabc123
...............
mysql> change master to master_host='192.168.174.15',master_user='myslave',master_password='123456',master_log_file='master-bin.000001',master_log_pos=604;
Query OK, 0 rows affected, 2 warnings (0.02 sec)
change master to master_host='192.168.174.15',master_user='myslave',master_password='123456',master_log_file='master-bin.000001',master_log_pos=604;
mysql> start slave;
Query OK, 0 rows affected (0.01 sec)
查看從服務(wù)器狀態(tài)
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State:
Master_Host: 192.168.174.15
Master_User: myslave
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: master-bin.000001
Read_Master_Log_Pos: 603
Relay_Log_File: wang3-relay-bin.000001
Relay_Log_Pos: 4
Relay_Master_Log_File: master-bin.000001
Slave_IO_Running: No
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 603
Relay_Log_Space: 154
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: NULL
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 1593
Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server ids; these ids must be different for replication to work (or the --replicate-same-server-id option must be used on slave but this does not always make sense; please check the manual before using it).
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 1
Master_UUID:
Master_Info_File: /usr/local/mysql/data/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp: 230723 12:33:38
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
1 row in set (0.00 sec)
同理、開啟另一臺(tái)從服務(wù)器同步
3.測試數(shù)據(jù)同步
在主服務(wù)器上創(chuàng)建一個(gè)數(shù)據(jù)庫
mysql> create database work;
Query OK, 1 row affected (0.00 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
| work |
+--------------------+
5 rows in set (0.00 sec)
在兩臺(tái)從服務(wù)器上直接查看數(shù)據(jù)庫列表
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
| work |
+--------------------+
5 rows in set (0.00 sec)
以上,主從同步復(fù)制配置完成
四、MySQL 讀寫分離
1.什么是讀寫分離?
讀寫分離,基本的原理是讓主數(shù)據(jù)庫處理事務(wù)性增、改、刪操作(INSERT、UPDATE、DELETE),而從數(shù)據(jù)庫處理SELECT查詢操作。數(shù)據(jù)庫復(fù)制被用來把事務(wù)性操作導(dǎo)致的變更同步到集群中的從數(shù)據(jù)庫。
2.為什么要讀寫分離呢?
因?yàn)閿?shù)據(jù)庫的“寫”(寫10000條數(shù)據(jù)可能要3分鐘)操作是比較耗時(shí)的。
但是數(shù)據(jù)庫的“讀”(讀10000條數(shù)據(jù)可能只要5秒鐘)。
所以讀寫分離,解決的是,數(shù)據(jù)庫的寫入,影響了查詢的效率。
3.什么時(shí)候要讀寫分離?
數(shù)據(jù)庫不一定要讀寫分離,如果程序使用數(shù)據(jù)庫較多時(shí),而更新少,查詢多的情況下會(huì)考慮使用。利用數(shù)據(jù)庫主從同步,再通過讀寫分離可以分擔(dān)數(shù)據(jù)庫壓力,提高性能。
4.主從復(fù)制與讀寫分離
在實(shí)際的生產(chǎn)環(huán)境中,對(duì)數(shù)據(jù)庫的讀和寫都在同一個(gè)數(shù)據(jù)庫服務(wù)器中,是不能滿足實(shí)際需求的。無論是在安全性、高可用性還是高并發(fā)等各個(gè)方面都是完全不能滿足實(shí)際需求的。因此,通過主從復(fù)制的方式來同步數(shù)據(jù),再通過讀寫分離來提升數(shù)據(jù)庫的并發(fā)負(fù)載能力。有點(diǎn)類似于rsync,但是不同的是rsync是對(duì)磁盤文件做備份,而mysql主從復(fù)制是對(duì)數(shù)據(jù)庫中的數(shù)據(jù)、語句做備份。
5.MySQL 讀寫分離原理
讀寫分離就是只在主服務(wù)器上寫,只在從服務(wù)器上讀。基本的原理是讓主數(shù)據(jù)庫處理事務(wù)性操作,而從數(shù)據(jù)庫處理 select 查詢。數(shù)據(jù)庫復(fù)制被用來把主數(shù)據(jù)庫上事務(wù)性操作導(dǎo)致的變更同步到集群中的從數(shù)據(jù)庫。
6.企業(yè) 使用MySQL 讀寫分離場景
目前較為常見的 MySQL 讀寫分離分為以下兩種:
(1)基于程序代碼內(nèi)部實(shí)現(xiàn)
在代碼中根據(jù) select、insert 進(jìn)行路由分類,這類方法也是目前生產(chǎn)環(huán)境應(yīng)用最廣泛的。
優(yōu)點(diǎn)是性能較好,因?yàn)樵诔绦虼a中實(shí)現(xiàn),不需要增加額外的設(shè)備為硬件開支;缺點(diǎn)是需要開發(fā)人員來實(shí)現(xiàn),運(yùn)維人員無從下手。
但是并不是所有的應(yīng)用都適合在程序代碼中實(shí)現(xiàn)讀寫分離,像一些大型復(fù)雜的Java應(yīng)用,如果在程序代碼中實(shí)現(xiàn)讀寫分離對(duì)代碼改動(dòng)就較大。
(2)基于中間代理層實(shí)現(xiàn)
代理一般位于客戶端和服務(wù)器之間,代理服務(wù)器接到客戶端請(qǐng)求后通過判斷后轉(zhuǎn)發(fā)到后端數(shù)據(jù)庫,有以下代表性程序。
(1)MySQL-Proxy。MySQL-Proxy 為 MySQL 開源項(xiàng)目,通過其自帶的 lua 腳本進(jìn)行SQL 判斷。
(2)Atlas。是由奇虎360的Web平臺(tái)部基礎(chǔ)架構(gòu)團(tuán)隊(duì)開發(fā)維護(hù)的一個(gè)基于MySQL協(xié)議的數(shù)據(jù)中間層項(xiàng)目。它是在mysql-proxy 0.8.2版本的基礎(chǔ)上,對(duì)其進(jìn)行了優(yōu)化,增加了一些新的功能特性。360內(nèi)部使用Atlas運(yùn)行的mysql業(yè)務(wù),每天承載的讀寫請(qǐng)求數(shù)達(dá)幾十億條。支持事物以及存儲(chǔ)過程。
(3)Amoeba。由陳思儒開發(fā),作者曾就職于阿里巴巴。該程序由Java語言進(jìn)行開發(fā),阿里巴巴將其用于生產(chǎn)環(huán)境。但是它不支持事務(wù)和存儲(chǔ)過程。
由于使用MySQL Proxy 需要寫大量的Lua腳本,這些Lua并不是現(xiàn)成的,而是需要自己去寫。這對(duì)于并不熟悉MySQL Proxy 內(nèi)置變量和MySQL Protocol 的人來說是非常困難的。
Amoeba是一個(gè)非常容易使用、可移植性非常強(qiáng)的軟件。因此它在生產(chǎn)環(huán)境中被廣泛應(yīng)用于數(shù)據(jù)庫的代理層。
五、讀寫分離實(shí)驗(yàn)
整個(gè)實(shí)驗(yàn)的環(huán)境 以及服務(wù)器信息
- 環(huán)境部署 cetos7.6
- 虛擬機(jī)服務(wù)環(huán)境
Master服務(wù)器:192.168.174.15
slave1服務(wù)器:192.168.174.18
Slave2服務(wù)器:192.168.174.19
Amoeba服務(wù)器:192.168.174.12 jdk1.6、Amoeba
客戶端服務(wù)器:192.168.174.13 mysql 測試
注:做讀寫分離實(shí)驗(yàn)之前必須有一 主 兩從 環(huán)境
1.搭建 MySQL讀寫分離
1.1 Amoeba服務(wù)器配置----
##安裝 Java 環(huán)境##
因?yàn)?Amoeba 基于是 jdk1.5 開發(fā)的,所以官方推薦使用 jdk1.5 或 1.6 版本,高版本不建議使用。
cd /opt/
cp jdk-6u14-linux-x64.bin /usr/local/
cd /usr/local/
chmod +x jdk-6u14-linux-x64
./jdk-6u14-linux-x64.bin
//按yes,按enter
mv jdk1.6.0_14/ /usr/local/jdk1.6
vim /etc/profile
export JAVA_HOME=/usr/local/jdk1.6
export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$JAVA_HOME/lib:$JAVA_HOME/jre/bin/:$PATH:$HOME/bin
export AMOEBA_HOME=/usr/local/amoeba
export PATH=$PATH:$AMOEBA_HOME/bin
source /etc/profile
java -version
##安裝 Amoeba軟件##
mkdir /usr/local/amoeba
tar zxvf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/
chmod -R 755 /usr/local/amoeba/
/usr/local/amoeba/bin/amoeba
//如顯示amoeba start|stop說明安裝成功
##配置 Amoeba讀寫分離,兩個(gè) Slave 讀負(fù)載均衡##
#先在Master、Slave1、Slave2 的mysql上開放權(quán)限給 Amoeba 訪問
grant all on *.* to @'192.168.174.%' identified by 'abc123';
flush privileges;
#再回到amoeba服務(wù)器配置amoeba服務(wù):
cd /usr/local/amoeba/conf/
cp amoeba.xml amoeba.xml.bak
vim amoeba.xml #修改amoeba配置文件
--30行--
<property name="user">root</property>
--32行--
<property name="password">abc123</property>
--115行--
<property name="defaultPool">master</property>
--117-去掉注釋-
<property name="writePool">master</property>
<property name="readPool">slaves</property>
cp dbServers.xml dbServers.xml.bak
vim dbServers.xml #修改數(shù)據(jù)庫配置文件
--23行--注釋掉 作用:默認(rèn)進(jìn)入test庫 以防m(xù)ysql中沒有test庫時(shí),會(huì)報(bào)錯(cuò)
<!-- <property name="schema">test</property> -->
--26--修改
<property name="user">test</property>
--28-30--去掉注釋
<property name="password">123456</property>
--45--修改,設(shè)置主服務(wù)器的名Master
<dbServer name="master" parent="abstractServer">
--48--修改,設(shè)置主服務(wù)器的地址
<property name="ipAddress">192.168.174.15</property>
--52--修改,設(shè)置從服務(wù)器的名slave1
<dbServer name="slave1" parent="abstractServer">
--55--修改,設(shè)置從服務(wù)器1的地址
<property name="ipAddress">192.168.174.18</property>
--58--復(fù)制上面6行粘貼,設(shè)置從服務(wù)器2的名slave2和地址
<dbServer name="slave2" parent="abstractServer">
<property name="ipAddress">192.168.174.19</property>
--65行--修改
<dbServer name="slaves" virtual="true">
--71行--修改
<property name="poolNames">slave1,slave2</property>
/usr/local/amoeba/bin/amoeba start& #啟動(dòng)Amoeba軟件,按ctrl+c 返回
netstat -antp | grep java #查看8066端口是否開啟,默認(rèn)端口為TCP 8066
1.2 測試讀寫分離
#先安裝數(shù)據(jù)庫
yum install -y mariadb-server mariadb
systemctl start mariadb.service
在客戶端服務(wù)器上測試
mysql -u test -pabc123 192.168.174.12 -P8066
//通過amoeba服務(wù)器代理訪問mysql ,在通過客戶端連接mysql后寫入的數(shù)據(jù)只有主服務(wù)會(huì)記錄,然后同步給從--從服務(wù)器
在主服務(wù)器上:
use db_test;
create table test (id int(10),name varchar(10),address varchar(20));
在兩臺(tái)從服務(wù)器上:
stop slave; #關(guān)閉同步
use db_test;
//在slave1上:
insert into test values('1','billkin','this_is_slave1');
//在slave2上:
insert into test values('2','pp','this_is_slave2');
//在主服務(wù)器上:
insert into test values('3','sehun','this_is_master');
//在客戶端服務(wù)器上:
use test;
select * from test; //客戶端會(huì)分別向slave1和slave2讀取數(shù)據(jù),顯示的只有在兩個(gè)從服務(wù)器上添加的數(shù)據(jù),沒有在主服務(wù)器上添加的數(shù)據(jù)
insert into test values('4','chanyeol','this_is_client'); //只有主服務(wù)器上有此數(shù)據(jù)
//在兩個(gè)從服務(wù)器上執(zhí)行 start slave; 即可實(shí)現(xiàn)同步在主服務(wù)器上添加的數(shù)據(jù)
start slave;
dress varchar(20));
在兩臺(tái)從服務(wù)器上:
stop slave; #關(guān)閉同步
use db_test;
//在slave1上:
insert into test values(‘1’,‘billkin’,‘this_is_slave1’);
//在slave2上:
insert into test values(‘2’,‘pp’,‘this_is_slave2’);
//在主服務(wù)器上:
insert into test values(‘3’,‘sehun’,‘this_is_master’);
//在客戶端服務(wù)器上:
use test;
select * from test; //客戶端會(huì)分別向slave1和slave2讀取數(shù)據(jù),顯示的只有在兩個(gè)從服務(wù)器上添加的數(shù)據(jù),沒有在主服務(wù)器上添加的數(shù)據(jù)
insert into test values(‘4’,‘chanyeol’,‘this_is_client’); //只有主服務(wù)器上有此數(shù)據(jù)文章來源:http://www.zghlxwxcb.cn/news/detail-613059.html
//在兩個(gè)從服務(wù)器上執(zhí)行 start slave; 即可實(shí)現(xiàn)同步在主服務(wù)器上添加的數(shù)據(jù)
start slave;文章來源地址http://www.zghlxwxcb.cn/news/detail-613059.html
到了這里,關(guān)于Mysql-主從復(fù)制與讀寫分離的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!