MMM+MySql+Proxy

master-slave的数据库结构解决了许多问题,特别是读写应用
1.写操作全部在master节点执行,slave每隔60s读取master的binlog
2.将众多的用户请求分散到更多 的节点,从而减轻单点的压力
缺点:
1.slave实时性不太好。
2.高可用问题,mater就是致命点(SPOF:Single point of failure);
master-master replication
1.使用两个mysql数据库db01,db02,互为master和slave
2.从app来说只有一个作为master
3.如果扮演slave的数据库节点db02failed
此时app会将所有的read,write分配给的db01,除非slave活过来了
4.如果扮演slave的数据库节点db01failed
此时app会将所有的read,write分配给的db02,除非slave活过来了
其中3.4是由mmm来配置的
MMM有三个组件
MMMD_MON->监控那些正在工作的并且指定角色等等的脚本
MMM_AGENT-->远程服务器管理代理脚本[提供一套service来使server管理跟容易,更有弹性的监控node]
MMM_CONTROL-->能够通过命令和脚本来管理MMMD_MON
每一个mysql服务器节点需要运行MMM_AGENT,同时在另一台机器(可以是独立的一台机器,也可以是app server共享一台机器)
运行mmmd_mon形成1*mmmd_mon +n*mmmd-agent部署架构
MMM利用虚拟ip技术:一个网卡可以同时使用多个ip
(所以使用mmm时,需要2*n+1个ip)n为mysql节点个数(包括master和slave节点_个数)
当有数据库节点fail时mmmd_mon检测不到mmmmd_agent的心跳或者服务状态。mmmd_mon将进行决定,并下指令给某个正常的数据库节点的mmmd_agent,
使得该mmmd_agent篡位使用刚才fail掉的那个节点的虚拟ip,使得虚拟ip实际指向fail那个机器
mmm对mysql master-slave replicastion有很好的补充
webclient 数据库请求至proxry -proxy进行读写分发-转至mmm机制,在检测存货的机器读与写操作
规划
主机名      ip                port      app         目录           备注
Node1       192.168.1.2       3306      mysql                      数据库服务器1
Node2       192.168.1.3       3306      mysql                      数据库服务器2
MON         192.168.1.4       3306      mysql                      数据库管理服务器
PROXY       192.168.1.5       4040      PROXY                      数据库代理NLB
node1,node 2数据库服务器replication双向master-master虚拟机有限,只能开四台,因为node1,node2即可以读又可以写


配置步骤
网络的配置修改为静态ip并且ifcongfig -a 和目录下的网卡名一致,确保硬件地址一致
node1和node2 replication 双向master-master
node1 和node2安装mmm并配置mmm_regent.conf
Mon安装mmm并配置mmm_mon.conf
proxy安装mysql-proxy



一,配置node1 node2数据库服务器replication双向master-master
1.配置node1同步
my.cnf
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 status\G;结果
slave_io_running yes
slave_sql_running yes


2.配置node2同步
my.cnf
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 status\G;结果
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主机包
1、安装mon主机软件包
前提(所需软件包):
    Algorithm-Diff-1.1902.tar.gz  :http://ipkg.nslu2-linux.org/sources/Algorithm-Diff-1.1902.tar.gz
    Proc-Daemon-0.03.tar.gz:ftp://ftp.auckland.ac.nz/pub/perl/CPAN/modules/by-module/Proc/Proc-Daemon-0.03.tar.gz
    mmm-1.0.tar.bz2 wget http://mysql-master-master.googlecode.com/files/mmm-1.0.tar.bz2
RPM
    mysql-server-5.0.22-2.1:ftp://ftp.pbone.net/mirror/www.startcom.org/ML-5.0.7/os/i386/StartCom/RPMS/mysql-server-5.0.22-2.2.ML5.1.i386.rpm
RPM
    mysql-5.0.22-2.1:http://down.51cto.com/data/632415
RPM
    perl-DBD-MySQL-3.0007-1.fc6:http://download.csdn.net/download/jasonz2/4242771
先安裝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, 192.168.1.8    对应ip 虚拟的IP
# Mysql Writer role
role writer         写规则
mode exclusive      模式为独占
servers db1,db2     规则负载db1 db2
ip 192.168.1.9      两台数据库公用一个ip为写,采用HA模式,默认db1使用,db1下线db2接管此ip 武汉誉天.独家授权 Cisco / RHCE 培训 www.yutianedu.com

五:测试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 co [url]http://svn.mysql.com/svnpublic/mysql-proxy/trunk[/url] 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;
-------------------------------
参考:
[url]http://dev.mysql.com/doc/refman/5.0/en/perl-support-problems.html[/url]
INSTALL.html

你可能感兴趣的:(MMM+MySql+Proxy)