這里寫目錄標題
- 一、主從復制與讀寫分離的意義
- 二、主從資料庫實作同步(主從復制)
- 三、主從讀寫分離
- 四、案例實操
一、主從復制與讀寫分離的意義
??企業中的業務通常資料量都比較大,而單臺資料庫在資料存盤、安全性和高并發方面都無法滿足實際的需求,所以需要配置多臺主從資料服務器,以實作主從復制,增加資料可靠性,讀寫分離,也減少資料庫壓力和存盤引擎帶來的表鎖定和行鎖定問題,
二、主從資料庫實作同步(主從復制)
什么是主從復制?簡單來說就是在主服務器上執行的陳述句,從服務器執行同樣的陳述句,在主服務器上的操作在從服務器產生了同樣的結果,
主從復制的基本程序如下:
-
Master(主資料庫)將用戶對資料庫更新的操作以二進制格式保存到BinaryLog日志檔案中,
-
Slave(從資料庫)上面的I0行程連接上Master, 并請求從指定日志檔案的指定位置(或者從最開始的日志)之后的日志內容,
-
Master接收到來自Slave的I0行程的請求后,通過負責復制的I0行程根據請求資訊讀取制定日志指定位置之后的日志資訊,回傳給Slave 的I0行程,回傳資訊中除了日志所包含的資訊之外,還包括本次回傳的資訊已經到Master端的bin-log檔案的名稱以及bin-log的位置,
-
Slave的I0行程接收到資訊后,將接收到的日志內容依次添加到Slave端的relay-log檔案的最末端,并將讀取到的Master端的bin-log的檔案名和位置記錄到master-info檔案中,以便在下一次讀取的時候能夠清楚的告訴Master “我需要從某個bin- log的哪個位置開始往后的日志內容,請發給我”,
-
Slave的Sql行程檢測到relay-log中新增加了內容后,會馬上決議relay- log的內容成為在Master端真實執行時候的那些可執行的內容,并在自身執行,

三、主從讀寫分離
只在主服務器上寫,在從服務器上讀;
主資料庫處理事務性查詢,從資料庫處理SELECT查詢;
進行讀操作時,是在兩個從服務器上輪流讀取,利用虛擬模塊MySQL-Proxy做讀取從服務器時的輪詢,
四、案例實操
環境準備:需要準備五臺主機,一臺作主資料庫服務器,兩臺做從服務器,還需要一臺Amoeba的服務器作為中間代理,用于客戶機登錄資料庫進行讀寫操作,而不用直接登錄主從服務器,
三臺主機上都編譯安裝好mysql5.7,安裝程序見另一篇文章,Mysql安裝鏈接
1、為了保證資料同步必須先保證時間同步,在三臺服務器均做時間同步
[root@master ~]# ntpdate ntp.aliyun.com
21 Oct 18:29:46 ntpdate[44242]: step time server 120.25.115.20 offset 1.449094 sec
2、主服務器上配置(IP:192.168.247.130)
修改組態檔:
vim /etc/my.cnf
#在[Mysqld]模塊修改
server-id = 11 //三臺主從資料庫的id必須不同
log-bin = master-bin //主服務器日志檔案
log-slave-updates=true //允許從服務器更新
[root@master ~]# systemctl restart mysqld.service //組態檔修改后必須重啟
登錄主資料庫給從資料庫授權:
[root@master ~]# mysql -uroot -p
Enter password:
mysql> grant replication slave on *.* to 'myslave'@'192.168.247.%' identified by 'abc123'';
Query OK, 0 rows affected, 1 warning (0.01 sec)
//給從服務器授權,允許192.168.247.網段的服務器使用myslave訪問所有庫的所有表
mysql> flush privileges; //策略重繪
Query OK, 0 rows affected (0.00 sec)
mysql> show master status; //查看主服務器狀態,日志用于從服務器同步,position是當前定位
+-------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| master-bin.000001 | 154 | | | |
+-------------------+----------+--------------+------------------+-------------------+
1 row in set (
3、從服務器上配置(IP:192.168.247.140 和 192.168.247.150)
修改組態檔:
vim /etc/my.cnf
server-id = 22 //另一個從服務器為33
relay-log = relay-log-bin //從主服務器上同步日志檔案記錄到本地
relay-log-index = slave-relay-bin.index //建立索引檔案,定義relay-log的位置和名稱
[root@slave1 ~]# systemctl restart mysqld
登錄資料庫配置:
mysql> change master to master_host='192.168.247.130',master_user='myslave',master_password='abc123',master_log_file='master-bin.000001',master_log_pos=154;
Query OK, 0 rows affected, 2 warnings (0.01 sec)
##指明從哪里找什么檔案的什么位置進行復制
mysql> start slave; //開啟從復制
Query OK, 0 rows affected (0.00 sec)
master_log_file:需要同步的二進制日志檔案名,即主服務器上查詢到的狀態中file
master_log_pos:斷點位置,即主服務器上查詢到的狀態position
查看從服務器狀態:
mysql> show slave status \G
I/O執行緒與SQL執行緒都為Yes,主從復制完成

4、驗證主從復制效果
在主服務器上創建aaa資料庫:
mysql> create database aaa;
Query OK, 1 row affected (0.01 sec)
在兩個從服務器上查看:有aaa資料庫
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| aaa |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)
同步到了主服務器的資料,主從復制實作,
另起一臺主機,安裝Amoeba:(IP:192.168.247.170)
1、首先安裝jdk依賴包
[root@server2 ~]# tar xf jdk-8u91-linux-x64.tar.gz
[root@server2 ~]# cp -rf jdk1.8.0_91/ /usr/local/java
##配置環境變數
[root@server2 ~]# vim /etc/profile
在末尾加入
export JAVA_HOME=/usr/local/java
export JRE_HOME=/usr/local/java/jre
export AMOEBA_HOME=/usr/local/amoeba
export PATH=$PATH:$JAVA_HOME/bin:$AMOEBA_HOME/bin
export CLASSPATH=./:/local/java/lib:/usr/local/java/jre/lib
[root@server2 ~]# source /etc/profile //生效
2、安裝Amoeba,并啟動
[root@server2 ~]# unzip amoeba-mysql-3.0.5-RC-distribution.zip //解壓安裝包
[root@server2 ~]# mv amoeba-mysql-3.0.5-RC /usr/local/amoeba //創建并移動至作業目錄
[root@server2 ~]# chmod -R 755 /usr/local/amoeba //給執行權限
[root@server2 ~]# vi /usr/local/amoeba/jvm.properties
#將32行注釋掉并添加下面一行
#JVM_OPTIONS="-server -Xms256m -Xmx1024m -Xss196k -XX:PermSize=16m -XX:MaxPerSize=96m"
JVM_OPTIONS="-server -Xms1024m -Xmx1024m -Xss256k"
[root@server2 ~]# cd /usr/local/amoeba/bin/
[root@server2 bin]# launcher
[root@server2 bin]# netstat -anpt | grep 8066
tcp6 0 0 :::8066 :::* LISTEN 1829/java
##Amoeba開啟,主機會強制關機,需要自行開機
3、修改Amoeba組態檔
## 進入組態檔目錄
[root@server2 bin]# cd /usr/local/amoeba/conf
需要修改下面兩個組態檔

第一個組態檔修改:
vi amoeba.xml
#28行修改,允許客戶機登錄amoeba的賬戶名,密碼
#84行下取消注釋,并設定讀寫池


第二個組態檔修改:
vi dbServers.xml
#修改如下配置

(不修改為mysql的話,也可以新建test資料庫,)

組態檔修改完成后,重新啟動Amoeba,并查看狀態
cd /usr/local/amoeba/bin/
launcher
[root@server2 bin]# netstat -anpt | grep 8066
tcp6 0 0 :::8066 :::* LISTEN 1829/java
在三臺MySQL資料庫中為amoeba授權:
mysql> grant all on *.* to test@'192.168.247.%' identified by '123.com';
#允許test賬戶以123.com為密碼訪問資料庫的所有庫的所有表
mysql> flush privileges;
#重繪權限
客戶機上的測驗(IP:192.168.247.160)
安裝輕量級資料庫,登錄amoeba服務器可進入主從資料庫
[root@server2 ~]# yum -y install mariadb*
[root@server2 ~]# systemctl start mariadb
[root@server2 ~]# mysql -uamoeba -p123456 -h 192.168.247.170 -P8066
#通過amoeba登錄資料庫 -u用戶名 -p密碼 -h 訪問地址為amoeba服務器 -P amoeba埠號
主從同步驗證
在主服務器上新建test資料庫和表tt
mysql> create database test;
Query OK, 1 row affected (0.01 sec)
mysql> use test
Database changed
mysql> create table tt(name char(10), id int(3) primary key auto_increment);
Query OK, 0 rows affected (0.02 sec)
mysql> desc tt;
+-------+----------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+----------------+
| name | char(10) | YES | | NULL | |
| id | int(3) | NO | PRI | NULL | auto_increment |
+-------+----------+------+-----+---------+----------------+
2 rows in set (0.00 sec)
在從服務器上都可查看到test和表tt(主從復制的效果)
mysql> use test;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| tt |
+----------------+
1 row in set (0.00 sec)
關閉從服務器的從狀態:
mysql> stop slave;
Query OK, 0 rows affected (0.01 sec)
在客戶端進行寫入操作:
客戶端:也無法查看,只能寫入主服務器
MySQL [(none)]> insert into test.tt values('a',1);
Query OK, 1 row affected (0.02 sec)
MySQL [(none)]> select * from test.tt;
ERROR 1146 (42S02): Table 'test.tt' doesn't exist
只能在主服務器查看,從服務器無法查看
主服務器:
mysql> select * from tt;
+------+----+
| name | id |
+------+----+
| a | 1 |
+------+----+
1 row in set (0.00 sec)
從服務器:
mysql> select * from test.tt;
ERROR 1146 (42S02): Table 'test.tt' doesn't exist
在從服務器上寫入資料
slave1:
mysql> insert into tt values('bb',2);
Query OK, 1 row affected (0.01 sec)
#從服務器上可以查看
mysql> select * from tt;
+------+----+
| name | id |
+------+----+
| bb | 2 |
+------+----+
slave2:
mysql> select * from test.tt;
+------+----+
| name | id |
+------+----+
| aa | 1 |
| cc | 3 |
+------+----+
客戶端可以輪流讀取到從服務器的資料

而主服務器上不會存盤從服務器的資料,依舊是從客戶端寫入的資料,
mysql> select * from tt;
+------+----+
| name | id |
+------+----+
| a | 1 |
+------+----+
實作了讀寫分離,
開啟主從同步之后,主服務器上寫入的資料同步到從服務器,客戶端也能讀取主服務器資料了,但從服務器上的資料不會到主服務器上,
mysql> start slave;
Query OK, 0 rows affected (0.01 sec)
mysql> select * from test.tt;
+------+----+
| name | id |
+------+----+
| a | 1 |
+------+----+
1 row in set (0.01 sec)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/196124.html
標籤:其他
上一篇:AI訓練影像選擇
下一篇:這份Alibaba內部整理的面試手抄本,Github上識訓45K+star的Java核心神技,吃透消化,讓你面試跳槽不再心慌!
