配置mysql主从同步读写分离,amoeba做中间代理服务
前言
最近自己利用课余时间研究了MySQL的的主从同步,读写分离的配置过程,期间遇到了很多的问题,在这篇博文中我把自己的配置过程遇到的问题和配置流程总结一下。
环境
我的服务器集群使用自己电脑上的虚拟机虚拟机模拟的,虚拟机装的是centos的系统
系统:三台装的CentOS的服务器,两台MySQL的服务器,一台amoeba代理服务器
MySQL的版本:5.7(这里建议不用最新版本的8.0,因为mysql8.0有很多新特性跟5.7的配置过程差异很大)
集群架构图
安装MySQL
配置mysql之前一定要先安装mysql,mysql的安装过程这个不进行叙述,请参考我的另一篇博文:https://blog.****.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
安装
[[email protected] 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的环境变量
[[email protected] 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
[[email protected] amoeba]# source /etc/profile
测试是否安装成功
[[email protected] 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输出日志的级别和方式。
本文参考文章: