准备

  • 本机,安装mysql
  • 一台虚拟机,或内网中的另一台主机,安装mysql 需要两台机器互相可以ping通

主数据库配置

  • 打开my.ini (linux下为 /etc/my.cnf)
  • 在mysqld下增加如下配置
1
2
3
log-bin=mysql-bin #slave会基于此log-bin来做replication
server-id=1 #master的标示
binlog-do-db = ms_test #用于master-slave的具体数据库
  • 进入mysql,增加一个从数据库连接主数据库的用户名和密码,repl为用户名,10.20.147.111为从数据库IP,111111为密码。
    GRANT REPLICATION SLAVE ON *.* TO repl@10.20.147.111 IDENTIFIED BY '111111';

  • 重启mysql

  • 进行mysql 输入show master status,查看主数据库状态

配置从数据库

  • 编辑 mysql配置文件 /etc/my.cnf
  • 在文件最后 增加一行server-id=2 #slave 从数据库标识,保存退出 并且重启mysql
  • 进入数据库,输入:
    10.20.147.110 为主数据库IP,
    repl 连接主数据库的用户名,
    111111 连接主数据库的密码,
    mysql-bin.000003 是 show master status 中file字段的值,
    161261 是show master status 中position字段的值。
1
2
3
4
5
6
CHANGE MASTER TO
MASTER_HOST='10.20.147.110', 
MASTER_USER='repl',
MASTER_PASSWORD='111111',
MASTER_LOG_FILE='mysql-bin.000003',
MASTER_LOG_POS=161261;
  • 启动从数据库
    start slave;

  • 查看从数据库状态
    show slave status \G;

以上,实现了主从复制,主数据库改变后,从数据库内容也会随之改变,反之亦然。

安装amoeba 代理数据库

1.下载压缩包
2.解压到本地
3.进入conf文件夹,编辑amoeba.xml配置文件
4.按照注释进行配置

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
<?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">127.0.0.1</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">root</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 
			平台已经提供一个具有负载均衡能力的objectPoolcom.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 -->
				<!--主数据库IP -->
				<property name="ipAddress">127.0.0.1</property>
				<!--需要做主从的数据库名字-->
				<property name="schema">ms_test</property>
				
				<!-- 用于登陆mysql的用户名 -->
				<!--主数据库用户名 -->
				<property name="user">root</property>
				
				<!-- 用于登陆mysql的密码 -->	
				<!--主数据库密码 -->				
				<property name="password">root</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 -->
				<!--从数据库IP-->
				<property name="ipAddress">192.168.11.151</property>
				<property name="schema">ms_test</property>
				
				<!-- 用于登陆mysql的用户名 -->
				<!--从数据库用户名-->
				<property name="user">root</property>
				
				<!-- 用于登陆mysql的密码 -->
				<!--从数据库密码-->
				<property name="password">MyNewPass1!</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="multiPool" 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>
		
	</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">server1</property>
		
	
		<property name="writePool">server1</property>
		<property name="readPool">server1</property>
		
		<property name="needParse">true</property>
		-->
		<property name="LRUMapSize">1500</property>  
		<property name="defaultPool">server1</property>  
		<property name="writePool">server1</property>  
		<property name="readPool">server2</property>  
		<property name="needParse">true</property> 
	</queryRouter>
</amoeba:configuration>

5.进入amoeba bin文件夹,双击amoeba.bat启动,显示:

1
2
log4f config load completed from file ....
Server listening...

证明启动成功。

测试

1.在主数据库建立一个表,从数据库无需建立表
2.编写一段JDBC代码测试

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
package msTest.test;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;

/**
 * 数据库工具类
 * @author muty
 *
 */
public class DBUtil {
	
	//amoeba数据库用户名
	private static final String username = "root";
	
	//amoeba数据库密码
	private static final String password = "root";
	
	//连接到哪一个数据库
	private static final String db_name = "ms_test";
	
	/**
	 * Connection 数据库连接对象
	 * java.sql.Connection
	 * 获取数据库连接
	 */
	public static Connection getConnection(){
		Connection conn = null;
		try{
			//加载数据库驱动
			Class.forName("com.mysql.jdbc.Driver");
			//拼接连接数据的地址和参数
			String url = "jdbc:mysql://localhost:8066/"+db_name
					+"?user="+username+"&password="+password+"&characterEncoding=utf8";
			System.out.println(url);
			//获取连接
			conn = DriverManager.getConnection(url);
		}catch(Exception e){
			e.printStackTrace();
		}
		return conn;
	}
	
	public static void main(String[] args){
		
		try{
			Connection conn = DBUtil.getConnection();
			PreparedStatement ps = conn.prepareStatement("insert into stu(name,age) values(?,?)");
			ps.setString(1,"测试学生");
			ps.setInt(2, 25);
			int r = ps.executeUpdate();
			System.out.println(r);
		}catch(Exception e){
			e.printStackTrace();
		}
	}
	
}

4.执行代码,查看主数据库和从数据库,数据相同则证明配置成功