MySQL5.7安裝、主從複製、讀寫分離原理解析以及詳細配置

1、Linux下mysql完全卸載

  一、查看mysql的安裝狀況node

rpm -qa | grep -i mysql

   

  二、刪除上圖安裝的軟件mysql

rpm -ev mysql-community-libs-5.7.27-1.el6.x86_64 --nodeps

  三、都刪除成功以後,查找相關的mysql的文件linux

find / -name mysql

   

  四、刪除所有相關文件sql

rm -rf /var/lib/mysql rm -rf /var/lib/mysql/mysql rm -rf /etc/logrotate.d/mysql rm -rf /usr/share/mysql rm -rf /usr/bin/mysql rm -rf /usr/lib64/mysql

  五、再次執行命令數據庫

rpm -qa | grep -i mysql

  若是沒有顯式則表示卸載完成。vim

2、MySQL5.7安裝步驟

  一、查看系統中是否自帶安裝mysql安全

yum list installed | grep mysql

    

  二、刪除系統自帶的mysql及其依賴(防止衝突)服務器

yum -y remove mysql-libs.x86_64

   

  三、安裝wget命令架構

yum install wget -y

     

  四、給CentOS添加rpm源,而且選擇較新的源併發

wget dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm

     

  五、安裝下載好的rpm文件

yum install mysql-community-release-el6-5.noarch.rpm -y

   

  六、安裝成功以後,會在/etc/yum.repos.d/文件夾下增長兩個文件

   

  這兩個文件是幫助mysql安裝的。
  七、修改mysql-community.repo文件

  原文件:

   

   修改以後:

     

  八、使用yum安裝mysql

yum install mysql-community-server -y

     

  九、啓動mysql服務並設置開機啓動

#啓動mysql服務 service mysqld start #設置mysql開機啓動 chkconfig mysqld on

    

  十、獲取mysql的臨時密碼

grep "password" /var/log/mysqld.log

   

  十一、使用臨時密碼登陸

mysql -uroot -p #輸入密碼

  十二、修改密碼

-- 修改密碼複雜度
set global validate_password_policy=0; set global validate_password_length=1; -- 修改密碼
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';

     

  1三、修改遠程訪問權限

grant all privileges on *.* to 'root'@'%' identified by '123456' with grant option; flush privileges;

     

   

  1四、設置字符集爲utf-8

#在[mysqld]部分添加: character-set-server=utf8 #在文件末尾新增[client]段,並在[client]段添加: default-character-set=utf8

  若是安裝過程當中有任何錯誤,能夠查看日誌:/var/log/mysqld.log。

3、mysql主從複製原理

  0、爲何須要主從複製?

  • 在業務複雜的系統中,有這麼一個情景,有一句sql語句須要鎖表,致使暫時不能使用讀的服務,那麼就很影響運行中的業務,使用主從複製,讓主庫負責寫,從庫負責讀,這樣,即便主庫出現了鎖表的情景,經過讀從庫也能夠保證業務的正常運做。
  • 作數據的熱備
  • 架構的擴展。業務量愈來愈大,I/O訪問頻率太高,單機沒法知足,此時作多庫的存儲,下降磁盤I/O訪問的頻率,提升單個機器的I/O性能。

  一、什麼是mysql的主從複製?

  MySQL 主從複製是指數據能夠從一個MySQL數據庫服務器主節點複製到一個或多個從節點。MySQL 默認採用異步複製方式,這樣從節點不用一直訪問主服務器來更新本身的數據,數據的更新能夠在遠程鏈接上進行,從節點能夠複製主數據庫中的全部數據庫或者特定的數據庫,或者特定的表。

  二、mysql複製原理

  • master服務器將數據的改變記錄二進制binlog日誌,當master上的數據發生改變時,則將其改變寫入二進制日誌中;
  • slave服務器會在必定時間間隔內對master二進制日誌進行探測其是否發生改變,若是發生改變,則開始一個I/OThread請求master二進制事件
  • 同時主節點爲每一個I/O線程啓動一個dump線程,用於向其發送二進制事件,並保存至從節點本地的中繼日誌中,從節點將啓動SQL線程從中繼日誌中讀取二進制日誌,在本地重放,使得其數據和主節點的保持一致,最後I/OThread和SQLThread將進入睡眠狀態,等待下一次被喚醒。

  也就是說:

  •  從庫會生成兩個線程,一個I/O線程,一個SQL線程;
  •  I/O線程會去請求主庫的binlog,並將獲得的binlog寫到本地的relay-log(中繼日誌)文件中;
  •  主庫會生成一個log dump線程,用來給從庫I/O線程傳binlog;
  •  SQL線程,會讀取relay log文件中的日誌,並解析成sql語句逐一執行;

  注意:

  •  master將操做語句記錄到binlog日誌中,而後授予slave遠程鏈接的權限(master必定要開啓binlog二進制日誌功能;一般爲了數據安全考慮,slave也開啓binlog功能)。
  •  slave開啓兩個線程:IO線程和SQL線程。其中:IO線程負責讀取master的binlog內容到中繼日誌relay log裏;SQL線程負責從relay log日誌裏讀出binlog內容,並更新到slave的數據庫裏,這樣就能保證slave數據和master數據保持一致了。
  •  Mysql複製至少須要兩個Mysql的服務,固然Mysql服務能夠分佈在不一樣的服務器上,也能夠在一臺服務器上啓動多個服務。
  •  Mysql複製最好確保master和slave服務器上的Mysql版本相同(若是不能知足版本一致,那麼要保證master主節點的版本低於slave從節點的版本)。
  •  master和slave兩節點間時間需同步(能夠配置ntp訪問同一個時鐘源)。

        

  具體步驟:

  • 從庫經過手工執行change master to 語句鏈接主庫,提供了鏈接的用戶一切條件(user 、password、port、ip),而且讓從庫知道,二進制日誌的起點位置(file名 position 號); start slave。
  • 從庫的IO線程和主庫的dump線程創建鏈接。
  • 從庫根據change master to 語句提供的file名和position號,IO線程向主庫發起binlog的請求。
  • 主庫dump線程根據從庫的請求,將本地binlog以events的方式發給從庫IO線程。
  • 從庫IO線程接收binlog events,並存放到本地relay-log中,傳送過來的信息,會記錄到master.info中。
  • 從庫SQL線程應用relay-log,而且把應用過的記錄到relay-log.info中,默認狀況下,已經應用過的relay 會自動被清理purge。

  三、mysql主從形式

  一主一從

           

  主主複製

          

  一主多從

          

  多主一從

          

  聯級複製

          

 4、mysql主從複製安裝配置

  一、在兩臺數據庫中分別建立數據庫

--注意兩臺必須所有執行,數據庫名根據須要自行定義。
create database msb;

  2、在主服務器進行以下配置:

# 修改配置文件,執行如下命令打開mysql配置文件 vi /etc/my.cnf  # 在mysqld模塊中添加以下配置信息 # 二進制文件名稱 log-bin=master-bin # 二進制日誌格式,有row、statement、mixed三種格式。 # row 指的是把改變的內容複製過去,而不是把命令在從服務器上執行一遍。 # statement 指的是在主服務器上執行的SQL語句,在從服務器上執行一樣的語句。MySQL默認採用基於語句的複製,效率比較高。 # mixed 指的是默認採用基於語句的複製,一旦發現基於語句的沒法精確的複製時,就會採用基於行的複製。 binlog-format=ROW #要求各個服務器的id必須不同 server-id=1 #同步的數據庫名稱 binlog-do-db=msb

  三、配置從服務器登陸主服務器的帳號受權

--受權操做
set global validate_password_policy=0; set global validate_password_length=1; grant replication slave on *.* to 'root'@'%' identified by '123456'; --刷新權限
flush privileges;

  四、從服務器的配置

# 修改配置文件,執行如下命令打開mysql配置文件 vi /etc/my.cnf
# 在mysqld模塊中添加以下配置信息
log-bin=master-bin #二進制文件的名稱 binlog-format=ROW #二進制文件的格式 server-id=2 #服務器的id

     

  五、重啓主服務器的mysqld服務

-- 重啓mysql服務
service mysqld restart -- 登陸mysql數據庫
mysql -uroot -p -- 查看master的狀態
show master status;

     

  六、重啓從服務器並進行相關配置

-- 重啓mysql服務
service mysqld restart -- 登陸mysql
mysql -uroot -p -- 鏈接主服務器
change master to master_host='IP地址',master_user='root',master_password='123456',master_port=3306,master_log_file='master-bin.000001',master_log_pos=154; -- 啓動slave
start slave -- 查看slave的狀態
show slave status \G

   

   只要字段Slave_IO_Running、Slave_SQL_Running兩個值都是Yes,那麼就表示從數據庫的IO線程、SQL線程從主數據庫同步數據成功。

  九、此時能夠在主服務器進行相關的數據添加、修改、刪除工做,再從服務器看相關的數據內容是否同步增長、修改或刪除。

5、Mysql讀寫分離介紹

  一、讀寫分離的介紹

         

​   MySQL讀寫分離基本原理是讓master數據庫處理寫操做,slave數據庫處理讀操做。master將寫操做的變動同步到各個slave節點。

​   MySQL讀寫分離能提升系統性能的緣由在於:

  • 物理服務器增長,機器處理能力提高。拿硬件換性能。
  • 主從只負責各自的讀和寫,極大程度緩解X鎖和S鎖爭用。
  • slave能夠配置myiasm引擎,提高查詢性能以及節約系統開銷。
  • master直接寫是併發的,slave經過主庫發送來的binlog恢復數據是異步。
  • slave能夠單獨設置一些參數來提高其讀的性能。
  • 增長冗餘,提升可用性。

  二、讀寫分離的配置

  2.一、硬件配置

  首先須要準備三臺機器:主數據庫、從數據庫、proxy服務器。

master 192.168.85.11 slave 192.168.85.12 proxy 192168.85.14

  2.二、首先在master和slave上配置主從複製

  讀寫分離配置有多種方式,本文介紹兩種方式:mysql-proxy方式(暫不是穩定版本)、Amoeba方式。

6、MySQL-Proxy實現MySQL讀寫分離

  一、下載mysql-proxy

https://downloads.mysql.com/archives/proxy/#downloads

  二、上傳軟件到proxy的機器

  直接經過xftp進行上傳。

  三、解壓安裝包

tar -zxvf mysql-proxy-0.8.5-linux-glibc2.3-x86-64bit.tar.gz

  四、修改解壓後的目錄

mv mysql-proxy-0.8.5-linux-glibc2.3-x86-64bit mysql-proxy

  五、進入mysql-proxy的目錄

cd mysql-proxy

  六、建立目錄

mkdir conf mkdir logs

  七、添加環境變量

# 打開/etc/profile文件 vi /etc/profile # 在文件的最後面添加一下命令 export PATH=$PATH:/root/mysql-proxy/bin

  八、執行命令讓環境變量生效

source /etc/profile

  九、進入conf目錄,建立文件並添加一下內容

vi mysql-proxy.conf

  添加內容

[mysql-proxy] user=root proxy-address=192.168.85.14:4040 proxy-backend-addresses=192.168.85.11:3306 proxy-read-only-backend-addresses=192.168.85.12:3306 proxy-lua-script=/root/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua log-file=/root/mysql-proxy/logs/mysql-proxy.log log-level=debug daemon=true

  十、開啓mysql-proxy

mysql-proxy --defaults-file=/root/mysql-proxy/conf/mysql-proxy.conf

  十一、查看是否安裝成功,打開日誌文件

cd /root/mysql-proxy/logs tail -100 mysql-proxy.log
# 內容以下:表示安裝成功
2019-10-11 21:49:41: (debug) max open file-descriptors = 1024 2019-10-11 21:49:41: (message) proxy listening on port 192.168.85.14:4040 2019-10-11 21:49:41: (message) added read/write backend: 192.168.85.11:3306 2019-10-11 21:49:41: (message) added read-only backend: 192.168.85.12:3306 2019-10-11 21:49:41: (debug) now running as user: root (0/0)

  十二、進行鏈接

# mysql的命令行會出現沒法鏈接的狀況,因此建議使用客戶端 mysql -uroot -p123456 -h192.168.85.14 -P 4040

7、Amoeba實現MySQL讀寫分離

  一、什麼是amoeba

  Amoeba(變形蟲)項目,專一 分佈式數據庫 proxy 開發。座落與Client、DB Server(s)之間。對客戶端透明。具備負載均衡、高可用性、sql過濾、讀寫分離、可路由相關的query到目標數據庫、可併發請求多臺數據庫合併結果。

  主要解決:

  • 下降數據切分帶來的複雜多數據庫結構。
  • 提供切分規則並下降數據切分規則給應用帶來的影響。
  • 下降 db 與客戶端的鏈接數。
  • 讀寫分離。

  二、爲何要用Amoeba

  目前要實現mysql的主從讀寫分離,主要有如下幾種方案:

  • 經過程序實現:網上不少現成的代碼,比較複雜,若是添加從服務器要更改多臺服務器的代碼。
  • 經過mysql-proxy實現:因爲mysql-proxy的主從讀寫分離是經過lua腳原本實現,目前lua的腳本的開發跟不上節奏,而寫沒有完美的現成的腳本,所以致使用於生產環境的話風險比較大,據網上不少人說mysql-proxy的性能不高。
  • 開發接口實現:這種方案門檻高,開發成本高,不是通常的小公司能承擔得起。
  • 利用Amoeba實現:Amoeba是阿里巴巴的國產開源項目,具備負載均衡、高可用性、sql過濾、讀寫分離、可路由相關的query到目標數據庫,而且安裝配置很是簡單。

  三、amoeba安裝

  3.一、首先安裝jdk,直接使用rpm包安裝便可。

  3.二、下載amoeba對應的版本https://sourceforge.net/projects/amoeba/,直接解壓便可。

  3.三、配置amoeba的配置文件。

  dbServers.xml:

<?xml version="1.0" encoding="gbk"?>
<!DOCTYPE amoeba:dbServers SYSTEM "dbserver.dtd">
<amoeba:dbServers xmlns:amoeba="http://amoeba.meidusa.com/">
        
    <dbServer name="abstractServer" abstractive="true">
        <factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory">
            <property name="connectionManager">${defaultManager}</property>
            <property name="sendBufferSize">64</property>
            <property name="receiveBufferSize">128</property>
                
            <!-- mysql port -->
            <property name="port">3306</property>
            
            <!-- mysql schema -->
            <property name="schema">msb</property>
            
            <!-- mysql user -->
            <property name="user">root</property>
            
            <property name="password">123456</property>
        </factoryConfig>

        <poolConfig class="com.meidusa.toolkit.common.poolable.PoolableObjectPool">
            <property name="maxActive">500</property>
            <property name="maxIdle">500</property>
            <property name="minIdle">1</property>
            <property name="minEvictableIdleTimeMillis">600000</property>
            <property name="timeBetweenEvictionRunsMillis">600000</property>
            <property name="testOnBorrow">true</property>
            <property name="testOnReturn">true</property>
            <property name="testWhileIdle">true</property>
        </poolConfig>
    </dbServer>

    <dbServer name="writedb" parent="abstractServer">
        <factoryConfig>
            <!-- mysql ip -->
            <property name="ipAddress">192.168.85.11</property>
        </factoryConfig>
    </dbServer>
    
    <dbServer name="slave" parent="abstractServer">
        <factoryConfig>
            <!-- mysql ip -->
            <property name="ipAddress">192.168.85.12</property>
        </factoryConfig>
    </dbServer>
    <dbServer name="myslave" virtual="true">
        <poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
            <!-- Load balancing strategy: 1=ROUNDROBIN輪詢 , 2=WEIGHTBASED權重 , 3=HA負載均衡-->
            <property name="loadbalance">1</property>
            
            <!-- Separated by commas,such as: server1,server2,server1 -->
            <property name="poolNames">slave</property>
        </poolConfig>
    </dbServer>
</amoeba:dbServers>

  amoeba.xml:

<?xml version="1.0" encoding="gbk"?>

<!DOCTYPE amoeba:configuration SYSTEM "amoeba.dtd">
<amoeba:configuration xmlns:amoeba="http://amoeba.meidusa.com/">

    <proxy>
    
        <!-- service class must implements com.meidusa.amoeba.service.Service -->
        <service name="Amoeba for Mysql" class="com.meidusa.amoeba.mysql.server.MySQLService">
            <!-- port -->
            <property name="port">8066</property>
            
            <!-- bind ipAddress -->
            <!-- <property name="ipAddress">127.0.0.1</property> -->
            
            <property name="connectionFactory">
                <bean class="com.meidusa.amoeba.mysql.net.MysqlClientConnectionFactory">
                    <property name="sendBufferSize">128</property>
                    <property name="receiveBufferSize">64</property>
                </bean>
            </property>
            
            <property name="authenticateProvider">
                <bean class="com.meidusa.amoeba.mysql.server.MysqlClientAuthenticator">
                    
                    <property name="user">root</property>
                    <property name="password">123456</property>
                    
                    <property name="filter">
                        <bean class="com.meidusa.toolkit.net.authenticate.server.IPAccessController">
                            <property name="ipFile">${amoeba.home}/conf/access_list.conf</property>
                        </bean>
                    </property>
                </bean>
            </property>
            
        </service>
        
        <runtime class="com.meidusa.amoeba.mysql.context.MysqlRuntimeContext">
            
            <!-- proxy server client process thread size -->
            <property name="executeThreadSize">128</property>
            
            <!-- per connection cache prepared statement size -->
            <property name="statementCacheSize">500</property>
            
            <!-- default charset -->
            <property name="serverCharset">utf8</property>
            
            <!-- query timeout( default: 60 second , TimeUnit:second) -->
            <property name="queryTimeout">60</property>
        </runtime>
        
    </proxy>
    
    <!-- Each ConnectionManager will start as thread manager responsible for the Connection IO read , Death Detection -->
    <connectionManagerList>
        <connectionManager name="defaultManager" class="com.meidusa.toolkit.net.MultiConnectionManagerWrapper">
            <property name="subManagerClassName">com.meidusa.toolkit.net.AuthingableConnectionManager</property>
        </connectionManager>
    </connectionManagerList>
    
        <!-- default using file loader -->
    <dbServerLoader class="com.meidusa.amoeba.context.DBServerConfigFileLoader">
        <property name="configFile">${amoeba.home}/conf/dbServers.xml</property>
    </dbServerLoader>
    
    <queryRouter class="com.meidusa.amoeba.mysql.parser.MysqlQueryRouter">
        <property name="ruleLoader">
            <bean class="com.meidusa.amoeba.route.TableRuleFileLoader">
                <property name="ruleFile">${amoeba.home}/conf/rule.xml</property>
                <property name="functionFile">${amoeba.home}/conf/ruleFunctionMap.xml</property>
            </bean>
        </property>
        <property name="sqlFunctionFile">${amoeba.home}/conf/functionMap.xml</property>
        <property name="LRUMapSize">1500</property>
        <property name="defaultPool">master</property>
<!-- 此處定義的寫池取自dbServer.xml配置中的master --> <property name="writePool">master</property>
     <!-- 此處定義的讀池配置取自dbServers.xml配置中的myslave -->
<property name="readPool">myslave</property> <property name="needParse">true</property> </queryRouter> </amoeba:configuration>

  四、啓動amoeba

/root/amoeba-mysql-3.0.5-RC/bin/launcher

  若是啓動過程當中報如下錯誤:

   

 

   則是由於棧空間過小了,所以能夠修改配置jvm.properties。

vim /root/amoeba-mysql-3.0.5-RC/jvm.properties

  找到JVM_OPTIONS配置項修改爲以下配置 (能夠根據自身機器性能調節):

    

  而後從新啓動Amoeba

  五、測試Amoeba

--測試的sql --在安裝amoeba的服務器上登陸mysql
mysql -h192.168.85.13 -uroot -p123 -P8066 --分別在master、slave、amoeba上登陸mysql
use msb select * from user; --在amoeba上插入數據
insert into user values(2,2); --在master和slave上分別查看錶中的數據
select * from user; --將master上的mysql服務中止,繼續插入數據會發現插入不成功,可是可以查詢 --將master上的msyql服務開啓,中止slave上的mysql,發現插入成功,可是不可以查詢
相關文章
相關標籤/搜索