當前位置:網站首頁>Linux Mysql 主從複制和分離解析

Linux Mysql 主從複制和分離解析

2022-01-27 07:46:20 Dark_wWw

目錄

Linux Mysql 主從複制和分離解析

一、Mysql 主從複制

主從複制架構和原理

Mysql 的擴展

什麼是讀寫分離

Mysql 讀寫分離原理

為什麼要讀寫分離

什麼時候要讀寫分離

主從複制與讀寫分離

複制的功用

複制結構

 主從複制原理

主從複制相關線稱

與複制功能相關的文件

Mysql 主從複制延遲

二、實際操作


Linux Mysql 主從複制和分離解析

一、Mysql 主從複制

主從複制架構和原理

服務性能擴展方式

向上擴展,垂直擴展

向外擴展,橫向擴展

Mysql 的擴展

讀寫分離

複制:每個節點都有相同的數據集,向外擴展,基於二進制日志的單向複制

什麼是讀寫分離

讀寫分離基本原理

基本的原理是讓主數據庫處理事務性增、改、删操作(INSERT、UPDATE、DELETE),而從數據庫處理SELECT查詢操作。數據庫複制被用來把事務性操作導致的變更同步到集群中的從數據庫

Mysql 讀寫分離原理

讀寫分離就是只在主服務器上寫,只在從服務器上讀。基本的原理是讓主數據庫處理事務性操作,而從數據庫處理 select 查詢。數據庫複制被用來把主數據庫上事務性操作導致的變更同步到集群中的從數據庫

目前較為常見的 MySQL 讀寫分離分為以下兩種:

基於程序代碼內部實現

在代碼中根據 select、insert 進行路由分類,這類方法也是目前生產環境應用最廣泛的。 優點是性能較好,因為在程序代碼中實現,不需要增加額外的設備為硬件開支;缺點是需要開發人員來實現,運維人員無從下手。 但是並不是所有的應用都適合在程序代碼中實現讀寫分離,像一些大型複雜的Java應用,如果在程序代碼中實現讀寫分離對代碼改動就較大

基於中間代理層實現

代理一般比特於客戶端和服務器之間,代理服務器接到客戶端請求後通過判斷後轉發到後端數據庫,有以下代錶性程序

MySQL-Proxy。MySQL-Proxy 為 MySQL 開源項目,通過其自帶的 lua 脚本進行SQL 判斷。

Atlas。是由奇虎360的Web平臺部基礎架構團隊開發維護的一個基於MySQL協議的數據中間層項目。它是在mysql-proxy 0.8.2版本的基礎上,對其進行了優化,增加了一些新的功能特性。360內部使用Atlas運行的mysql業務,每天承載的讀寫請求數達幾十億條。支持事物以及存儲過程

Amoeba。由陳思儒開發,作者曾就職於阿裏巴巴。該程序由Java語言進行開發,阿裏巴巴將其用於生產環境。但是它不支持事務和存儲過程

由於使用MySQL Proxy 需要寫大量的Lua脚本,這些Lua並不是現成的,而是需要自己去寫。這對於並不熟悉MySQL Proxy 內置變量和MySQL Protocol 的人來說是非常困難的

Amoeba是一個非常容易使用、可移植性非常强的軟件。因此它在生產環境中被廣泛應用於數據庫的代理層

為什麼要讀寫分離

因為數據庫的“寫”(寫10000條數據可能要3分鐘)操作是比較耗時的。

但是數據庫的“讀”(讀10000條數據可能只要5秒鐘)。

所以讀寫分離,解决的是,數據庫的寫入,影響了查詢的效率

什麼時候要讀寫分離

數據庫不一定要讀寫分離,如果程序使用數據庫較多時,而更新少,查詢多的情况下會考慮使用

利用數據庫主從同步,再通過讀寫分離可以分擔數據庫壓力,提高性能

主從複制與讀寫分離

在實際的生產環境中,對數據庫的讀和寫都在同一個數據庫服務器中,是不能滿足實際需求的。無論是在安全性、高可用性還是高並發等各個方面都是完全不能滿足實際需求的

因此,通過主從複制的方式來同步數據,再通過讀寫分離來提昇數據庫的並發負載能力。有點類似於rsync,但是不同的是rsync是對磁盤文件做備份,而mysql主從複制是對數據庫中的數據、語句做備份

複制的功用

數據分布

負載均衡讀操作

備份

高可用和故障切換

MySQL昇級測試

複制結構

 主從複制原理

從庫生成兩個線程,一個I/O線程,一個SQL線程

i/o線程去請求主庫 的binlog,並將得到的binlog日志寫到relay log(中繼日志) 文件中

主庫會生成一個 log dump 線程,用來給從庫 i/o線程傳binlog

SQL 線程,會讀取relay log文件中的日志,並解析成具體操作,來實現主從的操作一致,而最終數據一 致

注:

中繼日志通常會比特於 OS 緩存中,所以中繼日志的開銷很小

複制過程有一個很重要的限制,即複制在 Slave上是串行化的,也就是說 Master上的並行更新操作不能在 Slave上並行操作

主從複制相關線稱

主節點

dump Thread:為每個Slave的I/O Thread啟動一個dump線程,用於向其發送binary log events

從節點

I/O Thread:向Master請求二進制日志事件,並保存於中繼日志中

SQL Thread:從中繼日志中讀取日志事件,在本地完成重放

與複制功能相關的文件

master.info:用於保存slave連接至master時的相關信息,例如賬號、密碼、服務器地址等

relay-log.info:保存在當前slave節點上已經複制的當前二進制日志和本地relay log日志的對應關系

mariadb-relay-bin.00000#: 中繼日志,保存從主節點複制過來的二進制日志,本質就是二進制日志

Mysql 主從複制延遲

master服務器高並發,形成大量事務

網絡延遲

主從硬件設備導致 cpu主頻、內存io、硬盤io

本來就不是同步複制、而是异步複制 從庫優化Mysql參數。比如增大innodb_buffer_pool_size,讓更多操作在Mysql內存中完成,减少磁盤操作。 從庫使用高性能主機。包括cpu强悍、內存加大。避免使用虛擬雲主機,使用物理主機,這樣提昇了i/o面性。 從庫使用SSD磁盤 網絡優化,避免跨機房實現同步

二、實際操作

環境配置

master服務器: 192.168.118.140   mysql5.7
slave1服務器: 192.168.118.150	mysql5.7
slave1服務器: 192.168.118.160
Amoeba服務器: 192.168.118.170  jdk1.6、Amoeba
客戶端 服務器: 192.168.118.130	  mysql

初始環境准備

#五臺服務器上都初始化
systemctl stop firewalld
setenforce 0

 搭建 Mysql 主從複制

搭建時間同步(主服務器:192.168.118.140)

1.#安裝時間同步服務器
yum install ntp -y
 
2.#修改配置文件
vim /etc/ntp.conf  
server 127.127.59.0   #設置本地時鐘源
fudge 127.127.59.0 stratum 8  #設置時間層級為8 限制在15 以內
 
3.#開啟服務
service ntpd start

 修改配置文件

 開啟服務

 搭建時間同步(從服務器:192.168.118.150、192.168.118.160)

1.#安裝時間同步服務器、同步服務
yum install ntp -y
yum install ntpdate -y
 
2. #開啟服務
service ntpd start
 
3. #執行同步
/usr/sbin/ntpdate 192.168.118.140
 
4.#計劃定時任務
crontab -e
*/30 * * * *  /usr/sbin/ntpdate 192.168.118.140
 
###########slave2:192.168.118.160與以上操作相同######

192.168.118.150

 開啟服務

 執行同步

 計劃定時任務

 192.168.118.160

 開啟服務

 執行同步

 計劃定時任務

 配置主服務器(192.168.118.140)

1. #開啟二進制日志
vim /etc/my.cnf
 
log-bin=master-bin        #開啟二進制日志
binlog_format=MIXED       #二進制日志格式
log-slave-updates=true    #開啟從服務器同步
 
2. #重啟服務
systemctl restart mysqld.service 
 
3. #登入mysql,給從服務器在網段授權
mysql -uroot -p000000
grant replication slave on *.* to 'myslave'@'192.168.118.%' identified by '000000';
 
#刷新數據庫
flush privileges;
 
#查看主服務器二進制文件
show master status;
開啟二進制日志

開啟二進制日志 

 重啟服務

 登入mysql,給從服務器在網段授權

 配置從服務器(192.168.118.150、192.168.118.160)

1.#開啟二進制日志
vim /etc/my.cnf
server-id = 11 #slave1和slave2的id不能相同,我slave2設置的22
relay-log=relay-log-bin
relay-log-index=slave-relay-bin.index
 
2.#重啟服務
systemctl restart mysqld.service 
 
3. #登入mysql,配置同步注意master_log_file和master_log_pos的值要和master查詢的一致
mysql -uroot -p000000
change master to master_host='192.168.118.140',master_user='myslave',master_password='000000',master_log_file='master-bin.000001',master_log_pos=769;
 
4.#啟動同步,如果報錯,執行restart slave試試
start slave;
show slave status\G;
##以下兩個必須要是YES
#Slave_IO_Running: Yes
#Slave_SQL_Running: Yes
 
 
#########slave2:192.168.59.112與以上操作相同######

192.168.118.150 

開啟二進制日志

 重啟服務

 登入mysql,配置同步注意master_log_file和master_log_pos的值要和master查詢的一致

 192.168.118.160

開啟二進制文件

 重啟服務

 登入mysql,配置同步注意master_log_file和master_log_pos的值要和master查詢的一致

 驗證主從同步

#在主服務器上創建一個庫
create database yh001;
 
#在從服務器上查看
show databases;

192.168.118.150 

 192.168.118.160

 搭建 Amoeba 實現讀寫分離 (192.168.118.170)

安裝 Java 環境

################安裝 Java 環境###############
1.#下載安裝包:jdk-6u14-linux-x64.bin、amoeba-mysql-binary-2.2.0.tar.gz 
cd /opt
 
2.#把jdk複制到/usr/local下
cp jdk-6u14-linux-x64.bin /usr/local/
 
3.#賦予jdk權限並執行
chmod +x /usr/local/jdk-6u14-linux-x64.bin
cd /usr/local/
./jdk-6u14-linux-x64.bin  #一路回車到底,最後輸入yes 自動安裝
 
4.#jdk改個名字
mv jdk1.6.0_14/ jdk1.6
 
5.#配置環境並刷新
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
 
source /etc/profile      #刷新配置文件

下載安裝包

 把 jdk 複制到 /usr/local 下

 賦予 jdk 權限並執行

jdk 改名字

 配置環境變量

 配置 Amoeba

############## 安裝amoeba ###########
 
1.#在/usr/local目錄下創建amoeba目錄
mkdir /usr/local/amoeba
 
2.#切換至opt解壓amoeba
cd /opt/
tar zxvf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba
 
cd /usr/local/ 切換至目錄查看
 
 
3.#給目錄/usr/local/amoeba賦予執行權限
chmod -R 755 /usr/local/amoeba/
 
4.#運行amoeba
/usr/local/amoeba/bin/amoeba
 
 
###########配置 Amoeba讀寫分離 ####
5.#先在Master、Slave1mysql上開放權限給 Amoeba 訪問
grant all on *.* to [email protected]'192.168.118.%' identified by '000000';
flush privileges;
 
6.#備份amoeba配置
cd /usr/local/amoeba/conf/
cp amoeba.xml amoeba.xml.bak
cp dbserver.dtd dbserver.dtd.bak
 
7.#修改amoeba配置
vim amoeba.xml
30 <property name="user">amoeba</property>
#設置登錄用戶名
32<property name="password">000000</property>
#設置密碼
 
115<property name="defaultPool">master</property>
#設置默認池為master
118<property name="writePool">master</property>
#設置寫池
119<property name="readPool">slaves</property>
#設置讀池
 
vim dbServers.xml 
23 <!-- <property name="schema">test</property> -->
#23行注釋
26<property name="user">test</property>
#設置登錄用戶
28 <!--  mysql password -->
#删除
29<property name="password">000000</property>
#解决28注釋,添加密碼
 
45<dbServer name="master"  parent="abstractServer">
#服務池名
48<property name="ipAddress">192.168.118.140</property>
#添加地址
 
52<dbServer name="slave1"  parent="abstractServer">
55<property name="ipAddress">192.168.118.150</property>
複制6行 添加另一從節點
59<dbServer name="slave2"  parent="abstractServer">
62<property name="ipAddress">192.168.118.160</property>
 
66<dbServer name="slaves" virtual="true">
#定義池名
72<property name="poolNames">slave1,slave2</property>
#寫上從節點名
 
8.#啟動amoeba,並測試
amoeba start
netstat -ntap |grep java

在/usr/local目錄下創建amoeba目錄

 切換至opt解壓amoeba

給目錄/usr/local/amoeba賦予執行權限 

 運行 amoeba

 先在Master、Slave1 mysql上開放權限給 Amoeba 訪問

 備份amoeba配置

 修改配置文件

 啟動amoeba

 在客戶端測試 (192.168.118.130)

1.#安裝mariadb
yum install mariadb mariadb-server.x86_64 -y
 
2.#登入並查看數據庫
mysql -uamoeba -p000000 -h 192.168.118.170 -P8066
 
 
3.#測試同步
##在主服務器服務器上新建錶
use yh001;
create table info(id int(10),name char(40));
show tables;
 
##在客戶機上,插入數據會同步到所有數據庫中
 use yh001;
 insert into info values(1,'小王');
 
##在主從服務器上查看
 
4.#測試讀寫分離
#停止slave1和slave2的slave同步功能
stop slave;
 
#在master、slave1和slave2上插入數據

 安裝mariadb

 登入並查看數據庫

 測試

在主服務器上創建新錶

 在客戶機上,插入數據會同步到所有數據庫中

 在主服務器上查看

 測試讀寫分離

 

版權聲明
本文為[Dark_wWw]所創,轉載請帶上原文鏈接,感謝
https://cht.chowdera.com/2022/01/202201270746201712.html

隨機推薦