マスタースレーブレプリケーションと読み取りと書き込みの分離
(1)読み取り/書き込み分離とマスター/スレーブレプリケーションの概要
実際の実稼働環境では、データベースの読み取りと書き込みがすべて同じデータベースサーバーで実行されている場合、セキュリティ、高可用性、または高い同時実行性の観点から、実際のニーズを満たすことは完全に不可能です。したがって、一般に、データはマスタースレーブを介して同期され、データベースの同時負荷容量を改善するために、読み取りと書き込みの分離によって展開および実装されます。
(2)読み書きの分離の意義
なぜ読み取りと書き込みを分離する必要があるのですか?
データベースの「書き込み」(10000データの書き込みには3分かかる場合があります)操作は比較的時間がかかるためです。
ただし、データベースの「読み取り」(10,000データの読み取りには5秒しかかからない場合があります)。
したがって、読み取りと書き込みを分離すると、データベースの書き込みがクエリの効率に影響を与えるという解決策があります。
(3)読み書き分離の使用目的
データベースを読み取りと書き込みから分離する必要はありません。プログラムが多くのデータベースを使用しているが、更新が少ない場合は、クエリが多い場合に考慮されます。データベースのマスター/スレーブ同期と読み取り/書き込み分離を使用すると、データベースのプレッシャーを共有し、パフォーマンスを向上させることができます。
(4)一般的なMySQLの読み取り/書き込み分離は2つのタイプに分けられます
プログラムコードに基づく内部実装
コードでは、選択と挿入に従ってルーティング分類が実行されます。このタイプの方法は、実稼働環境でも最も広く使用されています。
メリットは、プログラムコードに実装されているため、パフォーマンスが向上し、ハードウェア費用のために機器を追加する必要がないことです。デメリットは、開発者が実装する必要があり、運用および保守担当者が開始できないことです。 。
ただし、すべてのアプリケーションがプログラムコードに読み取り/書き込み分離を実装するのに適しているわけではありません。一部の大規模で複雑なJavaアプリケーションと同様に、読み取り/書き込み分離をプログラムコードに実装すると、コードの変更が比較的大きくなります。
中間エージェント層の実装に基づく
プロキシは通常、クライアントとサーバーの間に配置されます。クライアントリクエストを受信すると、プロキシサーバーは判断を渡し、バックエンドデータベースに転送します。代表的なプログラムは次のとおりです
。MySQL-Proxy。MySQL-ProxyはMySQLのオープンソースプロジェクトであり、独自のluaスクリプトを使用してSQLの判断を下します。
アトラス。これは、Qihoo360のWebプラットフォーム部門のインフラストラクチャチームによって開発および保守されているMySQLプロトコルに基づくデータ中間層プロジェクトです。これは
、最適化され、いくつかの新機能が追加されたmysql-proxyの0.8.2バージョンに基づいています。360は、Atlasが内部で実行するmysqlビジネスを使用しており、毎日何十億もの読み取りおよび書き込み要求を実行します。物事とストアドプロシージャをサポートします。
アメーバ。Chen Siruによって開発された著者は、かつてAlibabaで働いていました。プログラムはJava言語で開発されており、Alibabaは本番環境で使用しています。ただし、トランザクションとストアドプロシージャはサポートされていません。
(5)MySQLでサポートされているレプリケーションタイプ
ステートメント
- ステートメントベースのレプリケーション。サーバーでsqlステートメントを実行し、スレーブサーバーで同じステートメントを実行します。MySQLはデフォルトでステートメントベースのレプリケーションを使用するため、実行効率が高くなります。
行
- 行ベースのレプリケーション。スレーブサーバーでコマンドを実行する代わりに、変更したコンテンツをコピーします。
混合
- 混合タイプのレプリケーション。デフォルトでは、ステートメントベースのレプリケーションが使用されます。ステートメントベースのレプリケーションを正確にレプリケートできなくなると、行ベースのレプリケーションが使用されます。
実験のセットアップ
ホスト | IPアドレス | 必要なソフトウェアパッケージ |
---|---|---|
Master(主) | 192.168.90.10 | ntp、mysql |
アメーバ | 192.168.90.20 | jdk-6u14-linux-x64.bin、amoeba |
Slave1(スレーブ) | 192.168.90.50 | ntp、ntpdate、mysql |
Slave2(スレーブ) | 192.168.90.60 | ntp、ntpdate、mysql |
クライアント | 192.168.90.70 | ヌル |
すべてのホストのファイアウォールをオフにします
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
1つは、MySQLマスタースレーブレプリケーションを構築する
(1)MySQLマスター/スレーブサーバーの時刻同期
メインサーバーの設定
yum -y install ntp
vim /etc/ntp.conf
==在配置文件末端添加此代码==
server 127.127.90.0 设置本地是时钟源,注意修改网段
fudge 127.127.90.0 stratum 8 设置时间层级为8(限制在15内)
systemctl start ntpd
サーバーからの設定
yum -y install ntp ntpdate
service ntpd start
/usr/sbin/ntpdate 192.168.90.10 进行时间同步,指向Master服务器IP
crontab -e
*/30 * * * * /usr/sbin/ntpdate 192.168.90.10
(2)メインサーバーのmysql構成
vim /etc/my.cnf
server-id = 1
log-bin=master-bin 添加,主服务器开启二进制日志
log-slave-updates=true 添加,允许从服务器更新二进制日志
systemctl restart mysqld
mysql -u root -p123123
GRANT REPLICATION SLAVE ON *.* TO 'myslave'@'192.168.90.%' IDENTIFIED BY '123123'; 给从服务器授权
FLUSH PRIVILEGES;
show master status;
File 列显示日志名,Fosition 列显示偏移量
(3)スレーブサーバーのmysql構成
vim /etc/my.cnf
server-id = 2 修改,注意id与Master的不同,两个Slave的id也要不同
relay-log=relay-log-bin 添加,开启中继日志,从主服务器上同步日志文件记录到本地
relay-log-index=slave-relay-bin.index 添加,定义中继日志文件的位置和名称
systemctl restart mysqld
mysql -u root -p123123
change master to master_host='192.168.90.10' , master_user='myslave',master_password='123123',master_log_file='master-bin.000003',master_log_pos=154;
配置同步,注意 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进程
(4)マスタースレーブレプリケーションの効果を確認します
マスターサーバーでデータベースを作成し、スレーブサーバーで表示します
mysql -uroot -p123123
create database bobo_ku;
メインサーバー:
サーバーから:
2つ目は、MySQLの読み取りと書き込みの分離を構築する
(1)Amoebaサーバー構成Java環境
因为 Amoeba 基于是 jdk1.5 开发的,所以官方推荐使用 jdk1.5 或 1.6 版本,高版本不建议使用。
将jdk-6u14-linux-x64.bin 和 amoeba-mysql-binary-2.2.0.tar.gz.0 上传到/opt目录下。
cd /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/local/jdk1.6
==末行添加==
vim /etc/profile
export JAVA_HOME=/usr/local/jdk1.6
export CLASSPATH=$CLASSPATH:$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
==安装 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 说明安装成功
(2)Amoebaの読み取りと書き込みの分離を構成し、2つのスレーブが負荷分散を読み取ります
まず、Master、Slave1、およびSlave2のMySQLにアクセスするためのAmoebaのアクセス許可を開きます。
grant all on *.* to test@'192.168.90.%' identified by '123.com';
amoebaサーバー構成amoebaサービス
cd /usr/local/amoeba/conf/
cp amoeba.xml amoeba.xml.bak
vim amoeba.xml
==30修改==
<property name="user">amoeba</property>
==32修改==
<property name="password">123123</property>
==115修改==
<property name="defaultPool">master</property>
==117去掉注释并修改==
<property name="writePool">master</property>
<property name="readPool">slaves</property>
cp dbServers.xml dbServers.xml.bak
vim dbServers.xml 修改数据库配置文件
==23注释掉==
作用:默认进入test库 以防mysql中没有test库时,会报错
<!-- <property name="schema">test</property> -->
==26修改==
<property name="user">test</property>
==28-30去掉注释==
<property name="password">123.com</property>
==45修改,设置主服务器的名master==
<dbServer name="master" parent="abstractServer">
==48修改,设置主服务器的地址==
<property name="ipAddress">192.168.90.10</property>
==52修改,设置从服务器的名slave1==
<dbServer name="slave1" parent="abstractServer">
==55修改,设置从服务器1的地址==
<property name="ipAddress">192.168.90.50</property>
==58复制上面6行粘贴,设置从服务器2的名slave2和地址==
<dbServer name="slave2" parent="abstractServer">
<property name="ipAddress">192.168.90.60</property>
==65修改==
<dbServer name="slaves" virtual="true">
==71修改==
<property name="poolNames">slave1,slave2</property>
/usr/local/amoeba/bin/amoeba start& #启动Amoeba软件,按ctrl+c 返回
netstat -anpt | grep java #查看8066端口是否开启,默认端口为TCP 8066
(3)試験結果
クライアントサーバーでテストします。
使用yum快速安装MySQL虚拟客户端
yum install -y mysql mysql-server
mysql -u amoeba -p123123 -h 192.168.90.20 -P8066
通过amoeba服务器代理访问mysql ,在通过客户端连接mysql后写入的数据只有主服务会记录,然后同步给从服务器
メインサーバー上
use bobo_ku;
create table test (id int(10),name varchar(10),address varchar(20));
2つのスレーブサーバー
stop slave; 关闭同步
use bobo_ku;
slave1上
insert into test values('1','zhangsan','this_is_slave1');
slave2について
insert into test values('2','lisi','this_is_slave2');
メインサーバー上
insert into test values('3','wangwu','this_is_master');
クライアントサーバー上
use bobo_ku;
select * from test;
客户端会分别向slave1和slave2读取数据,显示的只有在两个从服务器上添加的数据,没有在主服务器上添加的数据
insert into test values('4','qianqi','this_is_client'); 只有主服务器上有此数据