MySQL讀寫分離理論+實驗(下篇)

前言:

繼上篇MySQL主從複製的環境,本篇博客將繼續配置MySQL讀寫分離。可以直接從以下連接進入主從複製的博客:
MySQL主從複製理論+實驗(上篇)

一、MySQL讀寫分離介紹

1.1 MySQL讀寫分離原理
  • 讀寫分離就是隻在主服務器進行“寫”的任務,在從服務器只做“讀”的任務
  • 主數據庫處理事務性查詢,從數據庫處理 select查詢
  • 數據庫複製被用來把事務性查詢導致的變更同步到集羣中的從數據庫

在這裏插入圖片描述

1.2 MySQL讀寫分離背景
  • 在實際企業環境中,會有大量數據請求,單臺數據庫無法承擔所有讀與寫的操作,此時則需要配置讀寫分離
  • 配置多臺數據庫服務器實現讀寫分離
  • 讀寫分離建立在主從複製的基礎上

二、MySQL讀寫分離實驗

2.1 環境部署
  • ① 五臺centos7虛擬機
  • ② 一臺做爲client
  • ③ 三臺做爲mysql服務器(其中一臺爲master服務器)
  • ④ 一臺作爲amoeba服務器
2.2.1 實驗拓撲

在這裏插入圖片描述

2.2 實驗過程
2.2.1 配置amoeba服務器
  • ① 關閉防火牆
[root@amoeba ~]# systemctl stop firewalld.service 
[root@amoeba ~]# setenforce 0
[root@amoeba ~]# systemctl disable firewalld.service 
  • ② 安裝jdk
[root@amoeba ~]# mount.cifs //192.168.226.1/LAMP-C7 /mnt
Password for root@//192.168.226.1/LAMP-C7:  
[root@amoeba ~]# cd /mnt
[root@amoeba mnt]# cd LNMP-C7/
[root@amoeba LNMP-C7]# cp jdk-6u14-linux-x64.bin /usr/local
[root@amoeba LNMP-C7]# cd /usr/local
[root@amoeba local]# ls
bin  games    jdk-6u14-linux-x64.bin  lib64    sbin   src
etc  include  lib                     libexec  share
[root@amoeba local]# ./jdk-6u14-linux-x64.bin 
#文件是.bin結尾,所以直接執行即可
  • ③ 配置環境變量
[root@amoeba local]# vim /etc/profile
#指定JAVA工作目錄、命令文件位置
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
#指定amoeba的工作目錄和命令文件位置
export AMOEBA_HOME=/usr/local/amoeba
export PATH=$PATH:$AMOEBA_HOME/bin
[root@amoeba local]# source /etc/profile
  • ④ 安裝Amoeba
[root@amoeba local]# mv jdk1.6.0_14/ jdk1.6
[root@amoeba local]# mkdir /usr/local/amoeba
[root@amoeba local]# cd /mnt
[root@amoeba mnt]# tar zxvf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/
......省略部分內容
[root@amoeba mnt]# chmod -R 755 /usr/local/amoeba/
[root@amoeba usr]# /usr/local/amoeba/bin/amoeba
amoeba start|stop
#查看是否安裝成功
  • ⑤ 在三臺mysql服務器添加權限開放給amoeba訪問
mysql> grant all on *.* to test@'192.168.226.%' identified by '123.com'; 
Query OK, 0 rows affected (0.00 sec)
  • ⑥ 修改amoeba主配置文件
[root@amoeba usr]# cd /usr/local/amoeba/
[root@amoeba amoeba]# ls
benchmark  bin  changelogs.txt  conf  lib  LICENSE.txt  README.html
[root@amoeba amoeba]# cd conf/
[root@amoeba conf]# vi amoeba.xml    
#外網客戶訪問amoeba的賬戶                            <property name="user">amoeba</property>
#32行來訪的密碼    
<property name="password">123456</property>
#115行,將默認池子設置爲master                
<property name="defaultPool">master</property>
#117行,取消註釋       
<!-- -->
#寫入池修改爲master
<property name="writePool">master</property>
#讀取池修改爲slaves(附屬)
<property name="readPool">slaves</property>
#120行的-->註釋符號去除   
-------》wq
  • 修改amoeba數據庫配置文件
[root@amoeba conf]# vim dbServers.xml 
#23行將text修改爲mysql 
<property name="schema">mysql</property>
#26行,amoeba訪問三臺mysql數據庫的賬戶和密碼(賬戶爲test)
<property name="user">test</property>
                            
#29行,修改訪問的密碼
<property name="password">123.com</property>
#45行,修改數據庫主服務器名
<dbServer name="master"  parent="abstractServer">

#48行,修改master服務器ip
<property name="ipAddress">192.168.226.132</property>

#52行修改從服務器名
<dbServer name="slave1"  parent="abstractServer">
#55行修改從服務器地址
<property name="ipAddress">192.168.226.133</property>

#緊接複製52—57行,粘貼,添加第二臺服務器名
<dbServer name="slave2"  parent="abstractServer">
#修改第二臺服務器IP               
<property name="ipAddress">192.168.226.134</property>

#66行,修改多個服務器池的名稱(修改爲slaves)
<dbServer name="slaves" virtual="true">
#72行,添加兩個從服務器的服務器名(slave1 slave2)
<property name="poolNames">slave1,slave2</property>
------>wq
  • 開啓服務
[root@amoeba conf]# /usr/local/amoeba/bin/amoeba start &
#因爲amoeba啓動時會有一個實時監控,所以我們可以放在後臺
#利用遠程登錄軟件再開啓一個終端,查看java服務狀態
[root@amoeba ~]# netstat -natp | grep java
tcp6       0      0 127.0.0.1:47342         :::*                    LISTEN      81154/java          
tcp6       0      0 :::8066                 :::*                    LISTEN      81154/java          
tcp6       0      0 192.168.226.128:50826   192.168.226.132:3306    ESTABLISHED 81154/java          
tcp6       0      0 192.168.226.128:60952   192.168.226.134:3306    ESTABLISHED 81154/java          
tcp6       0      0 192.168.226.128:53836   192.168.226.133:3306    ESTABLISHED 81154/java        
2.3 使用客戶端client驗證
  • 關閉防火牆、增強性安全功能
[root@localhost ~]# systemctl stop firewalld.service 
[root@localhost ~]# setenforce 0
  • 安裝mysql
[root@localhost ~]# yum install mysql -y
  • 使用指定賬戶和密碼訪問amoeba服務器
[root@localhost ~]# mysql -u amoeba -p123456 -h 192.168.226.128 -P8066
#使用amoeba賬戶、密碼爲123456 連接地址爲192.168.226.128(amoeba服務器IP) -P8066(端口爲8066)
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 1362913826
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)]> 
  • 進入work數據庫創建一張表
MySQL [(none)]> use work;
Database changed
MySQL [work]> create table info(id int(4) not null primary key,name varchar(10) not null,score decimal(4,1) not null);
Query OK, 0 rows affected (0.03 sec)

MySQL [work]> show tables;
+----------------+
| Tables_in_work |
+----------------+
| info           |
+----------------+
1 row in set (0.00 sec)

MySQL [work]> select * from info;
Empty set (0.03 sec)
  • 在三臺mysql數據庫查中查看是否有info表
mysql> use work;
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_work |
+----------------+
| info           |
+----------------+
1 row in set (0.01 sec)

mysql> 
2.3.1 配置讀寫分離
  • ① 在兩臺MySQL從服務器上停止同步主服務器
mysql> stop slave;
Query OK, 0 rows affected (0.00 sec)

mysql> show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: 
                  Master_Host: 192.168.226.132
                  Master_User: myslave
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: master-bin.000001
          Read_Master_Log_Pos: 890
               Relay_Log_File: relay-log-bin.000002
                Relay_Log_Pos: 762
        Relay_Master_Log_File: master-bin.000001
             Slave_IO_Running: No
            Slave_SQL_Running: No
............省略部分內容
  • ② 此時寫入操作只在主服務器上進行,以下爲驗證

    在client數據庫中往info數據表寫入內容

MySQL [work]> insert into info (id,name,score) values (1,'changzhi',99);
Query OK, 1 row affected (0.05 sec)
  • 在主服務器查看數據表
mysql> select * from info;
+----+----------+-------+
| id | name     | score |
+----+----------+-------+
|  1 | changzhi |  99.0 |
+----+----------+-------+
1 row in set (0.00 sec)

mysql> 
  • 在從服務器查看數據表
mysql> use work;
Database changed
mysql> select * from info;
Empty set (0.00 sec)
  • 此時,在client數據庫中應該是看不到數據表的,如下
MySQL [work]> select * from info;
Empty set (0.01 sec)

以上以實現讀寫分離(主服務器執行“寫,從服務器進行讀)

  • ③ 此時驗證數據服務器讀取機制

    分別在兩臺從服務器上在info表中寫入不同數據

  • slave 1服務器

mysql> insert into info (id,name,score) values (2,'zhangchi',100);
Query OK, 1 row affected (0.00 sec)

mysql> select * from info;
+----+----------+-------+
| id | name     | score |
+----+----------+-------+
|  2 | zhangchi | 100.0 |
+----+----------+-------+
1 row in set (0.00 sec)

  • slave 2 服務器
mysql> insert into info (id,name,score) values (2,'zhizhi',18);
Query OK, 1 row affected (0.01 sec)

mysql> select * from info;
+----+----------+-------+
| id | name     | score |
+----+----------+-------+
|  1 | changzhi |  99.0 |
|  2 | zhizhi   |  18.0 |
+----+----------+-------+
2 rows in set (0.00 sec)

  • 此時我們在client數據庫中重複查詢info表
MySQL [work]> select * from info;
+----+----------+-------+
| id | name     | score |
+----+----------+-------+
|  2 | zhangchi | 100.0 |
+----+----------+-------+
1 row in set (0.00 sec)

MySQL [work]> select * from info;
+----+----------+-------+
| id | name     | score |
+----+----------+-------+
|  1 | changzhi |  99.0 |
|  2 | zhizhi   |  18.0 |
+----+----------+-------+
2 rows in set (0.01 sec)

MySQL [work]> select * from info;
+----+----------+-------+
| id | name     | score |
+----+----------+-------+
|  2 | zhangchi | 100.0 |
+----+----------+-------+
1 row in set (0.00 sec)

MySQL [work]> select * from info;
+----+----------+-------+
| id | name     | score |
+----+----------+-------+
|  1 | changzhi |  99.0 |
|  2 | zhizhi   |  18.0 |
+----+----------+-------+
2 rows in set (0.01 sec)

以上可見,數據庫輪流讀取兩臺從服務器上的數據

  • ④ 此時我們恢復兩臺從服務器的同步,然後在master服務器上查看數據表
mysql> select * from info;
+----+----------+-------+
| id | name     | score |
+----+----------+-------+
|  1 | changzhi |  99.0 |
+----+----------+-------+
1 row in set (0.00 sec)

mysql> 

再次證明,主從同步的放向是由slave向master單向同步的

總結:

伏筆~:devops 思想簡述

devops 也是雲計算的高階版,其中有三大塊方向

CI :持續性的集成

CD :持續性的交付

CD :持續性的部署

以上三點貫穿了整個軟件開發的思想

傳統軟件的開發思想如下

需求——》設計——》開發——》測試——》發佈

測試分爲:單元測試,項目的各個功能測試

項目測試:中間有個構建,make(把源碼文件轉化爲機器識別的二進制文件)

開發和測試是一個集成的過程,在git來回周折,也就是CI 持續集成

分層開發架構:三層

表示層:前端,效果 ( jsp html css…)

業務邏輯層:管理數據 (java c語言 php…)

持久層:數據庫 (mysql oracle…)

分佈式開發(微服務,docker容器,一個容器放一個服務,集合起來)

docker能夠解決部署問題。因爲起特性是無需載一底層環境,只要支持docker引擎就可以使用(難點在於服務之間的通訊)

因爲docker容器數量巨大,人爲管理不現實,所以有了羣集管理compose(編排工具只能管一臺) + machine(可以把一臺不是docker的節點,初始化轉化成docker節點並有資格加入到swarm羣集中) + swarm (羣集)

測試分爲:單元測試,項目的各個功能測試

項目測試:中間有個構建,make(把源碼文件轉化爲機器識別的二進制文件)

開發和測試是一個集成的過程,在git來回周折,也就是CI 持續集成

分層開發架構:三層

表示層:前端,效果 ( jsp html css…)

業務邏輯層:管理數據 (java c語言 php…)

持久層:數據庫 (mysql oracle…)

分佈式開發(微服務,docker容器,一個容器放一個服務,集合起來)

docker能夠解決部署問題。因爲起特性是無需載一底層環境,只要支持docker引擎就可以使用(難點在於服務之間的通訊)

因爲docker容器數量巨大,人爲管理不現實,所以有了羣集管理compose(編排工具只能管一臺) + machine(可以把一臺不是docker的節點,初始化轉化成docker節點並有資格加入到swarm羣集中) + swarm (羣集)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章