MySQLはコピーと読み書きから分離されています。


前言
企業の実用的なアプリケーションでは、成熟した業務のデータ量は比較的大きいが、単一のMySQLサーバーは、安全性、高利用性、高合併性のいずれにおいても、実際のニーズを満たすことができず、複数のMySQLサーバ(Master-Selave)において、コピーから同期データを実現し、読み書き分離によってデータベースの同時負荷能力を向上させることができます。ちょっとrsyncに似ていますが、rsyncはディスクファイルのバックアップをしています。mysqlのコピーはデータベースのデータ、文のバックアップをしています。
一、関連概要
メインコピー:メインデータベースから更新イベントをデータベースから読み込み、更新記録を実行します。データベースからメインデータベースと一致するようにします。
(一)MySQLサポートのコピータイプ
  • 文のコピーに基づいて(STATEMENT)。メインライブラリで実行されるSQL文は、ライブラリから同じステートメントを実行します。MySQLはデフォルトではステートメントベースのコピーを採用しており、効率が高いです。
  • 行に基づくコピー(ROW)。変更した内容をコピーして、ライブラリから命令を一回実行するのではありません。
  • ハイブリッドタイプのコピー(MIXED)。デフォルトでは、ステートメントベースのコピーを使用していますが、ステートメントに基づいて正確にコピーできないことがわかったら、行ベースのコピーを使用します。
  • (二)MySQL主にコピーされた作業過程
    在这里插入图片描述
    1.マスターサーバはバイナリログに保存します。
  • MySQLメインライブラリで行われた増減、削除、改変のデータ更新は、順番に自分のバイナリログ
  • に書き込みます。
    2.Slaveサーバはマスターサーバのログをコピーします。
  • その後、MySQLはライブラリからI/Oスレッドをメインライブラリに接続し、メインライブラリのバイナリログを読み取り、サーバからの==中継ログ==にバックアップする。メインライブラリについていくと、眠っていて、マスターが新しいイベントを生み出すのを待っています。I/Oスレッドはこれらのイベントを中継ログ
  • に書き込みます。
    3.Slaveサーバがコピーしたログを再生する
  • は次にライブラリからSQLスレッドを開き、SQLスレッドはI/Oスレッドに書き込まれた中継ログを読み取り、中継ログの内容に応じてライブラリからのデータを更新し、メインライブラリのデータと一致させる。
    重点:コピープロセスには重要な制限があります。すなわち、Slaveにコピーするのはシリアル化されています。つまり、Master上の並列更新操作はSlave上で並行操作できません。
    二、読み書き分離
    (1)読み書き分離の概念
    読みと書きの分離:読みと書きの分離はメインサーバーにだけ書いて、サーバーから読むだけです。基本的な原理はメインデータベースに事務性の増加、変更、削除操作(INSERT、UPDATE、DELETE)を処理させて、データベースからSELECT検索操作を処理することです。データベースコピーは、トランザクション操作による変更をクラスタ内のデータベースから同期させるために使用されます。
    (2)読み書き分離の役割
  •  データベースの「書き込み」(10000本のデータを書くと3分かかります。)操作は時間がかかります。しかし、データベースの「読み」(10000本のデータを読むと5秒しかかかりません。)
  • ですので、読み書き分離は、データベースの書き込みがクエリの効率に影響を及ぼします。注意:データベースは必ずしも読み書き分離しなくてもいいです。もしプログラムがデータベースを多く使う場合、更新が少なく、問い合わせが多い場合は、使用を考慮します。データベースの主従同期を利用して、読み書き分離によってデータベース圧力を分担し、性能を向上させます。
    (3)MySQL読み書き分離原理
  • 読み書き分離とは、メインサーバにだけ書いて、サーバーから読む
  • だけです。
  • 基本的な原理は、メインデータベースにトランザクションクエリを処理させ、データベースからselectクエリを処理させることである。
  • データベースコピーを使用して、プライマリデータベース上のトランザクションクエリによる変更をクラスタ内のデータベース
  • に同期させる。
    (4)よくあるMySQL読み書き分離
    1)プログラムコード内部による実現
    1.コードの中でselect、insertによってルートの分類を行って、このような方法も現在の生産環境の応用が最も広範です。
    2.長所と短所:
  • の利点は、プログラムコードに実装されているので、追加のデバイスをハードウェア支出に追加する必要はない。
  • 欠点は開発者が実現するために必要なので、運営・維持者は手がつけられません。
  • 3.すべてのアプリケーションがプログラムコードの中で読み書き分離を実現するのに適しているわけではありません。大型複雑なJavaアプリケーションのように、プログラムコードの中で読み書き分離を実現すれば、コードの変更が大きいです。
    2)中間代理層に基づいて実現する。
    1.プロキシは一般的にクライアントとサーバの間にあり、プロキシはクライアントの要求を受けた後、判断後にバックエンドデータベースに転送する。以下の代表的なプログラムがある。
  • MySQL-Proxy:MySQL-ProxyはMySQLのオープンソースプロジェクトで、自身のluaスクリプトでSQLの判断を行います。
  • Atlas:奇虎360のWebプラットフォーム部基礎アーキテクチャチームによって開発・維持されたMySQLプロトコルに基づくデータ中間層プロジェクトである。これはmysql-proxy 0.8.2バージョンに基づいて最適化され、いくつかの新しい機能特性が追加されました。360内部でAtlasが運行するmysql業務を使って、毎日積載する読み書き要求数は数十億件に達しています。物事および保存プロセスをサポートします。
  • Amoeba:陳思儒によって開発され、作者はアリババに就職しました。このプログラムはJava言語で開発され、アリババは生産環境に利用されます。しかし、トランザクションとストレージプロセスはサポートされていません。
  • 2.MySQL Proxyを使うために大量のLualスクリプトを書く必要があります。これらのLuaスクリプトは既成のものではなく、自分で作成する必要があります。これはMySQL Proxy内蔵変数とMySQL Protocolを知らない人にとっては非常に難しいです。
    3.Amoebaは非常に使いやすく、移植性が非常に強いソフトウェアですので、生産環境ではデータベースのエージェント層に広く使われています。
    三、MySQLは主にコピー実験から展開する。
    必要な関連ソフトダウンバッグ
    amoeba-mysql-binary-2.20.tar.gz
    jdk-6 u 14-linux-x 64.bin
    mysql圧縮バッグ
    在这里插入图片描述
    (1)主従複製実験手順と準備
    実験ステップ
    第一歩:クライアントclientアクセス代理サーバamoeba
    第二ステップ:プロキシの読み書き判定
    書き込み操作:メインサーバに書き込みます。
    ステップ3:メインサーバは添削を自分のバイナリログに書き換えます。
    ステップ4:メインサーバのバイナリログをサーバから自己中継ログに同期する
    ステップ5:サーバから中継ログをデータベースに再生する
    読み取り操作:直接サーバにアクセスする
    最終結果:負荷を低減し、負荷バランスの役割を果たします。
    ホスト操作システムIPアドレスに必要なツール/ソフトウェア/インストールパッケージ
    Amoeba CentOS 7
     192.168.71.10
    jdk-6 u 14-linux-x 64.bin、amoeba-mysql-binary-2.20.tar.gz
    マスターセンター7
    192.168.71.12
    ntp、mysql-boots-5.20.tar.gz
    Slave 1 CentOS 7
    192.168.71.13
    ntp、ntpdate、mysql-boots-5.20.tar.gz
    Slave 2 CentOS 7
    192.168.71.14
    ntp、ntpdate、mysql-boots-5.20.tar.gz
    クライアントセンター
    192.168.71.15
    1.ファイアウォールの閉鎖と安全メカニズム
    4台のサーバーはすべてシャットダウンします。
    
    systemctl stop firewalld
    systemctl disable firewalld
    setenforce 0
    2.設置時間同期サービスntp
    (1)メインサーバ
    
    yum -y install ntp
    
    vim /etc/ntp.conf
    ##---------    ---------
    server 127.127.71.0           #        ,      
    fudge 127.127.71.0 stratum 8  #       8(   15 )
    
    service ntpd start
    
    在这里插入图片描述
    (2)二つのサーバーから
    
    yum -y install ntp ntpdate
    
    service ntpd start
    
    /usr/sbin/ntpdate 192.168.71.12  #      ,  Master   IP
    
    crontab -e     #                  
    */30 * * * * /usr/sbin/ntpdate 192.168.71.12
    
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    3.メインサーバのmysql配置
    
    vim /etc/my.cnf
    server-id = 1
    log-bin=master-bin       #  ,           
    log-slave-updates=true   #  ,             
    
    systemctl restart mysqld
    
    mysql -u root -p
    grant replication slave on *.* to 'myslave'@'192.168.71.%' identified by '123'; #       
    #grant   
    #replication   
    #     192.168.71     123          
    
    flush privileges;
    
    show master status;
    #File       ,Fosition       
    
    在这里插入图片描述
    4.サーバーからのmysql配置
    Slave 1サーバ:192.168.163.13
    Slave 2サーバ:192.168.163.14
    1)プロファイルの変更
    
    vim /etc/my.cnf
    #  ,  id Master   ,  Slave id    
    server-id = 2
    
    #  ,      ,                 
    relay-log=relay-log-bin
    
    #  ,              
    relay-log-index=slave-relay-bin.index
    
    systemctl restart mysqld
    
    slaave 1
    在这里插入图片描述
    slaave 2
    在这里插入图片描述
    2)サーバからデータベースを操作する
    
    mysql -u root - p123
    change master to master_host='192.168.71.12',master_user='myslave',master_password='123',master_log_file='master-bin.000002',master_log_pos=306; #show master status;               
         #    ,  master_log_file  master_log_pos    Master     
    	 
    start slave;                     #    ,      reset slave;
    show slave status\G;             #  Slave   
    //   IO   SQL     Yes,      。
    Slave_IO_Running:Yes            #      io  
    Slave_SQL_Running:Yes           #     slave mysql  
    
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    5.検証結果
    メインサーバでライブラリを作成し、サーバーから確認します。
    在这里插入图片描述
    在这里插入图片描述
    四、MySQL読み書き分離実験
    Amoebaサーバ(192.168.153.30)
    Java環境のインストール
    Amoebaはjdk 1.5に基づいて開発されたので、公式の推奨はjdk 1.5または1.6バージョンで、高いバージョンは使用しないようにします。
    1)jdk java環境を作成する
    
    cd /opt/
    # jdk-6u14-linux-x64.bin   amoeba-mysql-binary-2.2.0.tar.gz   /opt   
    
    cp jdk-6u14-linux-x64.bin /usr/local/
    cd /usr/local/
    chmod +x jdk-6u14-linux-x64.bin
    ./jdk-6u14-linux-x64.bin
    // yes, enter
    
    mv jdk1.6.0_14/ /usr/1ocal/jdk1.6
    
    vim /etc/profile
    export JAVA_HOME=/usr/local/jdk1.6
    export CLASSPATH=SCLASSPATH:$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
    
    source /etc/profile
    java -version
    
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    2)Amoebaソフトのインストール
    
    mkdir /usr/local/amoeba
    tar zxvf /opt/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       
    
    在这里插入图片描述
    3)マスタサーバのmysqlに承認する
    マスターサーバ:192.168.71.12
    Slave 1サーバ:192.168.71.13
    Slave 2サーバ:192.168.71.14
    まずマスター、Slave 1、Slave 2のmysqlに公開権限をAmoebaに訪問します。
    
    grant all on *.* to 'test'@'192.168.163.%' identified by 'abc123';
    在这里插入图片描述
    4)アメーバサービスを配置してアメーバに配置する。
    
    cd /usr/local/amoeba/conf/
    
    cp amoeba.xml amoeba.xml.bak     #       
    vim amoeba.xml                   #  amoeba    
    
    <property name="user">amoeba</property>          #30   
    
    <property name="password">abc123</property>      #32         amoeba      
    
    <property.name="defaultPool">master</property>   #115         
    
    <property name="writePool">master</property>     #117        master   
    <property name="readPool">slaves</property>		 #slaves    
    
    在这里插入图片描述
    
    cp dbServers.xml dbServers.xml.bak
    vim dbServers.xml                     #         
    
    <!-- <property name="schema"> test</property> -->      #23 ,        :     test   mysql    test  ,   
    
    <property name="user">test</property>                  #26 ,                
    
    <property.name-"password">123</property>           #28-30 ,    
    
    <dbServer name= "master" parent="abstractServer">      #45 ,  ,        Master
    
    <property name= "ipAddress">192.168.71.12</property>  #48 ,  ,         
    
    <dbServer name="slave1"  parent="abstractServer">      #52 ,  ,        slave1
    
    <property.name="ipAddress">192.168.71.13</property>   #55 ,  ,      1   
    
    <dbServer name="slave2 " parent="abstractserver">      #59 ,    6   ,      2  slave2   
    <property, name="ipAddress">192.168.71.14</property>
    
    <dbServer name="slaves" virtual="true">                #65 ,  
    
    <property name="poolNames">slave1,slave2</property>    #71 ,  
    
    /usr/local/amoeba/bin/amoeba start&      #  Amoeba  , ctrl+c   
    netstat -anpt | grep java               #  8066      ,     TCP 8066
    
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    5)読みと書きの分離をテストします。
    クライアントサーバでテスト
    
    yum install -y mysql mysql-server #    mysql,         
    
    mysql -u amoeba -pabc123 -h 192.168.71.20 -P8066
    在这里插入图片描述
    メインサービスvからこの表が見えます。
    在这里插入图片描述
    amoebaサーバーエージェントでmysqlにアクセスし、クライアントを介してmysqlを接続した後に書き込んだデータはメインサービスのみ記録し、サーバーから同期します。
    
    stop slave;                                    #        
    use school;
    // slave1 :
    insert into test1 values('1','slave1');
    
    // slave2 :
    insert into test1 values('2','slave2');
    
    メインサーバにデータを挿入する
    
    insert into test1 values('3','master');
    クライアントにデータをテーブルに挿入する
    
    //        :
    use school;
    select * from test1;    //       slave1 s1ave2    ,                  ,             
    
    insert into test1 values('4','climet');   //           
    
    在这里插入图片描述
    メインサーバでデータを表示する
    在这里插入图片描述
    同時に二つのサーバーを開いて、テーブルレコードを確認します。
    在这里插入图片描述
    ここで、MySQLの詳細についてはコピーと読み書きから分離した文章を紹介します。MySQLの主はコピーと読み書きから分離した内容については、以前の文章を検索したり、下記の関連記事を見たりしてください。これからもよろしくお願いします。