SlideShare a Scribd company logo
1 of 13
Mysql+mmm+proxy 测试
2008 年 9 月 8 日
16:38


作者:守住每一天
博客:http://liuyu.blog.51cto.com
BBS:http://www.linuxtone.org
msn: liuyubj520@hotmail.com
邮箱:liuyu@sohu.com
如果有什么问题,欢迎大家交流
感谢黄琨老师:huangkun.blog.51cto.com




动机:proxy 实现读写分离
MMM 使 Replication 方案具有 HA
下面先看从网上摘抄的一段说明。
引言


Master-Slave 的数据库机构解决了很多问题,特别是 read/write 比较高的 web2.0 应用:
1、写操作全部在 Master 结点执行,并由 Slave 数据库结点定时(默认 60s)读取 Master 的
bin-log
2、将众多的用户读请求分散到更多的数据库节点,从而减轻了单点的压力


这是对 Replication 的最基本陈述,这种模式的在系统 Scale-out 方案中很有引力(如有必
要,数据可以先进行 Sharding,再使用 replication)。


它的缺点是:
1、Slave 实时性的保障,对于实时性很高的场合可能需要做一些处理
2、高可用性问题,Master 就是那个致命点(SPOF:Single point of failure)


本文主要讨论的是如何解决第 2 个缺点。


DB 的设计对大规模、高负载的系统是极其重要的。高可用性(High availability)在重要的系
统(critical System)是需要架构师事先考虑的。存在 SPOF:Single point of failure 的设计在
重要系统中是危险的。




Master-Master Replication
1、使用两个 MySQL 数据库 db01,db02,互为 Master 和 Slave,即:
一边 db01 作为 db02 的 master,一旦有数据写向 db01 时,db02 定时从 db01 更新
另一边 db02 也作为 db01 的 master,一旦有数据写向 db02 时,db01 也定时从 db02 获
得更新
(这不会导致循环,MySQL Slave 默认不会记录 Master 同步过来的变化)


2、但从 AppServer 的角度来说,同时只有一个结点 db01 扮演 Master,另外一个结点
db02 扮演 Slave,不能同时两个结点扮演 Master。即 AppSever 总是把 write 操作分配某
个数据库(db01),除非 db01 failed,被切换。


3、如果扮演 Slave 的数据库结点 db02 Failed 了:
a)此时 appServer 要能够把所有的 read,write 分配给 db01,read 操作不再指向 db02
b)一旦 db02 恢复过来后,继续充当 Slave 角色,并告诉 AppServer 可以将 read 分配给它
了


4、如果扮演 Master 的数据库结点 db01 Failed 了
a)此时 appServer 要能够把所有的写操作从 db01 切换分配给 db02,也就是切换 Master
由 db02 充当
b)db01 恢复过来后,充当 Slave 的角色,Master 由 db02 继续扮演


难点:
3、4 要如何自动进行?


Master-Master with n Slaves Replication
这比上一个还要复杂,即:
当一个 Master Fail 时,所有的 Slave 不再从原来失败的那个 Master(db01)获取更新日
志,而应该“自动”切换到最新充当 Master 角色的数据库 db02。


MMM,a greate project!
MMM 的基本信息请参考它的网站(见后"参考资料")
MMM 有 3 个重要的器件:
1、mmmd_mon - monitoring script which does all monitoring work and makes all
decisions about roles moving and so on.
2、mmmd_agent - remote servers management agent script, whichprovides monitoring
node with simple set of remote services to makeservers management easier, more
flexible abd highly portable.
3、mmm_control - simple script dedicated to management of the mmmd_mon processes
by commands.


每一个 MySQL 服务器器结点需要运行 mmmd_agent,同时在另外的一个机器上(可以是
独立的一台机器,也可以是和 AppServer 共享同一个服务器)运行 mmmd_mon。形成 1 *
mmmd_mon + n * mmmd_agent 的部署架构。


MMM 利用了虚拟 IP 的技术:1 个网卡可以同时使用多个 IP。
(所以使用 MMM 时,需要 2*n+1 个 IP,n 为 mysql 数据库结点个数,包括 master,slave)
当有数据库结点 fail 时,mmmd_mon 检测不到 mmmd_agent 的心跳或者对应的 MySQL
服务器的状态,mmmd_mon 将进行决定,并下指令给某个正常的数据库结点的
mmmd_agent,使得该 mmmd_agent“篡位”使用(注)刚才 fail 的那个结点的虚拟 IP,使得
虚拟 IP 实际从指向 fail 的那个机器自动转为此时的这个正常机器。
注:据 Qieqie 猜测是将获得的虚拟 IP 设置给网卡,也只能这样了,改天测试验证一下。


repeat: MMM 对 MySQL Master-Slave Replication 绝对是一个很有益的补充!


整体架构的原理:
Webclient 数据请求至 proxy—proxy 进行读写分发-转至 mmm 机制-在检测存活的机
器进行读与写操作。在此之前这些机器与为 master/slave.
本文测试环境如下:

主机名      IP            Port   App      目录               备注

Node1    192.168.1.2 3306     mysql    /var/lib/mysql   数据库服务器 1

Node2    192.168.1.3 3306     mysql    /var/lib/mysql   数据库服务器 2

Mon      192.168.1.4 3306     Mysql    /var/lib/mysql   数据库管理服务器

Proxy    192.168.1.5 4040     Proxy                     数据库代理(NLB)

node1 node2 数据库服务器 replication 双向 master-master 虚拟机有限,只能开 4 台,
因为 node1 与 node2 即做读又做写。




配置步骤:
Node1 node2 replication 双向 master-master
Node1 node2 安装 mmm 并配置 mmm_regent.conf
Mon 安装 mmm 并配置 mmm_mon.conf
proxy 安装 mysql-proxy
node1


node2


一、配置 node1 node2 数据库服务器 replication 双向 master-master
1、配置 node1 同步
Mkdir /var/log/mysql
Chown mysql.mysql /var/log/mysql
my.cnf at db1 should have following options:

server-id =          1

log_bin =            mysql-bin

master_host          192.168.1.2

master_port          3306

master_user          replication

master_password slave


mysql> grant replication slave on *.* to 'replication'@'%' identified by 'slave';


show slave statusG;的结果:
  Slave_IO_Running: Yes
  Slave_SQL_Running: Yes


2、配置 node2 同步
Mkdir /var/log/mysql
Chown mysql.mysql /var/log/mysql
my.cnf at db1 should have following options:

server-id =          2

log_bin =            mysql-bin

master_host          192.168.1.3

master_port          3306

master_user          replication

master_password slave
mysql> grant replication slave on *.* to 'replication'@'%' identified by 'slave';
show slave statusG;的结果:
     Slave_IO_Running: Yes
     Slave_SQL_Running: Yes


二、安装部署 MMM


目标主机:

Node1       192.168.1.2

Node2       192.168.1.3

Mon         192.168.1.4




1、安装 mon 主机软件包
前提:

--          Algorithm-Diff-1.1902.tar.gz

--          Proc-Daemon-0.03.tar.gz

RPM         mysql-server-5.0.22-2.1

RPM         mysql-5.0.22-2.1

RPM         perl-DBD-MySQL-3.0007-1.fc6

--          mmm-1.0.tar.bz2


先安裝 2 个 perl 的包:

--          Algorithm-Diff-1.1902.tar.gz

--          Proc-Daemon-0.03.tar.gz

perl 包的安裝過程都是:
perl Makefile.PL
make
make test
make install


安裝 mmm:
./install.pl


 2、安装 node1 node2 agent 软件包(使用 agent 功能)
 mmm-1.0.tar.bz2
 安裝 mmm:
 ./install.pl


 三台主机安装以上软件后进行配置过程


三:node1 node2 的 agent 配置过程
$cd /usr/local/mmm/etc
$cp examples/mmm_agent.conf.examples ../mmm_agent.conf
node1 配置文件所需要修改的地方如下
cluster_interface eth0 --配置 IP 所用的网卡
# Define current server id this db1
this db1
mode master
# For masters peer db2
Peer db2
# Cluster hosts addresses and access params
      host db1
      ip 192.168.1.2
      port 3306
      user rep_agent
      password RepAgent


      host db2
      ip 192.168.1.3
      port 3306
      user rep_agent
      password RepAgent


Node2 配置文件所需要修改的地方如下
# Cluster interface
cluster_interface eth0 --配置 IP 所用的网卡
# Define current server id this db1
this db2
mode master
# For masters peer db2
Peer db1
# Cluster hosts addresses and access params
     host db1
     ip 192.168.1.2
     port 3306
     user rep_agent
     password RepAgent


     host db2
     ip 192.168.1.3
     port 3306
     user rep_agent
     password RepAgent


设置权限(node1/node2)
GRANT ALL PRIVILEGES on *.* to 'rep_monitor'@'%' identified by 'RepMonitor';


 四、修改 mon 主机的配置文件 所需要修改的地方如下:
 文件位置:/usr/local/mmm/etc/mmm_mon.conf


 # Cluster interface
 cluster_interface eth0 ----配置 IP 所用的网卡
 # Cluster hosts addresses and access params

 host db1                数据库名

 ip 192.168.1.2          node1 ip

 port 3306               node1 port

 user rep_monitor        node1 用户(供 mon 监控使用,该用户需要在 db 上添
                         加)

 password RepMonitor 对应密码

 mode master             模式

 peer db2                slave 指定



 host db2                意义同上
ip 192.168.1.3

 port 3306

 user rep_monitor

 password RepMonitor

 mode master

 peer db1

 #后续如有添加需求,请按照上面格式填写


 active_master_role writer


 # Mysql Reader role      读规则

 role reader

 mode balanced                模式为均摊

 servers db1,db2              规则覆盖 db1 db2(如有更多 slave 继续填写,别忘了
                              ip )

 ip 192.168.1.7,              对应 ip 虚拟的 IP
 192.168.1.8

 # Mysql Writer role

 role writer           写规则

 mode exclusive        模式为独占

 servers db1,db2       规则负载 db1 db2

 ip 192.168.1.9        两台数据库公用一个 ip 为写,采用 HA 模式,默认 db1 使用,db1 下
                       线 db2 接管此 ip


五:测试 MMM
在 db1/db2 上启动 agent 功能
/usr/local/mmm/scripts/init.d/mmm_agent start


在 mon 上启动 mon 功能
/usr/local/mmm/scripts/init.d/mmm_mon start
并对 mon 进行检测
# mmm_control set_online db1
# mmm_control set_online db2
# mmm_control show 查看分配情况


正常情况下:
# mmm_control show
Servers status:
 db1(192.168.1.2): master/ONLINE. Roles: reader(192.168.1.7;), writer(192.168.1.9;)
 db2(192.168.1.3): master/ONLINE. Roles: reader(192.168.1.8;)


stop 192.168.1.3
# mmm_control show
Servers status:
 db1(192.168.1.2): master/ONLINE. Roles: reader(192.168.1.7;), writer(192.168.1.9;)
 db2(192.168.1.3): master/REPLICATION_FAIL. Roles: None


检测出 1.3 出了故障.
等一会..进行了切换!因为读写是轮循的.这时写切到了 3
# mmm_control show
Servers status:
 db1(192.168.1.2): master/ONLINE. Roles: reader(192.168.1.7;)
 db2(192.168.1.3): master/ONLINE. Roles: reader(192.168.1.8;), writer(192.168.1.9;)


Telnet 任何一个虚拟 IP 3306 都是通的




五、mysql_proxy 与 mysql MMM 集成的必要性
1、实现 mysql 数据库层的负载均衡
2、数据库节点实现 HA 动态切换
3、读写分离,降低主数据库负载




六、安装 mysql proxy
1、下载 proxy 代码包
从 svn 上获取最新代码
svn co http://svn.mysql.com/svnpublic/mysql-proxy/trunk mysql-proxy
2、安装
编译好的版本安装方法如下:
# tar zxf mysql-proxy-0.6.0-linux-rhas4-x86.tar.gz
# cd mysql-proxy-0.6.0-linux-rhas4-x86
#可以看到有 2 个目录
# ls
sbin share
# mv sbin/mysql-proxy /usr/local/sbin/
# ls share
mysql-proxy tutorial-constants.lua tutorial-packets.lua tutorial-rewrite.lua tutorial-
warnings.lua tutorial-basic.lua tutorial-inject.lua tutorial-query-time.lua tutorial-states.lua
#将 lua 脚本放到/usr/local/share 下,以备他用
# mv share/mysql-proxy /usr/local/share/


#删除符号连接等垃圾代码
# strip /usr/local/sbin/mysql-proxy




 proxy 与 MMM 集成


 连接接管        Proxy 192.168.1.5                 4040

 读操作         Db1 192.168.1.7:3306
             Db2 192.168.1.8:3306

 写操作         Db1/db2 192.168.1.9
             默认 db1 先用,db1 当
             机,db2 接管


 mysql-proxy --proxy-read-only-backend-addresses=192.168.1.7:3306 --proxy-read-only-
 backend-addresses=192.168.1.8:3306 --proxy-backend-addresses=192.168.1.9:3306 -
 -proxy-lua-script=/usr/local/share/mysql-proxy/rw-splitting.lua &


 现在解释一下:
 --proxy-backend-addresses=192.168.1.9:3306 指定 mysql 写主机的端口
 --proxy-read-only-backend-addresses=192.168.1.7:3306 指定只读的 mysql 主机端口
 --proxy-read-only-backend-addresses=192.168.1.8:3306 指定另一个只读的 mysql 主机
 端口
--proxy-lua-script=/usr/local/share/mysql-proxy/rw-splitting.lua 指定 lua 脚本,在这里,
使用的是 rw-splitting 脚本,用于读写分离
完整的参数可以运行以下命令查看:
mysql-proxy --help-all
运行以下命令启动/停止/重启 mysql proxy:
# /etc/init.d/mysql-proxy start


# /etc/init.d/mysql-proxy stop


# /etc/init.d/mysql-proxy restart
Ps -ef | grep mysql-proxy


七、测试结果
将 web server 如 apache 中部署的网站,数据库连接地址改为----〉proxy 的 ip 端口为
4040
1、往数据库 db1 里写入数据,查看 2 个数据库同步情况
2、使用 mon 服务器 mmm_control show 查看状态


简单的测试可以连接 proxy 4040 查看读写情况
方法我就不再详细写了。




编译过程有可能会遇到一些错误。下面是错误的总结:
1)如在 make 阶段出错
 (1)类、、、、make: *** [dbdimp.o] 错误 1
多半是库文件的问题,(--cflags=-I/usr/local/mysql/include/mysq 细查,少个“y"
 (2)类 LD_RUN_PATH="/usr/lib/mysql:/lib:/usr/lib" gcc
 -o blib/arch/auto/DBD/mysql/mysql.so -shared
 -L/usr/local/lib dbdimp.o mysql.o -L/usr/lib/mysql
 -lmysqlclient -lm -L/usr/lib/gcc-lib/i386-redhat-linux/2.96
 -lgcc -lz
/usr/bin/ld: cannot find -lz
collect2: ld returned 1 exit status
make: *** [blib/arch/auto/DBD/mysql/mysql.so] Error 1
与压缩包有关。可用 ldconfig -p | grep libz
             ldconfig -p | grep libgz
 查找,如有并指定路径!否则安装 libz-devel/ibgz-devel/zlib-devel/                 gzlib-devel
2)在 make test 阶段出错:
 (1)类: install_driver(mysql) failed: Can't load
 '/usr/lib/perl5/site_perl/i586-linux/auto/DBD/mysql/mysql.so'
 for module DBD::mysql: File not found at
 /usr/lib/perl5/i586-linux/5.00404/DynaLoader.pm line 166
 与 /usr/lib/mysql/libmysqlclient.a 有关 (cp libmysqlclient.a /us/lib)
 (2)类: t/00base............install_driver(mysql) failed: Can't load
 '../blib/arch/auto/DBD/mysql/mysql.so' for module DBD::mysql:
 ../blib/arch/auto/DBD/mysql/mysql.so: undefined symbol: _umoddi3
 at /usr/local/perl-5.005/lib/5.005/i586-linux-thread/DynaLoader.pm
 line 168.
 与 libgcc.a 有关 (cp /usr/lib/gcc/i386-redhat-linux/4.1.1/libgcc.a /usr/local/lib/
 (3) 类:Can't load libmysqlclient.so.15 、、、、
    (cp libmysqlclient.so.15 /us/lib)
----------------------------------------
$perl Makefile.PL --libs="-L/usr/local/mysql/lib/mysql -lmysqlclient -L/usr/lib -lz " --
cflags=-I/usr/local/mysql/include/mysql --
mysql_config=/usr/local/mysql/bin/mysql_config --testhost=127.0.0.1--
testsocket=/usr/local/mysql/tmp/mysql.sock --testdb=test --testuser=abc --
testpassword=abc
------------------
$
; make; make test ;sudo make install;
-------------------------------
参考:
http://dev.mysql.com/doc/refman/5.0/en/perl-support-problems.html
INSTALL.html

More Related Content

What's hot

2011 06-12-lamp-mysql-顾春江
2011 06-12-lamp-mysql-顾春江2011 06-12-lamp-mysql-顾春江
2011 06-12-lamp-mysql-顾春江thinkinlamp
 
康盛创想项目部Linux 服务器部署标准(最新版)
康盛创想项目部Linux 服务器部署标准(最新版)康盛创想项目部Linux 服务器部署标准(最新版)
康盛创想项目部Linux 服务器部署标准(最新版)Yiwei Ma
 
Dbabc.net 利用heartbeat + drbd搭建my sql高可用环境
Dbabc.net 利用heartbeat + drbd搭建my sql高可用环境Dbabc.net 利用heartbeat + drbd搭建my sql高可用环境
Dbabc.net 利用heartbeat + drbd搭建my sql高可用环境dbabc
 
X64服务器 lamp服务器部署标准 new
X64服务器 lamp服务器部署标准 newX64服务器 lamp服务器部署标准 new
X64服务器 lamp服务器部署标准 newYiwei Ma
 
0118 Windows Server 2008 的伺服器核心 (Server Core)
0118 Windows Server 2008 的伺服器核心 (Server Core)0118 Windows Server 2008 的伺服器核心 (Server Core)
0118 Windows Server 2008 的伺服器核心 (Server Core)Timothy Chen
 
Bypat博客出品-利用cent os快速构建自己的发行版
Bypat博客出品-利用cent os快速构建自己的发行版Bypat博客出品-利用cent os快速构建自己的发行版
Bypat博客出品-利用cent os快速构建自己的发行版redhat9
 
Web并发模型粗浅探讨
Web并发模型粗浅探讨Web并发模型粗浅探讨
Web并发模型粗浅探讨Robbin Fan
 
Juniper ScreenOS 基于Policy的
Juniper ScreenOS 基于Policy的Juniper ScreenOS 基于Policy的
Juniper ScreenOS 基于Policy的mickchen
 
Sery lvs+keepalived
Sery lvs+keepalivedSery lvs+keepalived
Sery lvs+keepalivedcolderboy17
 
Linux Network Monitoring
Linux Network MonitoringLinux Network Monitoring
Linux Network MonitoringKenny (netman)
 
Oracle10g Rac Configuration For Linux X86
Oracle10g Rac Configuration For Linux X86Oracle10g Rac Configuration For Linux X86
Oracle10g Rac Configuration For Linux X86dbabc
 
Linux基础
Linux基础Linux基础
Linux基础zhuqling
 
实习报告
实习报告实习报告
实习报告PengFan
 
Java应用性能测试与分析
Java应用性能测试与分析Java应用性能测试与分析
Java应用性能测试与分析Frank Lee
 
5, system admin
5, system admin5, system admin
5, system adminted-xu
 
再生龍於雲端環境之應用
再生龍於雲端環境之應用再生龍於雲端環境之應用
再生龍於雲端環境之應用Chenkai Sun
 
Linux Jffs2 & Linux MTD Device
Linux Jffs2 & Linux  MTD DeviceLinux Jffs2 & Linux  MTD Device
Linux Jffs2 & Linux MTD Device艾鍗科技
 

What's hot (17)

2011 06-12-lamp-mysql-顾春江
2011 06-12-lamp-mysql-顾春江2011 06-12-lamp-mysql-顾春江
2011 06-12-lamp-mysql-顾春江
 
康盛创想项目部Linux 服务器部署标准(最新版)
康盛创想项目部Linux 服务器部署标准(最新版)康盛创想项目部Linux 服务器部署标准(最新版)
康盛创想项目部Linux 服务器部署标准(最新版)
 
Dbabc.net 利用heartbeat + drbd搭建my sql高可用环境
Dbabc.net 利用heartbeat + drbd搭建my sql高可用环境Dbabc.net 利用heartbeat + drbd搭建my sql高可用环境
Dbabc.net 利用heartbeat + drbd搭建my sql高可用环境
 
X64服务器 lamp服务器部署标准 new
X64服务器 lamp服务器部署标准 newX64服务器 lamp服务器部署标准 new
X64服务器 lamp服务器部署标准 new
 
0118 Windows Server 2008 的伺服器核心 (Server Core)
0118 Windows Server 2008 的伺服器核心 (Server Core)0118 Windows Server 2008 的伺服器核心 (Server Core)
0118 Windows Server 2008 的伺服器核心 (Server Core)
 
Bypat博客出品-利用cent os快速构建自己的发行版
Bypat博客出品-利用cent os快速构建自己的发行版Bypat博客出品-利用cent os快速构建自己的发行版
Bypat博客出品-利用cent os快速构建自己的发行版
 
Web并发模型粗浅探讨
Web并发模型粗浅探讨Web并发模型粗浅探讨
Web并发模型粗浅探讨
 
Juniper ScreenOS 基于Policy的
Juniper ScreenOS 基于Policy的Juniper ScreenOS 基于Policy的
Juniper ScreenOS 基于Policy的
 
Sery lvs+keepalived
Sery lvs+keepalivedSery lvs+keepalived
Sery lvs+keepalived
 
Linux Network Monitoring
Linux Network MonitoringLinux Network Monitoring
Linux Network Monitoring
 
Oracle10g Rac Configuration For Linux X86
Oracle10g Rac Configuration For Linux X86Oracle10g Rac Configuration For Linux X86
Oracle10g Rac Configuration For Linux X86
 
Linux基础
Linux基础Linux基础
Linux基础
 
实习报告
实习报告实习报告
实习报告
 
Java应用性能测试与分析
Java应用性能测试与分析Java应用性能测试与分析
Java应用性能测试与分析
 
5, system admin
5, system admin5, system admin
5, system admin
 
再生龍於雲端環境之應用
再生龍於雲端環境之應用再生龍於雲端環境之應用
再生龍於雲端環境之應用
 
Linux Jffs2 & Linux MTD Device
Linux Jffs2 & Linux  MTD DeviceLinux Jffs2 & Linux  MTD Device
Linux Jffs2 & Linux MTD Device
 

Viewers also liked

Domainlang keynote-eric-qcon
Domainlang keynote-eric-qconDomainlang keynote-eric-qcon
Domainlang keynote-eric-qconYiwei Ma
 
Возможности для делового сотрудничества: Нидерланды - Екатерина Чаусская - ст...
Возможности для делового сотрудничества: Нидерланды - Екатерина Чаусская - ст...Возможности для делового сотрудничества: Нидерланды - Екатерина Чаусская - ст...
Возможности для делового сотрудничества: Нидерланды - Екатерина Чаусская - ст...St. Petersburg Foundation for SME Development
 
Государственные программы поддержки малого бизнеса на рынках РФ и за рубежом
Государственные программы поддержки малого бизнеса  на рынках РФ и за рубежомГосударственные программы поддержки малого бизнеса  на рынках РФ и за рубежом
Государственные программы поддержки малого бизнеса на рынках РФ и за рубежомSt. Petersburg Foundation for SME Development
 
Introducing and arranging a thesis - 1133
Introducing and arranging a thesis  - 1133Introducing and arranging a thesis  - 1133
Introducing and arranging a thesis - 1133writRHET -
 
Introducing The Shout Lounge
Introducing The Shout LoungeIntroducing The Shout Lounge
Introducing The Shout Loungelinkup marketing
 
Claiming your Facebook Place
Claiming your Facebook PlaceClaiming your Facebook Place
Claiming your Facebook Placelinkup marketing
 

Viewers also liked (7)

Domainlang keynote-eric-qcon
Domainlang keynote-eric-qconDomainlang keynote-eric-qcon
Domainlang keynote-eric-qcon
 
Возможности для делового сотрудничества: Нидерланды - Екатерина Чаусская - ст...
Возможности для делового сотрудничества: Нидерланды - Екатерина Чаусская - ст...Возможности для делового сотрудничества: Нидерланды - Екатерина Чаусская - ст...
Возможности для делового сотрудничества: Нидерланды - Екатерина Чаусская - ст...
 
Государственные программы поддержки малого бизнеса на рынках РФ и за рубежом
Государственные программы поддержки малого бизнеса  на рынках РФ и за рубежомГосударственные программы поддержки малого бизнеса  на рынках РФ и за рубежом
Государственные программы поддержки малого бизнеса на рынках РФ и за рубежом
 
The.first.st.petersburg.business.incubator
The.first.st.petersburg.business.incubatorThe.first.st.petersburg.business.incubator
The.first.st.petersburg.business.incubator
 
Introducing and arranging a thesis - 1133
Introducing and arranging a thesis  - 1133Introducing and arranging a thesis  - 1133
Introducing and arranging a thesis - 1133
 
Introducing The Shout Lounge
Introducing The Shout LoungeIntroducing The Shout Lounge
Introducing The Shout Lounge
 
Claiming your Facebook Place
Claiming your Facebook PlaceClaiming your Facebook Place
Claiming your Facebook Place
 

Similar to Mysql proxy+mysql-mmm

Mysql mmm演讲--冯浩
Mysql mmm演讲--冯浩Mysql mmm演讲--冯浩
Mysql mmm演讲--冯浩chinafenghao
 
Mysql proxy cluster
Mysql proxy clusterMysql proxy cluster
Mysql proxy clusterYiwei Ma
 
2011 06-12-lamp-mysql
2011 06-12-lamp-mysql2011 06-12-lamp-mysql
2011 06-12-lamp-mysqlpwesh
 
探索 ISTIO 新型 DATA PLANE 架構 AMBIENT MESH - GOLANG TAIWAN GATHERING #77 X CNTUG
探索 ISTIO 新型 DATA PLANE 架構 AMBIENT MESH - GOLANG TAIWAN GATHERING #77 X CNTUG探索 ISTIO 新型 DATA PLANE 架構 AMBIENT MESH - GOLANG TAIWAN GATHERING #77 X CNTUG
探索 ISTIO 新型 DATA PLANE 架構 AMBIENT MESH - GOLANG TAIWAN GATHERING #77 X CNTUGYingSiang Geng
 
8, lamp
8, lamp8, lamp
8, lampted-xu
 
Track2 -刘继伟--openstack in gamewave
Track2 -刘继伟--openstack in gamewaveTrack2 -刘继伟--openstack in gamewave
Track2 -刘继伟--openstack in gamewaveOpenCity Community
 
Nagios的安装部署和与cacti的整合(linuxtone)
Nagios的安装部署和与cacti的整合(linuxtone)Nagios的安装部署和与cacti的整合(linuxtone)
Nagios的安装部署和与cacti的整合(linuxtone)Yiwei Ma
 
Lamp安全全攻略
Lamp安全全攻略Lamp安全全攻略
Lamp安全全攻略Da Zhao
 
Oraliux+mysql5单机多实例安装文档
Oraliux+mysql5单机多实例安装文档Oraliux+mysql5单机多实例安装文档
Oraliux+mysql5单机多实例安装文档xuebao_zx
 
Oda安装 恢复步骤
Oda安装 恢复步骤Oda安装 恢复步骤
Oda安装 恢复步骤n-lauren
 
构建ActionScript游戏服务器,支持超过15000并发连接
构建ActionScript游戏服务器,支持超过15000并发连接 构建ActionScript游戏服务器,支持超过15000并发连接
构建ActionScript游戏服务器,支持超过15000并发连接 Renaun Erickson
 
Redis 多机特性工作原理简介v2
Redis 多机特性工作原理简介v2Redis 多机特性工作原理简介v2
Redis 多机特性工作原理简介v2ayanamist
 
Squid安装配置
Squid安装配置Squid安装配置
Squid安装配置Yiwei Ma
 
Linux network monitoring hands-on pratice
Linux network monitoring hands-on praticeLinux network monitoring hands-on pratice
Linux network monitoring hands-on praticeKenny (netman)
 
Mysql 101014202926-phpapp01
Mysql 101014202926-phpapp01Mysql 101014202926-phpapp01
Mysql 101014202926-phpapp01Bob Huang
 
Ubuntu 10.04 LTS上配置简单双机热备方案
Ubuntu 10.04 LTS上配置简单双机热备方案Ubuntu 10.04 LTS上配置简单双机热备方案
Ubuntu 10.04 LTS上配置简单双机热备方案Shawn Zhung
 
IBM Cloud Private Introduction
IBM Cloud Private IntroductionIBM Cloud Private Introduction
IBM Cloud Private IntroductionGuangya Liu
 
Openstack neutron 原理详解
Openstack neutron 原理详解Openstack neutron 原理详解
Openstack neutron 原理详解Yong Luo
 

Similar to Mysql proxy+mysql-mmm (20)

Mysql mmm演讲--冯浩
Mysql mmm演讲--冯浩Mysql mmm演讲--冯浩
Mysql mmm演讲--冯浩
 
Mysql proxy cluster
Mysql proxy clusterMysql proxy cluster
Mysql proxy cluster
 
2011 06-12-lamp-mysql
2011 06-12-lamp-mysql2011 06-12-lamp-mysql
2011 06-12-lamp-mysql
 
探索 ISTIO 新型 DATA PLANE 架構 AMBIENT MESH - GOLANG TAIWAN GATHERING #77 X CNTUG
探索 ISTIO 新型 DATA PLANE 架構 AMBIENT MESH - GOLANG TAIWAN GATHERING #77 X CNTUG探索 ISTIO 新型 DATA PLANE 架構 AMBIENT MESH - GOLANG TAIWAN GATHERING #77 X CNTUG
探索 ISTIO 新型 DATA PLANE 架構 AMBIENT MESH - GOLANG TAIWAN GATHERING #77 X CNTUG
 
8, lamp
8, lamp8, lamp
8, lamp
 
Mysql集群
Mysql集群Mysql集群
Mysql集群
 
Track2 -刘继伟--openstack in gamewave
Track2 -刘继伟--openstack in gamewaveTrack2 -刘继伟--openstack in gamewave
Track2 -刘继伟--openstack in gamewave
 
Nagios的安装部署和与cacti的整合(linuxtone)
Nagios的安装部署和与cacti的整合(linuxtone)Nagios的安装部署和与cacti的整合(linuxtone)
Nagios的安装部署和与cacti的整合(linuxtone)
 
Lamp安全全攻略
Lamp安全全攻略Lamp安全全攻略
Lamp安全全攻略
 
Oraliux+mysql5单机多实例安装文档
Oraliux+mysql5单机多实例安装文档Oraliux+mysql5单机多实例安装文档
Oraliux+mysql5单机多实例安装文档
 
Oda安装 恢复步骤
Oda安装 恢复步骤Oda安装 恢复步骤
Oda安装 恢复步骤
 
构建ActionScript游戏服务器,支持超过15000并发连接
构建ActionScript游戏服务器,支持超过15000并发连接 构建ActionScript游戏服务器,支持超过15000并发连接
构建ActionScript游戏服务器,支持超过15000并发连接
 
Redis 多机特性工作原理简介v2
Redis 多机特性工作原理简介v2Redis 多机特性工作原理简介v2
Redis 多机特性工作原理简介v2
 
Squid安装配置
Squid安装配置Squid安装配置
Squid安装配置
 
Linux network monitoring hands-on pratice
Linux network monitoring hands-on praticeLinux network monitoring hands-on pratice
Linux network monitoring hands-on pratice
 
Mysql 101014202926-phpapp01
Mysql 101014202926-phpapp01Mysql 101014202926-phpapp01
Mysql 101014202926-phpapp01
 
Ubuntu 10.04 LTS上配置简单双机热备方案
Ubuntu 10.04 LTS上配置简单双机热备方案Ubuntu 10.04 LTS上配置简单双机热备方案
Ubuntu 10.04 LTS上配置简单双机热备方案
 
Nova与虚拟机管理
Nova与虚拟机管理Nova与虚拟机管理
Nova与虚拟机管理
 
IBM Cloud Private Introduction
IBM Cloud Private IntroductionIBM Cloud Private Introduction
IBM Cloud Private Introduction
 
Openstack neutron 原理详解
Openstack neutron 原理详解Openstack neutron 原理详解
Openstack neutron 原理详解
 

More from Yiwei Ma

Cibank arch-zhouweiran-qcon
Cibank arch-zhouweiran-qconCibank arch-zhouweiran-qcon
Cibank arch-zhouweiran-qconYiwei Ma
 
Cibank arch-zhouweiran-qcon
Cibank arch-zhouweiran-qconCibank arch-zhouweiran-qcon
Cibank arch-zhouweiran-qconYiwei Ma
 
Taobao casestudy-yufeng-qcon
Taobao casestudy-yufeng-qconTaobao casestudy-yufeng-qcon
Taobao casestudy-yufeng-qconYiwei Ma
 
Alibaba server-zhangxuseng-qcon
Alibaba server-zhangxuseng-qconAlibaba server-zhangxuseng-qcon
Alibaba server-zhangxuseng-qconYiwei Ma
 
Zhongxing practice-suchunshan-qcon
Zhongxing practice-suchunshan-qconZhongxing practice-suchunshan-qcon
Zhongxing practice-suchunshan-qconYiwei Ma
 
Taobao practice-liyu-qcon
Taobao practice-liyu-qconTaobao practice-liyu-qcon
Taobao practice-liyu-qconYiwei Ma
 
Thoughtworks practice-hukai-qcon
Thoughtworks practice-hukai-qconThoughtworks practice-hukai-qcon
Thoughtworks practice-hukai-qconYiwei Ma
 
Ufida design-chijianqiang-qcon
Ufida design-chijianqiang-qconUfida design-chijianqiang-qcon
Ufida design-chijianqiang-qconYiwei Ma
 
Spring design-juergen-qcon
Spring design-juergen-qconSpring design-juergen-qcon
Spring design-juergen-qconYiwei Ma
 
Netflix web-adrian-qcon
Netflix web-adrian-qconNetflix web-adrian-qcon
Netflix web-adrian-qconYiwei Ma
 
Google arch-fangkun-qcon
Google arch-fangkun-qconGoogle arch-fangkun-qcon
Google arch-fangkun-qconYiwei Ma
 
Cibank arch-zhouweiran-qcon
Cibank arch-zhouweiran-qconCibank arch-zhouweiran-qcon
Cibank arch-zhouweiran-qconYiwei Ma
 
Alibaba arch-jiangtao-qcon
Alibaba arch-jiangtao-qconAlibaba arch-jiangtao-qcon
Alibaba arch-jiangtao-qconYiwei Ma
 
Twitter keynote-evan-qcon
Twitter keynote-evan-qconTwitter keynote-evan-qcon
Twitter keynote-evan-qconYiwei Ma
 
Netflix keynote-adrian-qcon
Netflix keynote-adrian-qconNetflix keynote-adrian-qcon
Netflix keynote-adrian-qconYiwei Ma
 
Facebook keynote-nicolas-qcon
Facebook keynote-nicolas-qconFacebook keynote-nicolas-qcon
Facebook keynote-nicolas-qconYiwei Ma
 
Devjam keynote-david-qcon
Devjam keynote-david-qconDevjam keynote-david-qcon
Devjam keynote-david-qconYiwei Ma
 
Baidu keynote-wubo-qcon
Baidu keynote-wubo-qconBaidu keynote-wubo-qcon
Baidu keynote-wubo-qconYiwei Ma
 
淘宝线上线下性能跟踪体系和容量规划-Qcon2011
淘宝线上线下性能跟踪体系和容量规划-Qcon2011淘宝线上线下性能跟踪体系和容量规划-Qcon2011
淘宝线上线下性能跟踪体系和容量规划-Qcon2011Yiwei Ma
 
网游服务器性能优化-Qcon2011
网游服务器性能优化-Qcon2011网游服务器性能优化-Qcon2011
网游服务器性能优化-Qcon2011Yiwei Ma
 

More from Yiwei Ma (20)

Cibank arch-zhouweiran-qcon
Cibank arch-zhouweiran-qconCibank arch-zhouweiran-qcon
Cibank arch-zhouweiran-qcon
 
Cibank arch-zhouweiran-qcon
Cibank arch-zhouweiran-qconCibank arch-zhouweiran-qcon
Cibank arch-zhouweiran-qcon
 
Taobao casestudy-yufeng-qcon
Taobao casestudy-yufeng-qconTaobao casestudy-yufeng-qcon
Taobao casestudy-yufeng-qcon
 
Alibaba server-zhangxuseng-qcon
Alibaba server-zhangxuseng-qconAlibaba server-zhangxuseng-qcon
Alibaba server-zhangxuseng-qcon
 
Zhongxing practice-suchunshan-qcon
Zhongxing practice-suchunshan-qconZhongxing practice-suchunshan-qcon
Zhongxing practice-suchunshan-qcon
 
Taobao practice-liyu-qcon
Taobao practice-liyu-qconTaobao practice-liyu-qcon
Taobao practice-liyu-qcon
 
Thoughtworks practice-hukai-qcon
Thoughtworks practice-hukai-qconThoughtworks practice-hukai-qcon
Thoughtworks practice-hukai-qcon
 
Ufida design-chijianqiang-qcon
Ufida design-chijianqiang-qconUfida design-chijianqiang-qcon
Ufida design-chijianqiang-qcon
 
Spring design-juergen-qcon
Spring design-juergen-qconSpring design-juergen-qcon
Spring design-juergen-qcon
 
Netflix web-adrian-qcon
Netflix web-adrian-qconNetflix web-adrian-qcon
Netflix web-adrian-qcon
 
Google arch-fangkun-qcon
Google arch-fangkun-qconGoogle arch-fangkun-qcon
Google arch-fangkun-qcon
 
Cibank arch-zhouweiran-qcon
Cibank arch-zhouweiran-qconCibank arch-zhouweiran-qcon
Cibank arch-zhouweiran-qcon
 
Alibaba arch-jiangtao-qcon
Alibaba arch-jiangtao-qconAlibaba arch-jiangtao-qcon
Alibaba arch-jiangtao-qcon
 
Twitter keynote-evan-qcon
Twitter keynote-evan-qconTwitter keynote-evan-qcon
Twitter keynote-evan-qcon
 
Netflix keynote-adrian-qcon
Netflix keynote-adrian-qconNetflix keynote-adrian-qcon
Netflix keynote-adrian-qcon
 
Facebook keynote-nicolas-qcon
Facebook keynote-nicolas-qconFacebook keynote-nicolas-qcon
Facebook keynote-nicolas-qcon
 
Devjam keynote-david-qcon
Devjam keynote-david-qconDevjam keynote-david-qcon
Devjam keynote-david-qcon
 
Baidu keynote-wubo-qcon
Baidu keynote-wubo-qconBaidu keynote-wubo-qcon
Baidu keynote-wubo-qcon
 
淘宝线上线下性能跟踪体系和容量规划-Qcon2011
淘宝线上线下性能跟踪体系和容量规划-Qcon2011淘宝线上线下性能跟踪体系和容量规划-Qcon2011
淘宝线上线下性能跟踪体系和容量规划-Qcon2011
 
网游服务器性能优化-Qcon2011
网游服务器性能优化-Qcon2011网游服务器性能优化-Qcon2011
网游服务器性能优化-Qcon2011
 

Mysql proxy+mysql-mmm

  • 1. Mysql+mmm+proxy 测试 2008 年 9 月 8 日 16:38 作者:守住每一天 博客:http://liuyu.blog.51cto.com BBS:http://www.linuxtone.org msn: liuyubj520@hotmail.com 邮箱:liuyu@sohu.com 如果有什么问题,欢迎大家交流 感谢黄琨老师:huangkun.blog.51cto.com 动机:proxy 实现读写分离 MMM 使 Replication 方案具有 HA 下面先看从网上摘抄的一段说明。 引言 Master-Slave 的数据库机构解决了很多问题,特别是 read/write 比较高的 web2.0 应用: 1、写操作全部在 Master 结点执行,并由 Slave 数据库结点定时(默认 60s)读取 Master 的 bin-log 2、将众多的用户读请求分散到更多的数据库节点,从而减轻了单点的压力 这是对 Replication 的最基本陈述,这种模式的在系统 Scale-out 方案中很有引力(如有必 要,数据可以先进行 Sharding,再使用 replication)。 它的缺点是: 1、Slave 实时性的保障,对于实时性很高的场合可能需要做一些处理 2、高可用性问题,Master 就是那个致命点(SPOF:Single point of failure) 本文主要讨论的是如何解决第 2 个缺点。 DB 的设计对大规模、高负载的系统是极其重要的。高可用性(High availability)在重要的系 统(critical System)是需要架构师事先考虑的。存在 SPOF:Single point of failure 的设计在 重要系统中是危险的。 Master-Master Replication
  • 2. 1、使用两个 MySQL 数据库 db01,db02,互为 Master 和 Slave,即: 一边 db01 作为 db02 的 master,一旦有数据写向 db01 时,db02 定时从 db01 更新 另一边 db02 也作为 db01 的 master,一旦有数据写向 db02 时,db01 也定时从 db02 获 得更新 (这不会导致循环,MySQL Slave 默认不会记录 Master 同步过来的变化) 2、但从 AppServer 的角度来说,同时只有一个结点 db01 扮演 Master,另外一个结点 db02 扮演 Slave,不能同时两个结点扮演 Master。即 AppSever 总是把 write 操作分配某 个数据库(db01),除非 db01 failed,被切换。 3、如果扮演 Slave 的数据库结点 db02 Failed 了: a)此时 appServer 要能够把所有的 read,write 分配给 db01,read 操作不再指向 db02 b)一旦 db02 恢复过来后,继续充当 Slave 角色,并告诉 AppServer 可以将 read 分配给它 了 4、如果扮演 Master 的数据库结点 db01 Failed 了 a)此时 appServer 要能够把所有的写操作从 db01 切换分配给 db02,也就是切换 Master 由 db02 充当 b)db01 恢复过来后,充当 Slave 的角色,Master 由 db02 继续扮演 难点: 3、4 要如何自动进行? Master-Master with n Slaves Replication
  • 3. 这比上一个还要复杂,即: 当一个 Master Fail 时,所有的 Slave 不再从原来失败的那个 Master(db01)获取更新日 志,而应该“自动”切换到最新充当 Master 角色的数据库 db02。 MMM,a greate project! MMM 的基本信息请参考它的网站(见后"参考资料") MMM 有 3 个重要的器件: 1、mmmd_mon - monitoring script which does all monitoring work and makes all decisions about roles moving and so on. 2、mmmd_agent - remote servers management agent script, whichprovides monitoring node with simple set of remote services to makeservers management easier, more flexible abd highly portable. 3、mmm_control - simple script dedicated to management of the mmmd_mon processes by commands. 每一个 MySQL 服务器器结点需要运行 mmmd_agent,同时在另外的一个机器上(可以是 独立的一台机器,也可以是和 AppServer 共享同一个服务器)运行 mmmd_mon。形成 1 * mmmd_mon + n * mmmd_agent 的部署架构。 MMM 利用了虚拟 IP 的技术:1 个网卡可以同时使用多个 IP。 (所以使用 MMM 时,需要 2*n+1 个 IP,n 为 mysql 数据库结点个数,包括 master,slave)
  • 4. 当有数据库结点 fail 时,mmmd_mon 检测不到 mmmd_agent 的心跳或者对应的 MySQL 服务器的状态,mmmd_mon 将进行决定,并下指令给某个正常的数据库结点的 mmmd_agent,使得该 mmmd_agent“篡位”使用(注)刚才 fail 的那个结点的虚拟 IP,使得 虚拟 IP 实际从指向 fail 的那个机器自动转为此时的这个正常机器。 注:据 Qieqie 猜测是将获得的虚拟 IP 设置给网卡,也只能这样了,改天测试验证一下。 repeat: MMM 对 MySQL Master-Slave Replication 绝对是一个很有益的补充! 整体架构的原理: Webclient 数据请求至 proxy—proxy 进行读写分发-转至 mmm 机制-在检测存活的机 器进行读与写操作。在此之前这些机器与为 master/slave. 本文测试环境如下: 主机名 IP Port App 目录 备注 Node1 192.168.1.2 3306 mysql /var/lib/mysql 数据库服务器 1 Node2 192.168.1.3 3306 mysql /var/lib/mysql 数据库服务器 2 Mon 192.168.1.4 3306 Mysql /var/lib/mysql 数据库管理服务器 Proxy 192.168.1.5 4040 Proxy 数据库代理(NLB) node1 node2 数据库服务器 replication 双向 master-master 虚拟机有限,只能开 4 台, 因为 node1 与 node2 即做读又做写。 配置步骤: Node1 node2 replication 双向 master-master Node1 node2 安装 mmm 并配置 mmm_regent.conf Mon 安装 mmm 并配置 mmm_mon.conf proxy 安装 mysql-proxy
  • 5. node1 node2 一、配置 node1 node2 数据库服务器 replication 双向 master-master 1、配置 node1 同步 Mkdir /var/log/mysql Chown mysql.mysql /var/log/mysql my.cnf at db1 should have following options: server-id = 1 log_bin = mysql-bin master_host 192.168.1.2 master_port 3306 master_user replication master_password slave mysql> grant replication slave on *.* to 'replication'@'%' identified by 'slave'; show slave statusG;的结果: Slave_IO_Running: Yes Slave_SQL_Running: Yes 2、配置 node2 同步 Mkdir /var/log/mysql Chown mysql.mysql /var/log/mysql my.cnf at db1 should have following options: server-id = 2 log_bin = mysql-bin master_host 192.168.1.3 master_port 3306 master_user replication master_password slave
  • 6. mysql> grant replication slave on *.* to 'replication'@'%' identified by 'slave'; show slave statusG;的结果: Slave_IO_Running: Yes Slave_SQL_Running: Yes 二、安装部署 MMM 目标主机: Node1 192.168.1.2 Node2 192.168.1.3 Mon 192.168.1.4 1、安装 mon 主机软件包 前提: -- Algorithm-Diff-1.1902.tar.gz -- Proc-Daemon-0.03.tar.gz RPM mysql-server-5.0.22-2.1 RPM mysql-5.0.22-2.1 RPM perl-DBD-MySQL-3.0007-1.fc6 -- mmm-1.0.tar.bz2 先安裝 2 个 perl 的包: -- Algorithm-Diff-1.1902.tar.gz -- Proc-Daemon-0.03.tar.gz perl 包的安裝過程都是: perl Makefile.PL make make test make install 安裝 mmm:
  • 7. ./install.pl 2、安装 node1 node2 agent 软件包(使用 agent 功能) mmm-1.0.tar.bz2 安裝 mmm: ./install.pl 三台主机安装以上软件后进行配置过程 三:node1 node2 的 agent 配置过程 $cd /usr/local/mmm/etc $cp examples/mmm_agent.conf.examples ../mmm_agent.conf node1 配置文件所需要修改的地方如下 cluster_interface eth0 --配置 IP 所用的网卡 # Define current server id this db1 this db1 mode master # For masters peer db2 Peer db2 # Cluster hosts addresses and access params host db1 ip 192.168.1.2 port 3306 user rep_agent password RepAgent host db2 ip 192.168.1.3 port 3306 user rep_agent password RepAgent Node2 配置文件所需要修改的地方如下 # Cluster interface cluster_interface eth0 --配置 IP 所用的网卡 # Define current server id this db1 this db2 mode master
  • 8. # For masters peer db2 Peer db1 # Cluster hosts addresses and access params host db1 ip 192.168.1.2 port 3306 user rep_agent password RepAgent host db2 ip 192.168.1.3 port 3306 user rep_agent password RepAgent 设置权限(node1/node2) GRANT ALL PRIVILEGES on *.* to 'rep_monitor'@'%' identified by 'RepMonitor'; 四、修改 mon 主机的配置文件 所需要修改的地方如下: 文件位置:/usr/local/mmm/etc/mmm_mon.conf # Cluster interface cluster_interface eth0 ----配置 IP 所用的网卡 # Cluster hosts addresses and access params host db1 数据库名 ip 192.168.1.2 node1 ip port 3306 node1 port user rep_monitor node1 用户(供 mon 监控使用,该用户需要在 db 上添 加) password RepMonitor 对应密码 mode master 模式 peer db2 slave 指定 host db2 意义同上
  • 9. ip 192.168.1.3 port 3306 user rep_monitor password RepMonitor mode master peer db1 #后续如有添加需求,请按照上面格式填写 active_master_role writer # Mysql Reader role 读规则 role reader mode balanced 模式为均摊 servers db1,db2 规则覆盖 db1 db2(如有更多 slave 继续填写,别忘了 ip ) ip 192.168.1.7, 对应 ip 虚拟的 IP 192.168.1.8 # Mysql Writer role role writer 写规则 mode exclusive 模式为独占 servers db1,db2 规则负载 db1 db2 ip 192.168.1.9 两台数据库公用一个 ip 为写,采用 HA 模式,默认 db1 使用,db1 下 线 db2 接管此 ip 五:测试 MMM 在 db1/db2 上启动 agent 功能 /usr/local/mmm/scripts/init.d/mmm_agent start 在 mon 上启动 mon 功能 /usr/local/mmm/scripts/init.d/mmm_mon start
  • 10. 并对 mon 进行检测 # mmm_control set_online db1 # mmm_control set_online db2 # mmm_control show 查看分配情况 正常情况下: # mmm_control show Servers status: db1(192.168.1.2): master/ONLINE. Roles: reader(192.168.1.7;), writer(192.168.1.9;) db2(192.168.1.3): master/ONLINE. Roles: reader(192.168.1.8;) stop 192.168.1.3 # mmm_control show Servers status: db1(192.168.1.2): master/ONLINE. Roles: reader(192.168.1.7;), writer(192.168.1.9;) db2(192.168.1.3): master/REPLICATION_FAIL. Roles: None 检测出 1.3 出了故障. 等一会..进行了切换!因为读写是轮循的.这时写切到了 3 # mmm_control show Servers status: db1(192.168.1.2): master/ONLINE. Roles: reader(192.168.1.7;) db2(192.168.1.3): master/ONLINE. Roles: reader(192.168.1.8;), writer(192.168.1.9;) Telnet 任何一个虚拟 IP 3306 都是通的 五、mysql_proxy 与 mysql MMM 集成的必要性 1、实现 mysql 数据库层的负载均衡 2、数据库节点实现 HA 动态切换 3、读写分离,降低主数据库负载 六、安装 mysql proxy 1、下载 proxy 代码包 从 svn 上获取最新代码 svn co http://svn.mysql.com/svnpublic/mysql-proxy/trunk mysql-proxy
  • 11. 2、安装 编译好的版本安装方法如下: # tar zxf mysql-proxy-0.6.0-linux-rhas4-x86.tar.gz # cd mysql-proxy-0.6.0-linux-rhas4-x86 #可以看到有 2 个目录 # ls sbin share # mv sbin/mysql-proxy /usr/local/sbin/ # ls share mysql-proxy tutorial-constants.lua tutorial-packets.lua tutorial-rewrite.lua tutorial- warnings.lua tutorial-basic.lua tutorial-inject.lua tutorial-query-time.lua tutorial-states.lua #将 lua 脚本放到/usr/local/share 下,以备他用 # mv share/mysql-proxy /usr/local/share/ #删除符号连接等垃圾代码 # strip /usr/local/sbin/mysql-proxy proxy 与 MMM 集成 连接接管 Proxy 192.168.1.5 4040 读操作 Db1 192.168.1.7:3306 Db2 192.168.1.8:3306 写操作 Db1/db2 192.168.1.9 默认 db1 先用,db1 当 机,db2 接管 mysql-proxy --proxy-read-only-backend-addresses=192.168.1.7:3306 --proxy-read-only- backend-addresses=192.168.1.8:3306 --proxy-backend-addresses=192.168.1.9:3306 - -proxy-lua-script=/usr/local/share/mysql-proxy/rw-splitting.lua & 现在解释一下: --proxy-backend-addresses=192.168.1.9:3306 指定 mysql 写主机的端口 --proxy-read-only-backend-addresses=192.168.1.7:3306 指定只读的 mysql 主机端口 --proxy-read-only-backend-addresses=192.168.1.8:3306 指定另一个只读的 mysql 主机 端口
  • 12. --proxy-lua-script=/usr/local/share/mysql-proxy/rw-splitting.lua 指定 lua 脚本,在这里, 使用的是 rw-splitting 脚本,用于读写分离 完整的参数可以运行以下命令查看: mysql-proxy --help-all 运行以下命令启动/停止/重启 mysql proxy: # /etc/init.d/mysql-proxy start # /etc/init.d/mysql-proxy stop # /etc/init.d/mysql-proxy restart Ps -ef | grep mysql-proxy 七、测试结果 将 web server 如 apache 中部署的网站,数据库连接地址改为----〉proxy 的 ip 端口为 4040 1、往数据库 db1 里写入数据,查看 2 个数据库同步情况 2、使用 mon 服务器 mmm_control show 查看状态 简单的测试可以连接 proxy 4040 查看读写情况 方法我就不再详细写了。 编译过程有可能会遇到一些错误。下面是错误的总结: 1)如在 make 阶段出错 (1)类、、、、make: *** [dbdimp.o] 错误 1 多半是库文件的问题,(--cflags=-I/usr/local/mysql/include/mysq 细查,少个“y" (2)类 LD_RUN_PATH="/usr/lib/mysql:/lib:/usr/lib" gcc -o blib/arch/auto/DBD/mysql/mysql.so -shared -L/usr/local/lib dbdimp.o mysql.o -L/usr/lib/mysql -lmysqlclient -lm -L/usr/lib/gcc-lib/i386-redhat-linux/2.96 -lgcc -lz /usr/bin/ld: cannot find -lz collect2: ld returned 1 exit status make: *** [blib/arch/auto/DBD/mysql/mysql.so] Error 1 与压缩包有关。可用 ldconfig -p | grep libz ldconfig -p | grep libgz 查找,如有并指定路径!否则安装 libz-devel/ibgz-devel/zlib-devel/ gzlib-devel
  • 13. 2)在 make test 阶段出错: (1)类: install_driver(mysql) failed: Can't load '/usr/lib/perl5/site_perl/i586-linux/auto/DBD/mysql/mysql.so' for module DBD::mysql: File not found at /usr/lib/perl5/i586-linux/5.00404/DynaLoader.pm line 166 与 /usr/lib/mysql/libmysqlclient.a 有关 (cp libmysqlclient.a /us/lib) (2)类: t/00base............install_driver(mysql) failed: Can't load '../blib/arch/auto/DBD/mysql/mysql.so' for module DBD::mysql: ../blib/arch/auto/DBD/mysql/mysql.so: undefined symbol: _umoddi3 at /usr/local/perl-5.005/lib/5.005/i586-linux-thread/DynaLoader.pm line 168. 与 libgcc.a 有关 (cp /usr/lib/gcc/i386-redhat-linux/4.1.1/libgcc.a /usr/local/lib/ (3) 类:Can't load libmysqlclient.so.15 、、、、 (cp libmysqlclient.so.15 /us/lib) ---------------------------------------- $perl Makefile.PL --libs="-L/usr/local/mysql/lib/mysql -lmysqlclient -L/usr/lib -lz " -- cflags=-I/usr/local/mysql/include/mysql -- mysql_config=/usr/local/mysql/bin/mysql_config --testhost=127.0.0.1-- testsocket=/usr/local/mysql/tmp/mysql.sock --testdb=test --testuser=abc -- testpassword=abc ------------------ $ ; make; make test ;sudo make install; ------------------------------- 参考: http://dev.mysql.com/doc/refman/5.0/en/perl-support-problems.html INSTALL.html