本篇文章給大家主要講的是關(guān)于在CentOS7上搭建MySQL主從復(fù)制與讀寫分離的具體操作步驟的內(nèi)容,感興趣的話就一起來看看這篇文章吧,相信看完在CentOS7上搭建MySQL主從復(fù)制與讀寫分離的具體操作步驟對大家多少有點參考價值吧。
創(chuàng)新互聯(lián)建站是一家集網(wǎng)站建設(shè),昌圖企業(yè)網(wǎng)站建設(shè),昌圖品牌網(wǎng)站建設(shè),網(wǎng)站定制,昌圖網(wǎng)站建設(shè)報價,網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,昌圖網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。
MySQL的主從復(fù)制和MySQL的讀寫分離兩者有著緊密聯(lián)系,首先要部署主從復(fù)制,只有主從復(fù)制完成了,才能在此基礎(chǔ)上進行數(shù)據(jù)的讀寫分離。
(1)MySQL支持復(fù)制的類型。
1)基于語句的復(fù)制。MySQL默認采用基于語句的復(fù)制,效率比較高。
2)基于行的復(fù)制。把改變的內(nèi)容復(fù)制過去,而不是把命令在從服務(wù)器上執(zhí)行一遍。
3)混合類型的復(fù)制。默認采用基于語句的復(fù)制,一旦發(fā)現(xiàn)基于語句無法精確復(fù)制時,就會采用基于行的復(fù)制。
(2)MySQL復(fù)制的工作過程如圖所示。
1)在每個事務(wù)更新數(shù)據(jù)完成之前,Master在二進制日志記錄這些改變。寫入二進制日志完成后,Master通知存儲引擎提交事務(wù)。
2)Slave將Master的Binary log復(fù)制到其中繼日志。首先,Slave開始一個工作線程——I/O線程,I/O線程在Master上打開一個普通的鏈接,然后開始Binlog dump process。Binlog dump process從Master的二進制日志中讀取事件,如果已經(jīng)跟上Master,它會睡眠并等待Master產(chǎn)生新的事件。I/O線程將這些事件寫入中繼日志。
3)SQL slave thred(SQL從線程)處理該過程的最后一步。SQL線程從中繼日志讀取事件,并重放其中的事件而更新Slave的數(shù)據(jù),使其與Master中的數(shù)據(jù)一致。只要該線程與I/O線程保持一致,中繼日志通常會位于OS的緩存中,所以中繼日志的開銷很小。
復(fù)制過程中有一個很重要的限制,即復(fù)制在Slave上是串行化的,也就是說Master上的并行更新操作不能在Slave上并行操作。
簡單來說,讀寫分離(見圖所示)就是只在主服務(wù)器上寫,只在從服務(wù)器上讀?;驹硎亲屩鲾?shù)據(jù)庫處理事務(wù)性查詢,而從數(shù)據(jù)庫處理select查詢。數(shù)據(jù)庫復(fù)制被用來把事務(wù)性查詢導(dǎo)致的變更同步到群集中的從數(shù)據(jù)庫。
基于中間代理層實現(xiàn):代理一般位于客戶端和服務(wù)器之間,代理服務(wù)器接到客戶端請求通過判斷后轉(zhuǎn)發(fā)到后端數(shù)據(jù)庫。
實驗環(huán)境
使用五臺服務(wù)器模擬搭建,具體的拓撲如圖所示:
實驗環(huán)境表:
實施步驟
1.搭建MySQL主從復(fù)制。
(1)建立時間同步環(huán)境,在主節(jié)點上搭建時間同步服務(wù)器。
1)安裝NTP。
[root@localhost ~]# yum install ntp -y
2)配置NTP。
[root@localhost ~]# vim /etc/ntp.conf server 127.127.126.0 //本地是時鐘源// fudge 127.127.126.0 stratum 8 //設(shè)置時間層級為8(限制在15內(nèi))//
3)重啟服務(wù)。
[root@localhost ~]# systemctl restart ntpd.service
(2)在從節(jié)點服務(wù)器上進行時間同步。
[root@localhost ~]# yum install ntpdate -y [root@localhost ~]# /usr/sbin/ntpdate 192.168.126.138 //同步主服務(wù)器的時間//
(3)在每臺服務(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ù)器更新二進制日志//
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)啟動同步。
mysql> start slave;
5)查看Slave狀態(tài),確保以下兩個值為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)驗證主從復(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(變形蟲),這個軟件致力于MySQL的分布式數(shù)據(jù)庫前端代理層,它主要為應(yīng)用層訪問MySQL時充當(dāng)SQL路由,并具有負載均衡、高可用性、SQL過濾、讀寫分離、可路由相關(guān)到目標數(shù)據(jù)庫、可并發(fā)請求多臺數(shù)據(jù)庫。通過Amoeba能夠完成多數(shù)據(jù)源的高可用、負載均衡、數(shù)據(jù)切片的功能。
(1)在主機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 //啟動//
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讀寫分離,兩個Slave讀負載均衡。
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行--amoeba ----32行---------123456 ---117-去掉注釋-master master slaves
3)編輯dbServers.xml配置文件。
vi conf/dbServers.xml --26-29--去掉注釋-- //行//test 123.com -----42-主服務(wù)器地址---192.168.126.138 --52-從服務(wù)器主機名---55-從服務(wù)器地址- 192.168.126.162 從服務(wù)器slave2//添加// 192.168.126.232 --末尾-- slave1,slave2 //修改//
4)配置無誤后,可用啟動Amoeba軟件,其默認端口為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) 測試
1)在client主機上。
[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)建一個表,同步到各從服務(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)
分別在兩臺服務(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ù)器上手動插入其他內(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)測試讀操作
在client主機上第一次查詢的結(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)測試寫操作。
在client主機上插入一條語句:
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)
由此驗證,已經(jīng)實現(xiàn)了MySQL讀寫分離,目前所有的寫操作全部在Master主服務(wù)器上,用來避免數(shù)據(jù) 的不同步;所有的讀操作都分攤給了Slave從服務(wù)器,用來分擔(dān)數(shù)據(jù)庫的壓力。
以上關(guān)于在CentOS7上搭建MySQL主從復(fù)制與讀寫分離的具體操作步驟詳細內(nèi)容,對大家有幫助嗎?如果想要了解更多相關(guān),可以繼續(xù)關(guān)注我們的行業(yè)資訊板塊。