Mysql 5.6 基于GTID的主从复制及使用Amoeba配置读写分离

一、简介

二、Mysql主从配置

三、读写分离配置


一、Amoeba简介

Amoeba(变形虫)项目,该开源框架于2008年开始发布一款 Amoeba for Mysql软件。这个软件致力于MySQL的分布式数据库前端代理层,它主要在应用层访问MySQL的 时候充当SQL路由功能,专注于分布式数据库代理层(Database Proxy)开发。座落与 Client、DB Server(s)之间,对客户端透明。具有负载均衡、高可用性、SQL 过滤、读写分离、可路由相关的到目标数据库、可并发请求多台数据库合并结果。 通过Amoeba你能够完成多数据源的高可用、负载均衡、数据切片的功能,目前Amoeba已在很多企业的生产线上面使用

Amoeba优缺点

优点:

1、降低费用,简单易用

2、提高系统整体可用性

3、易于扩展处理能力与系统规模

4、可以直接实现读写分离及负载均衡效果,而不用修改代码

缺点:

1、不支持事务与存储过程

2、暂不支持分库分表,amoeba目前只做到分数据库实例

3、不适合从amoeba导数据的场景或者对大数据量查询的query并不合适(比如一次请求返回10w以上甚至更多数据的场合)

Mysql GTID

Mysql 5.6的新特性之一,加入了全局事务性ID(GTID:Global Transactions Identifier)来强化数据库的主备一致性,故障恢复,以及容错能力;也使得复制功能的配置、监控及管理变得更加易于实现,且更加健壮


二、Mysql主从配置

1、环境介绍:

两台Mysql数据库实现主从配置,172.16.14.2主机为Master;172.16.14.3为Slave

2、在Master服务器上安装并配置Mysql

######安装Mysql并加入到系统服务[root@master ~]# tar xf mysql-5.6.13-linux-glibc2.5-x86_64.tar.gz -C /usr/local/[root@master ~]# cd /usr/local/[root@master local]# ln -s mysql-5.6.13-linux-glibc2.5-x86_64 mysql[root@master local]# cd mysql[root@master mysql]# cp support-files/mysql.server /etc/init.d/mysqld[root@master mysql]# chmod +x /etc/init.d/mysqld[root@master mysql]# chkconfig --add mysqld[root@master mysql]# echo "PATH=/usr/local/mysql/bin:$PATH" >> /etc/profile[root@master mysql]# . /etc/profile----------------------------------------------------------------------######提供主配置文件[root@master mysql]# vim /etc/my.cnf[client]#password       = your_passwordport            = 3306socket          = /tmp/mysql.sock[mysqld]port            = 3306socket          = /tmp/mysql.sockskip-external-lockingkey_buffer_size = 256Mmax_allowed_packet = 1Mtable_open_cache = 256sort_buffer_size = 1Mread_buffer_size = 1Mread_rnd_buffer_size = 4Mmyisam_sort_buffer_size = 64Mthread_cache_size = 8query_cache_size= 16Mthread_concurrency = 8binlog-format=ROWlog-slave-updates=truegtid-mode=onenforce-gtid-consistency=truemaster-info-repository=TABLErelay-log-info-repository=TABLEsync-master-info=1slave-parallel-workers=2binlog-checksum=CRC32master-verify-checksum=1slave-sql-verify-checksum=1binlog-rows-query-log_events=1report-port=3306datadir=/datareport-host=master.allen.comlog-bin=mysql-binserver-id       = 10[mysqldump]quickmax_allowed_packet = 16M[mysql]no-auto-rehash[myisamchk]key_buffer_size = 128Msort_buffer_size = 128Mread_buffer = 2Mwrite_buffer = 2M[mysqlhotcopy]interactive-timeout----------------------------------------------------------------------######初始化Mysql[root@master mysql]# useradd -r mysql[root@master mysql]# mkdir /data[root@master mysql]# chown -R mysql.mysql /data[root@master mysql]# chown -R root.mysql /usr/local/mysql/*[root@master mysql]# ./scripts/mysql_install_db --user=mysql --datadir=/data/[root@master ~]# service mysqld start

3、在Slave服务器上安装Mysql与在Master服务器上安装方法相同,这里不在介绍,而在Slave服务器上安装Mysql有两个参数与Master服务器不同;如下

server-id=11report-host=slave.allen.com[root@slave ~]# service mysqld start

4、在Master服务器上为Slave创建复制用户并测试连接

[root@master ~]# mysqlmysql> grant replication slave,replication client on *.* to 'slave'@'172.16.%.%' identified by 'passwd';mysql> flush privileges;------------------------------------------------------------------------######测试连接[root@slave ~]# mysql -uslave -ppasswd -h 172.16.14.2

5、启动从节点的复制线程

[root@slave ~]# mysqlmysql> change master to master_host='172.16.14.2',master_user='slave',master_password='passwd',master_auto_position=1;mysql> start slave;mysql> show slave status\G;*************************** 1. row ***************************               Slave_IO_State: Waiting for master to send event                  Master_Host: 172.16.14.2                  Master_User: slave                  Master_Port: 3306                Connect_Retry: 60              Master_Log_File: mysql-bin.000005          Read_Master_Log_Pos: 191               Relay_Log_File: slave-relay-bin.000003                Relay_Log_Pos: 401        Relay_Master_Log_File: mysql-bin.000005             Slave_IO_Running: Yes      #主要看这两项为“YES”说明成功            Slave_SQL_Running: Yes

6、在Master服务器创建数据库查看Slave服务器是否更新

[root@master ~]# mysql -e 'create database allen;'------------------------------------------------------------------------[root@slave ~]# mysql -e 'show databases;'+--------------------+| Database           |+--------------------+| information_schema || allen              || mysql              || performance_schema || test               |+--------------------+######由上可见,新创建的"allen"数据库已成功同步

至此Mysql 5.6 基于GTID的复制已经完成,下面将介绍如何基于Mysql的主从复制架构做读写分离


三、读写分离配置

1、基于前面做的Mysql主从架构,然后在前端加一台服务器,用于实现Mysql的读写分离,IP地址为:172.16.14.1;由于Amoeba是java程序所研发,所以需要先安装JDK程序

2、安装JDK

[root@amoeba ~]# chmod +x jdk-6u31-linux-x64-rpm.bin[root@amoeba ~]# ./jdk-6u31-linux-x64-rpm.bin[root@amoeba ~]# vim /etc/profile.d/java.shexport JAVA_HOME=/usr/java/latestexport PATH=$JAVA_HOME/bin:$PATH[root@amoeba ~]# . /etc/profile.d/java.sh[root@amoeba ~]# java -versionjava version "1.6.0_31"Java(TM) SE Runtime Environment (build 1.6.0_31-b04)Java HotSpot(TM) 64-Bit Server VM (build 20.6-b01, mixed mode)

3、安装Amoeba

[root@amoeba ~]# mkdir /usr/local/amoeba[root@amoeba ~]# tar xf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/[root@amoeba ~]# vim /etc/profile.d/amoeba.shexport AMOEBA_HOME=/usr/local/amoebaexport PATH=$AMOEBA_HOME/bin:$PATH[root@amoeba ~]# . /etc/profile.d/amoeba.sh[root@amoeba ~]# amoebaamoeba start|stop

4、授权Mysql用户,用于实现前端Amoeba连接,由于上面授权的主从复制帐号不能同步"mysql"数据库,所以用户名也无法同步,要在两台数据库上同时授权,用户名密码保持一致

[root@master ~]# mysqlmysql> grant all on *.* to 'amoeba'@'172.16.%.%' identified by 'amoebapass';mysql> flush privileges;------------------------------------------------------------------------[root@slave ~]# mysqlmysql> grant all on *.* to 'amoeba'@'172.16.%.%' identified by 'amoebapass';mysql> flush privileges;

5、配置Amoeba

[root@amoeba ~]# cd /usr/local/amoeba/conf/  #主要配置文件为以下两个amoeba.xml        #定义数据库读写分离及节点管理信息等dbServers.xml     #定义连接后端Mysql服务器信息------------------------------------------------------------------------[root@amoeba conf]# vim dbServers.xml
${defaultManager}
64
128
3306
#连接后端Mysql服务器端口
test
#连接到后端Mysql使用的默认数据库
amoeba
#连接后端Mysql数据库的用户名
amoebapass
#连接后端Mysql数据库的用户名
500
500
10
600000
600000
true
true
true
#定义"master"数据库节点,"name"名称可以自定义
172.16.14.2
#定义"slave"数据库节点
172.16.14.3
#这里注释的为算法
1
#定义选择哪一种算法进行负载均衡调度
#定义数据库池,用于实现负载均衡."slave"为上面定义的从数据库节点,可以写多个用","分隔;如:"slave,slave,master"可以实现基于权重负载的效果;当然这里也可以不用定义
slave

========================================================================[root@amoeba conf]# vim amoeba.xml
#定义amoeba代理服务器的对外连接监听端口
3306
#定义amoeba代理服务器对外连接的监听IP
172.16.14.1
${clientConnectioneManager}
128
64
#定义amoeba连接用户名和密码,客户端或程序只需要使用此用户名和密码连接即可
admin
password
${amoeba.home}/conf/access_list.conf
127.0.0.1
true
${clientConnectioneManager}
20
30
30
500
60
com.meidusa.amoeba.net.ConnectionManager
com.meidusa.amoeba.net.AuthingableConnectionManager
${amoeba.home}/conf/dbServers.xml
${amoeba.home}/conf/rule.xml
${amoeba.home}/conf/ruleFunctionMap.xml
${amoeba.home}/conf/functionMap.xml
1500
master
#定义默认池,一些sql语句默认会在此定义的服务器上执行
master
#定义只写数据库
slave
#定义只读数据库,此处定义的是在"dbServer.xml"文件中定义的后端服务器名称,也可以定义数据库池的名称,实现负载均衡
true

6、启动amoeba服务并连接测试

[root@amoeba ~]# amoeba start &[root@amoeba ~]# ss -tanlp | grep 3306LISTEN     0      128      ::ffff:172.16.14.1:3306     :::*      users:(("java",29448,54))######由上可见已启动成功并监听在3306端口------------------------------------------------------------------------

7、连接到amoeba代理服务器,执行插入与查询操作,分别在后端两台服务器上抓包,查看是否实现读写分离

[root@amoeba ~]# mysql -uadmin -ppassword -h 172.16.14.1mysql> create table allen.table (id int(4));  #执行写入操作Query OK, 0 rows affected (0.08 sec)mysql> select User,Host from mysql.user;      #执行查询操作

由上图可见,抓包的结果实现了读写分离的效果

到此,Mysql基于GTID的主从复制及Mysql的读写分离已完成,后续会更新其他内容,敬请关注...