利用Amoeba實(shí)現(xiàn)MySQL主從復(fù)制和讀寫分離

在實(shí)際生產(chǎn)環(huán)境中,如果對(duì)數(shù)據(jù)庫的讀和寫都在同一個(gè)數(shù)據(jù)庫服務(wù)器中操作,無論是在安全性、高可用性,還是高并發(fā)等各個(gè)方面都是完全不能滿足實(shí)際需求的,因此,一般來說都是通過主從復(fù)制(Master-Slave)的方式來同步數(shù)據(jù),再通過讀寫分離來提升數(shù)據(jù)庫的并發(fā)負(fù)載能力這樣的方案來進(jìn)行部署和實(shí)施。

在周村等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供網(wǎng)站設(shè)計(jì)制作、做網(wǎng)站 網(wǎng)站設(shè)計(jì)制作按需網(wǎng)站制作,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站設(shè)計(jì),成都全網(wǎng)營銷,成都外貿(mào)網(wǎng)站建設(shè)公司,周村網(wǎng)站建設(shè)費(fèi)用合理。

1、 MySQL主從復(fù)制原理

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

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

  • 1) 基于語句的復(fù)制。在主服務(wù)器上執(zhí)行的SQL語句,在從服務(wù)器上執(zhí)行同樣的語句。MySQL默認(rèn)采用基于語句的復(fù)制,效率比較高。
  • 2) 基于行的復(fù)制。把改變的內(nèi)容復(fù)制過去,而不是把命令在從服務(wù)器上執(zhí)行以便。
  • 3) 混合類型的復(fù)制。默認(rèn)采用基于語句的復(fù)制,一旦發(fā)現(xiàn)基于語句無法精確復(fù)制時(shí),就會(huì)采用基于行的復(fù)制。

    (2) 復(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線程將這些時(shí)間寫入中繼日志。
  • 3) SQL slave thread(SQL從線程)處理該過程的最后一步。SQL線程從中繼日志讀取事件,并重放其中的事件而更新Slave的數(shù)據(jù),使其與Master中的數(shù)據(jù)一致。只要該線程與I/O線程保持一致,中繼日志通常會(huì)位于OS的緩存中,所以中繼日志的開銷很小。
    復(fù)制過程有一個(gè)很重要的限制,即復(fù)制在Slave上是串行化的,也就是說Master上的并行更新操作不能在Slave上并行操作。

    2、 MySQL讀寫分離的原理

    簡單來說,讀寫分離就是只在主服務(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ù)庫,有兩個(gè)代表性程序。

  • (1)MySQL-Proxy。MySQL-Proxy為MySQL開源項(xiàng)目,通過其自帶的lua腳本進(jìn)行SQL判斷,雖然是MySQL官方產(chǎn)品,但是MySQL官方并不建議將MySQL用到生產(chǎn)環(huán)境。
  • (2)Amoeba。由陳思儒開發(fā),作者曾就職于阿里巴巴。該程序由Java語言進(jìn)行開發(fā),阿里巴巴將其用于生產(chǎn)環(huán)境。它不支持事務(wù)和存儲(chǔ)過程。
    -經(jīng)過上述簡單的比較,通過程序代碼實(shí)現(xiàn)MySQL讀寫分離自然是一個(gè)不錯(cuò)的選擇,但是并不是所有的應(yīng)用都適合在程序代碼中實(shí)現(xiàn)讀寫分離,像一些大型復(fù)雜的Java應(yīng)用,如果在程序代碼中實(shí)現(xiàn)讀寫分離對(duì)代碼改動(dòng)就較大。所以,像這種應(yīng)用一般會(huì)考慮使用代理層來實(shí)現(xiàn)。

實(shí)驗(yàn)拓?fù)鋱D

利用Amoeba實(shí)現(xiàn)MySQL主從復(fù)制和讀寫分離

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

主機(jī)操作系統(tǒng)IP地址主要軟件
Master CentOS 7.3 192.168.100.137 mysql-5.5.24.tar.gz
Slave1 CentOS 7.3 192.168.100.132 mysql-5.5.24.tar.gz
Slave2 CentOS 7.3 192.168.100.149 mysql-5.5.24.tar.gz
Amoeba CentOS 7.3 192.168.100.150 amoeba-mysql-binary-2.2.0.tar.gz jdk-6u14-linux-x64.bin
客戶端 CentOS 7.3 192.168.100.148 mysql-5.5.24.tar.gz

實(shí)驗(yàn)部署

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

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

1) 安裝NTP

#yum –y install ntp

2) 配置NTP

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

3)重啟服務(wù)并關(guān)閉防火墻和增強(qiáng)安全設(shè)置

#service ntpd restart
#systemctl stop firewalld.service
#setenforce 0

(2)在從節(jié)點(diǎn)上進(jìn)行時(shí)間同步并關(guān)閉防火墻及增強(qiáng)安全功能

#yum install ntpd start
#systemctl stop firewalld.service
#setenforce 0
#/usr/sbin/ntpdate 192.168.100.137              //進(jìn)行時(shí)間同步

(3)在Master、Slave1、Slave2上安裝MySQL數(shù)據(jù)庫,具體過程在這就不詳述了。

(4)配置MySQL主服務(wù)器

1)在/etc/my.cnf中修改或者增加以下內(nèi)容并重啟服務(wù)

#vim /etc/my.cnf
server-id       = 11
log-bin=master-bin                         //主服務(wù)器日志文件
log-slave-updates=true                     //從服務(wù)器更新二進(jìn)制日志
#systemctl restart mysqld.service

2)登錄MySQL,給從服務(wù)器授權(quán)

#mysql -u root –p
mysql>GRANT REPLICATION SLAVE ON *.* TO 'myslave'@'192.168.100.%' IDENTIFIED BY '123456';
mysql>FLUSH PRIVILEGES;
mysql>show master status;
+-------------------+----------+--------------+------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+------------------+
| master-bin.000001 |      339 |              |                  |
+-------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

(5)配置從服務(wù)器(Slave1,Slave2)

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

#vim /etc/my.cnf
server-id       =22                         //這里注意server-id不能與主服務(wù)器相同
relay-log=relay-log-bin                         //從主服務(wù)器上同步日志文件記錄到本地
relay-log-index=slave-relay-bin.index           //定義relay-log的位置和名稱

2)重啟MySQL服務(wù)

#systemctl restart mysqld.service

3)登錄MySQL,配置同步。按主服務(wù)器結(jié)果更改下面命令中master_log_file和master_log_pos的參數(shù)

#mysql –u root –p
mysql>change master to 
master_host='192.168.100.137',master_user='myslave',master_password='123456',master_log_file='master-bin.000001',master_log_pos=339;

4)啟動(dòng)同步,查看Slave狀態(tài),確保以下兩個(gè)值為YES。

mysql>start slave;

利用Amoeba實(shí)現(xiàn)MySQL主從復(fù)制和讀寫分離

(6)測(cè)試主從復(fù)制效果

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

mysql>create database db_test;

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

利用Amoeba實(shí)現(xiàn)MySQL主從復(fù)制和讀寫分離

二、搭建MySQL讀寫分離

(1)關(guān)閉防火墻及增強(qiáng)安全功能
#systemctl stop firewalld.service
#setenforce 0
(2)復(fù)制jdk軟件包及安裝
#cp jdk-6u14-linux-x64.bin /usr/local/
#cd /usr/local
#./jdk-6u14-linux-x64.bin                   //yes之后enter
(3)修改jdk目錄名稱
#mv jdk1.6.0_14/ /usr/local/jdk1.6
(4)添加jdk、jre、amoeba環(huán)境變量
#vi /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
(5)刷新環(huán)境變量
#source /etc/profile
(6)創(chuàng)建amoeba工作目錄
#mkdir /usr/local/amoeba
(7)解壓amoeba軟件包至工作目錄下
#tar zxvf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/
(8)修改amoeba目錄權(quán)限
#chmod -R 755 /usr/local/amoeba/
(9)驗(yàn)證amoeba是否安裝成功
#/usr/local/amoeba/bin/amoeba           //若顯示amoeba start|stop說明安裝成功
(10)在Master、Slave1、Slave2中開放權(quán)限給Amoeba訪問
mysql>grant all on *.* to test@'192.168.100.%' identified by '123.com';
(11)回到amoeba服務(wù)器,修改amoeba.xml配置文件
#cd /usr/local/amoeba
#vim conf/amoeba.xml
---30行--
<property name="user">amoeba</property>     //訪問amoeba的用戶名
----32行---------
<property name="password">123456</property>     //密碼
---117-去掉注釋-
<property name="defaultPool">master</property>  //默認(rèn)為主服務(wù)器
<property name="writePool">master</property>        //寫入為主服務(wù)器
<property name="readPool">slaves</property>         //讀取為slaves池,現(xiàn)有slave1、slave2服務(wù)器
(12)修改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.100.137</property>
--52-從服務(wù)器主機(jī)名-
<dbServer name="slave1"  parent="abstractServer">
--55-從服務(wù)器地址-
 <property name="ipAddress">192.168.100.132</property>

--57-從服務(wù)器主機(jī)名-
<dbServer name="slave2"  parent="abstractServer">
--60-從服務(wù)器地址-
 <property name="ipAddress">192.168.100.149</property>

 <dbServer name="slaves" virtual="true">
 <poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
--末尾--
<property name="poolNames">slave1,slave2</property>
 </poolConfig>
(13)啟動(dòng)amoeba服務(wù)
#/usr/local/amoeba/bin/amoeba start&
(14)查看java端口開啟情況,其默認(rèn)端口為tcp8066
# netstat -anpt | grep java
(15)在客戶端上安裝MySQL,并登陸amoeba服務(wù)器(關(guān)閉防火墻和增強(qiáng)安全設(shè)置)
#yum install -y mysql
#mysql -u amoeba -p123456 -h 192.168.100.100 -P8066
#systemctl stop firewalld.service
#setenforce 0
(16)測(cè)試讀寫分離

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

#mysql –u root –p
mysql>use db_test;
mysql>create table zang (id int(10),name varchar(10),address varchar(20));      //主服務(wù)器

mysql>stop slave;                   //從服務(wù)器

mysql>insert into zang values('1','zhang','this_is_master');        //主服務(wù)器上,內(nèi)容不會(huì)同步

2) 從服務(wù)器上同步了表,手動(dòng)插入其他內(nèi)容

mysql>use db_test;          //從服務(wù)器1
mysql>insert into zang values('2','zhang','this_is_slave1');
mysql>use db_test;          //從服務(wù)器2
mysql>insert into zang values('3','zhang','this_is_slave2');

3)測(cè)試讀操作
利用Amoeba實(shí)現(xiàn)MySQL主從復(fù)制和讀寫分離

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

mysql>insert into zang values('5','zhang','write_test');

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

利用Amoeba實(shí)現(xiàn)MySQL主從復(fù)制和讀寫分離
利用Amoeba實(shí)現(xiàn)MySQL主從復(fù)制和讀寫分離

分享標(biāo)題:利用Amoeba實(shí)現(xiàn)MySQL主從復(fù)制和讀寫分離
分享URL:http://bm7419.com/article2/jdipoc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信小程序、手機(jī)網(wǎng)站建設(shè)、動(dòng)態(tài)網(wǎng)站、用戶體驗(yàn)、網(wǎng)站導(dǎo)航軟件開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)