最近開発されたシステムではデータベースとして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 'multiPool' 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 サイトの他の関連記事を参照してください。

todropaviewinmysql、 "dropviewifexistsview_name;" andtomodifyaviewを使用して、 "createorreplaceviewview_nameasselect ..."を使用します

mysqlviewscanefectiveativeativeizedesignpatternslikeadapter、decorator、factory、andobserver.1)adapterpatternadaptsdatafromdifferenttablesintoaunifiedview.2)decoratorpatternenhancesdatawithedfieldsfieldsiffieldsiffieldsiffiedを

viewsinmysqlarebenefentialforsimprifiningcomplexqueries、拡張セキュリティ、ダタコンシーニング、および最適化されたパフォーマンスを保証する1)itsmplifyififycomplexqueriesbyencapsulsingthemintoreusableviews.2)viewsencurationecuritybycontrollingcescesces.3)

to CreateAsimpleviewinmysql、usethecreateviewstatement.1)DefinetheTheTheThecreateview_nameas.2)SpecifyTheSelectStatementtatementtatementtatementtatementtatementtatementedeSireddata.3)

tocleateusersinmysql、usethecreateuserstatement.1)foralocaluser:createUser'localuser '@' localhost'identifidedifiedifiedified 'securepassword';

mysqlviewshavelimitations:1)supportallsqloperations、制限、dataManipulationswithjoinsorubqueries.2)それらは、特にパフォーマンス、特にパルフェクソルラージャターセット

reperusermanmanagementInmysqliscialforenhancingsecurationsinginuring databaseaperation.1)usecreateusertoaddusers、指定connectionsourcewith@'localhost'or@'% '。

mysqldoes notimposeahardlimitontriggers、しかしpracticalfactorsdeTerminetheireffectiveuse:1)serverconufigurationStriggermanagement; 2)complentiggersincreaseSystemload;


ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

SublimeText3 中国語版
中国語版、とても使いやすい

ドリームウィーバー CS6
ビジュアル Web 開発ツール

VSCode Windows 64 ビットのダウンロード
Microsoft によって発売された無料で強力な IDE エディター

ZendStudio 13.5.1 Mac
強力な PHP 統合開発環境
