1. 程式人生 > >搭建 MySQL主從復制與讀寫分離

搭建 MySQL主從復制與讀寫分離

ast round running mysql配置 一個表 mysql主從 安全性 配置 tab

搭建 MySQL主從復制與讀寫分離

案例概述 :

在實際環境中 ,如果對數據庫的讀和寫都在同一個數據庫服務中操作 ,無論實在安全性、高可用性,
還是高並發等各個方面都是完全不能滿足實際需求的 ,因此 ,一般來說都只通過主從復制的方式來同
步數據 ,在通過讀寫分離來提升數據庫的並發負載能力 ,這樣的方案來進行部署與實施 。

環境拓補圖 :

技術分享圖片

本案環境 :

主機 操作系統 IP地 址 主要軟件
主服務器 CentOS 7.3 x86_64 192.168.217.130 NTP
從服務器1 CentOS 7.3 x86_64 192.168.217.131 ntpdate
從服務器2 CentOS 7.3 x86_64 192.168.217.132 ntpdate
amoeda CentOS 7.3 x86_64 192.168.217.129 jdk-6u14-linux-x64.bin amoeba-mysql-binary-2.2.0.tar.gz
客戶端 CentOS 7.3 x86_64 192.168.217.128 mysql

案例實施:

配置主服務器 :

  1. 在主服務器上搭建時間同步服務, 安裝NTP :

    yum install ntp -y
  2. 配置 NTP :

    vim /etc/ntp.conf                             #編輯配置文件 添加
    server 127.127.217.0                     #設置本地是時鐘源
    fudge 127.127.217.0 stratum 8      #設置時間層級為8(限制在15內)
    #127.127  ntp時間服務器的保留ip地址,作用是使用本機作為客戶端的時間服務器
  3. 開啟服務 :

    systemctl start ntpd.service 
    systemctl stop firewalld.service 
    setenforce 0
  4. 配置 MySQL 配置文件 :

    vim /etc/my.cnf        #在配置文件添加
    [mysqld]                     
    server-id = 11                    #修改   ID 主從不一樣
    log-bin=master-bin            #開啟二進制日誌
    log-slave-updates=true     #開啟從服務器同步主服務器二進制日誌
  5. 重啟服務, 進入數據庫給從服務器授權 :

    systemctl restart mysqld.service 
    mysql -u root  -p
    mysql>GRANT REPLICATION SLAVE ON *.* TO ‘myslave‘@‘192.168.217.%‘ IDENTIFIED BY ‘123456‘;
    #允許從服務器使用 myslave賬戶 登錄數據庫 
    mysql> FLUSH PRIVILEGES;    #刷新權限
    mysql> show master status;       #查看主服務器狀態
    +-------------------+----------+--------------+------------------+-------------------+
    | File              | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
    +-------------------+----------+--------------+------------------+-------------------+
    | master-bin.000001 |      604 |              |                  |                   |
    +-------------------+----------+--------------+------------------+-------------------+
    1 row in set (0.00 sec)

    記住主服務器的二進制日誌文件名和偏移量 。

配置從服務器 :

  1. 安裝 ntpdate 同步時間 :

    yum install ntpdate -y      #從服務器上安裝的 
    [root@localhost ~]# systemctl start ntpdate.service                   #開啟服務
    [root@localhost ~]# /usr/sbin/ntpdate 192.168.217.130            #時間同步
    6 Jul 09:45:44 ntpdate[2941]: adjust time server 192.168.217.130 offset -0.233224 sec   #同步成功
    systemctl stop firewalld.service 
    setenforce 0
  2. 配置MySQL配置文件 :

    vim /etc/my.cnf
    [mysqld]    
    server-id = 12      # id 不一樣  別一臺從服務器同樣配置 id 不同即可
    relay-log=relay-log-bin      #開啟中繼日誌
    relay-log-index=slvae-relay-bin.index      #指定位置和名稱
  3. 重啟服務 ,進入mysql :

    systemctl restart mysqld.service 
    mysql -u root -p
    mysql> change master to master_host=‘192.168.217.130‘,master_user=‘myslave‘,master_password=‘123456‘,master_log_file=‘master-bin.000001‘,master_log_pos=604;   
    #  主服務器地址、授權用戶、二進制日誌名稱、偏移量 。
    mysql> start slave;   # 開啟從服務器
    mysql> show slave status\G;                 #查看從服務器狀態
    *************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.217.130
                  Master_User: myslave
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: master-bin.000001
          Read_Master_Log_Pos: 604
               Relay_Log_File: relay-log-bin.000002
                Relay_Log_Pos: 321
        Relay_Master_Log_File: master-bin.000001
             Slave_IO_Running: Yes                # 兩個為yes 表示同步中
            Slave_SQL_Running: Yes              

配置 Amoeda 代理服務器 :

  1. 配置 java 環境變量 :

    cp jdk-6u14-linux-x64.bin /usr/local/
    cd /usr/local/
    ./jdk-6u14-linux-x64.bin     #運行jdk
    #之後輸入yes 或者 按回車鍵即可
    mv jdk1.6.0_14/ /usr/local/jdk1.6     #重命名
    vi /etc/profile     # 添加
    export JAVA_HOME=/usr/local/jdk1.6      #java家目錄
    export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib     #指定運行庫
    export PATH=$JAVA_HOME/lib:$JAVA_HOME/jre/bin/:$PATH:$HOME/bin     #識別java命令
    export AMOEBA_HOME=/usr/local/amoeba     #指定amoeba家目錄
    export PATH=$PATH:$AMOEBA_HOME/bin     # amoeba命令
    source /etc/profile     #刷新環境變量
  2. 配置 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
    amoeba start|stop     #出現 amoeba start|stop 說明 amoeba 安裝成功
  3. 配置 amoeba 讀寫分離 :

    mysql> grant all on *.* to ‘test‘@‘192.168.217.%‘ identified by ‘abcabc‘;
    #在三臺mysql上添加權限開放給amoeba訪問
    cd /usr/local/amoeba
    vim conf/amoeba.xml     #編輯 amoeba 配置文件
    30<property name="user">amoeba</property>   #第30、32行 用戶名 密碼  這是客戶端訪問 amoeba 所需要的賬戶密碼
    31 
    32 <property name="password">123456</property>
    # 把註釋去掉 開啟服務
    115<property name="defaultPool">master</property>     #修改 默認池
    116<property name="writePool">master</property>     #修改 寫入池   寫操作寫 mysql 主服務器
    117<property name="readPool">slaver</property>     #修改 讀入池   讀操作讀 mysql 從服務器
  4. 配置 dbServers.xml 配置文件 :

    vim conf/dbServers.xml   
    23                         <property name="schema">test</property>   
    #把這句話註釋  或者在mysql主服務器創建一個test數據庫 ,再或者把test修改成mysql主服務器已經存在的數據庫名
    
    25                         <property name="user">test</property>     #允許amoeba 訪問數據庫 的賬戶密碼
    26                         # 把註釋去掉 開啟服務
    27                         <property name="password">abcabc</property>
    42         <dbServer name="master"  parent="abstractServer">      #修改  MySQL 主服務器名稱
    43                 <factoryConfig> 
    44                         <!-- mysql ip -->
    45                         <property name="ipAddress">192.168.217.130</property>      #修改    主服務器 IP 地址
    49         <dbServer name="slave1"  parent="abstractServer">     #修改  MySQL 從服務器名稱
    50                 <factoryConfig>
    51                         <!-- mysql ip -->
    52                         <property name="ipAddress">192.168.217.131</property>      #修改    從服務器 IP 地址
    53                 </factoryConfig>
    54         </dbServer>
    55 #添加 slave2 
    56         <dbServer name="slave2"  parent="abstractServer">      #MySQL 從服務器名稱
    57                 <factoryConfig>
    58                         <!-- mysql ip -->
    59                         <property name="ipAddress">192.168.217.132</property>      # 從服務器 IP 地址
    60                 </factoryConfig>
    61         </dbServer>
    62         <dbServer name="slaves" virtual="true">     #定義 slaves 池
    63                 <poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
    64                         <!-- Load balancing strategy: 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-->
    65                         <property name="loadbalance">1</property>
    66 
    67                         <!-- Separated by commas,such as: server1,server2,server1 -->
    68                         <property name="poolNames">slave1,slave2</property>     #修改 slaves 池 所包含slave1 、slave2
    69                 </poolConfig>
  5. 啟動 amoeba 服務 :

    /usr/local/amoeba/bin/amoeba start &     #後臺啟動
    netstat -anpt | grep java     #查看8066端口
    systemctl stop firewalld.service 
    setenforce 0

    配置客戶端 :

  6. 在客戶端安裝 mysql :

    yum install -y mysql
    mysql -u amoeba -p123456 -h 192.168.217.129 -P8066     #鏈接 amoeba 代理服務   ip地址是 amoeba 地址

讀寫分離測試 :

  1. 在客戶端創建一個表 ,查看主從服務器是否創建 。

  2. 在一臺mysql從服務器表內插入信息 ,在客戶端進行查看到的信息應該是一下有信息 、一下沒有信息 。因為在讀取mysql從服務器是輪流讀取 。

    ps:數據庫授權給 amoeba 訪問的權限賬戶 、密碼和 amoeba 給客戶端授予的權限賬戶 、密碼不要搞錯 。

搭建 MySQL主從復制與讀寫分離