mysql数据库读写分离

来源:互联网 发布:周立功单片机笔试题目 编辑:程序博客网 时间:2024/04/29 22:43

 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.csdn.net/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();}}}



1 0