検索
ホームページデータベースmysql チュートリアルMySQL-アメーバをベースにした1つのマスターと複数のスレーブの読み書き分離構成方法

最近開発されたシステムではデータベースとしてMySqlが使われていますが、データにはお金が関係しているので注意が必要です。同時に、ユーザーは最大訪問数に関する要件も提示します。 MySQL がパフォーマンスのボトルネックになるのを防ぎ、優れたフォールト トレランスを実現するために、マスター/スレーブのホット バックアップと読み取り/書き込みの分離が実装されています。今後の参考のためにここに簡単なメモを残しておきます。

1. マスターとスレーブを設定します

条件: 2 台の PC、IP はそれぞれ 192.168.168.253 と 192.168.168.251 です。両方の PC の Mysql バージョンは 5.0 です。253 の Mysql はマスター、251 の Mysql はスレーブです。

1. メイン データベース サーバーの構成

メイン データベース サーバーのインストール ディレクトリを入力し、my.ini を開き、ファイルの最後に次の構成を追加します:

#数据库ID号, 为1时表示为Master,其中master_id必须为1到232–1之间的一个正整数值; 
server-id = 1
#启用二进制日志;
log-bin=mysql-bin
#需要同步的二进制数据库名;
binlog-do-db=minishop
#不同步的二进制数据库名,如果不设置可以将其注释掉;
binlog-ignore-db=information_schema
binlog-ignore-db=mysql
binlog-ignore-db=personalsite
binlog-ignore-db=test
#设定生成的log文件名;
log-bin="D:/Database/materlog"
#把更新的记录写到二进制文件中;
log-slave-updates

ファイルを保存します。 MySQL サービスを再起動します。

スレーブ データベース サーバーのインストール ディレクトリを入力し、my.ini を開き、ファイルの最後に次の設定を追加します:

#如果需要增加Slave库则,此id往后顺延;
server-id = 2  
log-bin=mysql-bin
#主库host
master-host = 192.168.168.253
#在主数据库服务器中建立的用于该从服务器备份使用的用户
master-user = forslave
master-password = ******
master-port = 3306
#如果发现主服务器断线,重新连接的时间差;
master-connect-retry=60
#不需要备份的数据库; 
replicate-ignore-db=mysql
#需要备份的数据库
replicate-do-db=minishop
log-slave-update

ファイルを保存します。 MySQL サービスを再起動します。

メインデータベースサーバーに入り、上記のバックアップに使用するユーザー名とパスワードを作成し、レプリケーションスレーブ、スーパー、リロードを許可します

mysql>grant replication slave,super,reload on minishop.* to forslave@192.168.168.251 identified by '******';

スレーブデータベースサーバーに入り、スレーブを起動します。

mysql>slave start;
mysql>show slave status\G;

テスト: メインデータベースサーバーに入り、Minishop のテーブルにデータを挿入し、挿入したばかりのデータがスレーブデータベースサーバーに含まれているかどうかを確認します。完了!

注: 1) スレーブ データベース サーバーの前に、設定されたマスター データベース サーバーを実行します。このようにして、スレーブ データベース サーバーを実行するとき、マスター データベースのファイルと位置は、スレーブ データベースの Master_Log_File および Read_Master_Log_Pos 設定と一致します。 。そうしないと、不整合が発生する可能性があります。これはコマンドからも調整できます。

2) マスターとスレーブのレプリケーションが失敗したことがわかった場合は、まずスレーブ データベース サーバーをシャットダウンしてから、データ内のrelay-log.info、hosname-relay-bin*、master.infoおよびその他のファイルを削除します。スレーブ データベース サーバーのディレクトリに移動し、スレーブ サーバーを再起動します。

2. 読み取りと書き込みの分離構成

当初は読み取りと書き込みの分離を実現するために Mysql プロキシを使用したいと考えていましたが、使用する lua スクリプトが非常に面倒で、最終的にはオープンソースのデータベース プロキシ ミドルウェアを使用することにしました。中国人が開発したアメーバ。 Ameba を使用すると、単純な XML 構成で簡単に読み取りと書き込みの分離を実現できます。

Amoeba はアプリケーションとデータベース サーバーの間に位置し、中間プロキシ層として機能します。ロード バランシング、高可用性、クエリ フィルタリング、読み取りと書き込みの分離をサポートし、関連するクエリをターゲット データベースにルーティングしたり、複数のデータベースに結果をマージするよう同時に要求したりできます。この機能は非常に強力です。

Amoeba のデフォルトのポートは 8066 で、Mysql プロトコルを実装しています。アプリケーションは、Amoeba を使用してデータベース アクセスをプロキシするためにデータベース接続を変更するだけで済みます。例: Java アプリケーションで、元の jdbc 接続文字列が jdbc:mysql://192.168.168.42:3306/minishop である場合、データベース アクセス プロキシとして Amoeba を使用する場合は、上記を変更するだけで済みます。接続文字列を次のように変更します (Amoeba が配置されているマシンの IP が 192.168.168.88 の場合): jdbc:mysql://192.168.168.88:8066/minishop。アメーバは透明性に関して素晴らしい仕事をしています。

主なことはAmoedaの設定ですが、設定も非常に簡単です。基本的に、構成する必要があるのは、confdbServers.xml と confamoeba.xml の 2 つのファイルだけです。構成内の各項目の意味については、amoeda の中国語ガイドを参照してください。ここではあまり説明しません。設定を記録するだけです。

dbServers.xml のメイン設定

<amoeba:dbServers xmlns:amoeba="http://amoeba.meidusa.com/">

		<!-- 
			Each dbServer needs to be configured into a Pool,
			If you need to configure multiple dbServer with load balancing that can be simplified by the following configuration:
			 add attribute with name virtual = "true" in dbServer, but the configuration does not allow the element with name factoryConfig
			 such as &#39;multiPool&#39; dbServer   
		-->
		
	<dbServer name="abstractServer" abstractive="true">
		<factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory">
			<property name="manager">${defaultManager}</property>
			<property name="sendBufferSize">64</property>
			<property name="receiveBufferSize">128</property>
				
			<!-- mysql port -->
			<property name="port">3306</property>
			
			<!-- mysql schema -->
			<property name="schema">minishop</property>
			
			<!-- mysql user -->
			<property name="user">chenjie</property>
			
			<!--  mysql password -->
			<property name="password">chenjie</property>

		</factoryConfig>

		<poolConfig class="com.meidusa.amoeba.net.poolable.PoolableObjectPool">
			<property name="maxActive">500</property>
			<property name="maxIdle">500</property>
			<property name="minIdle">10</property>
			<property name="minEvictableIdleTimeMillis">600000</property>
			<property name="timeBetweenEvictionRunsMillis">600000</property>
			<property name="testOnBorrow">true</property>
			<property name="testWhileIdle">true</property>
		</poolConfig>
	</dbServer>

	<dbServer name="master"  parent="abstractServer">
		<factoryConfig>
			<!-- mysql ip -->
			<property name="ipAddress">192.168.168.253</property>
		</factoryConfig>
	</dbServer>

	<dbServer name="slave1"  parent="abstractServer">
		<factoryConfig>
			<!-- mysql ip -->
			<property name="ipAddress">192.168.168.119</property>
		</factoryConfig>
	</dbServer>

	<dbServer name="slave2"  parent="abstractServer">
		<factoryConfig>
			<!-- mysql ip -->
			<property name="ipAddress">192.168.168.251</property>

		</factoryConfig>
	</dbServer>
	
	<dbServer name="multiPool" 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">slave1,slave2</property>
		</poolConfig>
	</dbServer>
		
</amoeba:dbServers>

amoeba.xml 設定:

<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.net.ServerableConnectionManager">
			<!-- port -->
			<property name="port">8066</property>
			
			<!-- bind ipAddress -->

			<property name="ipAddress">192.168.168.253</property>

			
			<property name="manager">${clientConnectioneManager}</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="authenticator">
				<bean class="com.meidusa.amoeba.mysql.server.MysqlClientAuthenticator">
					
					<property name="user">chenjie</property>
					
					<property name="password">chenjie</property>
					
					<property name="filter">
						<bean class="com.meidusa.amoeba.server.IPAccessController">
							<property name="ipFile">${amoeba.home}/conf/access_list.conf</property>
						</bean>
					</property>
				</bean>
			</property>
			
		</service>
		
		<!-- server class must implements com.meidusa.amoeba.service.Service -->
		<service name="Amoeba Monitor Server" class="com.meidusa.amoeba.monitor.MonitorServer">
			<!-- port -->
			<!--  default value: random number
			<property name="port">9066</property>
			-->
			<!-- bind ipAddress -->
			<property name="ipAddress">127.0.0.1</property>
			<property name="daemon">true</property>
			<property name="manager">${clientConnectioneManager}</property>
			<property name="connectionFactory">
				<bean class="com.meidusa.amoeba.monitor.net.MonitorClientConnectionFactory"></bean>
			</property>
			
		</service>
		
		<runtime class="com.meidusa.amoeba.mysql.context.MysqlRuntimeContext">
			<!-- proxy server net IO Read thread size -->
			<property name="readThreadPoolSize">20</property>
			
			<!-- proxy server client process thread size -->
			<property name="clientSideThreadPoolSize">30</property>
			
			<!-- mysql server data packet process thread size -->
			<property name="serverSideThreadPoolSize">30</property>
			
			<!-- per connection cache prepared statement size  -->
			<property name="statementCacheSize">500</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="clientConnectioneManager" class="com.meidusa.amoeba.net.MultiConnectionManagerWrapper">
			<property name="subManagerClassName">com.meidusa.amoeba.net.ConnectionManager</property>
			<!-- 
			  default value is avaliable Processors 
			<property name="processors">5</property>
			 -->
		</connectionManager>
		<connectionManager name="defaultManager" class="com.meidusa.amoeba.net.MultiConnectionManagerWrapper">
			<property name="subManagerClassName">com.meidusa.amoeba.net.AuthingableConnectionManager</property>
			
			<!-- 
			  default value is avaliable Processors 
			<property name="processors">5</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>
		

		<property name="writePool">master</property>
		<property name="readPool">multiPool</property>

		<property name="needParse">true</property>
	</queryRouter>
</amoeba:configuration>

この時点で、Mysql のマスター/スレーブ ホット スタンバイと読み書き分離が設定されます。ただし、実稼働環境での特定のアプリケーションはまだテストおよび調査されていません。その後、1 つのマスターと複数のスレーブをテストするときに、Mysql スレーブ データベース サーバーが追加されました。これが、上記のアメーバ構成に追加の IP 119 が存在する理由です。


以上がMySQL-アメーバをベースにした1つのマスターと複数のスレーブの読み書き分離構成方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
图文详解mysql架构原理图文详解mysql架构原理May 17, 2022 pm 05:54 PM

本篇文章给大家带来了关于mysql的相关知识,其中主要介绍了关于架构原理的相关内容,MySQL Server架构自顶向下大致可以分网络连接层、服务层、存储引擎层和系统文件层,下面一起来看一下,希望对大家有帮助。

mysql的msi与zip版本有什么区别mysql的msi与zip版本有什么区别May 16, 2022 pm 04:33 PM

mysql的msi与zip版本的区别:1、zip包含的安装程序是一种主动安装,而msi包含的是被installer所用的安装文件以提交请求的方式安装;2、zip是一种数据压缩和文档存储的文件格式,msi是微软格式的安装包。

mysql怎么去掉第一个字符mysql怎么去掉第一个字符May 19, 2022 am 10:21 AM

方法:1、利用right函数,语法为“update 表名 set 指定字段 = right(指定字段, length(指定字段)-1)...”;2、利用substring函数,语法为“select substring(指定字段,2)..”。

mysql怎么替换换行符mysql怎么替换换行符Apr 18, 2022 pm 03:14 PM

在mysql中,可以利用char()和REPLACE()函数来替换换行符;REPLACE()函数可以用新字符串替换列中的换行符,而换行符可使用“char(13)”来表示,语法为“replace(字段名,char(13),'新字符串') ”。

MySQL复制技术之异步复制和半同步复制MySQL复制技术之异步复制和半同步复制Apr 25, 2022 pm 07:21 PM

本篇文章给大家带来了关于mysql的相关知识,其中主要介绍了关于MySQL复制技术的相关问题,包括了异步复制、半同步复制等等内容,下面一起来看一下,希望对大家有帮助。

mysql怎么将varchar转换为int类型mysql怎么将varchar转换为int类型May 12, 2022 pm 04:51 PM

转换方法:1、利用cast函数,语法“select * from 表名 order by cast(字段名 as SIGNED)”;2、利用“select * from 表名 order by CONVERT(字段名,SIGNED)”语句。

mysql怎么判断是否是数字类型mysql怎么判断是否是数字类型May 16, 2022 am 10:09 AM

在mysql中,可以利用REGEXP运算符判断数据是否是数字类型,语法为“String REGEXP '[^0-9.]'”;该运算符是正则表达式的缩写,若数据字符中含有数字时,返回的结果是true,反之返回的结果是false。

mysql怎么删除unique keymysql怎么删除unique keyMay 12, 2022 pm 03:01 PM

在mysql中,可利用“ALTER TABLE 表名 DROP INDEX unique key名”语句来删除unique key;ALTER TABLE语句用于对数据进行添加、删除或修改操作,DROP INDEX语句用于表示删除约束操作。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

WebStorm Mac版

WebStorm Mac版

便利なJavaScript開発ツール

Dreamweaver Mac版

Dreamweaver Mac版

ビジュアル Web 開発ツール

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。

VSCode Windows 64 ビットのダウンロード

VSCode Windows 64 ビットのダウンロード

Microsoft によって発売された無料で強力な IDE エディター

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター