您好,登录后才能下订单哦!
下文主要给大家带来MySQL Proxy实现读写分离的实战举例,希望这些内容能够带给大家实际用处,这也是我编辑MySQL Proxy实现读写分离的实战举例这篇文章的主要目的。好了,废话不多说,大家直接看下文吧。
 
  
    规划:
	主mysql服务器:192.168.1.21
	从mysql服务器: 192.168.1.22
	mysql读写分离器:192.168.1.23
	1、读写分离服务器上解压安装包,并添加对应用户,并编辑启动脚本;
		# tar xf mysql-proxy-0.8.3-linux-glibc2.3-x86-64bit.tar.gz -C /usr/local/
		# cd /usr/local/
		# ln -sv mysql-proxy-0.8.3-linux-glibc2.3-x86-64bit mysql-proxy
		# cd mysql-proxy
		# useradd mysql-proxy
		# vim /etc/init.d/mysql-proxy
			#!/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/functions
			prog="/usr/local/mysql-proxy/bin/mysql-proxy"
			# Source networking configuration.
			if [ -f /etc/sysconfig/network ]; then
				. /etc/sysconfig/network
			fi
			# 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.pid
			PROXY_USER="mysql-proxy"
			# Source mysql-proxy configuration.
			if [ -f /etc/sysconfig/mysql-proxy ]; then
				. /etc/sysconfig/mysql-proxy
			fi
			RETVAL=0
			start() {
				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
					;;
			esac
			exit $RETVAL
		# chmod +x /etc/init.d/mysql-proxy
		# vim /etc/sysconfig/mysql-proxy
			# Options for mysql-proxy 
			ADMIN_USER="admin"
			ADMIN_PASSWORD="admin"
			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.21:3306 --proxy-read-only-backend-addresses=192.168.1.22:3306 --proxy-lua-script=/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua"
	2、编辑admin.lua脚本文件,将其保存至/usr/local/mysql-proxy/share/doc/mysql-proxy/中;
		# vim /usr/local/mysql-proxy/share/doc/mysql-proxy/admin.lua
			--[[ $%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-1301  USA
			$%ENDLICENSE%$ --]]
			function set_error(errmsg) 
				proxy.response = {
					type = proxy.MYSQLD_PACKET_ERR,
					errmsg = errmsg or "error"
				}
			end
			function 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_RESULT
			end
		# service mysql-proxy start
	3、测试;
		3.1、管理功能测试:
			# yum -y install mysql
			# mysql -uadmin -padmin -h292.168.1.23 --port=4041 
			mysql> SELECT * FROM backends;
		3.2、主服务器上创建一个复制账号;
			mysql> GRANT ALL ON *.* TO 'admin'@'192.168.1.23' IDENTIFIED BY 'admin';
			mysql> FLUSH PRIVILEGES;
		3.3、在mysql-proxy上使用主服务器的账号登录;
			# mysql -u admin -p -h 192.168.1.23
				此时即可登录到主mysql服务器;
			mysql> CREATE DATABASE mydb;
				此时创建数据库应该仅发送给主mysql服务器,可使用tcpdump的方式获取数据流向,创建数据库完成后mysql-proxy与主mysql服务器已建立联系,因而在mysql-proxy上使用SELECT * FROM backends即可查看服务器状态;
对于以上关于MySQL Proxy实现读写分离的实战举例,大家是不是觉得非常有帮助。如果需要了解更多内容,请继续关注我们的行业资讯,相信你会喜欢上这些内容的。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。