您好,登錄后才能下訂單哦!
本篇文章給大家主要講的是關(guān)于在CentOS7上搭建MySQL主從復(fù)制與讀寫分離的具體操作步驟的內(nèi)容,感興趣的話就一起來看看這篇文章吧,相信看完在CentOS7上搭建MySQL主從復(fù)制與讀寫分離的具體操作步驟對(duì)大家多少有點(diǎn)參考價(jià)值吧。
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ù)制的工作過程如圖所示。
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上并行操作。
簡(jiǎn)單來說,讀寫分離(見圖所示)就是只在主服務(wù)器上寫,只在從服務(wù)器上讀。基本原理是讓主數(shù)據(jù)庫處理事務(wù)性查詢,而從數(shù)據(jù)庫處理select查詢。數(shù)據(jù)庫復(fù)制被用來把事務(wù)性查詢導(dǎo)致的變更同步到群集中的從數(shù)據(jù)庫。
基于中間代理層實(shí)現(xiàn):代理一般位于客戶端和服務(wù)器之間,代理服務(wù)器接到客戶端請(qǐng)求通過判斷后轉(zhuǎn)發(fā)到后端數(shù)據(jù)庫。
實(shí)驗(yàn)環(huán)境
使用五臺(tái)服務(wù)器模擬搭建,具體的拓?fù)淙鐖D所示:
實(shí)驗(yàn)環(huán)境表:
實(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)
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è)資訊板塊。
免責(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)容。