mysql数据库读写分离

(1)、基本的理论知识:

首先,要实现mysql的读写分离,可以使用mysql的主(master)从(slave)复制(Replication)来实现:

主(master)库只提供写数据的服务,而从(slave)库只提供读数据的服务。

什么是主从复制?

简单来说,就是主(master)库把对数据改动的操作保存到一个文件里面,而从(slave)库会隔一个时间间隔根据这个文件更新自己的数据

(所以读到的数据是有延迟的,这个延迟取决于从(slave)库设置的时间间隔)

(2)、实际操作步骤:

使用以下两台电脑:

主库(master)的IP:192.168.1.65  

从库(slave)的IP:192.168.1.49     //这两个IP是我摘自网上的,用的时候用自己数据库的IP就好,DOS命令ipconfig就能看本机IP

两台电脑都安装了MySQL5.7      //个人感觉版本没什么影响吧,我看的教程装的是5.5的版本,我自己在5.7的版本上也能够实现

 

然后把两台电脑的mysql服务停掉

A、打开主库(master)的mysql安装目录,打开配置文件my.ini    //这里打开的路径是对于5.5版本来说的,对于5.7版本的ini路径在C:\ProgramData\MySQL\MySQL Server 5.7,根据自己的电脑进行查找此路径,还有一点,网上有许多教程说的是打开cnf文件,其实这个是对于Linux来说的,windows下的文件是ini。

在[mysqld]的后面添加如下代码:

log-bin=mysql-bin #slave会基于此log-bin来做replication

binlog-do-db=test #用于master-slave的具体数据库

binlog_ignore_db=mysql #不用于master-slave的具体数据库

binlog_ignore_db=information_schema #和binlog-do-db一样,可以设置多个

//这里也需要说一下,我看的教程上,有添加

server-id=1 #master的标示

这一行代码,其实是多余的(因为接下来的步骤中会提示这个错误,我也是被这个绊了好久才改过来)因为ini文件中有server-id=1这个代码,只需要保持不变即可,无需修改。

打开主库(master)的mysql服务,进入mysql的命令行,输入如下代码:

         Showmaster status\G;

 

D、记录一下file(日志文件)和position,然后分别给两个从库复制权限

grant replication slave on *.* to'slave'@'192.168.1.%' identified by '123456';

其中的’slave’为登录账号,’123456’为密码,’192.168.1.%’为从库的IP(这里偷懒使用了通配符~)    //我在做的时候提示了一个警告,但是个人觉得没啥问题,所以不用管就行

 

E、打开从库1的mysql安装目录,打开配置文件my.ini,在[mysqld]的后面添加如下代码:

log-bin=mysql-bin#slave会基于此log-bin来做replication

replicate-do-db=test#用于master-slave的具体数据库

//这里就要在说明一下,之前说过ini文件中本身就有server-id,所以这里也不需要添加,只需要找到对应的server-id把它的值改大就行,=2就可以,如果还有做别的从库,只要保证从库之间不能有一样即可。

 

保存后启动从库的mysql服务,进入mysql的命令行,输入如下代码:

先停止它的slave:

         stopslave;

再改变它的master:

change master tomaster_host='192.168.1.65',

master_port=3306,

master_user='slave',

master_password='123456',

master_log_file='mysql-bin.000040',

master_log_pos=107;    //这里的数据和图片我也是摘自别人的教程,大家要灵活的区结合自己的数据库进行修改

 

再启动它的slave;

         startslave;

然后再输入如下代码,检查是否成功:

         Showslave status\G;

如果看到上面这些的,那就没问题了~

当然你也可以在主库(master)上做修改数据的操作,看看从库会不会更新~(注意:从库(slave)的数据库需要自己手动创建)

G.到这里,mysql的读写分离就完成了~

但是这样不够方便,因为我们写数据时需要连接主库,而读数据时需要连接从库。在连接从库时,不能负载均衡。

这时候就要靠神器Amoeba了~

它就像一个中转站,将所有的写请求分配给主库,读请求分配给从库,并且在从库之间实现负载均衡,丢个官网的图~

 

H.配置Amoeba服务器:

这里最好找另外的一台电脑充当Amoeba服务器:192.168.1.62

博主使用的版本是amoeba-mysql-3.0.5-RC-distribution,链接如下:

下载链接

下载完成后解压,打开conf文件夹,配置amoeba.xml和dbServer.xml:

amoeba.xml:

<proxy>

        <!-- service class must implements com.meidusa.amoeba.service.Service -->

        <service class="com.meidusa.amoeba.mysql.server.MySQLService" name="Amoeba for Mysql">

            <!-- amoeba代理端口号 -->

            <property name="port">8066</property>

            <!-- amoeba服务器IP地址 -->

            <property name="ipAddress">192.168.1.62</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="authenticateProvider">

                <bean class="com.meidusa.amoeba.mysql.server.MysqlClientAuthenticator">

                    <!-- amoeba服务器用户名 -->

                    <property name="user">amoeba</property>

                    <!-- amoeba服务器密码 -->

                    <property name="password">123456</property>

                    <property name="filter">

                        <bean class="com.meidusa.toolkit.net.authenticate.server.IPAccessController">

                            <property name="ipFile">${amoeba.home}/conf/access_list.conf</property>

                        </bean>

                    </property>

                </bean>

            </property>

        </service>

        <runtime class="com.meidusa.amoeba.mysql.context.MysqlRuntimeContext">

            <!-- proxy server client process thread size -->

            <property name="executeThreadSize">128</property>

            <!-- per connection cache prepared statement size  -->

            <property name="statementCacheSize">500</property>

            <!-- default charset -->

            <property name="serverCharset">utf8</property>

            <!-- query timeout( default: 60 second , TimeUnit:second) -->

            <property name="queryTimeout">60</property>

        </runtime>

    </proxy>

    <!--

        Each ConnectionManager will start as thread

        manager responsible for the Connection IO read , Death Detection

    -->

    <connectionmanagerlist>

        <connectionmanager class="com.meidusa.toolkit.net.MultiConnectionManagerWrapper" name="defaultManager">

            <property name="subManagerClassName">com.meidusa.toolkit.net.AuthingableConnectionManager</property>

        </connectionmanager>

    </connectionmanagerlist>

        <!-- default using file loader -->

    <dbserverloader class="com.meidusa.amoeba.context.DBServerConfigFileLoader">

        <property name="configFile">${amoeba.home}/conf/dbServers.xml</property>

    </dbserverloader>

    <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">master</property>

        <!-- 设定可写节点-->

        <property name="writePool">master</property>

        <!-- 设定只读节点-->

        <property name="readPool"> multiPool </property>

        <property name="needParse">true</property>

    </queryrouter>

</amoeba:configuration>

 

dbServers.xml:

 

  <!--

            Each dbServer needs to be configured into a Pool,

            If you need to configure multiple dbServer with load balancing that can be simplified by the following configuration:

             add attribute with name virtual = "true" in dbServer, but the configuration does not allow the element with name factoryConfig

             such as 'multiPool' dbServer  

        -->

    <dbserver abstractive="true" name="abstractServer">

        <factoryconfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory">

            <property name="connectionManager">${defaultManager}</property>

            <property name="sendBufferSize">64</property>

            <property name="receiveBufferSize">128</property>

            <!-- mysql port(数据库端口) -->

            <property name="port">3306</property>

            <!-- mysql schema(数据库名称,数据库中必须存在此数据库) -->

            <property name="schema">test</property>

            <!-- mysql user(控制数据库用户名) -->

            <property name="user">proxy</property>

            <!-- mysql password(控制数据库密码) -->

            <property name="password">123456</property>

        </factoryconfig>

        <poolconfig class="com.meidusa.toolkit.common.poolable.PoolableObjectPool">

            <property name="maxActive">500</property>

            <property name="maxIdle">500</property>

            <property name="minIdle">1</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="master" parent="abstractServer">

        <factoryconfig>

            <!-- mysql ip -->

            <property name="ipAddress">192.168.1.65</property>

        </factoryconfig>

    </dbserver>

    <!-- 从数据库配置 -->

    <dbserver name="slave1" parent="abstractServer">

        <factoryconfig>

            <!-- mysql ip -->

            <property name="ipAddress">192.168.1.64</property>

        </factoryconfig>

    </dbserver>

    <dbserver name="slave2" parent="abstractServer">

        <factoryconfig>

            <!-- mysql ip -->

            <property name="ipAddress">192.168.1.49</property>

        </factoryconfig>

    </dbserver>

    <!-- 定义虚拟服务器组,即只读池 -->

    <dbserver name="multiPool" virtual="true">

        <poolconfig class="com.meidusa.amoeba.server.MultipleServerPool">

            <!-- Load balancing strategy: 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-->

            <property name="loadbalance">1</property>

            <!-- Separated by commas,such as: server1,server2,server1 -->

            <property name="poolNames">slave1,slave2</property>

        </poolconfig>

    </dbserver>

</amoeba:dbservers>

 

I.给Amoeba授权:

分别到主库、从库1、从库2的mysql控制台下给Amoeba服务器授权,代码如下:

?

1

grant all on *.* to 'proxy'@'192.168.1.62' identified by '123456';

这里的账号和密码必须和dbServers.xml中的配置一毛一样:

 

然后使用这个连接对数据库test做数据修改操作,再到主库从库上面查看是否有同步修改,如果有,那就完成了读写分离~

如果想看看有没有实现负载均衡,可以打开Amoeba安装目录的logs/root.log查看查询日志。

然后我们的应用就可以通过连接Amoeba服务器来访问数据库中的数据了

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值