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

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 replicationslave 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、安装 node1node2 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 masterspeer 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 port3306 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 zxfmysql-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