MySQL Proxy 实现MySQLDB 读写分离
一、简述
MySQL Proxy是一个处于你的client端和MySQL server端之间的简单程序,它可以监测、分析或改变它们的通信。它使用灵活,没有限制,常见的用途包括:负载平衡,故障、查询分析,查询过滤和修改等等。
MySQL Proxy就是这么一个中间层代理,简单的说,MySQL Proxy就是一个连接池,负责将前台应用的连接请求转发给后台的数据库,并且通过使用lua脚本,可以实现复杂的连接控制和过滤,从而实现读写分离和负 载平衡。对于应用来说,MySQL Proxy是完全透明的,应用则只需要连接到MySQL Proxy的监听端口即可。当然,这样proxy机器可能成为单点失效,但完全可以使用多个proxy机器做为冗余,在应用服务器的连接池配置中配置到多 个proxy的连接参数即可。
MySQL Proxy更强大的一项功能是实现“读写分离”,基本原理是让主数据库处理事务性查询,让从库处理SELECT查询。数据库复制被用来把事务性查询导致的变更同步到集群中的从库。
二、对MariaDB做主从复制
关于如何对MariaDB做主从复制,请移步本人博客MariaDB 主从复制
三、安装
1.可以通过rpm安装,其会提供配置文件及服务脚本,但是没有读写分享脚本
2.通过编译安装
①、源码安装时,MySQL proxy的依赖关系:
libevent 1.x or higher (1.3b or later is preferred).
lua 5.1.x or higher.
glib2 2.6.0 or higher.
pkg-config.
libtool 1.5 or higher.
MySQL 5.0.x or higher developer files.
②、下载源码包,编译安装
# tar zxf mysql-proxy-0.8.2.tar.gz# cd mysql-proxy-0.8.2# ./configure# make# make check如果管理员有密码,上面的步骤则需要使用如下格式进行:# MYSQL_PASSWORD=root_pwd make check# make install默认情况下, mysql-proxy安装在/usr/local/sbin/mysql-proxy,而Lua示例脚本安装在/usr/local/share目录中。
3.通过通用二进制格式安装
①、下载解压。这里的系统平台为rhel6.5 64位系统
[root@httpweb ~]# wget http://mirror.sohu.com/mysql/MySQL-Proxy/mysql-proxy-0.8.4-linux-el6-x86-64bit.tar.gz[root@httpweb ~]# tar xf mysql-proxy-0.8.4-linux-el6-x86-64bit.tar.gz[root@httpweb ~]# mv mysql-proxy-0.8.4-linux-el6-x86-64bit /usr/local/mysql-proxy
②、添加代理用户
[root@httpweb mysql-proxy]# useradd mysql-proxy
③、为mysql-proxy提供SysV服务脚本
#!/bin/bash## mysql-proxy This script starts and stops the mysql-proxy daemon## chkconfig: - 78 30# processname: mysql-proxy# description: mysql-proxy is a proxy daemon for mysql# Source function library.. /etc/rc.d/init.d/functionsprog="/usr/local/mysql-proxy/bin/mysql-proxy"# Source networking configuration.if [ -f /etc/sysconfig/network ]; then . /etc/sysconfig/networkfi# Check that networking is up.[ ${NETWORKING} = "no" ] && exit 0# Set default mysql-proxy configuration.ADMIN_USER="admin"ADMIN_PASSWD="admin"ADMIN_LUA_SCRIPT="/usr/local/mysql-proxy/share/doc/mysql-proxy/admin.lua"PROXY_OPTIONS="--daemon"PROXY_PID=/var/run/mysql-proxy.pidPROXY_USER="mysql-proxy"# Source mysql-proxy configuration.if [ -f /etc/sysconfig/mysql-proxy ]; then . /etc/sysconfig/mysql-proxyfiRETVAL=0start() { echo -n $"Starting $prog: " daemon $prog $PROXY_OPTIONS --pid-file=$PROXY_PID --proxy-address="$PROXY_ADDRESS" --user=$PROXY_USER --admin-username="$ADMIN_USER" --admin-lua-script="$ADMIN_LUA_SCRIPT" --admin-password="$ADMIN_PASSWORD" RETVAL=$? echo if [ $RETVAL -eq 0 ]; then touch /var/lock/subsys/mysql-proxy fi}stop() { echo -n $"Stopping $prog: " killproc -p $PROXY_PID -d 3 $prog RETVAL=$? echo if [ $RETVAL -eq 0 ]; then rm -f /var/lock/subsys/mysql-proxy rm -f $PROXY_PID fi}# See how we were called.case "$1" in start) start ;; stop) stop ;; restart) stop start ;; condrestart|try-restart) if status -p $PROXY_PIDFILE $prog >&/dev/null; then stop start fi ;; status) status -p $PROXY_PID $prog ;; *) echo "Usage: $0 {start|stop|restart|reload|status|condrestart|try-restart}" RETVAL=1 ;;esacexit $RETVAL
将上述内容保存为/etc/init.d/mysql-proxy,给予执行权限,而后添加至服务列表
[root@httpweb mysql-proxy]# vi /etc/init.d/mysql-proxy[root@httpweb mysql-proxy]# chmod +x /etc/init.d/mysql-proxy[root@httpweb mysql-proxy]# chkconfig --add mysql-proxy
④、为服务脚本提供配置文件/etc/sysconfig/mysql-proxy
#Options for mysql-proxyADMIN_USER="firefox"ADMIN_PASSWORD="firefox"ADMIN_ADDRESS=""ADMIN_LUA_SCRIPT="/usr/local/mysql-proxy/share/doc/mysql-proxy/admin.lua"PROXY_ADDRESS=""PROXY_USER="mysql-proxy"PROXY_OPTIONS="--daemon --log-level=info --log-use-syslog --plugins=proxy --plugins=admin --proxy-backend-addresses=192.168.1.200:3306 --proxy-read-only-backend-addresses=192.168.1.202:3306 --proxy-lua-script=/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua"其中的proxy-backend-addresses选项和proxy-read-only-backend-addresses选项均可重复使用多次,以实现指定多个读写服务器或只读服务器。
⑤、mysql-proxy的配置选项
mysql-proxy的配置选项大致可分为帮助选项、管理选项、代理选项及应用程序选项几类,下面一起去介绍它们。 --help --help-admin --help-proxy --help-all ———— 以上四个选项均用于获取帮助信息; --proxy-address=host:port ———— 代理服务监听的地址和端口; --admin-address=host:port ———— 管理模块监听的地址和端口; --proxy-backend-addresses=host:port ———— 后端mysql服务器的地址和端口; --proxy-read-only-backend-addresses=host:port ———— 后端只读mysql服务器的地址和端口; --proxy-lua-script=file_name ———— 完成mysql代理功能的Lua脚本; --daemon ———— 以守护进程模式启动mysql-proxy; --keepalive ———— 在mysql-proxy崩溃时尝试重启之; --log-file=/path/to/log_file_name ———— 日志文件名称; --log-level=level ———— 日志级别; --log-use-syslog ———— 基于syslog记录日志; --plugins=plugin,.. ———— 在mysql-proxy启动时加载的插件; --user=user_name ———— 运行mysql-proxy进程的用户; --defaults-file=/path/to/conf_file_name ———— 默认使用的配置文件路径;其配置段使用[mysql-proxy]标识; --proxy-skip-profiling ———— 禁用profile; --pid-file=/path/to/pid_file_name ———— 进程文件名;
⑥、提供admin.lua文件,将其保存至/usr/local/mysql-proxy/share/mysql-proxy/中
--[[ $%BEGINLICENSE%$ Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; version 2 of the License. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301USA $%ENDLICENSE%$ --]]function set_error(errmsg) proxy.response = { type = proxy.MYSQLD_PACKET_ERR, errmsg = errmsg or "error" }endfunction read_query(packet) if packet:byte() ~= proxy.COM_QUERY then set_error("[admin] we only handle text-based queries (COM_QUERY)") return proxy.PROXY_SEND_RESULT end local query = packet:sub(2) local rows = { } local fields = { } if query:lower() == "select * from backends" then fields = { { name = "backend_ndx", type = proxy.MYSQL_TYPE_LONG }, { name = "address", type = proxy.MYSQL_TYPE_STRING }, { name = "state", type = proxy.MYSQL_TYPE_STRING }, { name = "type", type = proxy.MYSQL_TYPE_STRING }, { name = "uuid", type = proxy.MYSQL_TYPE_STRING }, { name = "connected_clients", type = proxy.MYSQL_TYPE_LONG }, } for i = 1, #proxy.global.backends do local states = { "unknown", "up", "down" } local types = { "unknown", "rw", "ro" } local b = proxy.global.backends[i] rows[#rows + 1] = { i, b.dst.name, -- configured backend address states[b.state + 1], -- the C-id is pushed down starting at 0 types[b.type + 1], -- the C-id is pushed down starting at 0 b.uuid, -- the MySQL Server's UUID if it is managed b.connected_clients-- currently connected clients } end elseif query:lower() == "select * from help" then fields = { { name = "command", type = proxy.MYSQL_TYPE_STRING }, { name = "description", type = proxy.MYSQL_TYPE_STRING }, } rows[#rows + 1] = { "SELECT * FROM help", "shows this help" } rows[#rows + 1] = { "SELECT * FROM backends", "lists the backends and their state" } else set_error("use 'SELECT * FROM help' to see the supported commands") return proxy.PROXY_SEND_RESULT end proxy.response = { type = proxy.MYSQLD_PACKET_OK, resultset = { fields = fields, rows = rows } } return proxy.PROXY_SEND_RESULTend
⑦、测试
启动服务;
service mysql-proxy start
管理功能测试
可以看到4041端口和3306端口以及处于监听状态
我们在主服务器上授予201数据库写的权限
MariaDB [(none)]>grant all on *.* to 'firefox'@'192.168.1.201' identified by 'firefox';MariaDB [(none)]> flush privileges;[root@httpweb mysql-proxy]# mysql -ufirefox -pfirefox -h192.168.1.201 --port=3306我们可以看到我们在mysql-proxy的可以登录数据库了
查看是否配置成功
[root@httpweb ~]# mysql -ufirefox -pfirefox -h192.168.1.201 --port=4041Welcome to the MySQL monitor.Commands end with ; or /g.Your MySQL connection id is 1Server version: 5.0.99-agent-adminCopyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.Oracle is a registered trademark of Oracle Corporation and/or itsaffiliates. Other names may be trademarks of their respectiveowners.mysql> select * from backends;+-------------+--------------------+---------+------+------+-------------------+| backend_ndx | address| state | type | uuid | connected_clients |+-------------+--------------------+---------+------+------+-------------------+| 1 | 192.168.1.200:3306 | up| rw | NULL | 0 || 2 | 192.168.1.202:3306 | up| ro | NULL | 0 |+-------------+--------------------+---------+------+------+-------------------+
我们的程序就可以实现真正意义上的读写分离了,大功告成,由于本人水平有限,请各位大神多多批评指正

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen

Die Standardkarte auf dem iPhone ist Maps, Apples proprietärer Geolokalisierungsanbieter. Obwohl die Karte immer besser wird, funktioniert sie außerhalb der Vereinigten Staaten nicht gut. Im Vergleich zu Google Maps hat es nichts zu bieten. In diesem Artikel besprechen wir die möglichen Schritte, um Google Maps als Standardkarte auf Ihrem iPhone zu nutzen. So machen Sie Google Maps zur Standardkarte auf dem iPhone. Das Festlegen von Google Maps als Standardkarten-App auf Ihrem Telefon ist einfacher als Sie denken. Befolgen Sie die nachstehenden Schritte – Erforderliche Schritte – Sie müssen Gmail auf Ihrem Telefon installiert haben. Schritt 1 – Öffnen Sie den AppStore. Schritt 2 – Suchen Sie nach „Gmail“. Schritt 3 – Klicken Sie auf neben der Gmail-App

Im vorherigen Artikel (Link) stellte Xiao Zaojun die Entwicklungsgeschichte der Breitbandtechnologie von ISDN, xDSL bis 10GPON vor. Lassen Sie uns heute über die kommende neue Generation der Glasfaser-Breitbandtechnologie sprechen – 50GPON. █F5G und F5G-A Bevor wir 50GPON vorstellen, sprechen wir zunächst über F5G und F5G-A. Im Februar 2020 förderte ETSI (European Telecommunications Standards Institute) ein festes Kommunikationsnetzwerk-Technologiesystem basierend auf 10GPON+FTTR, Wi-Fi6, optischer 200G-Übertragung/Aggregation, OXC und anderen Technologien und nannte es F5G Netzwerkkommunikationstechnologie (The5thgenerationFixednetworks). F5G ist ein Festnetz

Fehlt die Uhr-App auf Ihrem Telefon? Datum und Uhrzeit werden weiterhin in der Statusleiste Ihres iPhones angezeigt. Ohne die Uhr-App können Sie jedoch die Weltzeituhr, die Stoppuhr, den Wecker und viele andere Funktionen nicht nutzen. Daher sollte die Reparatur der fehlenden Uhr-App ganz oben auf Ihrer To-Do-Liste stehen. Diese Lösungen können Ihnen bei der Lösung dieses Problems helfen. Lösung 1 – Platzieren Sie die Uhr-App. Wenn Sie versehentlich die Uhr-App von Ihrem Startbildschirm entfernt haben, können Sie die Uhr-App wieder an ihrem Platz platzieren. Schritt 1 – Entsperren Sie Ihr iPhone und wischen Sie nach links, bis Sie zur Seite „App-Bibliothek“ gelangen. Schritt 2 – Suchen Sie als Nächstes im Suchfeld nach „Uhr“. Schritt 3 – Wenn Sie unten in den Suchergebnissen „Uhr“ sehen, halten Sie die Taste und gedrückt

C++ ist eine weit verbreitete Programmiersprache, die sich beim Schreiben von Countdown-Programmen sehr praktisch und praktisch eignet. Das Countdown-Programm ist eine gängige Anwendung, die uns sehr genaue Zeitberechnungs- und Countdown-Funktionen bieten kann. In diesem Artikel wird erläutert, wie Sie mit C++ ein einfaches Countdown-Programm schreiben. Der Schlüssel zur Implementierung eines Countdown-Programms besteht darin, einen Timer zur Berechnung des Zeitablaufs zu verwenden. In C++ können wir die Funktionen in der Header-Datei time.h verwenden, um die Timer-Funktion zu implementieren. Das Folgende ist der Code für ein einfaches Countdown-Programm

Besuchen Sie häufig dieselbe Website jeden Tag etwa zur gleichen Zeit? Dies kann dazu führen, dass Sie viel Zeit mit mehreren geöffneten Browser-Registerkarten verbringen und den Browser bei der Ausführung täglicher Aufgaben überladen. Wie wäre es, wenn Sie es öffnen, ohne den Browser manuell starten zu müssen? Es ist sehr einfach und erfordert nicht das Herunterladen von Apps von Drittanbietern, wie unten gezeigt. Wie richte ich den Taskplaner ein, um eine Website zu öffnen? Drücken Sie die Taste, geben Sie „Taskplaner“ in das Suchfeld ein und klicken Sie dann auf „Öffnen“. Klicken Sie in der rechten Seitenleiste auf die Option „Basisaufgabe erstellen“. Geben Sie im Feld „Name“ den Namen der Website ein, die Sie öffnen möchten, und klicken Sie auf „Weiter“. Klicken Sie anschließend unter „Trigger“ auf „Zeitfrequenz“ und dann auf „Weiter“. Wählen Sie aus, wie lange das Ereignis wiederholt werden soll, und klicken Sie auf „Weiter“. Wählen Sie „Aktivieren“.

In iOS 17 hat Apple nicht nur mehrere neue Messaging-Funktionen hinzugefügt, sondern auch das Design der Nachrichten-App optimiert, um ihr ein klareres Aussehen zu verleihen. Auf alle iMessage-Apps und -Tools, wie z. B. die Kamera- und Fotooptionen, kann jetzt zugegriffen werden, indem man auf die Schaltfläche „+“ über der Tastatur und links neben dem Texteingabefeld tippt. Wenn Sie auf die Schaltfläche „+“ klicken, wird eine Menüspalte mit einer Standardreihenfolge der Optionen angezeigt. Von oben beginnend gibt es Kamera, Fotos, Aufkleber, Bargeld (falls verfügbar), Audio und Standort. Ganz unten befindet sich die Schaltfläche „Mehr“, die beim Antippen alle anderen installierten Messaging-Apps anzeigt (Sie können auch nach oben wischen, um diese versteckte Liste anzuzeigen). So organisieren Sie Ihre iMessage-App neu. Dies können Sie unten tun

Erhalten Sie die Meldung „Zugriff auf Kamera und Mikrofon konnte nicht zugelassen werden“, wenn Sie versuchen, die App zu verwenden? Normalerweise erteilen Sie Kamera- und Mikrofonberechtigungen bestimmten Personen nach Bedarf. Wenn Sie jedoch die Erlaubnis verweigern, funktionieren die Kamera und das Mikrofon nicht und es wird stattdessen diese Fehlermeldung angezeigt. Die Lösung dieses Problems ist sehr einfach und in ein oder zwei Minuten erledigt. Fix 1 – Kamera- und Mikrofonberechtigungen bereitstellen Sie können die erforderlichen Kamera- und Mikrofonberechtigungen direkt in den Einstellungen bereitstellen. Schritt 1 – Gehen Sie zur Registerkarte „Einstellungen“. Schritt 2 – Öffnen Sie das Fenster „Datenschutz und Sicherheit“. Schritt 3 – Aktivieren Sie dort die Berechtigung „Kamera“. Schritt 4 – Darin finden Sie eine Liste der Apps, die eine Erlaubnis für die Kamera Ihres Telefons angefordert haben. Schritt 5 – Öffnen Sie die „Kamera“ der angegebenen App

Der Grafiktreiber ist einer der wichtigsten Treiber auf Ihrem PC und wirkt sich direkt auf die Leistung und das Spielerlebnis aus. Bei der Aktualisierung von Treibern über das Installationsprogramm tritt jedoch bei vielen Benutzern die Fehlermeldung „Ihr System hat Treiber sind an Herstellerangaben gebunden“ auf. Dieses Problem tritt auf, weil der Hersteller Aktualisierungen einschränkt, es sei denn, sie werden ausdrücklich von seiner Seite gepusht. Dies sorgt für Stabilität, kann aber für viele Menschen ein Problem darstellen. Finden wir also jetzt heraus, wie wir das Problem lösen können! Wie können Sie Ihr System unter Windows 11 reparieren, wenn die Treiber an die Herstellerspezifikationen gebunden sind? Bevor wir zu etwas komplizierteren Lösungen übergehen, probieren Sie diese schnellen Lösungen aus: Stellen Sie sicher, dass Ihr PC und Ihr Betriebssystem die Systemanforderungen des Treibers erfüllen. Starten Sie dann Ihren Computer im abgesicherten Modus
