mysql的主从复制(二)mysql-proxy实现读写分离

安装前准备(三台虚拟机):

主机1:

172.16.24.77   安装msyql服务器端  mysql-proxy

主机2:

172.16.24.88    安装mysql服务器端(mysql主)

主机3:

172.16.24.99   安装mysql服务器端(mysql从)

(注,我这里的三台主机都是安装好了mysql的,如里你没有安装请参照前面的博客有安装过程)

一、安装mysql-proxy

所需安装包(mysql-proxy-0.8.3-linux-glibc2.3-x86-64bit.tar.gz)

1)解压并创建链接:

[[email protected] ~]# tar xf mysql-proxy-0.8.3-linux-glibc2.3-x86-64bit.tar.gz -C /usr/local

[[email protected] ~]# cd /usr/local

[[email protected] local]# ln -sv mysql-proxy-0.8.3-linux-glibc2.3-x86-64bit mysql-proxy

`mysql-proxy‘ -> `mysql-proxy-0.8.3-linux-glibc2.3-x86-64bit‘

2)创建mysql-proxy用户。因为mysql-proxy要以这个用户的身份运行。

[[email protected] local]# cd mysql-proxy

[[email protected] mysql-proxy]# useradd mysql-proxy

3)为mysql-proxy提供服务服本

[[email protected] mysql-proxy]# vim /etc/rc.d/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

4)更改文件权限并设置开机启动

[[email protected] mysql-proxy]# chmod +x /etc/rc.d/init.d/mysql-proxy

[[email protected] mysql-proxy]# chkconfig --add mysql-proxy

5)为服务脚本提供配置文件/etc/sysconfig/mysql-proxy

[[email protected] mysql-proxy]# vim /etc/sysconfig/mysql-proxy

ADMIN_PASSWORD="admin"

ADMIN_ADDRESS=""

ADMIN_LUA_SCRIPT="/usr/local/mysql-proxy/share/doc/mysql-proxy/admin.lua"

PROXY_ADDRESS="172.16.24.77:4040"

PROXY_USER="mysql-proxy"

PROXY_OPTIONS="--daemon --log-level=info --log-use-syslog --plugins=proxy --plugins=admin --proxy-backend-addresses=172.16.24.88:3306 --proxy-read-only-backend-addresses=172.16.24.99:3306 --proxy-lua-script=/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua"

(注:上面的配置文件就定义了172.16.24.99,为只读服务器,并指定了读写分离脚本的存放位置)

5)建立admin.lua文件

[[email protected] mysql-proxy]# vim share/doc/mysql-proxy/admin.lua

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

6)配置好了,现在就启动mysql-proxy:

[[email protected]rver1 mysql-proxy]# service mysql-proxy start

Starting /usr/local/mysql-proxy/bin/mysql-proxy:           [  OK  ]

[[email protected] ~]# ss -tnl

State      Recv-Q Send-Q                                    Local Address:Port

LISTEN     0      128                                                 ::1:6010

LISTEN     0      128                                        172.16.24.77:4040

LISTEN     0      128                                                   *:4041

LISTEN     0      50                                                    *:3306

7)连接mysql-proxy并验证:

[[email protected] ~]# mysql -uadmin -padmin -h 172.16.24.77 --port=4041

mysql> select * from backends;

+-------------+-------------------+---------+------+------+-------------------+

| backend_ndx | address           | state   | type | uuid | connected_clients |

+-------------+-------------------+---------+------+------+-------------------+

|           1 | 172.16.24.88:3306 | unknown | rw  | NULL |                 0 |

|           2 | 172.16.24.99:3306 | unknown | ro   | NULL |                 0 |

+-------------+-------------------+---------+------+------+-------------------+

2 rows in set (0.00 sec)

mysql的主从复制(二)mysql-proxy实现读写分离,布布扣,bubuko.com

时间: 2024-12-29 01:18:27

mysql的主从复制(二)mysql-proxy实现读写分离的相关文章

MySQL主从复制(Master-Slave)与读写分离(MySQL-Proxy)实践

Mysql作为目前世界上使用最广泛的免费数据库,相信所有从事系统运维的工程师都一定接触过.但在实际的生产环境中,由单台Mysql作为独立的数据库是完全不能满足实际需求的,无论是在安全性,高可用性以及高并发等各个方面. 因此,一般来说都是通过 主从复制(Master-Slave)的方式来同步数据,再通过读写分离(MySQL-Proxy)来提升数据库的并发负载能力 这样的方案来进行部署与实施的. 如下图所示: 下面是我在实际工作过程中所整理的笔记,在此分享出来,以供大家参考. 一.MySQL的安装与

MySQL主从复制(Master-Slave)与读写分离(MySQL-Proxy)实践 转载

http://heylinux.com/archives/1004.html MySQL主从复制(Master-Slave)与读写分离(MySQL-Proxy)实践 Mysql作为目前世界上使用最广泛的免费数据库,相信所有从事系统运维的工程师都一定接触过.但在实际的生产环境中,由单台Mysql作为独立的数据库是完全不能满足实际需求的,无论是在安全性,高可用性以及高并发等各个方面. 因此,一般来说都是通过 主从复制(Master-Slave)的方式来同步数据,再通过读写分离(MySQL-Proxy

MySQL主从(MySQL proxy Lua读写分离设置,一主多从同步配置,分库分表方案)

Mysql Proxy Lua读写分离设置 一.读写分离说明 读写分离(Read/Write Splitting),基本的原理是让主数据库处理事务性增.改.删操作(INSERT.UPDATE.DELETE),而从数据库处理SELECT查询操作.数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库. 1.设置说明 Master服务器: 192.168.41.196 Slave服务器: 192.168.41.197 Proxy服务器: 192.168.41.203 2.安装Mysql Pro

Mysql + keepalived 实现双主热备读写分离【转】

Mysql + keepalived 实现双主热备读写分离 2013年6月16日frankwong发表评论阅读评论 架构图 系统:CentOS6.4_X86_64软件版本:Mysql-5.6.12,Keepalived-1.2.7环境简介:1.Master-A 192.168.1.168 (Mysql+Keepalived)2.Master-B 192.168.1.169 (Mysql+Keepalived)3.写入VIP 192.168.100 (168主,169从)4.读取VIP 192.1

MariaDB 10 (MySQL DB) 多主复制并实现读写分离

MMM 即Master-Master Replication Manager for MySQL(mysql主主复制管理器)关于mysql主主复制配置的监控.故障转移和管理的一套可伸缩的脚本套件(在任何时候只有一个节点可以被写 入),这个套件也能对居于标准的主从配置的任意数量的从服务器进行读负载均衡,所以你可以用它来在一组居于复制的服务器启动虚拟ip,除此之外,它还有实 现数据备份.节点之间重新同步功能的脚本.MySQL本身没有提供replication failover的解决方案,通过MMM方

mysql的复制集群,及读写分离

为什么要设置mysql集群? 为了减轻,mysql服务器的IO压力,设置多个其他mysql服务器帮他分担读写操作 1.mysql复制集群的类型 主从架构(从服务器只读,不可写) 一主一从, 一主多重 主主架构 2.复制原理 1)若主服务器上的数据集较大,则需要我们将主服务器数据库所有内容做备份,然后发送给从服务器,随后获取二进制日志的文件,及其坐标用于后续的数据同步 2)所谓同步,是主服务器上的二进制日志中的SQL语句,发送到从服务器上的中继日志文件中,然后把这些SQL语句重放实现同步 3.与主

mysql基于Amoeba(变形虫)实现读写分离

一.实验环境 1.准备五台主机,其中三台已经实现了Mysql的主从复制(主从复制不再演示,从安装Amoeba开始),一台安装Amoeba,一台用作试验机 mysql-master:192.168.200.111 mysql-slave1:192.168.200.112 mysql-slave2:192.168.200.113 Amoeba:192.168.200.114 Client:192.168.200.115 2.所有主机关闭安全机制和防火墙. [[email protected] ~]#

mysql 第十七篇文章~mycat的读写分离

一 简介 今天咱们来聊聊mycat的一个功能 读写分离二 前沿: mycat的核心功能之一,读写分离的测试三    1读写分离的需求     1 将业务的读需求定向到从库去查询,减轻主库压力     2 将业务的特殊读需求定向到主库去查询   2 读写分离要考虑的问题    1 当从库出现问题时踢出有问题的从库(从库down机或者复制停止)    2 当从库出现延迟时踢出有问题的从库(单个从库延迟),但是当从库正常时,从库节点从新提供读服务    3 当所有提供读取的从节点的从库出现问题时,查询

MySQL的主从复制与MySQL的主主复制

一.MySQL的主从复制 注意事项: 主节点必须开启二进制日志,在从节点上务必开启中继日志: 中继日志:从服务器上记录下来从主服务器的二进制日志文件同步过来的事件: 下面来做一个小的实验,两个空的数据库的主从复制 配置前注意事项:务必同步时间 ntpdate 172.18.0.1 如果服务开启先停止服务,清空数据 systemctl stop mariadb rm -rf /var/lib/mysql/* 实验演示: 1.主节点上的配置文件中定义如下 [server]