A new MySQL proxy written in Go — LegendBase Proxy
今天很高兴得知Go1 release, 其实我一只在等它正式发布,因为我用go语言自己实现了一个MySQL代理,命名为LegendBase Proxy for MySQL(LPM),等Go1 release之后,我也可以尽快release出来了. 代码摘录: case COM_STMT_EXECUTE, COM_QUERY: /* if we get a OK in t
今天很高兴得知Go1 release, 其实我一只在等它正式发布,因为我用go语言自己实现了一个MySQL代理,命名为LegendBase Proxy for MySQL(LPM),等Go1 release之后,我也可以尽快release出来了.
代码摘录:
case COM_STMT_EXECUTE, COM_QUERY:
/* if we get a OK in the first packet there will be no result-set */
switch *qStage {
case PARSE_COM_QUERY_INIT:
switch pkt[4] {
case 0xff, 0×00: // ERR, OK, NULL
/* ERR: e.g. SELECT * FROM dual -> ERROR 1096 (HY000): No tables used */
/* OK: e.g. DELETE FROM tbl */
finished = true
break
case 0xfb: // NULL
*qStage = PARSE_COM_QUERY_LOAD_DATA
finished = true
break
case 0xfe: // EOF
err = errors.New(fmt.Sprintf("COM_(0x%02x), packet should not be (NULL|EOF), got %02x", cmd, pkt[4]))
break
default:
*qStage = PARSE_COM_QUERY_FIELD
break
}
break
case PARSE_COM_QUERY_FIELD:
写这个的初衷是因为除了部分程序开发者自己实现了读写分离\或者采用sharding方式之外,还有大量的程序是针对单一的MySQL数据库接口. 然而随着业务量的增加,db压力增大,单台db没法承载,需要扩展MySQL数据库为主从架构,这时候需要代理层来分发读写,因为改造程序的代价往往太大.
新开发的MySQL proxy的配置如下:
[proxy]
port = 3307
sock = /tmp/proxy.sock
fetch_schemas_interval = 10 # seconds
# For management
admin_user = admin
admin_password = 100c4e57374fc998e57164d4c0453bd3a4876a58 # sha1
admin_port = 8288
# For connecting to proxy
proxy_user = ivan
proxy_password = 100c4e57374fc998e57164d4c0453bd3a4876a58 # sha1
# For proxy to connect backend mysql server
mysql_user = ivan
mysql_password = 100c4e57374fc998e57164d4c0453bd3a4876a58 #sha1
mysql_dbname = test # default db
# connections setting
connections_per_weight_max = 32
# master and slaves setting. ip:port:w w: weight of load
master = 127.0.0.1:3306
#slaves = 127.0.0.1:3306:1|192.168.2.200:3306:2|192.168.2.203:3306:1
slaves = 127.0.0.1:3306:1
其中配置的密码是明文密码的sha1, 防止非相关人员获取数据库的密码,安全性能得到一定的保障.
通过其他的配置也可以看出proxy实现的功能,即能够配置多个slave,并且能够指定它们的权重.
Related posts:
- Golang 实现的 mysql-proxy
- lbmysqlping (LegendBase MySQL Ping)
- MySQL vs NoSQL 效率与成本之争
- 6.0.11 will be the last release of MySQL 6.0
- 由CSDN泄密想到的:MySQL数据库验证过程的改进、密码存储及验证方法的总结
? 谭俊青 发布在 MySQL性能、MySQL Cluster集群、MySQL HA高可用等研究 - MySQL实验室, 2012.
可以任意转载, 但转载时务必以超链接形式标明文章原始出处 和 作者信息。
链接: http://www.mysqlab.net/blog/2012/03/a-new-mysql-proxy-written-in-go-language/
标签: MySQL Proxy

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

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

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

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック

MySQLの起動が失敗する理由はたくさんあり、エラーログをチェックすることで診断できます。一般的な原因には、ポートの競合(ポート占有率をチェックして構成の変更)、許可の問題(ユーザー許可を実行するサービスを確認)、構成ファイルエラー(パラメーター設定のチェック)、データディレクトリの破損(テーブルスペースの復元)、INNODBテーブルスペースの問題(IBDATA1ファイルのチェック)、プラグインロード障害(エラーログのチェック)が含まれます。問題を解決するときは、エラーログに基づいてそれらを分析し、問題の根本原因を見つけ、問題を防ぐために定期的にデータをバックアップする習慣を開発する必要があります。

MySQLは、基本的なデータストレージと管理のためにネットワーク接続なしで実行できます。ただし、他のシステムとのやり取り、リモートアクセス、または複製やクラスタリングなどの高度な機能を使用するには、ネットワーク接続が必要です。さらに、セキュリティ対策(ファイアウォールなど)、パフォーマンスの最適化(適切なネットワーク接続を選択)、およびデータバックアップは、インターネットに接続するために重要です。

MySQLは、共有ロックと排他的ロックを使用して並行性を管理し、テーブルロック、ロウロック、ページロックの3つのロックタイプを提供します。 Row Locksは並行性を向上させ、for Updateステートメントを使用して排他的なロックを行に追加します。悲観的なロックは競合を想定し、楽観的なロックはバージョン番号を介してデータを判断します。一般的なロックテーブルの問題は、スロークエリとしてマニフェストします。ShowProcessListコマンドを使用して、ロックが保持しているクエリを表示します。最適化測定には、適切なインデックスの選択、トランザクションスコープの削減、バッチ操作、およびSQLステートメントの最適化が含まれます。

MySQLデータベース操作では、文字列処理は避けられないリンクです。 Substring_index関数はこれのために設計されており、セパレータに基づいてサブストリングを効率的に抽出できます。 substring_index関数アプリケーションの例次の例は、substring_index関数の柔軟性と実用性を示しています。たとえば、URLから特定の部分を抽出します。たとえば、ドメイン名を抽出します:selectsubstring_index( 'www.mysql.com'、 '。'、 '、2);ファイル拡張子を簡単に取得するには、ファイル拡張子を簡単に取得します:SelectSubstring_index( 'file.pdf'、 '。'、 - 1);処理は存在しません

MySQLプライマリキーは、データベース内の各行を一意に識別するキー属性であるため、空にすることはできません。主キーが空になる可能性がある場合、レコードを一意に識別することはできません。これにより、データの混乱が発生します。一次キーとして自己挿入整数列またはUUIDを使用する場合、効率やスペース占有などの要因を考慮し、適切なソリューションを選択する必要があります。

MySQLはJSONデータを返すことができます。 json_extract関数はフィールド値を抽出します。複雑なクエリについては、Where句を使用してJSONデータをフィルタリングすることを検討できますが、そのパフォーマンスへの影響に注意してください。 JSONに対するMySQLのサポートは絶えず増加しており、最新バージョンと機能に注意を払うことをお勧めします。

生産環境の場合、パフォーマンス、信頼性、セキュリティ、スケーラビリティなどの理由により、通常、MySQLを実行するためにサーバーが必要です。サーバーには通常、より強力なハードウェア、冗長構成、より厳しいセキュリティ対策があります。小規模で低負荷のアプリケーションの場合、MySQLはローカルマシンで実行できますが、リソースの消費、セキュリティリスク、メンテナンスコストを慎重に考慮する必要があります。信頼性とセキュリティを高めるには、MySQLをクラウドまたは他のサーバーに展開する必要があります。適切なサーバー構成を選択するには、アプリケーションの負荷とデータボリュームに基づいて評価が必要です。

MySQLとMariaDBは共存できますが、注意して構成する必要があります。重要なのは、さまざまなポート番号とデータディレクトリを各データベースに割り当て、メモリ割り当てやキャッシュサイズなどのパラメーターを調整することです。接続プーリング、アプリケーションの構成、およびバージョンの違いも考慮する必要があり、落とし穴を避けるために慎重にテストして計画する必要があります。 2つのデータベースを同時に実行すると、リソースが制限されている状況でパフォーマンスの問題を引き起こす可能性があります。
