论坛首页 Java企业应用论坛

Amoeba for mysql 0.31发布(读写分离、负载均衡、Failover、数据切分)

浏览 76306 次
该帖已经被评为良好帖
作者 正文
   发表时间:2008-05-05  
数据同步还是由后端的数据库结构来完成的。amoeba只是充当proxy 跟 query router、负载均衡等。它不能完成数据库自身的数据同步。
假设A是master b是slave。那么 如果A挂了..那么这个系统里面就无法写入了
假设A、B都是slave. 那么A/B就可以做成虚拟的dbserver。即使挂了一台也没有关系,这儿amoeba就象类似的f5 bigIP设备。会做心跳检测、故障恢复功能。
A恢复以后,A与master之间的同步还是需要mysql 的Master-slave结构来完成复制的。


但是在amoeba里面可以同时更新、插入、删除 多台数据库(作为数据备份的一种手段,但个人不提倡这种做法,有风险,如果需要数据完整性方面更多需要应用‘回滚机制’,这种做法在其他分布式系统里面也比较典型的做法),也就是同时将一条sql给多台数据库执行。
0 请登录后投票
   发表时间:2008-05-05  
csrcom高手
多发点自己的心得啊,多帮助中国的同僚。
0 请登录后投票
   发表时间:2008-05-05  
csrcom 写道
数据同步还是由后端的数据库结构来完成的。amoeba只是充当proxy 跟 query router、负载均衡等。它不能完成数据库自身的数据同步。
假设A是master b是slave。那么 如果A挂了..那么这个系统里面就无法写入了
假设A、B都是slave. 那么A/B就可以做成虚拟的dbserver。即使挂了一台也没有关系,这儿amoeba就象类似的f5 bigIP设备。会做心跳检测、故障恢复功能。
A恢复以后,A与master之间的同步还是需要mysql 的Master-slave结构来完成复制的。


但是在amoeba里面可以同时更新、插入、删除 多台数据库(作为数据备份的一种手段,但个人不提倡这种做法,有风险,如果需要数据完整性方面更多需要应用‘回滚机制’,这种做法在其他分布式系统里面也比较典型的做法),也就是同时将一条sql给多台数据库执行。


Master slave也可以自动切换的, A是master,B是slave, A挂了以后,可以自动切换到B,B作为Master。

楼主的类似产品可以去看看continuent

http://www.continuent.org/
0 请登录后投票
   发表时间:2008-05-05  
恩,如果A、B是互为备份的话是没什么问题的。
可以将A、B作为一个虚拟的dbserver

Continuent 的产品在中间是充当负载均衡、故障转移的(高可用性方面),不过需要配上Continuent 提供的驱动
0 请登录后投票
   发表时间:2008-05-05  
另外,他的负载均衡几种算法?还有这个东西本身可不可以进行备份,如果运行这个东西的机器死掉了,怎么处理?
0 请登录后投票
   发表时间:2008-05-05  
负载均衡算法目前有2种实现方式:1、轮询、2、根据目前的活动连接数、活动连接少的则优先(活动连接:当前正在执行sql的连接)

目前没有备份机制。唯一需要备份的就是配置文件。可以启动多个amoeba for mysql 服务。并且利用mysql 的conenctor-j的故障转移机制。类似这种解决方法一般需要通过驱动实现。或者通过 F5硬件来实现,
当然负载均衡设备也会有挂的时候。

自从connector-j 3.17以后版本。mysql jdbc提供了一个负载均衡配置 或者 是故障转移。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Properties;

import com.mysql.jdbc.Driver;

public class PreparedStatmentTest {

	/**
	 * @param args
	 * @throws Exception 
	 */
	public static void main(String[] args) throws Exception {
		
		Properties props = new Properties(); 

		// 是否启用 自动连接
		props.put("autoReconnect", "false"); 

		//是否启用负载均衡
		props.put("roundRobinLoadBalance", "false"); 

		props.put("user", "root"); 
		//props.put("password", "...."); 
		
		java.sql.DriverManager.registerDriver(new Driver());
		
		for(int i=0;i<10000;i++){
			Connection conn = null;
			PreparedStatement statment = null;
			ResultSet result = null;
			try{
				conn = DriverManager.getConnection("jdbc:mysql://localhost:8066,localhost:3306/test",props);
				statment = conn.prepareStatement("select * from account where id = ?");
				statment.setInt(1,1);
				
				result = statment.executeQuery();
				System.out.println(result);
				
			}catch(Exception e){
				e.printStackTrace();
			}finally{
				if(result != null){
					try{
						result.close();
					}catch(Exception e){}
				}
				
				if(statment != null){
					try{
						statment.close();
					}catch(Exception e){}
				}
				
				if(conn != null){
					try{
						conn.close();
					}catch(Exception e){}
				}
			}
		}
	}

}
0 请登录后投票
   发表时间:2008-05-05  
你没懂我的意思,我的意思是如果amoeba这台机器死掉了,你怎么办。
0 请登录后投票
   发表时间:2008-05-05  
你启动2台配置一样amoeba 服务

挂掉一台,还有一台可以继续提供服务。amoeba没有数据没有任何状态,只是中间节点而已。

故障转移通过mysql jdbc driver来转移
0 请登录后投票
   发表时间:2008-05-05  
csrcom 写道
你启动2台配置一样amoeba 服务

挂掉一台,还有一台可以继续提供服务。amoeba没有数据没有任何状态,只是中间节点而已。

故障转移通过mysql jdbc driver来转移


2个配置一样的服务在两台服务器还是一台?如果是1台,那么这台服务器死掉了,怎么处理?如果是两台,那么两台之间怎么进行切换?故障转移通过mysql jdbc driver,那么这个链接驱动程序是放在和amoeba相同的服务器还是另外再配置一台?
0 请登录后投票
   发表时间:2008-05-05  
ztka你没明白我的意思....

client端使用mysql jdbc driver,通过配置jdbc:mysql://192.168.1.2:8066,192.168.1.3:8066/test (可支持多台mysql或者amoeba)

客户端连接的是2台amoeba。即使挂了1台amoeba,那么客户端来会自动连接到另外一台amoeba/mysql。

对应用来说它不知道后面是否是真实的mysql server。因为amoeba是解析mysql协议的。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics