1.mysql的主从同步
环境 : 两台windows 系统
ip : 主:192.168.1.147 从 : 192.168.1.133 两台电脑可以ping通
mysql版本: 5.6
2.首先配置主数据库
1). 找到 c盘下的 C:\ProgramData\MySQL\MySQL Server 5.6\my.ini 文件。 一定要找 这个文件夹下的,找安装包下的没用!!!
2). 用editPlus 打开文件 ,改变以下的几项
1.Server-id = 1 这是数据库ID,此ID是唯一的,ID值不能重复,否则会同步出错;
2.log-bin = mysql-bin 二进制日志文件,此项为必填项,否则不能同步数据;如果不取名字的话,那么就会以计算机的名字加编号来命名二进制文件;
3.binlog-do-db = testcreate 需要同步的数据库,如果还需要同步另外的数据库,那么继续逐条添 加,如果不写,那么默认同步所有的数据库;
4。binlog-ignore-db = mysql 不需要同步的数据库;
5.添加 grant file,select,replication slave on *.* to 'user'@'%' identified by 'root'; 一个用户可以复制主数据库的数据,给用户加权限, 有的时候权限不够,后来的 slave_IO_Running:connecting 就会变成这样
6. show master status;
会显示这个, pos, 1822
3.配置从数据库
1.与主数据库一样, 也配置那几个变量。 测试的时候,主库和从库得有相同的表,和库名
2.在从库执行以下命令
change master to
-> master_host='192.168.1.147', //主库ip
-> master_user='user',//主库给的 名字
-> master_password='root', //主库允许的密码
-> master_log_file='mysql-bin.000001', // file文件
-> master_log_pos=1822;//pos号
3.重启mysql服务
4.验证是否同步。
执行show slave status\G;
如果得到这些, 那么恭喜你 mysql主从已经配置好了
可以利用sql文件 来检测你的主从同步是否好使。
5.配置完上面之后,我们可以利用阿里巴巴的开源项目 amoeba 来进行读写分离操作,
下载地址 : http://download.youkuaiyun.com/detail/nikotse/5667519
将 下载的文件解压 , 进入bin目录下。
6.配置 amoeba.xml 文件
<service name="Amoeba for Mysql" class="com.meidusa.amoeba.net.ServerableConnectionManager"> <!-- port --> <property name="port">8066</property> <!-- 绑定的地址 ipAddress --> <!-- <property name="ipAddress">127.0.0.1</property> --> <property name="manager">${clientConnectioneManager}</property> <property name="connectionFactory"> <bean class="com.meidusa.amoeba.mysql.net.MysqlClientConnectionFactory"> <property name="sendBufferSize">128</property> <property name="receiveBufferSize">64</property> </bean> </property> <property name="authenticator"> <bean class="com.meidusa.amoeba.mysql.server.MysqlClientAuthenticator"> <-- 用户名--><span style="white-space: pre;"><-- 需要配置--></span> <property name="user">root</property> <property name="password">root</property> <-- amoeba密码--><span style="white-space: pre;"><-- 需要配置--></span> <property name="filter"> <bean class="com.meidusa.amoeba.server.IPAccessController"> <property name="ipFile">${amoeba.home}/conf/access_list.conf</property> </bean> </property> </bean> </property> </service>
7.配置dbService.xml<dbServer name="abstractServer" abstractive="true"><factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory"><property name="manager">${defaultManager}</property><property name="sendBufferSize">64</property><property name="receiveBufferSize">128</property><-- 需要配置--><!-- mysql port --><property name="port">3306</property><!-- mysql schema --><property name="schema">repl</property><-- 需要配置--></factoryConfig><poolConfig class="com.meidusa.amoeba.net.poolable.PoolableObjectPool"><property name="maxActive">500</property><property name="maxIdle">500</property><property name="minIdle">10</property><property name="minEvictableIdleTimeMillis">600000</property><property name="timeBetweenEvictionRunsMillis">600000</property><property name="testOnBorrow">true</property><property name="testOnReturn">true</property><property name="testWhileIdle">true</property></poolConfig></dbServer><dbServer name="server1" parent="abstractServer"><factoryConfig><-- 需要配置--><!-- mysql ip --><property name="ipAddress">192.168.1.147</property><property name="user">root</property><property name="password">123456</property><-- 需要配置--></factoryConfig></dbServer><dbServer name="server2" parent="abstractServer"><factoryConfig><-- 需要配置--><!-- mysql ip --><property name="ipAddress">192.168.1.133</property><!-- mysql user --><property name="user">root</property><property name="password">123456</property><-- 需要配置--></factoryConfig></dbServer>9.配置 amoeba.xml<queryRouter class="com.meidusa.amoeba.mysql.parser.MysqlQueryRouter"><property name="ruleLoader"><bean class="com.meidusa.amoeba.route.TableRuleFileLoader"><property name="ruleFile">${amoeba.home}/conf/rule.xml</property><property name="functionFile">${amoeba.home}/conf/ruleFunctionMap.xml</property></bean></property><property name="sqlFunctionFile">${amoeba.home}/conf/functionMap.xml</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>10. jdbc测试插入数据 我的数据库叫 repl
import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class DBConnection { public static void main(String[] args) { String driver = "com.mysql.jdbc.Driver"; // localhost指本机,也可以用本地ip地址代替,3306为MySQL数据库的默认端口号,“user”为要连接的数据库名 String url = "jdbc:mysql://localhost:8066/repl"; // 填入数据库的用户名跟密码 String username = "root"; String password = "root"; String sql = "insert into user (id,username) values('5','xxxxxxx')";// 编写要执行的sql语句,此处为从user表中查询所有用户的信息 try { Class.forName(driver);// 加载驱动程序,此处运用隐式注册驱动程序的方法 } catch (ClassNotFoundException e) { e.printStackTrace(); } try { Connection con = DriverManager.getConnection(url, username, password);// 创建连接对象 Statement st = con.createStatement();// 创建sql执行对象 st.executeUpdate(sql);// 执行sql语句并返回结果集 // 关闭相关的对象 if (st != null) { try { st.close(); } catch (SQLException e) { e.printStackTrace(); } } if (con != null) { try { con.close(); } catch (SQLException e) { e.printStackTrace(); } } } catch (SQLException e) { e.printStackTrace(); } } }