マスタースレーブデータベースは読み取りおよび書き込み分離します
時間の経過とともにプラットフォームまたはシステムと時間のユーザーの量を増やし、データベース操作を遅くする傾向があり、我々はデータベースの実行を高速化するためにいくつかの効果的な最適化を必要とする;例えばSQLの最適化、テーブル構造の最適化、インデックスの最適化、エンジンなど別々の読み取りおよび書き込み手段の最適化と最適化。
1、SQLの最適化(単純な列ポイント):
* SELECT使用しないようにしてください。
クエリがLIMIT1レコードを使用した場合にのみ、
代わりにサブクエリの接続クエリを使用し、
いくつかのキーワードができインデックスクエリを使用してみてください。
2、最適化テーブルの構造:
;、デジタルタイプのフィールドを使用して、コントラストの効率向上試みる
さもなければVARCHAR、チャーを使用することも考えられる一定の長さと高速データ照会要求を、
適切であり得る垂直分割過剰フィールドテーブルは、フィールドの別の部分に移動したときテーブル、
データテーブル適切な量は、データテーブルの別の部分に移動し、水平方向に分割することができます。
3、インデックスの最適化:
問い合わせ適切なインデックスの高周波フィールドと効率を向上させます。(頻繁に使用するフィールドに索引付けされます)
4、エンジンの最適化:
特定の用途に応じて、2つの最も一般的に使用されるMySQLのテーブル型、利点とテーブルのこれらの2つのタイプの欠点で多くの人々が、このようなInnoDBテーブルとMyISAMの、InnoDBのとMyISAMのように、パフォーマンスを向上させるために、適切なデータベースエンジンを選択します。基本的な違いがある:InnoDBのタイプのためのMyISAMサポートしていない高度な処理取引の種類、およびサポート。MyISAMテーブル型は、InnoDBのタイプよりも数倍速く実行し、その性能を重視するが、トランザクションのサポートを提供していない、とInnoDBはトランザクションのサポート、高度なデータベース機能は、外部キーを持っています。
InnoDBは:
サポートトランザクション処理、外部キーのサポート、クラッシュ修復能力と同時実行制御のためのサポート。あなたは、トランザクションの整合要件が必要な場合は、比較的高い(銀行など)(などのチケットのような)同時実行制御を達成するために必要な場合、InnoDBは大きな利点を持って選択します。あなたが頻繁に、更新したデータベースを削除する必要がある場合、あなたはまた、著者は、(コミット)するので、InnoDBテーブルを選択し、ロールバック(ロールバック)トランザクションサポートすることができます。
MyISAMテーブル:
高速なデータを挿入し、スペースとメモリの使用率は比較的低いです。テーブルは、主に新しいレコードの記録再生を挿入するために使用される場合、選択のMyISAM効率的な処理を実現することができます。アプリケーションの整合性、同時実行性の要件が比較的低い場合、それはまた、使用することができます。
MEMORY:
メモリ内のすべてのデータを、高速なデータ処理速度が、セキュリティは高くありません。速いアクセス速度を所望の場合には、低いデータセキュリティ要件がMEMOEYを選択することができます。それはあなたがテーブルの多くを構築することはできません、テーブルのサイズ要件があります。したがって、データベースのこのタイプは、比較的小規模なデータベーステーブルで使用されます。
注意:
データベースのストレージエンジンの様々なものテーブルを使用することができ、テーブルの要件が比較的高いトランザクション処理であれば、あなたはInnoDBのを選択することができます。このデータベース缶クエリは、比較的高いテーブル選択MyISAMストレージを必要とするデータベースを使用する必要がある場合一時テーブルクエリでは、メモリストレージエンジンを選択することができます。
5、別々の読み取りと書き込みの最適化:
ユーザーのボリュームの増加に伴い、データベース操作は、多くの場合、システムのボトルネックが、一般的なシステムとなって圧力が「書く」よりもはるかに大きい、だから我々は読み書きにデータベースを実装することにより単離することができる「読み」 - マスタースレーブレプリケーションシステムを改善するために、パフォーマンス。
メインのデザインのアイデアから:
別々のリードを提供し、マスタデータベースからの書き込みにより、マスターデータベースは、データベースから「読み取り」を担当、「書き込み」の原因である、圧力条件に応じて、それによってシステム全体を向上させる、データベースから速度を「読み取り」の複数を改善するために展開することができますパフォーマンス。もちろん、私たちは他のプロジェクトに基づいてライブラリから複数を設定する必要があります。
図に示すように。读写分离的实现,主要是解决主从数据库数据同步的问题,在主数据库写入数据后要保证从数据库的数据也要更新。主服务器master记录数据库操作日志到Binary log,从服务器开启i/o线程将二进制日志记录的操作同步到relay log(存在从服务器的缓存中),另外sql线程将relay log日志记录的操作在从服务器执行。
Master-Slave具体步骤
2台のサーバーを準備するには、この必要性の前に準備作業をマスターとして、他のスレーブが、もちろん、自分自身に多くの奴隷に係合することができるライブラリーからもっと必要で、その上にMySQLデータベースをインストールしました。図は次のとおりです。
二つの仮想マシンサーバ:
MySQLデータベースがインストールされました:
1.マスタデータベースプロファイルの変更mysqlの
[ルート@のtjt03〜] #1 のvimな/etc/my.cnf
マスターサーバーマスター上に配置されたバイナリログの開口部は、主に[mysqldを]で次の行を追加します。
ID = 132-Serverの
ログ・ビンビン・マスター// =バイナリログを有効にする[する必要があります]
ログ・ビン・インデックス=マスター- bin.index // [ 必要]ユニークなサーバIDを、デフォルトは1で、IPの一般最後の段落
構成の変更後にそう重くメインライブラリのMysql:
[root@tjt03 ~]# sudo service mysqld stop
Stopping mysqld (via systemctl): [ OK ]
[root@tjt03 ~]# sudo service mysqld start
Starting mysqld (via systemctl): [ OK ]
[root@tjt03 ~]#
在主数据库检查配置效果:
mysql> SHOW MASTER STATUS;
可以看到下图表示配置没问题,这里面的File名:master-bin.000001 我们接下来在从数据库的配置会使用:
2.从mysql数据库配置文件修改
[root@tjt02 mysql]# vim /etc/my.cnf
在从服务器slave上的[mysqld]下面添加:
server-id=131 //这里面的server-id 一定要和主库的不同
relay-log-index=slave-relay-bin.index
relay-log=slave-relay-bin
配置修改好后重从库Mysql:
[root@tjt02 mysql]# service mysqld stop
Stopping mysqld (via systemctl): [ OK ]
[root@tjt02 mysql]# service mysqld start
Starting mysqld (via systemctl): [ OK ]
[root@tjt02 mysql]#
3、配置连个数据库的关联
首先我们先建立一个操作主从同步的数据库用户,切换到主数据库执行:
mysql> GRANT REPLICATION SLAVE ON *.* to 'tjt'@'%' identified by 'TANjintao@520';
这个配置的含义就是创建了一个数据库用户tjt,密码是TANjintao@520, 在从服务器使用tjt这个账号和主服务器连接的时候,就赋予其REPLICATION SLAVE的权限, *.* 表面这个权限是针对主库的所有表的,“%”表示所有客户端都可能连,只要帐号,密码正确,此处可用具体客户端IP代替,如192.168.145.226,加强安全。
进入从数据库执行授权Slave:
mysql> change master to master_host='172.16.114.132',master_port=3306,master_user='tjt',master_password='TANjintao@520',master_log_file='master-bin.000001',master_log_pos=0;
上述步骤执行完毕后执行start slave启动配置:
mysql> start slave;
停止主从同步的命令为:
mysql> stop slave;
查看状态命令,\G表示换行查看:
mysql> show slave status \G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 172.16.114.132
Master_User: tjt
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: master-bin.000001
Read_Master_Log_Pos: 870
Relay_Log_File: slave-relay-bin.000002
Relay_Log_Pos: 1085
Relay_Master_Log_File: master-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
可以看到状态如下:
这里看到从数据库已经在等待主库的消息了,接下来在主库的操作,在从库都会执行了。我们可以主库负责写,从库负责读,达到读写分离的效果。
注:Slave_IO及Slave_SQL进程必须正常运行,即YES状态,否则都是错误的状态(如:其中一个NO均属错误)。
简单测试
在主数据库中创建一个新的数据库:
mysql> create database tjt0702;
在从数据库查看数据库:
mysql> show databases;
到这里,数据库的主从复制Master-Slave已经OK了。
代码层面实现读写分离
假设我们使用的是主流的SpringBoot框架开发的web项目,实现数据库读写分离如下。
配置了一个从库Slave:
https://blog.csdn.net/zhouzeqiang/article/details/87800590
配置了两个从库Slave:
https://my.oschina.net/u/560547/blog/1843462
配置两个数据库的关联
配置两个数据库的关联