最近自己利用课余时间研究了MySQL的的主从同步,读写分离的配置过程,期间遇到了很多的问题,在这篇博文中我把自己的配置过程遇到的问题和配置流程总结一下。
我的服务器集群使用自己电脑上的虚拟机虚拟机模拟的,虚拟机装的是centos的系统
系统:三台装的CentOS的服务器,两台MySQL的服务器,一台amoeba代理服务器
MySQL的版本:5.7(这里建议不用最新版本的8.0,因为mysql8.0有很多新特性跟5.7的配置过程差异很大)
配置mysql之前一定要先安装mysql,mysql的安装过程这个不进行叙述,请参考我的另一篇博文:https://blog.csdn.net/codeHaoHao/article/details/83618180
配置前要保证两个的MySQL服务器的MySQL的版本一致。
配置前先启动mysql的服务:
shell > service mysqld start
执行如下命令:
shell > vim /etc/my.cnf
在文件的最后加上以下内容:
[mysqld]
#[必须]启用二进制日志
log-bin=mysql-bin
#[必须]服务器唯一ID,默认是1,一般取IP最后一段
server-id=1
同样执行如下命令:
shell > vim /etc/my.cnf
在文件的最后加上如下内容:
[mysqld]
#[必须]启用二进制日志
log-bin=mysql-bin
#[必须]服务器唯一ID,默认是1,一般取IP最后一段
server-id=2
两台都配置完成后重启两台服务器的MySQL的:
shell > service mysqld restart
一个先登录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>show master status;
显示如下:
注:执行完此步骤后不要再操作主服务器MYSQL,防止主服务器状态值变化
//注意不要断开,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服务器的主从同步已经实现了。
主服务器的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前需要先安装的Java的安装环境
amoeba框架是居于JDK1.5开发的,采用了JDK1.5的特性,所以还需要安装Java的环境,建议使用javaSE1.5以上的JDK版本。
先去官网下载: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)
下载:
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的配置文件在本环境下位于在/ 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”?>
<! -
需要将每个dbServer配置到池中,
如果需要配置多个带有负载平衡的dbServer,可以通过以下配置进行简化:
在dbServer中添加名为virtual =“true”的属性,但配置不允许名为factoryConfig的元素,
例如'multiPool'dbServer
- >
$ {defaultManager} property>
64
128 property>
<! - mysql port - >
3306 property>#设置Amoeba要连接的mysql数据库的端口,默认是3306
< ! - mysql schema - >
testdb property>#设置缺省的数据库,当连接amoeba时,操作表必须显式的指定数据库名,即采用dbname.tablename的方式,不支持使用dbname指定缺省库,因为操作会调度到各个后端dbserver
<! - mysql user - >
test1 property>#设置amoeba连接后端数据库服务器的账号和密码,因此需要在所有后端数据库上创建该用户,并授权amoeba服务器可连接
111111 property>
factoryConfig>
500 #最大连接数,默认500
500 #最大空闲连接数
10 #最新空闲连接数
600000
600000
true
true
true
writedb ”parent =“abstractServer”>#设置一个后端可写的dbServer,这里定义为writedb,这个名字可以任意命名,后面还会用到
<! - mysql ip - >
192.168.112.148 property>#设置后端可写dbserver,即master
factoryConfig>
dbServer>
slave ”parent =“abstractServer”>#设置后端可读dbserver,即slave
<! - mysql ip - >
192.168.112.149 property>
factoryConfig>
dbServer>
myslave“virtual =”true“>#设置定义一个虚拟的dbserver,实际上相当于一个dbserver组,这里将可读的数据库ip统一放到一个组中,将这个组的名字命名为myslave
<! - 负载均衡策略:1 = ROUNDROBIN,2 = WEIGHTBASED,3 = HA - >
1 property>#选择调度算法,1表示复制均衡,2表示权重,3表示HA,这里选择1
<! - 用逗号分隔,例如:server1,server2,server1 - >
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”>
<! - service class必须实现com.meidusa.amoeba.service.Service - >
<! - port - >
8066 property>#设置amoeba监听的端口,默认是8066
<! - bind ipAddress - >#下面配置监听的接口,如果不设置,默认监听所以的IP,0.0.0.0表示都可访问
<! -
0.0.0.0 property>
- >
128 property>
64 property>
bean>
property>
#提供客户端连接amoeba时需要使用这里设定的账号(这里的账号密码和amoeba连接后端数据库服务器的密码无关)
root property>
123456 property>
$ {amoeba.home} /conf/access_list.conf property>
bean>
property>
bean>
property>
service>
<! - 代理服务器客户端进程线程大小 - >
128 property>
<! - 每个连接缓存 预准备语句大小 - >
500 property>
<! - default charset - >
utf8 property>
<! - 查询超时(默认值:60秒,TimeUnit:秒) - >
60 property>
runtime>
proxy>
<! -
每个ConnectionManager将作为线程
管理器负责启动对于连接IO读取,死亡检测
- >
com.meidusa.toolkit.net.AuthingableConnectionManager property>
connectionManager>
connectionManagerList>
<! - default using file loader - >
$ {amoeba.home} /conf/dbServers.xml property>
dbServerLoader>
$ {amoeba.home} /conf/rule.xml property>
$ {amoeba.home} /conf/ruleFunctionMap.xml property>
bean>
property>
$ {amoeba.home} / conf / functionMap .xml property>
1500 property>
writedb property>#设置amoeba默认的池,这里设置为writedb
writedb property>#这两个选项默认是注销掉的,需要取消注释,这里用来指定前面定义好的俩个读写池
myslave property>#
true property>
queryRouter>
amoeba:configuration>
以上内容便配置完成了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
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实现数据库读写分离》