该帖已经被评为良好帖
|
|
---|---|
作者 | 正文 |
发表时间: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给多台数据库执行。 |
|
返回顶楼 | |
发表时间:2008-05-05
csrcom高手
多发点自己的心得啊,多帮助中国的同僚。 |
|
返回顶楼 | |
发表时间: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/ |
|
返回顶楼 | |
发表时间:2008-05-05
恩,如果A、B是互为备份的话是没什么问题的。
可以将A、B作为一个虚拟的dbserver Continuent 的产品在中间是充当负载均衡、故障转移的(高可用性方面),不过需要配上Continuent 提供的驱动 |
|
返回顶楼 | |
发表时间:2008-05-05
另外,他的负载均衡几种算法?还有这个东西本身可不可以进行备份,如果运行这个东西的机器死掉了,怎么处理?
|
|
返回顶楼 | |
发表时间: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){} } } } } } |
|
返回顶楼 | |
发表时间:2008-05-05
你没懂我的意思,我的意思是如果amoeba这台机器死掉了,你怎么办。
|
|
返回顶楼 | |
发表时间:2008-05-05
你启动2台配置一样amoeba 服务
挂掉一台,还有一台可以继续提供服务。amoeba没有数据没有任何状态,只是中间节点而已。 故障转移通过mysql jdbc driver来转移 |
|
返回顶楼 | |
发表时间:2008-05-05
csrcom 写道 你启动2台配置一样amoeba 服务
挂掉一台,还有一台可以继续提供服务。amoeba没有数据没有任何状态,只是中间节点而已。 故障转移通过mysql jdbc driver来转移 2个配置一样的服务在两台服务器还是一台?如果是1台,那么这台服务器死掉了,怎么处理?如果是两台,那么两台之间怎么进行切换?故障转移通过mysql jdbc driver,那么这个链接驱动程序是放在和amoeba相同的服务器还是另外再配置一台? |
|
返回顶楼 | |
发表时间: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协议的。 |
|
返回顶楼 | |