- 浏览: 159718 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
西巴拉古呀那:
Linux多线程并发服务器编程(线程池,FTP服务器)网盘地址 ...
多线程服务器的适用场合 -
somefuture:
第四题怎麼用位图法。写了半天没出来,用了下面的,速度很快pri ...
位图法应用 -
寂寞秋江:
系统,全面,条理清晰,由浅入深,简直是集大成之作。 特别是最后 ...
单个进程最大线程数 -
darkjune:
有点意思, 不错
单个进程最大线程数 -
kidding87:
谢谢啦,收藏着
google使用一点敲门分享
mysql-mmm+amoeba+keepalived实现mysql高可用和读写分离(二)
一、利用amoeba实现高可用下的读写分离
1、 关于amoeba的介绍和安装我这里不做介绍了,请查看:http://blog.chinaunix.net/u3/93755/showart.php?id=2363202,有什么问题我们再一起讨论。
2、 Amoeba在mysql-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简介:Keepalived是Linux下面实现VRRP 备份路由的高可靠性运行件。基于Keepalived设计的服务模式能够真正做到主服务器和备份服务器故障时IP瞬间无缝交接。从而提高系统的可用性
1、 keepalived的安装(server6、server7上都要安装):
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的配置
配置server6的keepalived配置文件/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
}
}
配置server6的keepalived配置文件/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的启动:
在server6、server7上执行如下命令启动:
/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 读写分离** Amoeba 是一个...
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.gzamoeba-mysql-binary-2.2.0.tar.gz amoeba-mysql-binary-2.2.0.tar.gz ...
根据提供的信息,我们可以详细探讨如何构建一个基于MySQL、DRBD(Distributed Replicated Block Device)、Heartbeat以及Amoeba的高可用性和负载均衡的数据库集群系统。这种集群配置旨在提高系统的稳定性和数据的...
#### 二、使用mysql-proxy实现读写分离的具体步骤 接下来,我们将详细介绍如何利用mysql-proxy来实现MySQL的读写分离。 1. **环境准备**:假设已经搭建好了一台主数据库(mysql-master)和一台从数据库(mysql-...
可以实现数据库负载均衡、读写分离、高可用性等功能。 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实例透明地扩展到多个节点,实现数据的高可用性和负载均衡。这个tar文件可能包含了Amoeba运行所需的全部文件,如配置文件、库文件和可执行文件等。 描述中提到了...
本文将深入探讨一种基于DRBD、Keepalived、Mysql和Amoeba技术构建的双主双从高可用集群方案,旨在提供高可靠性和数据安全性。这个集群配置确保了即使在单个节点故障的情况下,服务也能继续运行,从而避免了业务中断...
Amoeba 是一个基于 MySQL 的 proxy,能够集中地响应应用的请求,并根据用户事先设置的规则,将 SQL 请求发送到特定的数据库上执行,从而实现负载均衡、读写分离、高可用性等需求。 一、Amoeba 简介 Amoeba 是一个...
"amoeba-mysql-binary" 是一个与MySQL数据库相关的开源项目,其主要功能是提供一种分布式解决方案,用于扩展MySQL服务器的能力,提升数据库的可扩展性和可用性。Amoeba这个名字来源于生物学中的变形虫,寓意该系统...
Amoeba主要解决以下问题: a). 数据切分后复杂数据源整合 b). 提供数据切分规则并降低数据切分规则给数据库带来的影响 c). 降低数据库与客户端连接 d). 读写分离路由 通过Amoeba实现读写分离
总之,Amoeba作为一款Java环境下的MySQL读写分离解决方案,通过智能的分片策略和高可用性设计,能够有效提升系统的读取性能和容错能力。但在实际应用中,需要结合业务需求和技术限制,合理选择和配置,才能发挥其...
Amoeba MySQL 是一个分布式数据库系统,它基于开源的 MySQL 数据库引擎,旨在提供高可用性、可扩展性和性能优化。3.0.5 RC(Release Candidate)版本是该软件的一个候选发布版本,通常在正式版发布前,供用户测试和...
接下来,我们可以利用Amoeba或MySQL-Proxy实现读写分离。Amoeba是一个开源的MySQL中间件,它支持分布式事务和读写分离。Amoeba会将读请求分发到多个从服务器,而写请求则发送到主服务器。配置Amoeba通常涉及安装...
描述中提到的“mysql读写分离集群、linux版中间件”是指Amoeba可以在Linux操作系统上运行,作为一个中间件来实现MySQL的读写分离功能。读写分离是数据库架构优化的一种策略,它将数据库的读操作和写操作分开处理,以...
MySQL主从复制(Master-Slave)的方式来同步数据,再通过读写分离(MySQL-Proxy/Amoeba)来提升数据库的并发负载能力 这样的方案来进行部署与实施的
5. Amoeba读写分离:Amoeba是一个基于MYSQL的代理服务,提供MYSQL协议接口,可以实现负载均衡、读写分离和高可用性。 6. Mycat读写分离:Mycat是一个MYSQL Proxy服务器,可以实现读写分离和负载均衡。 7. 基于程序...
Mysql 主从复制+读写分离是指在 Mysql 集群中,拥有多个从服务器(Slave),它们从主服务器(Master)中复制数据,以确保数据的一致性和可用性。这种架构可以提高数据库的读取性能、减少写入压力、提高系统的可用性...
通过以上四个文件,学习者可以全面了解如何利用Amoeba搭建高可用性和负载均衡的MySQL数据库集群,以及如何实现MySQL的主从同步,从而提升数据库系统的稳定性和可扩展性。在实际操作中,遇到任何问题都可以根据描述中...