溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

在CentOS7上搭建MySQL主從復(fù)制與讀寫分離的具體操作步驟

發(fā)布時(shí)間:2020-06-05 17:16:29 來源:網(wǎng)絡(luò) 閱讀:730 作者:三月 欄目:MySQL數(shù)據(jù)庫

本篇文章給大家主要講的是關(guān)于在CentOS7上搭建MySQL主從復(fù)制與讀寫分離的具體操作步驟的內(nèi)容,感興趣的話就一起來看看這篇文章吧,相信看完在CentOS7上搭建MySQL主從復(fù)制與讀寫分離的具體操作步驟對(duì)大家多少有點(diǎn)參考價(jià)值吧。

MySQL主從復(fù)制原理

MySQL的主從復(fù)制和MySQL的讀寫分離兩者有著緊密聯(lián)系,首先要部署主從復(fù)制,只有主從復(fù)制完成了,才能在此基礎(chǔ)上進(jìn)行數(shù)據(jù)的讀寫分離。

(1)MySQL支持復(fù)制的類型。

1)基于語句的復(fù)制。MySQL默認(rèn)采用基于語句的復(fù)制,效率比較高。

2)基于行的復(fù)制。把改變的內(nèi)容復(fù)制過去,而不是把命令在從服務(wù)器上執(zhí)行一遍。

3)混合類型的復(fù)制。默認(rèn)采用基于語句的復(fù)制,一旦發(fā)現(xiàn)基于語句無法精確復(fù)制時(shí),就會(huì)采用基于行的復(fù)制。

(2)MySQL復(fù)制的工作過程如圖所示。
在CentOS7上搭建MySQL主從復(fù)制與讀寫分離的具體操作步驟
1)在每個(gè)事務(wù)更新數(shù)據(jù)完成之前,Master在二進(jìn)制日志記錄這些改變。寫入二進(jìn)制日志完成后,Master通知存儲(chǔ)引擎提交事務(wù)。

2)Slave將Master的Binary log復(fù)制到其中繼日志。首先,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 thred(SQL從線程)處理該過程的最后一步。SQL線程從中繼日志讀取事件,并重放其中的事件而更新Slave的數(shù)據(jù),使其與Master中的數(shù)據(jù)一致。只要該線程與I/O線程保持一致,中繼日志通常會(huì)位于OS的緩存中,所以中繼日志的開銷很小。

復(fù)制過程中有一個(gè)很重要的限制,即復(fù)制在Slave上是串行化的,也就是說Master上的并行更新操作不能在Slave上并行操作。

MySQL讀寫分離原理

簡(jiǎn)單來說,讀寫分離(見圖所示)就是只在主服務(wù)器上寫,只在從服務(wù)器上讀。基本原理是讓主數(shù)據(jù)庫處理事務(wù)性查詢,而從數(shù)據(jù)庫處理select查詢。數(shù)據(jù)庫復(fù)制被用來把事務(wù)性查詢導(dǎo)致的變更同步到群集中的從數(shù)據(jù)庫。
在CentOS7上搭建MySQL主從復(fù)制與讀寫分離的具體操作步驟
基于中間代理層實(shí)現(xiàn):代理一般位于客戶端和服務(wù)器之間,代理服務(wù)器接到客戶端請(qǐng)求通過判斷后轉(zhuǎn)發(fā)到后端數(shù)據(jù)庫。

實(shí)驗(yàn)環(huán)境

使用五臺(tái)服務(wù)器模擬搭建,具體的拓?fù)淙鐖D所示:
在CentOS7上搭建MySQL主從復(fù)制與讀寫分離的具體操作步驟

實(shí)驗(yàn)環(huán)境表:
在CentOS7上搭建MySQL主從復(fù)制與讀寫分離的具體操作步驟
實(shí)施步驟

1.搭建MySQL主從復(fù)制。

(1)建立時(shí)間同步環(huán)境,在主節(jié)點(diǎn)上搭建時(shí)間同步服務(wù)器。

1)安裝NTP。

[root@localhost ~]# yum install ntp -y

2)配置NTP。

[root@localhost ~]# vim /etc/ntp.conf 
server 127.127.126.0                    //本地是時(shí)鐘源//
fudge 127.127.126.0 stratum 8          //設(shè)置時(shí)間層級(jí)為8(限制在15內(nèi))//

3)重啟服務(wù)。

[root@localhost ~]# systemctl restart ntpd.service

(2)在從節(jié)點(diǎn)服務(wù)器上進(jìn)行時(shí)間同步。

[root@localhost ~]# yum install ntpdate -y
[root@localhost ~]# /usr/sbin/ntpdate 192.168.126.138  //同步主服務(wù)器的時(shí)間//

(3)在每臺(tái)服務(wù)器上關(guān)閉firewalld防火墻。

[root@localhost ~]# systemctl stop firewalld.service   //關(guān)閉防火墻//
[root@localhost ~]# setenforce 0

(4)安裝MySQL數(shù)據(jù)庫。在Master、Slave1、Slave2上安裝,我用的數(shù)據(jù)庫是MySQL5.7.17這里安裝完畢不再演示。

(5)配置MySQL Master主服務(wù)器。

1)在/etc/my.cnf中修改或者增加以下內(nèi)容。

[root@localhost mysql]# vim /etc/my.cnf
server-id = 11
log-bin=master-bin             //主服務(wù)器日志文件//
log-slave-updates=true      //從服務(wù)器更新二進(jìn)制日志//

2)重啟MySQL服務(wù)。

[root@localhost ~]# systemctl restart mysqld.service

3)登錄MySQL程序,給服務(wù)器授權(quán)。

[root@localhost ~]# mysql -uroot -p
mysql> GRANT REPLICATION SLAVE ON *.* TO 'myslave'@'192.168.126.%' IDENTIFIED BY '123456';      //授權(quán)//
mysql> FLUSH PRIVILEGES;
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)
其中File列顯示日志名,position列顯示偏移量。

(6)配置從服務(wù)器。
1)在/etc/my.cnf中修改或者增加以下內(nèi)容。

[root@localhost ~]# vim /etc/my.cnf
server-id = 22
relay-log=relay-log-bin             //從主服務(wù)器上同步日志文件記錄到本地//
relay-log-index=slave-relay-bin.index   //定義relay-log的位置和名稱//

這里要注意server-id不能與主服務(wù)器相同。

2)重啟mysql服務(wù)。

[root@localhost ~]# systemctl restart mysqld.service 

3)登錄mysql,配置同步。

按主服務(wù)器結(jié)果更改下面命令中的master_log_file和master_log_pos的參數(shù)。

[root@localhost ~]# mysql -u root -p
mysql> change master to master_host='192.168.126.138',master_user='myslave',master_password='123456',master_log_file='master-bin.000001',master_log_pos=604;

4)啟動(dòng)同步。

mysql> start slave;

5)查看Slave狀態(tài),確保以下兩個(gè)值為YES。

mysql> show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.126.138
                  Master_User: myslave
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: master-bin.000001
          Read_Master_Log_Pos: 604
               Relay_Log_File: relay-log-bin.000002
                Relay_Log_Pos: 321
        Relay_Master_Log_File: master-bin.000001
             Slave_IO_Running: Yes           
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 

(7)驗(yàn)證主從復(fù)制效果。

1)在主服務(wù)器上新建數(shù)據(jù)庫 db_test。

mysql>  create database db_test;

2)在主、從服務(wù)器上分別查看數(shù)據(jù)庫,顯示數(shù)據(jù)庫相同,則主從復(fù)制成功。

mysql> show databases;      //主服務(wù)器//
+--------------------+
| Database           |
+--------------------+
| information_schema |
| db_test            |
| mysql              |
| performance_schema |
| school             |
| sys                |
+--------------------+
6 rows in set (0.03 sec)

mysql> show databases;    //從服務(wù)器//
+--------------------+
| Database           |
+--------------------+
| information_schema |
| db_test            |
| kgc                |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
6 rows in set (0.05 sec)
搭建MySQL讀寫分離

Amoeba(變形蟲),這個(gè)軟件致力于MySQL的分布式數(shù)據(jù)庫前端代理層,它主要為應(yīng)用層訪問MySQL時(shí)充當(dāng)SQL路由,并具有負(fù)載均衡、高可用性、SQL過濾、讀寫分離、可路由相關(guān)到目標(biāo)數(shù)據(jù)庫、可并發(fā)請(qǐng)求多臺(tái)數(shù)據(jù)庫。通過Amoeba能夠完成多數(shù)據(jù)源的高可用、負(fù)載均衡、數(shù)據(jù)切片的功能。

(1)在主機(jī)Amoeba上安裝Java環(huán)境。

Amoeba是基于jdk1.5開發(fā)的,所以官方推薦使用jdk1.5或1.6版本,高版本不建議使用。

[root@localhost ~]# systemctl stop firewalld.service 
[root@localhost ~]# setenforce 0
[root@localhost tomcat]# cp jdk-6u14-linux-x64.bin /usr/local/
[root@localhost local]# ./jdk-6u14-linux-x64.bin    //根據(jù)提示按Enter鍵完成即可//
[root@localhost local]# mv jdk1.6.0_14/ /usr/local/jdk1.6
[root@localhost local]# 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

[root@localhost local]# source /etc/profile   //啟動(dòng)//

Java環(huán)境已配置成功。

(2)安裝并配置Amoeba軟件

[root@localhost local]# mkdir /usr/local/amoeba  創(chuàng)建工作路徑//
[root@localhost tomcat]# tar zxvf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba   //解壓安裝包//
[root@localhost tomcat]# chmod -R 755 /usr/local/amoeba/  //提示amoeba權(quán)限//
[root@localhost tomcat]# /usr/local/amoeba/bin/amoeba
amoeba start|stop   //顯示此內(nèi)容說明Amoeba安裝成功//

(3)配置Amoeba讀寫分離,兩個(gè)Slave讀負(fù)載均衡。
1)Master、Slave1、Slave2中開放權(quán)限給Amoeba訪問。

grant all on *.* to test@'192.168.126.%' identified by '123.com';

2)編輯amoeba.xml配置文件。

[root@localhost tomcat]# cd /usr/local/amoeba/
[root@localhost amoeba]# vim conf/amoeba.xml 
---30行--

 <property name="user">amoeba</property>
----32行---------
 <property name="password">123456</property>

---117-去掉注釋-
 <property name="defaultPool">master</property>
 <property name="writePool">master</property>
 <property name="readPool">slaves</property>

3)編輯dbServers.xml配置文件。

vi conf/dbServers.xml

--26-29--去掉注釋--      //行//
 <property name="user">test</property>    

 <property name="password">123.com</property>

-----42-主服務(wù)器地址---
<dbServer name="master"  parent="abstractServer">
 <property name="ipAddress">192.168.126.138</property>
--52-從服務(wù)器主機(jī)名-
<dbServer name="slave1"  parent="abstractServer">
--55-從服務(wù)器地址-
 <property name="ipAddress">192.168.126.162</property>
 從服務(wù)器slave2      
<dbServer name="slave2"  parent="abstractServer">      //添加//
 <property name="ipAddress">192.168.126.232</property>
 <dbServer name="slaves" virtual="true">
 <poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">

--末尾--
<property name="poolNames">slave1,slave2</property>    //修改//
 </poolConfig>

4)配置無誤后,可用啟動(dòng)Amoeba軟件,其默認(rèn)端口為TCP 8066。

[root@localhost amoeba]# /usr/local/amoeba/bin/amoeba start&
[root@localhost amoeba]#  netstat -anpt | grep java
tcp6       0      0 127.0.0.1:28750         :::*                    LISTEN      3370/java           
tcp6       0      0 :::8066                 :::*                    LISTEN      3370/java 
.....//省略//

(4) 測(cè)試
1)在client主機(jī)上。

[root@localhost ~]# yum install mysql -y

可以通過代理訪問MySQL:

[root@localhost ~]# mysql -u amoeba -p123456 -h 192.168.126.132 -P8066
..... //省略//
MySQL [(none)]>

2)在Master上創(chuàng)建一個(gè)表,同步到各從服務(wù)器上,然后關(guān)閉各從服務(wù)器的Slave功能,再插入?yún)^(qū)別語句。

mysql> use db_test;
Database changed
mysql> create table zang (id int(10),name varchar(10),address varchar(20)); //創(chuàng)建表//
Query OK, 0 rows affected (0.06 sec)

分別在兩臺(tái)服務(wù)器上關(guān)閉slave功能:

mysql> stop slave;

然后在主服務(wù)器上插入?yún)^(qū)別語句:

mysql> insert into zang values('1','zhang','this_is_master');  //插入數(shù)據(jù)//

3)從服務(wù)器上手動(dòng)插入其他內(nèi)容。

slave1:
mysql> use db_test;
mysql> insert into zang values('2','zhang','this_is_slave1');   //插入數(shù)據(jù)//
Query OK, 1 row affected (0.03 sec)

slave2:
mysql> use db_test;
mysql> insert into zang values('3','zhang','this_is_slave2'); //插入數(shù)據(jù)//
Query OK, 1 row affected (0.03 sec)

4)測(cè)試讀操作
在client主機(jī)上第一次查詢的結(jié)果如下:

MySQL [db_test]> select * from zang;
+------+-------+----------------+
| id   | name  | address        |
+------+-------+----------------+
|    3 | zhang | this_is_slave2 |
+------+-------+----------------+
1 row in set (0.01 sec)

第二次查詢的結(jié)果如下:

MySQL [db_test]> select * from zang;
+------+-------+----------------+
| id   | name  | address        |
+------+-------+----------------+
|    2 | zhang | this_is_slave1 |
+------+-------+----------------+
1 row in set (0.01 sec)

第三次查詢結(jié)果:

MySQL [db_test]> select * from zang;
+------+-------+----------------+
| id   | name  | address        |
+------+-------+----------------+
|    3 | zhang | this_is_slave2 |
+------+-------+----------------+
1 row in set (0.01 sec)

5)測(cè)試寫操作。
在client主機(jī)上插入一條語句:

MySQL [db_test]> insert into zang values('5','zhang','write_test');
Query OK, 1 row affected (0.02 sec)

但在client上查詢不到,最終只有在Master上才能查看到這條語句內(nèi)容,說明寫的操作在Master服務(wù)器上。

mysql> select * from zang;
+------+-------+----------------+
| id   | name  | address        |
+------+-------+----------------+
|    1 | zhang | this_is_master |
|    5 | zhang | write_test     |
+------+-------+----------------+
2 rows in set (0.01 sec)

由此驗(yàn)證,已經(jīng)實(shí)現(xiàn)了MySQL讀寫分離,目前所有的寫操作全部在Master主服務(wù)器上,用來避免數(shù)據(jù) 的不同步;所有的讀操作都分?jǐn)偨o了Slave從服務(wù)器,用來分擔(dān)數(shù)據(jù)庫的壓力。

以上關(guān)于在CentOS7上搭建MySQL主從復(fù)制與讀寫分離的具體操作步驟詳細(xì)內(nèi)容,對(duì)大家有幫助嗎?如果想要了解更多相關(guān),可以繼續(xù)關(guān)注我們的行業(yè)資訊板塊。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI