Mysql+mmm+proxy 测试2008 年 9 月 8 日16:38作者:守住每一天博客:http://liuyu.blog.51cto.comBBS:http://www.linuxtone.orgmsn: liuyubj520@hot...
1、使用两个 MySQL 数据库 db01,db02,互为 Master 和 Slave,即:一边 db01 作为 db02 的 master,一旦有数据写向 db01 时,db02 定时从 db01 更新另一边 db02 也作为 db01 的...
这比上一个还要复杂,即:当一个 Master Fail 时,所有的 Slave 不再从原来失败的那个 Master(db01)获取更新日志,而应该“自动”切换到最新充当 Master 角色的数据库 db02。MMM,a greate proje...
当有数据库结点 fail 时,mmmd_mon 检测不到 mmmd_agent 的心跳或者对应的 MySQL服务器的状态,mmmd_mon 将进行决定,并下指令给某个正常的数据库结点的mmmd_agent,使得该 mmmd_agent“篡位”使...
node1node2一、配置 node1 node2 数据库服务器 replication 双向 master-master1、配置 node1 同步Mkdir /var/log/mysqlChown mysql.mysql /var/log/...
mysql> grant replication slave on *.* to replication@% identified by slave;show slave statusG;的结果:     Slave_IO_Running: Y...
./install.pl 2、安装 node1 node2 agent 软件包(使用 agent 功能) mmm-1.0.tar.bz2 安裝 mmm: ./install.pl 三台主机安装以上软件后进行配置过程三:node1 node2 的...
# For masters peer db2Peer db1# Cluster hosts addresses and access params     host db1     ip 192.168.1.2     port 3306   ...
ip 192.168.1.3 port 3306 user rep_monitor password RepMonitor mode master peer db1 #后续如有添加需求,请按照上面格式填写 active_master_role ...
并对 mon 进行检测# mmm_control set_online db1# mmm_control set_online db2# mmm_control show 查看分配情况正常情况下:# mmm_control showServer...
2、安装编译好的版本安装方法如下:# tar zxf mysql-proxy-0.6.0-linux-rhas4-x86.tar.gz# cd mysql-proxy-0.6.0-linux-rhas4-x86#可以看到有 2 个目录# lss...
--proxy-lua-script=/usr/local/share/mysql-proxy/rw-splitting.lua 指定 lua 脚本,在这里,使用的是 rw-splitting 脚本,用于读写分离完整的参数可以运行以下命令查看:...
2)在 make test 阶段出错: (1)类: install_driver(mysql) failed: Cant load /usr/lib/perl5/site_perl/i586-linux/auto/DBD/mysql/mysql...
Upcoming SlideShare
Loading in...5
×

Mysql proxy+mysql-mmm

943

Published on

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
943
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
0
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Mysql proxy+mysql-mmm

  1. 1. Mysql+mmm+proxy 测试2008 年 9 月 8 日16:38作者:守住每一天博客:http://liuyu.blog.51cto.comBBS:http://www.linuxtone.orgmsn: 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-log2、将众多的用户读请求分散到更多的数据库节点,从而减轻了单点的压力这是对 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. 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 操作不再指向 db02b)一旦 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. 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 alldecisions about roles moving and so on.2、mmmd_agent - remote servers management agent script, whichprovides monitoringnode with simple set of remote services to makeservers management easier, moreflexible abd highly portable.3、mmm_control - simple script dedicated to management of the mmmd_mon processesby 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. 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 数据库服务器 1Node2 192.168.1.3 3306 mysql /var/lib/mysql 数据库服务器 2Mon 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-masterNode1 node2 安装 mmm 并配置 mmm_regent.confMon 安装 mmm 并配置 mmm_mon.confproxy 安装 mysql-proxy
  5. 5. node1node2一、配置 node1 node2 数据库服务器 replication 双向 master-master1、配置 node1 同步Mkdir /var/log/mysqlChown mysql.mysql /var/log/mysqlmy.cnf at db1 should have following options:server-id = 1log_bin = mysql-binmaster_host 192.168.1.2master_port 3306master_user replicationmaster_password slavemysql> grant replication slave on *.* to replication@% identified by slave;show slave statusG;的结果: Slave_IO_Running: Yes Slave_SQL_Running: Yes2、配置 node2 同步Mkdir /var/log/mysqlChown mysql.mysql /var/log/mysqlmy.cnf at db1 should have following options:server-id = 2log_bin = mysql-binmaster_host 192.168.1.3master_port 3306master_user replicationmaster_password slave
  6. 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.2Node2 192.168.1.3Mon 192.168.1.41、安装 mon 主机软件包前提:-- Algorithm-Diff-1.1902.tar.gz-- Proc-Daemon-0.03.tar.gzRPM mysql-server-5.0.22-2.1RPM mysql-5.0.22-2.1RPM 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.gzperl 包的安裝過程都是:perl Makefile.PLmakemake testmake install安裝 mmm:
  7. 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.confnode1 配置文件所需要修改的地方如下cluster_interface eth0 --配置 IP 所用的网卡# Define current server id this db1this db1mode master# For masters peer db2Peer 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 RepAgentNode2 配置文件所需要修改的地方如下# Cluster interfacecluster_interface eth0 --配置 IP 所用的网卡# Define current server id this db1this db2mode master
  8. 8. # For masters peer db2Peer 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. 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. 10. 并对 mon 进行检测# mmm_control set_online db1# mmm_control set_online db2# mmm_control show 查看分配情况正常情况下:# mmm_control showServers 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 showServers 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 showServers 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 proxy1、下载 proxy 代码包从 svn 上获取最新代码svn co http://svn.mysql.com/svnpublic/mysql-proxy/trunk mysql-proxy
  11. 11. 2、安装编译好的版本安装方法如下:# tar zxf mysql-proxy-0.6.0-linux-rhas4-x86.tar.gz# cd mysql-proxy-0.6.0-linux-rhas4-x86#可以看到有 2 个目录# lssbin share# mv sbin/mysql-proxy /usr/local/sbin/# ls sharemysql-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. 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 restartPs -ef | grep mysql-proxy七、测试结果将 web server 如 apache 中部署的网站,数据库连接地址改为----〉proxy 的 ip 端口为40401、往数据库 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 -lzcollect2: ld returned 1 exit statusmake: *** [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. 13. 2)在 make test 阶段出错: (1)类: install_driver(mysql) failed: Cant 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: Cant 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) 类:Cant 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.htmlINSTALL.html

×