一.主從複製原理
- MySQL的主從複製和MySQL的讀寫分離兩者有着緊密的聯繫,首先要部署主從複製,只有主從複製完成了,才能在此基礎之上進行數據的讀寫分離
- MySQL支持三類主從複製類型:
- 基於語句的複製,在主服務器上的執行的語句SQL語句,在從服務器上執行同樣的語句。MySQL默認採用基於語句的複製,效率比較高
- 基於行的複製,把改變的內容複製過去,而不是把命令在從服務器上執行一遍
- 混合類型的複製,默認採用基於語句的複製,一旦發現基於語句無法精確複製時,就會採用基於行的複製
- 工作過程
二.讀寫分離原理
- 讀寫分離就是用戶基於第三方服務器,訪問數據庫時,寫在主服務器上,在從服務器上讀
- 基本原理是讓主數據庫處理事務性查詢,而讓從數據庫處理select查詢
- 數據庫主從複製被用來把事務查詢導致的變更同步到集羣的從數據庫
- 基於中間代理層實現:代理一般位於客戶端和服務器之間,代理服務器接到客戶端請求通過判斷後轉發到後端數據庫,比如Mycat 、Amoeba
三.搭建主從複製、讀寫分離環境
1.羣集拓撲
2.實驗環境
主機 | 操作系統 | IP地址 | 主要軟件 |
MySQL(master) | CentOS7 | 192.168.43.100 | mysql-5.6.26.tar.gz |
MySQL(slave1) | CentOS7 | 192.168.43.243 | mysql-5.6.26.tar.gz |
MySQL(slave2) | CentOS7 | 192.168.43.221 | mysql-5.6.26.tar.gz |
Amoeba | CentOS7 | 192.168.43.104 |
amoeba-mysql-binary-2.2.0.tar.gz jdk-6u14-linux-x64.bin |
Client | CentOS7 | 192.168.43.244 | mariadb-5.5.64-1.el7.x86_64 |
3.搭建MySQL主從複製
主服務器
- 在主服務器上,安裝時間服務器,且在主配置文件設置參數
yum install ntp -y
vim /etc/ntp.conf
server 127.127.43.0 ##寫自己主服務器的IP地址的第三段
fudge 127.127.43.0 stratum 8 ##配置時區
##關閉安全性功能,重啓服務
systemctl stop firewalld
setenforce 0
systemctl start ntpd
-
默認已經配置好MySQL5.6版本,修改MySQL的主配置文件
vim /etc/my.cnf
#指定id號,唯一標識服務器
server-id = 11
#開啓二進制日誌文件
log-bin=master-bin
#更新從服務器二進制日誌
log-slave-updates=ture
- 進入數據庫,修改權限
#進入數據庫
mysql -u root -pabc123
#給從服務器權限,*.*所有數據庫的所有表
CRANT REPLICATION SLAVE ON *.* TO 'myslave'@'192.168.43.%' IDENTIFIED BY '123456';
#刷新權限
FLUSH PRIVILEGES;
#查看主服務器的狀態,獲取file名和position
show master status;
+-------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| master-bin.000001 | 411| | | |
+-------------------+----------+--------------+------------------+-------------------+
從服務器
-
在兩臺MySQL從服務器上做一樣的操作,除了指定的ID號
-
安裝時間服務器,關閉安全性功能,開啓服務
yum install ntp ntpdate -y
systemctl start ntpd
systemctl stop firewalld
setenforce 0
-
時間同步主服務器
/usr/bin/ntpdate 192.168.43.100
- 修改配置文件
#指定id號,服務器的唯一標識(另外一臺從服務器上要修改)
server-id = 22
##從服務器上同步日誌文件記錄
relay-log=relay-log-bin
##定義relay-log的位置和名稱
relay-log-index=slave-relay-bin.index
-
重啓服務
service -uroot -pabc123
-
進入數據庫,指定主服務器
change master to master_host='192.168.43.101',
master_user='myslave',
master_password='123456',
master_log_file='master-bin.000001',
master_log_pos=441;
#開啓從服務器
start slave;
#查看狀態
show slave status\G;
測試主從同步
4.搭建Amoeba服務器,建立讀寫分離功能
- 配置Java環境
#把軟件包複製到/usr/local下
cp jdk-6u14-linux-x64.bin /usr/local
#執行腳本(交互時,選擇yes,用遠程終端時彈窗選擇否)
bash jdk-6u14-linux-x64.bin
#重命名,方便管理
mv jdk-1.6.0_14 /usr/local/jdk1.6
#配置環境變量
vim /et/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
- 安裝amoeba
#解壓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
#出現下列代碼說明成功
[root@localhost ~]# /usr/local/amoeba/bin/amoeba
amoeba start|stop
[root@localhost ~]#
- 在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>
- 在amoeba服務器上設置數據庫服務器文件參數
vim conf/dbServers.xml
#26-29行:去掉註釋,設置登錄用戶名和密碼
<property name="user">test</property>
<property name="password">123.com</property>
##找到主服務器和從服務器模塊,修改好名稱和對應IP地址:
#主服務器:
<dbServer name="master" parent="abstractServer">
<property name="ipAddress">192.168.43.100</property>
#第一臺從服務器:
<dbServer name="slave1" parent="abstractServer">
<property name="ipAddress">192.168.43.243</property>
#第二臺從服務器:
<dbServer name="slave2" parent="abstractServer">
<property name="ipAddress">192.168.43.221</property>
#指定從服務器池:
<dbServer name="slaves" virtual="true">
<property name="poolNames">slave1,slave2</property>
- 啓動amoeba服務
##放到後臺執行
/usr/local/amoeba/bin/amoeba start&
##查看服務
[root@localhost ~]# netstat -antp|grep java
tcp6 0 0 127.0.0.1:38258 :::* LISTEN 61637/java
tcp6 0 0 :::8066 :::* LISTEN 61637/java
5.建立測試環境
- 在客戶機安裝數據庫,關閉安全性功能
yum install -y mariadb
systemctl stop firewalld
setenforce 0
- 連接amoeba
[root@localhost ~]# mysql -u amoeba -p123456 -h 192.168.43.104 -P8066
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MySQL connection id is 730578010
Server version: 5.1.45-mysql-amoeba-proxy-2.2.0 Source distribution
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MySQL [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| class |
| mysql |
| performance_schema |
| school |
| test |
| you_db |
+--------------------+
7 rows in set (0.01 sec)
MySQL [(none)]>
- 測試是否能夠讀寫分離
- 在從服務器上關閉,主從複製功能
- 分別在主服務、從服務器上寫入數據
- 在client上查看數據庫
- 在client上寫入數據,分別在主從服務器上查看
注:在生產環境中,不能斷開主從複製的服務。另外,使用MySQL版本的不同會導致,amoeba服務中的配置文件不同