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台のサーバーはすべてシャットダウンします。
(1)メインサーバ
(2)二つのサーバーから
3.メインサーバのmysql配置
4.サーバーからのmysql配置
Slave 1サーバ:192.168.163.13
Slave 2サーバ:192.168.163.14
1)プロファイルの変更
slaave 2
2)サーバからデータベースを操作する
5.検証結果
メインサーバでライブラリを作成し、サーバーから確認します。
四、MySQL読み書き分離実験
Amoebaサーバ(192.168.153.30)
Java環境のインストール
Amoebaはjdk 1.5に基づいて開発されたので、公式の推奨はjdk 1.5または1.6バージョンで、高いバージョンは使用しないようにします。
1)jdk java環境を作成する
2)Amoebaソフトのインストール
3)マスタサーバのmysqlに承認する
マスターサーバ:192.168.71.12
Slave 1サーバ:192.168.71.13
Slave 2サーバ:192.168.71.14
まずマスター、Slave 1、Slave 2のmysqlに公開権限をAmoebaに訪問します。
4)アメーバサービスを配置してアメーバに配置する。
5)読みと書きの分離をテストします。
クライアントサーバでテスト
メインサービスvからこの表が見えます。
amoebaサーバーエージェントでmysqlにアクセスし、クライアントを介してmysqlを接続した後に書き込んだデータはメインサービスのみ記録し、サーバーから同期します。
メインサーバでデータを表示する
同時に二つのサーバーを開いて、テーブルレコードを確認します。
ここで、MySQLの詳細についてはコピーと読み書きから分離した文章を紹介します。MySQLの主はコピーと読み書きから分離した内容については、以前の文章を検索したり、下記の関連記事を見たりしてください。これからもよろしくお願いします。
企業の実用的なアプリケーションでは、成熟した業務のデータ量は比較的大きいが、単一のMySQLサーバーは、安全性、高利用性、高合併性のいずれにおいても、実際のニーズを満たすことができず、複数のMySQLサーバ(Master-Selave)において、コピーから同期データを実現し、読み書き分離によってデータベースの同時負荷能力を向上させることができます。ちょっとrsyncに似ていますが、rsyncはディスクファイルのバックアップをしています。mysqlのコピーはデータベースのデータ、文のバックアップをしています。
一、関連概要
メインコピー:メインデータベースから更新イベントをデータベースから読み込み、更新記録を実行します。データベースからメインデータベースと一致するようにします。
(一)MySQLサポートのコピータイプ
1.マスターサーバはバイナリログに保存します。
2.Slaveサーバはマスターサーバのログをコピーします。
3.Slaveサーバがコピーしたログを再生する
重点:コピープロセスには重要な制限があります。すなわち、Slaveにコピーするのはシリアル化されています。つまり、Master上の並列更新操作はSlave上で並行操作できません。
二、読み書き分離
(1)読み書き分離の概念
読みと書きの分離:読みと書きの分離はメインサーバーにだけ書いて、サーバーから読むだけです。基本的な原理はメインデータベースに事務性の増加、変更、削除操作(INSERT、UPDATE、DELETE)を処理させて、データベースからSELECT検索操作を処理することです。データベースコピーは、トランザクション操作による変更をクラスタ内のデータベースから同期させるために使用されます。
(2)読み書き分離の役割
(3)MySQL読み書き分離原理
(4)よくあるMySQL読み書き分離
1)プログラムコード内部による実現
1.コードの中でselect、insertによってルートの分類を行って、このような方法も現在の生産環境の応用が最も広範です。
2.長所と短所:
2)中間代理層に基づいて実現する。
1.プロキシは一般的にクライアントとサーバの間にあり、プロキシはクライアントの要求を受けた後、判断後にバックエンドデータベースに転送する。以下の代表的なプログラムがある。
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 1slaave 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の主はコピーと読み書きから分離した内容については、以前の文章を検索したり、下記の関連記事を見たりしてください。これからもよろしくお願いします。