Heim Datenbank MySQL-Tutorial MySQL Proxy 实现MySQLDB 读写分离

MySQL Proxy 实现MySQLDB 读写分离

Jun 01, 2016 pm 01:15 PM
平衡 程序 通信

一、简述

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目录中。
Nach dem Login kopieren

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
Nach dem Login kopieren

②、添加代理用户

[root@httpweb mysql-proxy]# useradd mysql-proxy
Nach dem Login kopieren

 ③、为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
Nach dem Login kopieren

将上述内容保存为/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
Nach dem Login kopieren

④、为服务脚本提供配置文件/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选项均可重复使用多次,以实现指定多个读写服务器或只读服务器。
Nach dem Login kopieren

⑤、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 ———— 进程文件名; 
Nach dem Login kopieren

⑥、提供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
Nach dem Login kopieren

 ⑦、测试

启动服务;

service mysql-proxy start
Nach dem Login kopieren

管理功能测试      

wKiom1NOlV_BSlwLAABNBtSUtm0691.jpg

可以看到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的可以登录数据库了
Nach dem Login kopieren

查看是否配置成功   

[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 |+-------------+--------------------+---------+------+------+-------------------+
Nach dem Login kopieren

我们的程序就可以实现真正意义上的读写分离了,大功告成,由于本人水平有限,请各位大神多多批评指正

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Repo: Wie man Teamkollegen wiederbelebt
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
2 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Abenteuer: Wie man riesige Samen bekommt
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

So machen Sie Google Maps zur Standardkarte im iPhone So machen Sie Google Maps zur Standardkarte im iPhone Apr 17, 2024 pm 07:34 PM

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

Neue Generation der Glasfaser-Breitbandtechnologie – 50G PON Neue Generation der Glasfaser-Breitbandtechnologie – 50G PON Apr 20, 2024 pm 09:22 PM

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

Uhr-App fehlt im iPhone: So beheben Sie das Problem Uhr-App fehlt im iPhone: So beheben Sie das Problem May 03, 2024 pm 09:19 PM

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

Wie schreibe ich ein einfaches Countdown-Programm in C++? Wie schreibe ich ein einfaches Countdown-Programm in C++? Nov 03, 2023 pm 01:39 PM

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

So öffnen Sie eine Website mit dem Taskplaner So öffnen Sie eine Website mit dem Taskplaner Oct 02, 2023 pm 11:13 PM

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“.

iOS 17: So organisieren Sie iMessage-Apps in Nachrichten iOS 17: So organisieren Sie iMessage-Apps in Nachrichten Sep 18, 2023 pm 05:25 PM

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

Der Zugriff auf Kamera und Mikrofon im iPhone kann nicht zugelassen werden Der Zugriff auf Kamera und Mikrofon im iPhone kann nicht zugelassen werden Apr 23, 2024 am 11:13 AM

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

Fix: Systemtreiber an Herstellerangaben gebunden Fix: Systemtreiber an Herstellerangaben gebunden Sep 23, 2023 pm 07:25 PM

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

See all articles