`
jackyhongvip
  • 浏览: 159718 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

mysql-mmm+amoeba+keepalived实现mysql高可用和读写分离(二)

 
阅读更多

一、利用amoeba实现高可用下的读写分离

1、 关于amoeba的介绍和安装我这里不做介绍了,请查看:http://blog.chinaunix.net/u3/93755/showart.php?id=2363202,有什么问题我们再一起讨论。

2、 Amoebamysql-mmm架构下的配置

配置的除了amoeba的监听IP外其他的均采用上面mmm分配的浮动IP,因为当出现故障后,浮动IP会自动分配到正常的server上。amoeba.xml的配置如下:

<?xml version="1.0" encoding="gbk"?>

<!DOCTYPE amoeba:configuration SYSTEM "amoeba.dtd">

<amoeba:configuration xmlns:amoeba="http://amoeba.meidusa.com/">

<server>

<!-- proxy server绑定的端口 -->

<property name="port">8066</property>

<!-- proxy server绑定的IP -->

<property name="ipAddress">192.168.1.163</property>

<!-- proxy server net IO Read thread size -->

<property name="readThreadPoolSize">20</property>

<!-- proxy server client process thread size -->

<property name="clientSideThreadPoolSize">30</property>

<!-- mysql server data packet process thread size -->

<property name="serverSideThreadPoolSize">30</property>

<!-- socket Send and receive BufferSize(unit:K) -->

<property name="netBufferSize">128</property>

<!-- Enable/disable TCP_NODELAY (disable/enable Nagle's algorithm). -->

<property name="tcpNoDelay">true</property>

<property name="user">root</property>

<property name="password">password</property>

<!-- query timeout( default: 60 second , TimeUnit:second) -->

<property name="queryTimeout">60</property>

</server>

<!--

每个ConnectionManager都将作为一个线程启动。

manager负责Connection IO读写/死亡检测

-->

<connectionManagerList>

<connectionManager name="defaultManager" class="com.meidusa.amoeba.net.MultiConnectionManagerWrapper">

<property name="subManagerClassName">com.meidusa.amoeba.net.AuthingableConnectionManager</property>

<!--

default value is avaliable Processors

<property name="processors">5</property>

-->

</connectionManager>

</connectionManagerList>

<dbServerList>

<!--

一台mysqlServer 需要配置一个pool,

如果多台 平等的mysql需要进行loadBalance,

平台已经提供一个具有负载均衡能力的objectPool:com.meidusa.amoeba.mysql.server.MultipleServerPool

简单的配置是属性加上 virtual="true",该Pool 不允许配置factoryConfig

或者自己写一个ObjectPool。

-->

<dbServer name="server1">

<!-- PoolableObjectFactory实现类 -->

<factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory">

<property name="manager">defaultManager</property>

<!-- 真实mysql数据库端口 -->

<property name="port">3306</property>

<!-- 真实mysql数据库IP -->

<property name="ipAddress">192.168.1.113</property>

<property name="schema">test</property>

<!-- 用于登陆mysql的用户名 -->

<property name="user">zhang</property>

<!-- 用于登陆mysql的密码 -->

<property name="password">zhang123</property>

</factoryConfig>

<!-- ObjectPool实现类 -->

<poolConfig class="com.meidusa.amoeba.net.poolable.PoolableObjectPool">

<property name="maxActive">200</property>

<property name="maxIdle">200</property>

<property name="minIdle">10</property>

<property name="minEvictableIdleTimeMillis">600000</property>

<property name="timeBetweenEvictionRunsMillis">600000</property>

<property name="testOnBorrow">true</property>

<property name="testWhileIdle">true</property>

</poolConfig>

</dbServer>

<dbServer name="server2">

<!-- PoolableObjectFactory实现类 -->

<factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory">

<property name="manager">defaultManager</property>

<!-- 真实mysql数据库端口 -->

<property name="port">3306</property>

<!-- 真实mysql数据库IP -->

<property name="ipAddress">192.168.1.111</property>

<property name="schema">test</property>

<!-- 用于登陆mysql的用户名 -->

<property name="user">zhang</property>

<!-- 用于登陆mysql的密码 -->

<property name="password">zhang123</property>

</factoryConfig>

<!-- ObjectPool实现类 -->

<poolConfig class="com.meidusa.amoeba.net.poolable.PoolableObjectPool">

<property name="maxActive">200</property>

<property name="maxIdle">200</property>

<property name="minIdle">10</property>

<property name="minEvictableIdleTimeMillis">600000</property>

<property name="timeBetweenEvictionRunsMillis">600000</property>

<property name="testOnBorrow">true</property>

<property name="testWhileIdle">true</property>

</poolConfig>

</dbServer>

<dbServer name="server3">

<!-- PoolableObjectFactory实现类 -->

<factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory">

<property name="manager">defaultManager</property>

<!-- 真实mysql数据库端口 -->

<property name="port">3306</property>

<!-- 真实mysql数据库IP -->

<property name="ipAddress">192.168.1.112</property>

<property name="schema">test</property>

<!-- 用于登陆mysql的用户名 -->

<property name="user">zhang</property>

<!-- 用于登陆mysql的密码 -->

<property name="password">zhang123</property>

</factoryConfig>

<!-- ObjectPool实现类 -->

<poolConfig class="com.meidusa.amoeba.net.poolable.PoolableObjectPool">

<property name="maxActive">200</property>

<property name="maxIdle">200</property>

<property name="minIdle">10</property>

<property name="minEvictableIdleTimeMillis">600000</property>

<property name="timeBetweenEvictionRunsMillis">600000</property>

<property name="testOnBorrow">true</property>

<property name="testWhileIdle">true</property>

</poolConfig>

</dbServer>

<dbServer name="server4">

<!-- PoolableObjectFactory实现类 -->

<factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory">

<property name="manager">defaultManager</property>

<!-- 真实mysql数据库端口 -->

<property name="port">3306</property>

<!-- 真实mysql数据库IP -->

<property name="ipAddress">192.168.1.114</property>

<property name="schema">test</property>

<!-- 用于登陆mysql的用户名 -->

<property name="user">zhang</property>

<!-- 用于登陆mysql的密码 -->

<property name="password">zhang123</property>

</factoryConfig>

<!-- ObjectPool实现类 -->

<poolConfig class="com.meidusa.amoeba.net.poolable.PoolableObjectPool">

<property name="maxActive">200</property>

<property name="maxIdle">200</property>

<property name="minIdle">10</property>

<property name="minEvictableIdleTimeMillis">600000</property>

<property name="timeBetweenEvictionRunsMillis">600000</property>

<property name="testOnBorrow">true</property>

<property name="testWhileIdle">true</property>

</poolConfig>

</dbServer>

<dbServer name="server5">

<!-- PoolableObjectFactory实现类 -->

<factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory">

<property name="manager">defaultManager</property>

<!-- 真实mysql数据库端口 -->

<property name="port">3306</property>

<!-- 真实mysql数据库IP -->

<property name="ipAddress">192.168.1.115</property>

<property name="schema">test</property>

<!-- 用于登陆mysql的用户名 -->

<property name="user">zhang</property>

<!-- 用于登陆mysql的密码 -->

<property name="password">zhang123</property>

</factoryConfig>

<!-- ObjectPool实现类 -->

<poolConfig class="com.meidusa.amoeba.net.poolable.PoolableObjectPool">

<property name="maxActive">200</property>

<property name="maxIdle">200</property>

<property name="minIdle">10</property>

<property name="minEvictableIdleTimeMillis">600000</property>

<property name="timeBetweenEvictionRunsMillis">600000</property>

<property name="testOnBorrow">true</property>

<property name="testWhileIdle">true</property>

</poolConfig>

</dbServer>

<dbServer name="master" virtual="true">

<poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">

<!-- 负载均衡参数 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-->

<property name="loadbalance">1</property>

<!-- 参与该pool负载均衡的poolName列表以逗号分割 -->

<property name="poolNames">server1</property>

</poolConfig>

</dbServer>

<dbServer name="slave" virtual="true">

<poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">

<!-- 负载均衡参数 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-->

<property name="loadbalance">1</property>

<!-- 参与该pool负载均衡的poolName列表以逗号分割 -->

<property name="poolNames">server2,server3,server4,server5</property>

</poolConfig>

</dbServer>

</dbServerList>

<queryRouter class="com.meidusa.amoeba.mysql.parser.MysqlQueryRouter">

<property name="ruleConfig">${amoeba.home}/conf/rule.xml</property>

<property name="functionConfig">${amoeba.home}/conf/functionMap.xml</property>

<property name="ruleFunctionConfig">${amoeba.home}/conf/ruleFunctionMap.xml</property>

<property name="LRUMapSize">1500</property>

<property name="defaultPool">master</property>

<property name="writePool">master</property>

<property name="readPool">slave</property>

<property name="needParse">true</property>

</queryRouter>

</amoeba:configuration>

3、 启动amoeba

/usr/local/amoeba/bin/amoeba &

检验启动是否成功(使用的是默认的8066端口):

[root@server3 ~]# ps aux | grep amoeba

root 15390 0.2 21.7 411800 55684 pts/0 Sl Nov09 0:13 /usr/java/jdk1.6/bin/java -server -Xms256m -Xmx256m -Xss128k -Damoeba.home=/usr/local/amoeba -Dclassworlds.conf=/usr/local/amoeba/bin/amoeba.classworlds -classpath /usr/local/amoeba/lib/classworlds-1.0.jar org.codehaus.classworlds.Launcher

4、 测试

为了有权限,请在所有mysql-server上添加上面配置的用户名和密码,比如:

grant all on test.* to zhang@'192.168.1.%' identified by 'zhang123';

flush privileges;

测试的时候比较麻烦,因为如果把主从停掉来看效果的话,mmm会将该同步状态有问题的服务器设置成REPLICATION_FAIL并将该主机上的浮动IP移动到正常服务器,比如:我将server4停掉后,就出出现如下现象:

[root@server3 ~]# mmm_control show

db1(192.168.1.161) master/ONLINE. Roles: reader(192.168.1.114), reader(192.168.1.115)

db2(192.168.1.162) master/ONLINE. Roles: reader(192.168.1.112), writer(192.168.1.113)

db3(192.168.1.164) slave/REPLICATION_FAIL. Roles:

db4(192.168.1.165) slave/ONLINE. Roles: reader(192.168.1.111)

暂时没想到很好的测试办法。读写分离测试没有问题。

最近手头没有空闲的机器来做压力测试。等有了机器了再对这个架构做下压力测试!

二、利用keepalived实现amoeba高可用

Keepalived简介:KeepalivedLinux下面实现VRRP 备份路由的高可靠性运行件。基于Keepalived设计的服务模式能够真正做到主服务器和备份服务器故障时IP瞬间无缝交接。从而提高系统的可用性

1、 keepalived的安装(server6server7上都要安装):

wget http://www.keepalived.org/software/keepalived-1.1.19.tar.gz
tar zxvf keepalived-1.1.19.tar.gz
cd keepalived-1.1.19
./configure --prefix=/usr/local/keepalived
make
make install
cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
mkdir /etc/keepalived
cd /etc/keepalived/

2、 keepalived的配置

配置server6keepalived配置文件/etc/keepalived/keepalived.conf,内容如下:

bal_defs {

notification_email {

jimo291@gmail.com

}

notification_email_from jimo291@gmail.com

smtp_server 127.0.0.1

smtp_connect_timeout 30

router_id test1

}

vrrp_instance VI_1 {

state MASTER

interface eth0

virtual_router_id 51

priority 100

advert_int 1

smtp_alert

authentication {

auth_type PASS

auth_pass 123

}

virtual_ipaddress {

192.168.1.170

}

}

配置server6keepalived配置文件/etc/keepalived/keepalived.conf,内容如下:

bal_defs {

notification_email {

jimo291@gmail.com

}

notification_email_from jimo291@gmail.com

smtp_server 127.0.0.1

smtp_connect_timeout 30

router_id test2

}

vrrp_instance VI_1 {

state BACKUP

interface eth0

virtual_router_id 51

priority 80

advert_int 1

smtp_alert

authentication {

auth_type PASS

auth_pass 123

}

virtual_ipaddress {

192.168.1.170

}

}

3、 keepalived的启动:

server6server7上执行如下命令启动:

/etc/rc.d/init.d/keepalived start

看看server6上是否绑定了虚拟IP192.168.1.170

[root@server6 ~]# ip add | grep 192.168.1.170

inet 192.168.1.170/32 scope global eth0

可以看到已经成功绑定了192.168.1.170

4、 测试

停掉server6,看看虚拟IP192.168.1.170会不会自动切换到server7上。以及测试mysql -uroot -ppassword -h192.168.1.170登录,看看能否实现读写操作是否正常等等!

备注:最后记得将所有的启动命令都写到/etc/rc.local文件中去,实现开机启动!

分享到:
评论

相关推荐

    Amoeba+mysql 读写分离 Keepalived+mysql

    这里我们主要探讨的是如何使用Amoeba与MySQL实现读写分离,以及如何利用Keepalived来构建MySQL的高可用集群。这两部分内容对于保障数据库服务的稳定性和效率至关重要。 **Amoeba+MySQL 读写分离** Amoeba 是一个...

    amoeba+mysql-mmm+mysql 高可用

    amoeba+mysql-mmm+mysql 高可用,读写分离,双主多活

    amoeba-mysql-binary-2.2.0.tar.gz

    amoeba-mysql-binary-2.2.0.tar.gz amoeba-mysql-binary-2.2.0.tar.gz amoeba-mysql-binary-2.2.0.tar.gz amoeba-mysql-binary-2.2.0.tar.gzamoeba-mysql-binary-2.2.0.tar.gz amoeba-mysql-binary-2.2.0.tar.gz ...

    Mysql+drbd+heartbeat+amoeba集群配置详解

    根据提供的信息,我们可以详细探讨如何构建一个基于MySQL、DRBD(Distributed Replicated Block Device)、Heartbeat以及Amoeba的高可用性和负载均衡的数据库集群系统。这种集群配置旨在提高系统的稳定性和数据的...

    使用mysql-proxy实现mysql读写分离

    #### 二、使用mysql-proxy实现读写分离的具体步骤 接下来,我们将详细介绍如何利用mysql-proxy来实现MySQL的读写分离。 1. **环境准备**:假设已经搭建好了一台主数据库(mysql-master)和一台从数据库(mysql-...

    Amoeba(amoeba-mysql-3.0.5-RC-distribution.zip)

    可以实现数据库负载均衡、读写分离、高可用性等功能。 amoeba-mysql.zip压缩包内容: amoeba-mysql-3.0.5-RC-distribution.zip amoeba-mysql-binary-2.2.0.tar.gz amoeba-mysql-binary-2.1.0-RC5.tar.gz amoeba-...

    amoeba-mysql-binary-2.2.0.tar

    Amoeba是一个分布式数据库中间件,它能够将一个MySQL实例透明地扩展到多个节点,实现数据的高可用性和负载均衡。这个tar文件可能包含了Amoeba运行所需的全部文件,如配置文件、库文件和可执行文件等。 描述中提到了...

    第三十九章:DRBD+Keepalived+Mysql+Amoeba双主双从高可用集群1

    本文将深入探讨一种基于DRBD、Keepalived、Mysql和Amoeba技术构建的双主双从高可用集群方案,旨在提供高可靠性和数据安全性。这个集群配置确保了即使在单个节点故障的情况下,服务也能继续运行,从而避免了业务中断...

    MySQL搭建Amoeba_读写分离.docx

    Amoeba 是一个基于 MySQL 的 proxy,能够集中地响应应用的请求,并根据用户事先设置的规则,将 SQL 请求发送到特定的数据库上执行,从而实现负载均衡、读写分离、高可用性等需求。 一、Amoeba 简介 Amoeba 是一个...

    amoeba-mysql-binary

    "amoeba-mysql-binary" 是一个与MySQL数据库相关的开源项目,其主要功能是提供一种分布式解决方案,用于扩展MySQL服务器的能力,提升数据库的可扩展性和可用性。Amoeba这个名字来源于生物学中的变形虫,寓意该系统...

    amoeba-mysql-3.0.4-BETA.tar.gz 实现集群管理 读写分离

    Amoeba主要解决以下问题: a). 数据切分后复杂数据源整合 b). 提供数据切分规则并降低数据切分规则给数据库带来的影响 c). 降低数据库与客户端连接 d). 读写分离路由 通过Amoeba实现读写分离

    Amoeba搞定mysql主从读写分离

    总之,Amoeba作为一款Java环境下的MySQL读写分离解决方案,通过智能的分片策略和高可用性设计,能够有效提升系统的读取性能和容错能力。但在实际应用中,需要结合业务需求和技术限制,合理选择和配置,才能发挥其...

    amoeba-mysql-3.0.5-RC-distribution.zip

    Amoeba MySQL 是一个分布式数据库系统,它基于开源的 MySQL 数据库引擎,旨在提供高可用性、可扩展性和性能优化。3.0.5 RC(Release Candidate)版本是该软件的一个候选发布版本,通常在正式版发布前,供用户测试和...

    linux下mysql amoeba读写分离配置

    接下来,我们可以利用Amoeba或MySQL-Proxy实现读写分离。Amoeba是一个开源的MySQL中间件,它支持分布式事务和读写分离。Amoeba会将读请求分发到多个从服务器,而写请求则发送到主服务器。配置Amoeba通常涉及安装...

    amoeba-mysql-1.2.0-RC3.zip

    描述中提到的“mysql读写分离集群、linux版中间件”是指Amoeba可以在Linux操作系统上运行,作为一个中间件来实现MySQL的读写分离功能。读写分离是数据库架构优化的一种策略,它将数据库的读操作和写操作分开处理,以...

    MySQL读写分离架构与实践--mysql-proxy

    MySQL主从复制(Master-Slave)的方式来同步数据,再通过读写分离(MySQL-Proxy/Amoeba)来提升数据库的并发负载能力 这样的方案来进行部署与实施的

    安装LAP+mysql主从库 apache+mysql+proxy主从+PHP+discuz论坛 .docx

    5. Amoeba读写分离:Amoeba是一个基于MYSQL的代理服务,提供MYSQL协议接口,可以实现负载均衡、读写分离和高可用性。 6. Mycat读写分离:Mycat是一个MYSQL Proxy服务器,可以实现读写分离和负载均衡。 7. 基于程序...

    Mysql主从复制+读写分离1

    Mysql 主从复制+读写分离是指在 Mysql 集群中,拥有多个从服务器(Slave),它们从主服务器(Master)中复制数据,以确保数据的一致性和可用性。这种架构可以提高数据库的读取性能、减少写入压力、提高系统的可用性...

    amoeba集群文档+Amoeba使用指南pdf+mysql主从同步

    通过以上四个文件,学习者可以全面了解如何利用Amoeba搭建高可用性和负载均衡的MySQL数据库集群,以及如何实现MySQL的主从同步,从而提升数据库系统的稳定性和可扩展性。在实际操作中,遇到任何问题都可以根据描述中...

Global site tag (gtag.js) - Google Analytics