在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的启动、停止、重启和相关运行的读写分离、负载均衡提供了支持。

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

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

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

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

保存退出

再执行命令:

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

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

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

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

  1. Ø  vi /etc/sysconfig/mysql-proxy 创建文件    
  1. 添加内容:
  1. # options to mysql-proxy  
  1. # do not remove --daemon   
  1. 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"
  1. 红色为读写分离配置,只用于读
  1. 脚本解释说明

--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. 如何让springboot中的某些html文件不经过thymeleaf模板解析?

    这个thymeleaf有时有用,有时用不着. 但默认设置,所有的html都会经过它解析. 我的作法,是新建public,在resource里,所有css,js所放里面.(当然,static下也是OK的 ...

  2. web前端到底是什么?有前途吗

    web前端到底是什么? 某货: “前几年前端开发人员鱼目混杂,技术参差不齐,相对学习起来不规范,导致> 前端开发人员聚集,所以现在前端工种和工资还是没得到普遍重视,但近2年来,> > ...

  3. POJ 2528.Mayor's posters-线段树(成段替换、离散数据、简单hash)

    POJ2528.Mayor's posters 这道题真的是线段数的经典的题目,因为数据很大,直接建树的话肯定不可以,所以需要将数据处理一下,没有接触离散化的时候感觉离散化这个东西相当高级,其实在不知 ...

  4. 最小生成树【p2121】 拆地毯

    题目描述--->p2121 拆地毯 分析 这题为什么是最大生成树. 先来bb两句 题目为拆地毯,让我们剩下k个地毯. 题目想要我们求得最大的美丽度. 且要求我们 保留的地毯构成的图中,任意可互相 ...

  5. java collection get 方法

    Collections unmodifiableList

  6. MFC学习1

    引用:http://v.youku.com/v_show/id_XMjM3MTI1ODky.html MSG 窗口——一般是程序在屏幕上的不同的矩形区域。 窗口句柄——标识窗口类型的类(资源的标识) ...

  7. [JZOJ3106]锻炼

    题目大意: 给你一个$n\times m(n,m\leq 50)$的网格图,其中有一个四连通的障碍物.给定起点和终点,每次你可以走到和当前位置八连通的一个方格内,问绕障碍物一圈最短要走几格? 思路: ...

  8. extjs combo中给Store插入一条数据

    { xtype: 'combo', columnWidth: .55, name: 'AQLLevel', store: Ext.create('Scripts.Code.Common.store.I ...

  9. Apache2 httpd.conf 配置详解

    Apache2 httpd.conf 配置详解 <第一部分> 常用配置指令说明 1. ServerRoot:服务器的基础目录,一般来说它将包含conf/和logs/子目录,其它配置文件的相 ...

  10. linux-系统启动过程,执行的配置文件

    注意:环境变量的设置,都是通过export来设置的. export的使用详见:http://www.cnblogs.com/DengGao/p/6341443.html 环境变量是和Shell紧密相关 ...