在mysql中实现读写分离、负载均衡,用Mysql-Proxy是很容易的事,不过大型处理对于性能方面还有待提高,主要配置步骤如下:

1.1. mysql-proxy安装

MySQL Proxy就是这么一个中间层代理,简单的说,MySQL Proxy就是一个连接池,负责将前台应用的连接请求转发给后台的数据库,并且通过使用lua脚本,可以实现复杂的连接控制和过滤,从而实现读写分离和负 载平衡。对于应用来说,MySQL Proxy是完全透明的,应用则只需要连接到MySQL Proxy的监听端口即可。当然,这样proxy机器可能成为单点失效,但完全可以使用多个proxy机器做为冗余,在应用服务器的连接池配置中配置到多 个proxy的连接参数即可。建议proxy别跟mysql数据库安装在一台服务器中。

在安装mysql-proxy之前需要确定已经按照以下包:pkg-config(系统自带,不需安装) ,libevent,glib,LUA,在CentOS5.2系统已经包含,查看是否已经安装改包,用命令rpm –q libevent 、rpm –q glib和rpm –q –lua,如果版本过低或者未安装,需要重新安装。

一、mysql-proxy安装

1、 libevent安装

centos下自带的libevent版本超老,这个没有别的办法,只能自己重新编译,版本需要在1.4.0以上,越高越好,重新安装命令

Ø  wget http://monkey.org/~provos/libevent-1.4.9-stable.tar.gz  远程下载包

Ø  tar zvfx libevent-1.4.9-stable.tar.gz

Ø  cd libevent-1.4.9-stable

Ø  ./configure

Ø  make

Ø  make install

2、glib安装

centos自带的glib版本也比较老,mysqlproxy 0.7.0以上需要glib2 2.16.0以上才能编译成功,因此也需要重新编译glib,重新安装命令:

Ø  wget http://ftp.gnome.org/pub/gnome/sources/glib/2.18/glib-2.18.4.tar.gz

Ø  tar zvfx glib-2.18.4.tar.gz

Ø  cd glib-2.18.4

Ø  ./configure

Ø  make

Ø  make install

3、LUA安装

Centos系统未自带该包,需下载安装,安装命令如下

Ø  wget http://www.lua.org/ftp/lua-5.1.4.tar.gz

Ø  tar zvfx lua-5.1.4.tar.gz

Ø  cd lua-5.1.4

在安装Lua之前,如果操作系统为64位,需要修改lua相关文件代码为:

vi src/Makefile进入改文件找到CFLAGS,在其最后面添加上-fPIC,如果不添加则要在64位机上编译出现了“relocations”错误。

修改了改文件后,现在执行编译按照操作

Ø  make linux

Ø  make install

Ø  cp etc/lua.pc /usr/local/lib/pkgconfig/

重要:让pkg-config找到自己编译的库在哪里,执行以下指令

export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig

LUA安装完毕。

4、mysql-proxy源码安装

Ø  wget http://launchpad.net/mysql-proxy/0.8/0.8.0/+download/mysql-proxy-0.8.0.tar.gz

Ø

Ø  tar zxvf mysql-proxy-0.8.0.tar.gz

Ø  cd mysql-proxy-0.8.0

Ø  ./configure

Ø  make

Ø  make install

编译完成可执行命令mysql-proxy –V 查看安装信息

说明Mysql-proxy已经安装成功了。接下来对其进行配置

二、mysql-proxy配置

1、mysql-proxy配置需要配置脚本,脚本可以直接从网站上下载,执行命令

Ø  wget -c http://customcode.googlecode.com/files/mysql-proxy

Ø   cp mysql-proxy   /etc/init.d/mysql-proxy 把下载到的复制到 /etc/init.d/下

此脚本为mysql-proxy的启动、停止、重启和相关运行的读写分离、负载均衡提供了支持。

对脚本进行格式转换,否则在运行操作时会提示错误,转换命令:

Ø  dos2unxi /etc/init.d/mysql-proxy 

Ø   vi /etc/init.d/mysql-proxy

Ø  :set ff=unix 修改成Unix模式

保存退出

再执行命令:

Ø  # chmod 755 /etc/init.d/mysql-proxy   修改该文件权限
Ø  # chkconfig mysql-proxy on  

2、添加读写分离、负载均衡配置文件

此文件主要配置读写分离、负载均衡的服务器配置文件,路径为:etc/sysconfig/添加mysql-proxy文件,此文件名需要和 /etc/init.d/mysql-proxy中文件里的代码指定的文件名一致。这里都为mysql-proxy。

创建mysql-proxy文件,执行命令:

Ø  vi /etc/sysconfig/mysql-proxy 创建文件    
添加内容:
 # options to mysql-proxy  
# do not remove --daemon   
PROXY_OPTIONS="—admin-address=:4040 --proxy-backend-addresses=192.168.1.60:3306  --proxy-read-only-backend-addresses=192.168.1.61:3306  --proxy-lua-script=/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua  --keepalive --daemon"
红色为读写分离配置,只用于读
脚本解释说明

--daemon 采用daemon方式启动

--admin-address=:4040 指定mysqlproxy的管理端口,在这里,表示本机的4401端口;

--proxy-address=:3307 指定mysqlproxy的监听端口,也可以用 127.0.0.1:3307 表示;

--proxy-backend-addresses=192.168.1.60:3306 指定mysql主机的端口,可读写;

--proxy-read-only-backend-addresses=192.168.1.61:3306 指定只读的mysql主机端口,多个指定

--proxy-read-only-backend-addresses=192.168.1.61:3306 指定另一个只读的mysql主机端口;

--proxy-lua-script=/usr/local/share/mysql-proxy/rw-splitting.lua指定lua脚本,在这里,使用的是rw-splitting脚本,用于读写分离

此脚本也可以直接在网上下载:

在linux下执行命令:

wget http://bazaar.launchpad.net/~diego-fmpwizard/mysql-proxy/bug-43424/download/head%3A/rwsplitting.lua-20090112150705-l9v35osiopsn0nz0-10/rw-splitting.lua

把下载的包复制到路径/usr/local/share/mysql-proxy/下

修改读写分离脚本 rw-splitting.lua

修改默认连接,进行快速测试,不修改的话达到连接数为4时才启动读写分离

#vi /opt/mysql-proxy/scripts/rw-splitting.lua

-- connection pool

min_idle_connections = 1, //默认为4

max_idle_connections = 1, //默认为8

三、启动mysql-proxy

进入之前在路径/etc/init.d/中建立的mysql-proxy文件,执行命令:

Ø mysql-proxy start|stop 则mysql-proxy服务启动成功|停止

2.2测试

一、负载均衡测试:

测试服务器:192.168.1.60(mysql-proxy安装在此服务器);192.168.1.61,

分表在上述服务器创建数据库testproxy,用于数据读取。

在60数据库中添加数据 name:slave,id:1

61数据库中添加数据 name:master,id:1

打开两个连接窗口

在192.168.1.61中输入命令

# mysql -u user -h 192.168.1.60 -p -P 4010

主要是连接在192.168.1.60中的mysql-proxy,其中4040为mysql-proxy管理端口,在配置文件中设置。

在mysql中执行查询语句:

默认请求的是当前数据库的连接,接下来停止当前服务器(192.168.1.61)中的mysql服务

命令:service mysqld stop;

停止服务后,再一次连接

# mysql -u user -h 192.168.1.60 -p -P 4010

在mysql执行查询语句,输出的结果则为:

此查询是自动切换到192.168.1.60中的数据中

现在mysql-proxy服务连接的是192.168.0.60数据库,如果现在把该mysql服务停止,启动1.61的mysql服务,再在192.168.1.61客户端执行

# mysql -u user -h 192.168.1.60 -p -P 4010

查询出的结果又会是192.168.1.61 数据库的数据,如图:

提示上面错误信息,说明正在试图连接其他服务器。

说明:负载均衡中的连接没有主从之分,在多个服务器同时启动的时候,先启动的服务器,就被标识为主,如果主挂掉,连接的其他服务器会被标识成主。

在做读写分离测试时:

主要是针对程序测试,需要在对两个数据库同时作添加查询的操作,那样,添加会自动切换到主库,读取数据会切换到从库。

我们已经实现了MySQL读写分离,目前所有的写操作都全部在Master主服务器上,用来避免数据的不同步;在程序里做测试时,连接的服务器地址为:192.168.1.60 port=4040 (.net 连接数据库web.config连接字符串)

这里必须跟上端口号,指定连接是mysql-proxy代理服务器,在代码中写入插入、查询语句,进行测试,会发现读写操作不同的数据库。

另外,所有的读操作都分摊给了其它各个Slave从服务器上,用来分担数据库压力。

总结:在上述环境中,mysql-proxy和mysql-master、mysql-slave三台服务器均存在单点故障。如果在可用性要求较高
的场合,单点隐患是绝对不允许的。为了避免mysql-proxy单点隐患有两种方法,一种方法是mysql-proxy配合keepalived做双
机,另一种方法是将mysql-proxy和应用服务安装到同一台服务器上;为了避免mysql-master单点故障可以使用
DRBD+heartbear做双机;避免mysql-slave单点故障增加多台mysql-slave即可,因为mysql-proxy会自动屏蔽后
端发生故障的mysql-slave。

附录:

Mysql 配置文件:

1 [mysqld]

2datadir=/var/lib/mysql

3socket=/var/lib/mysql/mysql.sock

4user=mysql

5 #server-id= 2

6 log-bin= mysql-bin

7 #master-host= 192.168.1.60

8 #master-user= user

9 #master-password= 123456

10 #master-port= 3306

11 #Disabling symbolic-links is recommended to prevent assorted security risks

12symbolic-links=0

13log-slow-queries = var/lib/mysql/slow-query.log

14back_log=1000

15key_buffer_size = 300M

16max_allowed_packet = 4M

17thread_stack = 256K

18tmp_table_size = 200M

19sort_buffer_size = 32M

20read_buffer_size = 4M

21read_rnd_buffer_size = 16M

22join_buffer_size = 8M

23myisam_sort_buffer_size = 64M

24table_cache= 1024

25 thread_cache_size= 120

26query_cache_size = 64M

27tmp_table_size = 256M

28max_connections = 1024

29thread_cache_size = 80

30max_connect_errors = 10000000

31wait_timeout=30// sleep连接休眠时间 超过10秒则终止连接

32thread_concurrency= 8

33innodb_flush_log_at_trx_commit = 1

34innodb_log_buffer_size = 2M

35innodb_thread_concurrency=8

36record_buffer = 16M

37interactive_timeout = 30

38skip_name_resolve // 建议打开

39binlog_format=mixed  // 建议开启 以免在事务操作时日志出错

40 # Toenable the InnoDB Plugin, uncomment the 2 next lines

41#ignore-builtin-innodb

42#plugin-load=innodb=ha_innodb_plugin.so

43

44 # Toenable InnoDB-related INFORMATION_SCHEMA tables

45 # Jointhe following options to above directive

46   ;innodb_trx=ha_innodb_plugin.so

47   ;innodb_locks=ha_innodb_plugin.so

48   ;innodb_cmp=ha_innodb_plugin.so

49   ;innodb_cmp_reset=ha_innodb_plugin.so

50   ;innodb_cmpmem=ha_innodb_plugin.so

51   ;innodb_cmpmem_reset=ha_innodb_plugin.so

52

53[mysqld_safe]

54log-error=/var/log/mysqld.log

55pid-file=/var/run/mysqld/mysqld.pid

56

57

58 [mysql]

59default-character-set=gb2312

常用my.cnf配置文件

Mysql慢日志查询

分析sql查询语句,可以打开mysql中的log_slow_queries 参数

打开方式是在my.cnf中添加log-slow-queries= var/lib/mysql/slow-query.log

配合参数long_query_time =10(单位为秒) 只的是超过10s的查询会记录该日志

Mysql在多并发出现大量“unauthenticated user x.x.x.x:2501 None Connect Reading from net”

信息时,需要在my.cnf配置文件中添加skip-name-resolve 参数,

它将禁止 MySql Server 对外部连接进行 DNS 解析,使用这一选项可以消除 MySql 进行 DNS 解析的时间。

但需要注意,如果开启该选项,则所有远程主机连接授权都要使用IP地址方式,否则MySQL将无法正常处理连接请求,即不能使用Localhost主机名的方式访问

Mysql-Proxy实现mysql读写分离、负载均衡 (转)的更多相关文章

  1. 基于amoeba实现mysql数据库的读写分离/负载均衡

    一.Amoeba的简述:[来自百度百科]      Amoeba是一个以MySQL为底层数据存储,并对应用提供MySQL协议接口的proxy.它集中地响应应用的请求,依据用户事先设置的规则,将SQL请 ...

  2. mysql高可用架构方案之二(keepalived+lvs+读写分离+负载均衡)

    mysql主从复制与lvs+keepalived实现负载高可用 文件夹 1.前言    4 2.原理    4 2.1.概要介绍    4 2.2.工作原理    4 2.3.实际作用    4 3方 ...

  3. MySQL Proxy 实现MySQLDB 读写分离

    一.简述 MySQL Proxy是一个处于你的client端和MySQL server端之间的简单程序,它可以监测.分析或改变它们的通信.它使用灵活,没有限制,常见的用途包括:负载平衡,故障.查询分析 ...

  4. MyCat 读写分离,负载均衡

    docker mysql 主从复制 配合Spring 事务 注意事项 配置好JRE,安装好MYCAT 在mysql主库创建表,会同步到从库 CREATE TABLE `user` ( `id` ) N ...

  5. 使用MySQL Proxy和MySQL Replication实现读写分离

    MySQL Replication可以将master的数据复制分布到多个slave上,然后可以利用slave来分担master的读压力.那么对于前台应用来说,就要考虑如何将读的压力分布到多个slave ...

  6. MySql的主从复制以及读写分离详解

    MySQL主从复制(Master-Slave)与读写分离(MySQL-Proxy)实践 Mysql作为目前世界上使用最广泛的免费数据库,相信所有从事系统运维的工程师都一定接触过.但在实际的生产环境中, ...

  7. MySQL主从复制技术与读写分离技术amoeba应用

    MySQL主从复制技术与读写分离技术amoeba应用 前言:眼下在搭建一个人才站点,估计流量会非常大,须要用到分布式数据库技术,MySQL的主从复制+读写分离技术.读写分离技术有官方的MySQL-pr ...

  8. Mysql 高可用(MHA)-读写分离(Atlas)-分布式架构(Mycat)

    Mysql 高可用(MHA)-读写分离(Atlas) 1. 搭建主从复制(一主两从) 1.1 准备环境 1 主库:10.0.0.51/db01 2 从库:10.0.0.52/db02,10.0.0.5 ...

  9. 基于Mysql-Proxy实现Mysql的主从复制以及读写分离(上)

    基于Mysql-Proxy实现Mysql的主从复制以及读写分离(上) 上周BOSS给分配任务让实现一下Mysql数据库的主从复制以及读写分离,然后花了一盏茶的功夫进行了调研,发现主从复制数据库进行一番 ...

  10. 基于Mysql-Proxy实现Mysql的主从复制以及读写分离(下)

    基于Mysql-Proxy实现Mysql的主从复制以及读写分离(下) 昨天谈到了Mysql实现主从复制,但由于时间原因并未讲有关读写分离的实现,之所以有读写分离,是为了使数据库拥有双机热备功能,至于双 ...

随机推荐

  1. C#中使用aria2c进行下载并显示进度条

    正则表达式的生成网站: http://www.txt2re.com/index-csharp.php3 Aria2c下载地址: https://github.com/aria2/aria2/relea ...

  2. JDK7集合框架源码阅读(三) HashMap

    基于版本jdk1.7.0_80 java.util.HashMap 代码如下 /* * Copyright (c) 1997, 2010, Oracle and/or its affiliates. ...

  3. Codeforces 798 B. Mike and strings-String的find()函数

    好久好久好久之前的一个题,今天翻cf,发现这个题没过,补一下. B. Mike and strings time limit per test 2 seconds memory limit per t ...

  4. spark完整的数据倾斜解决方案

    1.数据倾斜的原理 2.数据倾斜的现象 3.数据倾斜的产生原因与定位 在执行shuffle操作的时候,大家都知道,我们之前讲解过shuffle的原理. 是按照key,来进行values的数据的输出.拉 ...

  5. Lightoj 1348 Aladdin and the Return Journey (树链剖分)(线段树单点修改区间求和)

    Finally the Great Magical Lamp was in Aladdin's hand. Now he wanted to return home. But he didn't wa ...

  6. 固件分析工具Binwalk

    固件分析工具Binwalk   固件是保存在嵌入式设备存储器的程序.它负责设备运行和功能,如路由器等设备.通过分析固件文件,可以了解设备的工作方式,并且确认是否存在漏洞.Binwalk是Kali Li ...

  7. hdu 1501 Zipper dfs

    题目链接: HDU - 1501 Given three strings, you are to determine whether the third string can be formed by ...

  8. 每天一个liunx命令3之awk实现文本文件的抓取

    =============================================================================grep -h -s -E 'HUAWEI_9 ...

  9. Linux下进行Web服务器压力(并发)测试工具http_load、webbench、ab、Siege、autobench简单使用教程(转)

    一.http_load 程序非常小,解压后也不到100K http_load以并行复用的方式运行,用以测试web服务器的吞吐量与负载.但是它不同于大多数压力测试工 具,它可以以一个单一的进程运行,一般 ...

  10. sqlserver 出现sql被锁时,查看加锁和被锁的sql

    原文:sqlserver 出现sql被锁时,查看加锁和被锁的sql DECLARE @spid INT DECLARE @blk INT DECLARE @count INT DECLARE @ind ...