Mysql主從複製與讀寫分離

在實際生產環境中,若是對數據庫的讀和寫都在同一個數據庫服務器中操做,不管是在安全性,高可用性,仍是高併發等各方面都是徹底不能知足實際需求的,所以通常來講都是經過主從複製(Master-Slave)的方式來同步數據,再經過讀寫分離來提高數據庫的併發負載能力這樣的方案來進行部署與實施。
前端

在企業網站中,後端MySQL數據庫只有一臺時,會有如下問題:
1.單點故障,服務不可用
2.沒法處理大量的併發數據請求
3.數據丟失------大災難java


改造辦法:
1.增長MySQL數據庫服務器,對數據進行備份,造成主備。
2.確保主備MySQL數據庫服務器數據是同樣的。
3.主服務器宕機了,備份服務器繼續工做,數據有保障。
MySQL主從複製與讀寫分離是密切相關的。mysql


以下圖所示:一臺主mysql帶兩臺從mysql進行了數據複製,前端應用在進行數據庫寫操做時,對主設備進行操做,在進行數據庫讀操做時,對兩臺從設備進行操做,這樣大量減輕了對主設備的壓力。
Mysql主從複製與讀寫分離linux


mysql的主從複製和mysql的讀寫分離有着緊密的聯繫,首先要部署主從複製,只有主從複製完成了,才能在此基礎上進行數據的讀寫分離。
Mysql主從複製與讀寫分離c++


mysql複製的工做原理及過程:sql

  1. 在每一個事務更新數據完成以前,Master在二進制日誌記錄這些變化。寫入二進制日誌完成後,Master通知存儲引擎提交事務。
    2.Slave將Master的Binary log複製到其中繼日誌。首先,Slave開始一個工做線程---I/O線程,I/O線程在Master上打開一個普通的鏈接,而後開始Binlog dump process。Binlog dump process從Master的二進制日誌中讀取事件,若是已經跟上Master,它會睡眠並等待Master產生新的事件。I/O線程將這些事件寫入中繼日誌。
    3.SQL slave thread(SQL從線程)處理該過程的最後一步。SQL線程從中繼日誌讀取事件,並重放其中的事件而更新Slave的數據,使其與Master中的數據一致。只要該線程與I/O線程保持一致,中繼日誌一般會位於OS的緩存中,因此中繼日誌的開銷很小。

mysql讀寫分離原理:
Mysql主從複製與讀寫分離
mysql讀寫分離的實現方式:
Mysql主從複製與讀寫分離數據庫

Mysql主從複製與讀寫分離


接下來實驗部署:vim

首先先搞明白實驗環境拓撲 其中:
1.mysql數據庫服務器master-slave身份驗證,設置主從同步之間的身份受權驗證。
2.amoeba--->mysql,設置amoeba代理服務訪問mysql服務的身份受權驗證。
3.client---->amoeba,設置前端客戶client訪問amoeba代理服務的身份受權驗證。後端

Mysql主從複製與讀寫分離

實驗環境:全都基於centos7上
1.Master主數據庫服務器 、ip地址:192.168.48.133 、安裝軟件: mysql-5.5.24.tar.gz
2.Slave1從數據庫服務器、ip地址:192.168.48.12九、安裝軟件: mysql-5.5.24.tar.gz
3..Slave2從數據庫服務器、ip地址:192.168.48.130、安裝軟件: mysql-5.5.24.tar.gz
4.Amoeba代理服務器、ip地址:192.168.48.13四、安裝軟件: jdk-6u14-linux-x64.bin, amoeba-mysql-binary-2.2.0.tar.gz
5.Client 客戶端、ip地址:192.168.48.128 、 使用yum安裝mysql進行遠程測試
百度網盤免費提供源碼包:centos

jdk-6u14-linux-x64.bin:https://pan.baidu.com/s/16VpIUCD2-KH-dblAQrSbSA
amoeba-mysql-binary-2.2.0.tar.gz: https://pan.baidu.com/s/14KFbeGYgNdDQd5OiWv8YMA
mysql-5.5.24.tar.gz: https://pan.baidu.com/s/1VGEebdZ5bobKnKD5HNxbZQ


接下來搭建mysql主從複製:

創建時間同步環境,NTP時間同步協議圖解:
Mysql主從複製與讀寫分離


主服務器master設置:
yum install ntp -y
vim /etc/ntp.conf
server 127.127.48.0 //本地是時鐘源//
fudge 127.127.48.0 stratum 8 //設置時間層級爲8//
service ntpd start


在從服務器slave上進行時間同步:
yum install ntp ntpdate -y
service ntpd start
/usr/sbin/ntpdate 192.168.48.133 //進行時間同步//


全部的主機都關閉防火牆,關閉加強型功能
systemctl stop firewalld.service
setenforce 0


接下來手工編譯安裝mysql數據庫。在Master,Slave1,Slave2上安裝。步驟以下:

編譯安裝mysql:
yum -y install ncurses-devel cmake gcc gcc-c++ ncurses bison libaio-devel //ncurses是字符終端下屏幕控制的基本庫//
tar xzvf mysql-5.5.24.tar.gz
cd mysql-5.5.24
cmake \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_EXTRA_CHARSETS=all \

-DSYSCONFDIR=/etc \

-DMYSQL_DATADIR=/home/mysql/ \

-DMYSQL_UNIX_ADDR=/home/mysql/mysql.sock \

-DWITH_MYISAM_STORAGE_ENGINE=1 \

-DWITH_INNOBASE_STORAGE_ENGINE=1 \

-DWITH_ARCHIVE_STORAGE_ENGINE=1 \

-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \

-DENABLED_LOCAL_INFILE=1 \

-DWITH_SSL=system \

-DMYSQL_TCP_PORT=3306 \

-DENABLE_DOWNLOADS=1 \

-DWITH_SSL=bundled


make && make install


優化調整:
cp support-files/my-medium.cnf /etc/my.cnf

cp support-files/mysql.server /etc/init.d/mysqld

chmod +x /etc/init.d/mysqld

chkconfig --add mysqld

chkconfig --level 35 mysqld on
echo "PATH=$PATH:/usr/local/mysql/bin/" >> /etc/profile. /etc/profile (注意:"."後面有空格)


初始化數據庫:
useradd -s /sbin/nologin mysql

chown -R mysql.mysql /usr/local/mysql

/usr/local/mysql/scripts/mysql_install_db \

--user=mysql \

--ldata=/var/lib/mysql \

--basedir=/usr/local/mysql \

--datadir=/home/mysql

ln -s /var/lib/mysql/mysql.sock /home/mysql/mysql.sock

vi /etc/init.d/mysqld

basedir=/usr/local/mysql

datadir=/home/mysql


啓動mysql服務,設置mysql用戶密碼:
service mysqld start

mysqladmin -uroot -p password '123123'


配置MySQL主服務器master,在配置文件中修改或增長如下選項:
vim /etc/my.cnf

server-id = 11 //修改id
log-bin=master-bin //增長主服務器日誌文件//
log-slave-updates=true //增長從服務器更新二進制日誌//

service mysqld restart
登陸mysql程序,給從服務器受權:
grant replication slave on . to 'myslave'@'192.168.48.%' identified by '123123'; #進行受權
flush privileges; //刷新受權設置
show master status; //查看master狀態


配置MySQL從服務器slave0一、slave02,在配置文件中修改或增長如下選項:
vim /etc/my.cnf

[mysqld]

server-id = 22 #另外一臺id不同

relay-log=relay-log-bin //從主服務器上同步日誌文件記錄到本地//

relay-log-index=slave-relay-bin.index //定義relay-log的位置和名稱//

service mysqld restart
登陸mysql配置同步,按主服務器結果更改下面命令中的master_log_file和master_log_pos的參數
change master to master_host='192.168.48.133',master_user='myslave',master_password='123123',master_log_file='mysql-bin.000011',master_log_pos=267;
start slave; //啓動同步

show slave status \G; //查看slave狀態,確保如下兩個值爲yes

.............

Slave_IO_Running: Yes #這兩個必須爲yes

Slave_SQL_Running: Yes


驗證:

在主服務器master上新建數據庫school, 在主,從服務器上分別查看數據庫,均可以看到master新建的數據庫school,則主從複製成功。
接下來搭建mysql讀寫分離:
amoeba服務器配置:
1.在主機amoeba上安裝java環境,由於amoeba是基於jdk1.5開發的,因此官方推薦使用jdk1.5或1.6版本,高版本不建議使用。
service iptables stop
setenforce 0
cp jdk-6u14-linux-x64.bin /usr/local/
./jdk-6u14-linux-x64.bin

yes
按enter

mv jdk1.6.0_14/ /usr/local/jdk1.6
2.添加java環境變量:
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

source /etc/profile
3.安裝並配置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說明安裝成功
4.配置amoeba讀寫分離,兩個slave讀負載均衡,在master,slave1,slave2上登陸mysql添加權限開放給amoeba訪問:
grant all on . to test@'192.168.48.%' identified by '123.com';
5.回到amoeba服務器,編輯amoeba.xml配置文件,設置前端客戶client訪問amoeba代理服務的身份受權驗證:
cd /usr/local/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>
編輯dbServers.xml 配置文件,設置amoeba代理服務訪問mysql服務的身份受權驗證:
vim conf/dbServers.xml

--26-29--去掉註釋--
<property name="user">test</property>
<property name="password">123.com</property>

-----42-主服務器地址---
<dbServer name="master" parent="abstractServer">
<property name="ipAddress">192.168.48.133</property>
--52-從服務器主機名-
<dbServer name="slave1" parent="abstractServer">
--55-從服務器地址-
<property name="ipAddress">192.168.48.129</property>

<dbServer name="slaves" virtual="true">
<poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">

--末尾--
<property name="poolNames">slave1,slave2</property>
</poolConfig>
配置無誤後,能夠啓動amoeba軟件,其默認端口爲tcp 8066:
/usr/local/amoeba/bin/amoeba start& //開啓amoeba服務

netstat -anpt | grep java //查看端口


到此所有配置完成,在Client主機上進行測試:

客戶端:
yum install -y mysql
mysql -u amoeba -p123456 -h 192.168.48.134 -P8066 //經過amoeba代理訪問mysql
而後能夠建立新的表、內容。關閉slave功能(stop slave;)後,不管在哪臺服務器上進入數據庫只能讀取查看到兩臺slave從服務器寫入的內容。這說明讀操做在slave服務器上。
不管進哪臺服務器包括客戶端,只要是寫進數據庫的內容只有在master服務器上才能查看到。這就說明寫操做在master服務器上。


本章總結:

1.MySQL的主從複製和MySQL的讀寫分離二者有着緊密的聯繫。首先要部署主從複製,只有主從複製完成了,才能在此基礎上進行數據的讀寫分離。2.MySQL支持的複製類型有三種:基於語句的複製、基於行的複製和混合類型的複製。3.經過程序代碼實現MySQL讀寫分離是一個不錯的選擇,可是並非全部的應用都適合程序代碼中實現讀寫分離,像一些大型複雜的Java應用,通常會考慮使用代理層來實現。

相關文章
相關標籤/搜索