配置mysql主从同步读写分离,amoeba做中间代理服务

前言

最近自己利用课余时间研究了MySQL的的主从同步,读写分离的配置过程,期间遇到了很多的问题,在这篇博文中我把自己的配置过程遇到的问题和配置流程总结一下。

环境

我的服务器集群使用自己电脑上的虚拟机虚拟机模拟的,虚拟机装的是centos的系统

系统:三台装的CentOS的服务器,两台MySQL的服务器,一台amoeba代理服务器

MySQL的版本:5.7(这里建议不用最新版本的8.0,因为mysql8.0有很多新特性跟5.7的配置过程差异很大)

集群架构图

安装MySQL

配置mysql之前一定要先安装mysql,mysql的安装过程这个不进行叙述,请参考我的另一篇博文:https//blog.csdn.net/codeHaoHao/article/details/83618180

配置

配置前要保证两个的MySQL服务器的MySQL的版本一致。

配置前先启动mysql的服务:

shell >  service mysqld start

修改主服务器master的my.cnf中

执行如下命令:

shell >  vim /etc/my.cnf

在文件的最后加上以下内容:

[mysqld]
#[必须]启用二进制日志
log-bin=mysql-bin
#[必须]服务器唯一ID,默认是1,一般取IP最后一段
server-id=1     

配置从服务器slave的my.cnf中

同样执行如下命令:

shell >  vim /etc/my.cnf

在文件的最后加上如下内容:

[mysqld]
#[必须]启用二进制日志
log-bin=mysql-bin
#[必须]服务器唯一ID,默认是1,一般取IP最后一段
server-id=2  

两台都配置完成后重启两台服务器的MySQL的:

shell >  service mysqld restart

在主服务器master上创建账户并授权slave

一个先登录MySQL的:

shell >  mysql -uroot -p

然后执行如下代码:

mysql>GRANT REPLICATION SLAVE ON *.* to 'myslave'@'192.168.112.149' identified by '123456'; 

这段命令中的myslave为创建的帐户名,123456为账户myslave登录密码,其中@后面的为从服务器(slave)的IP地址。

一般不用root帐号,@后面用 “%” 表示所有客户端都可能连,只要帐号,密码正确,此处可用具体客户端IP代替,如192.168.145.226,加强安全。

登录主服务器的MySQL,查询master的状态

执行如下命令:

mysql>show master status;

显示如下:

 注:执行完此步骤后不要再操作主服务器MYSQL,防止主服务器状态值变化

配置从服务器slave

 //注意不要断开,454数字前后无单引号。

mysql>change master to master_host='192.168.112.148',master_user='myslave',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=454;

MASTER_HOST:主服务器(master)的IP地址。

MASTER_USER:刚刚在master上授权的账户名。

MASTER_PASSWORD:账户授权的密码。

master_log_file:刚刚show master status;命令下的File属性内容。

master_log_pos:是master  status下的position

然后启动从服务器复制功能

Mysql>start slave;

检查从服务器复制功能状态

mysql> show slave status\G

结果如下:

如果其中的Slave_Io_Running为connecting可以参考如下方法:

关闭主服务器和从服务器的防火墙:

shell >  service iptables stop

或者配置防火墙不拦截的MySQL的3306端口(如果你是在真正的服务器上配置使用的话建议这个方法)。

我这里使用的是直接关闭两个防火墙。

到这里咱们的MySQL的的master和slave服务器的主从同步已经实现了。

测试master和slave的主从同步

主服务器的Mysql,建立数据库,并在这个库中建表插入一条数据:

mysql> create database test_master;

mysql> use test_master;

mysql> create table test_master(id int(3),name char(10));

mysql> insert into test_master values(001,'test');

执行结束后进入从服务器数据库,查看刚刚主中添加的数据:

mysql > show databases;

mysql > use test_master;

mysql > show tables;

mysql > select * from test_master;

结果如下:

主从同步已经实现。

配置amoeba

配置amoeba前需要先安装的Java的安装环境

amoeba框架是居于JDK1.5开发的,采用了JDK1.5的特性,所以还需要安装Java的环境,建议使用javaSE1.5以上的JDK版本。

安装的Java环境

先去官网下载:HTTP://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

安装

[root@bogon src]# rpm -ivh jdk-8u111-linux-x64.rpm
Preparing...                ########################################### [100%]
   1:jdk1.8.0_111           ########################################### [100%]
Unpacking JAR files...
    tools.jar...
    plugin.jar...
    javaws.jar...
    deploy.jar...
    rt.jar...
    jsse.jar...
    charsets.jar...
    localedata.jar...

然后设置Java的环境变量

[root@bogon src]# vim /etc/profile

#set java environment
JAVA_HOME=/usr/java/jdk1.8.0_111
JRE_HOME=/usr/java/jdk1.8.0_111/jre
CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
export JAVA_HOME JRE_HOME CLASS_PATH PATH
[root@bogon amoeba]# source /etc/profile

测试是否安装成功

[root@bogon src]# java -version
java version "1.8.0_111"
Java(TM) SE Runtime Environment (build 1.8.0_111-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.111-b14, mixed mode)

安装amoeba

下载:

wget http://nchc.dl.sourceforge.net/project/amoeba/Amoeba%20for%20mysql/2.x/amoeba-mysql-binary-2.1.0-RC5.tar.gz

安装amoeba

amoeba安装非常简单,直接解压即可使用,这里将amoeba解压到的/ usr /local/amoeba目录下,这样就安装完成了。

mkdir /usr/local/amoeba

mv amoeba-mysql-binary-2.1.0-RC5.tar.gz/usr/local/amoeba

tar xvf amoeba-mysql-binary-2.1.0-RC5.tar.gz

配置amoeba

amoeba的配置文件在本环境下位于在/ usr /local/amoeba/ conf目录下。配置文件比较多,但是仅仅使用读写分离功能,只需配置两个文件即可,分别是dbServers.xml和amoeba. XML,如果需要配置IP访问控制,还需要修改access_list.conf文件,下面首先介绍dbServers.xml

注意红色部分内容

[root @ bogon amoeba] #vim conf / dbServers.xml 
<?xml version =“1.0”encoding =“gbk”?>

<!DOCTYPE amoeba:dbServers SYSTEM "dbserver.dtd">
<amoeba:dbServers xmlns:amoeba="http://amoeba.meidusa.com/">

        <! - 
            需要将每个dbServer配置到池中,
            如果需要配置多个带有负载平衡的dbServer,可以通过以下配置进行简化:
             在dbServer中添加名为virtual =“true”的属性,但配置不允许名为factoryConfig的元素,
             例如'multiPool'dbServer   
        - >
        
    <dbServer name =“abstractServer”abstractive =“true”>
        <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>#设置Amoeba要连接的mysql数据库的端口,默认是3306
            
            < ! - mysql schema - >
            <property name =“schema”> testdb </ property>#设置缺省的数据库,当连接amoeba时,操作表必须显式的指定数据库名,即采用dbname.tablename的方式,不支持使用dbname指定缺省库,因为操作会调度到各个后端dbserver
            
            <! - mysql user - >
            <property name =“user”> test1 </ property>#设置amoeba连接后端数据库服务器的账号和密码,因此需要在所有后端数据库上创建该用户,并授权amoeba服务器可连接
            
            <property name =“password”> 111111 </ property>
        </ factoryConfig>

        <poolConfig class="com.meidusa.toolkit.common.poolable.PoolableObjectPool">
            <property name="maxActive">500</property>  #最大连接数,默认500
            <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 =“ writedb ”parent =“abstractServer”>#设置一个后端可写的dbServer,这里定义为writedb,这个名字可以任意命名,后面还会用到
        <factoryConfig>
            <! - mysql ip - >
            <property name =“ipAddress”> 192.168.112.148 </ property>#设置后端可写dbserver,即master
        </ factoryConfig>
    </ dbServer>
    
    <dbServer name =“ slave ”parent =“abstractServer”>#设置后端可读dbserver,即slave
        <factoryConfig>
            <! - mysql ip - >
            <property name =“ipAddress”> 192.168.112.149 </ property>
        </ factoryConfig>
    </ dbServer>
    
    <dbServer name =“ myslave“virtual =”true“>#设置定义一个虚拟的dbserver,实际上相当于一个dbserver组,这里将可读的数据库ip统一放到一个组中,将这个组的名字命名为myslave
        <poolConfig class =” com.meidusa.amoeba.server.MultipleServerPool“>
            <! - 负载均衡策略:1 = ROUNDROBIN,2 = WEIGHTBASED,3 = HA - >
            <property name =”loadbalance“> 1 </ property>#选择调度算法,1表示复制均衡,2表示权重,3表示HA,这里选择1
            
            <! - 用逗号分隔,例如:server1,server2,server1 - >
            <property name =“poolNames”> slave </ property># myslave组成员
        </ poolConfig>
    </ dbServer>
        
</ amoeba:dbServers>

另一个配置文件amoeba.xml

注意红色部分内容

[root @ bogon amoeba] #vim conf / amoeba.xml 
<?xml version =“1.0”encoding =“gbk”?>

<!DOCTYPE amoeba:configuration SYSTEM“amoeba.dtd”>
<amoeba:configuration xmlns:amoeba =“http://amoeba.meidusa.com/”>

    <proxy>
    
        <! - service class必须实现com.meidusa.amoeba.service.Service - >
        <service name =“Amoeba for Mysql”class =“com.meidusa.amoeba.mysql.server.MySQLService”>
            <! - port - >
            <property name =“port”> 8066 </ property>#设置amoeba监听的端口,默认是8066
            
            <! - bind ipAddress - >#下面配置监听的接口,如果不设置,默认监听所以的IP,0.0.0.0表示都可访问
            <! - 
            <property name =“ipAddress”> 0.0.0.0 </ 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时需要使用这里设定的账号(这里的账号密码和amoeba连接后端数据库服务器的密码无关)

                    <property name =“user”> root </ property>    

                    
                    <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“>
            
            <! - 代理服务器客户端进程线程大小 - >
            <property name =“executeThreadSize”> 128 </ property>
            
            <! - 每个连接缓存            预准备语句大小 - >
            <property name =“statementCacheSize”> 500 </ property>
            
            <! - default charset - >
<property name =“serverCharset”> utf8 </ property>
            
            <! - 查询超时(默认值:60秒,TimeUnit:秒) - >
            <property name =“queryTimeout”> 60 </ property>
        </ runtime>
        
    </ proxy>
    
    <! - 
        每个ConnectionManager将作为线程
        管理器负责启动对于连接IO读取,死亡检测
    - >
    <connectionManagerList>
        <connectionManager name =“defaultManager“class =”com.meidusa.toolkit.net.MultiConnectionManagerWrapper“>
            <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”> writedb </ property>#设置amoeba默认的池,这里设置为writedb
        
        
        <property name =“writePool” > writedb </ property>#这两个选项默认是注销掉的,需要取消注释,这里用来指定前面定义好的俩个读写池
        <property name =“readPool”> myslave </ property>#
        
        <property NAME =”needParse“> true </ property>
    </ queryRouter>
</ amoeba:configuration>

以上内容便配置完成了amoeba的配置文件。

下面开始分别给master和slave服务器上为amoeba授权

mysql> GRANT ALL ON testdb.* TO 'test1'@'192.168.112.150' IDENTIFIED BY '111111';
Query OK, 0 rows affected (0.05 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.02 sec)

master和slave服务器都要授权。

这个账户密码要和IP地址要和amoeba配置文件里的账号密码一样,IP为amoeba服务器的IP一致。同时要记住关闭amoeba的防火墙。

shell > service iptables stop

启动amoeba

shell > /usr/local/amoeba/bin/amoeba start

到此所有配置已经完成。

测试

远程登陆的mysql客户端通过指定amoeba配置文件中指定的用户名,密码,和端口以及amoeba服务器IP地址链接的MySQL数据库。这里建议关闭amoeba服务器的防火墙。

以前你的JDBC连接:

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/testdb?useUnicode=true&characterEncoding=utf8
jdbc.username=root
jdbc.password=123456

现在你的JDBC连接:

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://192.168.112.150:8066/testdb?useUnicode=true&characterEncoding=utf8
jdbc.username=root #这个需要与amoeba.xml中配置的账号密码一致
jdbc.password=123456

amoeba其他配置文件:

Amoeba主配置文件($AMOEBA_HOME/conf/amoeba.xml),用来配置Amoeba服务的基本参数,如Amoeba主机地址、端口、认证方式、用于连接的用户名、密码、线程数、超时时间、其他配置文件的位置等。

数据库服务器配置文件($AMOEBA_HOME/conf/dbServers.xml),用来存储和配置Amoeba所代理的数据库服务器的信息,如:主机IP、端口、用户名、密码等。

切分规则配置文件($AMOEBA_HOME/conf/rule.xml),用来配置切分规则。

数据库函数配置文件($AMOEBA_HOME/conf/functionMap.xml),用来配置数据库函数的处理方法,Amoeba将使用该配置文件中的方法解析数据库函数。

切分规则函数配置文件($AMOEBA_HOME/conf/ruleFunctionMap.xml),用来配置切分规则中使用的用户自定义函数的处理方法。

访问规则配置文件($AMOEBA_HOME/conf/access_list.conf),用来授权或禁止某些服务器IP访问Amoeba。

日志规格配置文件($AMOEBA_HOME/conf/log4j.xml),用来配置Amoeba输出日志的级别和方式。

本文参考文章:

《 mysql主从复制(超简单)

Amoeba实现mysql读写分离

Amoeba + Mysql实现数据库读写分离

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值