MySQL讀寫分離

MySQL讀寫分離

  • 讀寫分離就是隻在主服務器上寫,只在從服務器上讀
  • 主數據庫處理事務性查詢,從而數據庫處理select查詢
  • 數據庫複製被用來把事務性查詢導致的變更同步到集羣中的從數據庫
    MySQL讀寫分離
    案例實施
  • 所有服務器關閉firewalld或者進行規則設置
  • 搭建mysql主從複製環境
  • Amoeba服務器環境安裝
    MySQL讀寫分離
    配置amoeba讀寫分離,兩個slave讀負載均衡
  • mysql1、mysql2和mysql3中執行以下操作開放權限給Amoeba
    MySQL讀寫分離
    修改amoeba配置文件
    /usr/local/amoeba/conf/amoeba.xml
    MySQL讀寫分離
    MySQL讀寫分離
  • /usr/local/amoeba/conf/dbServers.xml
    MySQL讀寫分離
    MySQL讀寫分離
    MySQL讀寫分離
    啓動Amoeba軟件
    MySQL讀寫分離
    測試讀負載均衡
    客戶機訪問數據庫
    MySQL讀寫分離
    在數據庫db_test中創建zang,並自動同步到2臺從服務器
    MySQL讀寫分離
    兩臺從服務器數據庫中關閉主從複製
    MySQL讀寫分離
    分別在mysql1、mysql2、mysql3的zang表中上插入不同的數據
    MySQL讀寫分離
    實操
    在amoeba服務器上安裝amoeba需要先安裝jdk依賴包

    cp jdk-6u14-linux-x64.bin /usr/local
    [root@amoeba abc]# cd /usr/local
    [root@amoeba local]# ls
    bin           etc    include                 lib    libexec  share  tomcat9
    boost_1_59_0  games  jdk-6u14-linux-x64.bin  lib64  sbin     src
    [root@amoeba local]# ./jdk-6u14-linux-x64.bin 
    //more,往下回車繼續看,直到讓你輸入yes
    Do you agree to the above license terms? [yes or no]
    yes
    Press Enter to continue.....
    Done

    改個名字,便於管理

    [root@amoeba local]# mv jdk1.6.0_14/ /usr/local/jdk1.6
    [root@amoeba local]# ls
    bin           etc    include  jdk-6u14-linux-x64.bin  lib64    sbin   src
    boost_1_59_0  games  jdk1.6   lib                     libexec  share  tomcat9

    優化環境變量

    [root@amoeba local]# 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
    [root@amoeba local]# source /etc/profile
    [root@amoeba local]# echo $PATH
    /usr/local/jdk1.6/lib:/usr/local/jdk1.6/jre/bin/:/usr/java/jdk1.8.0_201-amd64/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/root/bin:/usr/local/amoeba/bin

    依賴包安裝完畢,接下來解壓amoeba源碼包

    [root@amoeba local]# mkdir /usr/local/amoeba
    [root@amoeba local]# cd /abc
    [root@amoeba abc]# tar zxvf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/
    [root@amoeba abc]# chmod -R 755 /usr/local/amoeba/
    [root@amoeba abc]# /usr/local/amoeba/bin/amoeba
    amoeba start|stop

    這個時候amoeba已經裝好了,接下來綁定三臺節點服務器,amoeba需要獲得相應的權限的賬號
    對所有的數據庫進行配置

    mysql> grant all on *.* to test@'192.168.247.%' identified by '123.com';
    Query OK, 0 rows affected (0.01 sec)

    回到amoeba服務器繼續配置

    [root@amoeba abc]# cd /usr/local/amoeba/
    [root@amoeba amoeba]# vim conf/amoeba.xml 
    30                                         <property name="user">amoeba</property>
    //這裏是數據庫訪問amoeba服務器時使用的賬號
    31 
    32                                         <property name="password">123123</property>
    //這裏是數據庫訪問amoeba服務器時使用賬號時用的密碼 
    115                 <property name="defaultPool">master</property>
    116 
    117                 <!-- -->        //取消下面的註釋符號-->,改到這裏
    118                 <property name="writePool">master</property>
    119                 <property name="readPool">slaves</property>
    120                 <property name="needParse">true</property>

    設置服務器文件/usr/local/amoeba/conf/dbServers.xml

    [root@amoeba amoeba]# cd conf/
    [root@amoeba conf]# ls
    access_list.conf  amoeba.xml    dbServers.xml  functionMap.xml  log4j.xml  ruleFunctionMap.xml
    amoeba.dtd        dbserver.dtd  function.dtd   log4j.dtd        rule.dtd   rule.xml
    [root@amoeba conf]# vim dbServers.xml 
    25                         <!-- mysql user -->
    26                         <property name="user">test</property>
    //這裏是amoeba訪問mysql時使用的賬號
    27 
    28                         <!--  mysql password -->
    29                         <property name="password">123.com</property>
    //這裏是amoeba訪問mysql時使用賬號的密碼
    
    44         <dbServer name="master"  parent="abstractServer">
    45                 <factoryConfig>
    46                         <!-- mysql ip -->
    47                         <property name="ipAddress">192.168.247.160</property>
    48                 </factoryConfig>
    49         </dbServer>
    50 
    //上面6行是指定主服務器的地址
    51         <dbServer name="slave1"  parent="abstractServer">
    52                 <factoryConfig>
    53                         <!-- mysql ip -->
    54                         <property name="ipAddress">192.168.247.161</property>
    55                 </factoryConfig>
    56         </dbServer>
    57 
    //上面6行是指定從服務器1的地址
    58         <dbServer name="slave2"  parent="abstractServer">
    59                 <factoryConfig>
    60                         <!-- mysql ip -->
    61                         <property name="ipAddress">192.168.247.154</property>
    62                 </factoryConfig>
    63         </dbServer>
    64  
    //在原配置文件中,上面6行不存在,此處是由複製粘貼的得來,是指定從服務器2的地址       
    65         <dbServer name="slaves" virtual="true">
    //此處設置從服務器地址池slaves
    66                 <poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
    67                         <!-- Load balancing strategy: 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-->
    68                         <property name="loadbalance">1</property>
    69 
    70                         <!-- Separated by commas,such as: server1,server2,server1 -->
    71                         <property name="poolNames">slave1,slave2</property>
    //此處填入從服務器名
    72                 </poolConfig>
    73         </dbServer>

    開啓amoeba服務
    保存退出配置文件,開啓amoeba服務,因爲它內部有一個實時監控,持續性開啓,所以需要在後臺啓動,而且無法再進行命令操作,若想再對它進行操作,可以重新開啓一臺遠程,去連接
    驗證

    [root@client ~]# systemctl stop firewall
    Failed to stop firewall.service: Unit firewall.service not loaded.
    [root@client ~]# setenforce 0
    [root@client ~]# yum install mysql -y
    //安裝mysql去連接即可,client不需要安裝數據庫取存儲數據
    [root@client ~]# mysql -u amoeba -p123123 -h 192.168.247.206 -P8066
    //連接amoeba服務器
    mysql: [Warning] Using a password on the command line interface can be insecure.
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 494299142
    Server version: 5.1.45-mysql-amoeba-proxy-2.2.0 Source distribution
    Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.
    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    mysql> 

    此時先查看一下主服務器mysql中的數據庫,此時school中是沒有數據的

    mysql> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    | performance_schema |
    | school             |
    | test               |
    +--------------------+
    5 rows in set (0.01 sec)
    mysql> show tables;
    ERROR 1046 (3D000): No database selected
    mysql> use school;
    Database changed
    mysql> show tables;
    Empty set (0.00 sec)

    回到鏈接到amoeba服務器的客戶端client,創建school數據庫

    mysql> 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.11 sec)
    mysql> desc info;
    +-------+--------------+------+-----+---------+-------+
    | Field | Type         | Null | Key | Default | Extra |
    +-------+--------------+------+-----+---------+-------+
    | id    | int(4)       | NO   | PRI | NULL    |       |
    | name  | varchar(10)  | NO   |     | NULL    |       |
    | score | decimal(4,1) | NO   |     | NULL    |       |
    +-------+--------------+------+-----+---------+-------+
    3 rows in set (0.02 sec)
    mysql> use school;
    Database changed
    mysql> show tables;
    +------------------+
    | Tables_in_school |
    +------------------+
    | info             |
    +------------------+
    1 row in set (0.00 sec)

    下面就開始做讀寫分離實驗;

    mysql> stop slave;
    Query OK, 0 rows affected (0.01 sec)
    mysql> show slave status\G
    *************************** 1. row ***************************
               Slave_IO_State: 
                  Master_Host: 192.168.247.160
                  Master_User: myslave
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: master-bin.000001
          Read_Master_Log_Pos: 900
               Relay_Log_File: relay-log-bin.000002
                Relay_Log_Pos: 772
        Relay_Master_Log_File: master-bin.000001
    ‘             Slave_IO_Running: No
    ’            Slave_SQL_Running: No
        Seconds_Behind_Master: NULL
             Master_Server_Id: 11
                  Master_UUID: e9a82741-3223-11ea-af25-000c29524d89
             Master_Info_File: /home/mysql/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
           Master_Retry_Count: 86400
    1 row in set (0.00 sec)
    mysql> 

    此時在客戶端寫如數據,然後到主服務器查看,發現寫入成功

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

    在從服務器在此查看

    mysql> select * from school.info;
    Empty set (0.00 sec)
    mysql> 

    由此可以發現讀寫已經分離,讀從服務器,寫主服務器
    此時在從服務器1內寫入數據

    mysql>  insert into info (id,name,score) values (2,'lisi',99);
    Query OK, 1 row affected (0.01 sec)

    此時在從服務器2內寫入數據

    mysql>  insert into school.info (id,name,score) values (3,'wangwu',60);
    Query OK, 1 row affected (0.01 sec)

    此時再到客戶端去讀取數據,可以發現實在輪流依次讀取兩臺從服務器上的數據
    MySQL讀寫分離
    開啓同步後在此檢驗
    MySQL讀寫分離

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