架构MySQL读写分离与容灾--For zabbix

Amoeba+keepalived架构MySQL读写分离与容灾

                                  --For zabbix

一、项目背景

目前公司的zabbix系统在运行过程中,频繁出现数据库瓶颈导致应用卡死,故时常发送大量误报短信。

截止至今,zabbix应用基本上没有重大问题(如有,也可以通过升级的方式解决),但是数据库相关问题较多:

        1、数据库未进行合理的优化;

        2、数据库读写量较大,但是未做读写分离工作;

        3zbbix定期数据清理工作耗费资源较多,替代的方式是需要进行表分区工作;

         4zabbix支持多种数据库,如MySQL/Oracle,可以根据各地支持情况进行部署,但是建议MySQL

        

 

笔者接到该项目,准备运用mysql 主主复制+amoeba(读写分离)+keepalived来实现上述需求。

二、拓扑图

Amoeba是阿里巴巴陈思儒写的开源软件,用来实现mysql的读写分离。据说该软件比Mysql官方的mysql-proxy(也是个读写分离软件)更加稳定。笔者最初打算用mysql-proxy做读写分离了,但是笔者安装测试后,确实发现用 mysql-proxy连接数据库有时能连上,有时连接失败。于是笔者决然放弃mysql-proxy,转而使用Amoeba

MySQLAB复制就不用再多说了,是很好的解决数据容灾的方案。

至于我为什么用keepalived,就是为了实现mysql高可用服务的。keepalived可以提供虚拟ip10.72.23.87,当写的mysql宕机后,虚拟ip10.72.23.87可以自动漂移到负责读的mysql上,这时负责读的mysql就转换为read write角色;反之亦然,当读的mysql宕机后,负责写的mysql转换为read wirte角色。

好了,废话不多说了,下面开始记录我的部署过程了,以供将来参考使用。

 

三、部署过程

1、安装源码的mysql

源码mysql的下载

 

         登录http://www.mysql.com/downloads/mysql/进入MySQL Community Server下载页面,在Select Platform选项中选择Source Code

 

 

或者到搜狐的开源镜像网站下载也行:http://mirrors.sohu.com/mysql/

 

安装依赖包

yum -y install gcc gcc-c++ ncurses-devel perl

yum -y install bison

yum -y install ncurses

yum -y install make

 

创建mysql安装目录

此处的安装目录可以任选,如果是默认安装则在/usr/local/mysql

mkdir -p /usr/local/mysql

创建数据存放目录

 # mkdir -p /data/mysql/zabbix

 

创建用户和用户组与赋予数据存放目录权限

#groupadd mysql 

#useradd -g mysql -s /sbin/nologin -M mysql

#chown mysql.mysql -R /data/mysql/zabbix

安装cmake  

mysql5.5以后是通过cmake工具来编译的, cmake 是个跨平台的自动化建构系统,它用组态档(生成Makefile文件的特殊脚本)控制建构过程,mysql的源码进行build Process(构建),然后生成Makefile文件.  cmake下载地址:

http://www.cmake.org/cmake/resources/software.html ,选择Unix/Linux Source.tar.gz文件进行下载最新版本,然后将其解压缩到本地,并配置、安装,以下是相关命令 

# tar zxvf cmake-2.8.6.tar.gz 

# cd cmake-2.8.6  

#./configure   

# make && make install

 

配置源码的mysql

 

编辑mysql  进入MySQL解压目录下,使用cmake来对mysql的安装目录、数据存放、配置文件、系统语言等相关信息进行编辑,以下是编辑命令的集合,可以直接拷贝、粘贴并执行,注意的是安装目录与数据目录的位置:

cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/data/mysql/zabbix -DMYSQL_UNIX_ADDR=/tmp/mysqld.sock -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_MYISAM_STORAGE_ENGINE=1 -DWITH_PARTITION_STORAGE_ENGINE=1  -DSYSCONFDIR=/etc -DEXTRA_CHARSETS=all -DDEFAULT_CHARSET=utf8  -DDEFAULT_COLLATION=utf8_unicode_ci  -DWITH_DEBUG=0

 

参数说明:http://dev.mysql.com/doc/refman/5.5/en/source-configuration-options.html

-DCMAKE_INSTALL_PREFIX=/usr/local/mysql    //mysql安装的主目录,5.5.17版本默认为/usr/local/mysql,(可省略)

-DMYSQL_DATADIR=/data/mysql     //数据保存的路径,自定义

-DMYSQL_UNIX_ADDR=/tmp/mysqld.sock    //系统Socket文件(.sock)设置,基于该文件路径进行Socket连接,必须为绝对路径

-DSYSCONFDIR=/etc        //mysql配置文件my.cnf地址,默认/etc下(可省略) -DMYSQL_TCP_PORT=3306  数据库服务器TCP/IP连接的监听端口,默认为3306(可省略)

DENABLED_LOCAL_INFILE=1    //默认为关闭,这里开启

-DEXTRA_CHARSETS=all 

-DDEFAULT_CHARSET=utf8 

-DDEFAULT_COLLATION=utf8-general_ci         // 数据库编码设置 

-DWITH_INNOBASE_STORAGE_ENGINE=1 

-DWITH_ARCHIVE_STORAGE_ENGINE=1 

-DWITH_BLACKHOLE_STORAGE_ENGINE=1

-DWITH_FEDERATED_STORAGE_ENGINE=1  -

DWITH_PARTITION_STORAGE_ENGINE=1  //存储引擎设置

######################################### 

*注意事项:

重新编译时,需要清除旧的对象文件和缓存信息。

进入MySQL解压目录下:

# make clean

# rm -f CMakeCache.txt

# rm -rf /etc/my.cnf

##############################

安装MySQL 

make && make install   这将是一个比较漫长的过程。。。。。

配置MySQL的启动项

cp support-files/my-medium.cnf /etc/my.cnf  //更改配置文件位置

cp support-files/mysql.server /etc/init.d/mysqld   //设置mysql服务器操作路径 

chmod 755  /etc/init.d/mysqld      //更改权限

[root@zabbixsrvbjdb02 mysql-5.6.23]# vi /etc/my.cnf

[mysqld]

datadir=/data/mysql/zabbix

socket=/tmp/mysqld.sock

user=mysql

# Disabling symbolic-links is recommended to prevent assorted security risks

symbolic-links=0

[mysqld_safe]

log-error=/var/log/mysqld.log

pid-file=/var/run/mysqld/mysqld.pid

:wq

 

#cd /usr/local/mysql   

# chown -R mysql .   

# chgrp -R mysql .

  

#cd /usr/local/mysql

#scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql  --datadir=/data/mysql/zabbix     //安装数据库,并设置用户名和数据存放位置

 

MySQL启动与使用 

1、在命令行中输入:  /etc/init.d/mysqld start  启动Mysql服务

2、登录MySQL 命令行:/usr/local/mysql/bin/mysql -u root p   

        使用MySQL数据库的root用户登录,默认无密码(此rootlinuxroot不是一回事)  

可以使用硬连接ln /usr/local/mysql/bin/mysql /usr/bin将其指定到/usr/bin下,以后直接输入mysql即可以启动登录 ,或者export PATH=/usr/local/mysql/bin:$PATH也可以实现直接输

mysql命令即可登录数据库

3 简单操作 

mysql>use mysql  //使用mysql数据库

mysql>update user set password=PASSWORD("bjsyx825") where user='root'; //更改root用户的登录密码 

mysql>FLUSH PRIVILEGES;  //刷新更新  

4、为了方便,将mysql bin目录加到PATH

export PATH=/usr/local/mysql/bin:$PATH

 小知识:
mysql 也可以这么启动,
/usr/local/mysql/bin/mysqld_safe --defaults-file=/home/mysqldata5_6/my.cnf --user=root &

客户端登陆方法:,指定sccket登陆。

mysql –S  /home/mysqldata5_6/mysql.sock


安装源码mysql错误汇总

笔者在安装源码包的mysql时,可以说也费了点劲,俗话说,万事开头难,第一次做真是错误百出。我就把我遇到的问题列在这里,供以后参考。

第一种错误

[root@zabbixsrvbjdb02 bin]# /etc/init.d/mysqld start

Starting MySQL.. ERROR! The server quit without updating PID file (/data/mysql/zabbixsrvbjdb02.pid).

 

根据mysql错误日志文件显示,首先检查运行权限,再看一下/var/mysql.sock,发现/var/mysql.sock目录下并没有该文件,是否是没有权限写/var目录?OK,那就用root用户运行一下safe_mysqld,启动正常。使用mysql连接数据库,提示错误,连接不到数据库服务器, /tmp目录下没有mysql.sock这个文件,到这里,基本清楚了Mysql客户端和服务器端在本机的通信方式了,是通过一个名为mysql.sock 文件来进行初始化通信的,因此该文件所存放的目录必须双方都有权限可以访问到,而且服务器在启动时需要写该文件,如果my.cnf中这两项配置不正确,就会出现Permission denied等类似错误。将配置文件my.cnf里面的mysql.sock修改一下,就没有问题了。

如果还是不行,那就需要 chmod  777  /data/mysql/chown -R mysql.mysql  /data/mysql/

 

第二种错误

登录段错误的解决方法:参考http://space.wudiweb.com/phychion/blog/111

MySQL 5.6.16 后首次登录出错:段错误 (Segmentation fault)

root@test mysql-5.6.16]# mysql -u root -p

Enter password:

Welcome to the MySQL monitor.  Commands end with ; or \g.

Your MySQL connection id is 1

Server version: 5.6.16-log Source distribution

 

Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.

 

Oracle is a registered trademark of Oracle Corporation and/or its

affiliates. Other names may be trademarks of their respective

owners.

段错误

据说这是个bug,关于此bug的解决方法如下:

MySQL 5.6.16 源码包里,编辑文件 cmd-line-utils/libedit/terminal.c,找到代码段类似 char buf[TC_BUFSIZE]; 的,将其注释,并找到下面的变量 area = buf; ,将其更改为 area = NULL;

更正后的代码类似:

865 protected int

866 terminal_set(EditLine *el, const char *term)

867 {

868 int i;

869 /*char buf[TC_BUFSIZE];*/

870 char *area;

871 const struct termcapstr *t;

872 sigset_t oset, nset;

873 int lins, cols;

874

875 (void) sigemptyset(&nset);

876 (void) sigaddset(&nset, SIGWINCH);

877 (void) sigprocmask(SIG_BLOCK, &nset, &oset);

878

879 area = NULL;

 

保存后,重新编译安装MySQL,就可以在命令行中正常登录了。

 

2、修改数据库端口

10.72.23.8810.72.23.89两台服务器上面,把mysql端口改成3307。释放3306端口给amoeba用。

[root@zabbixsrvbjdb02 ~]# vi /etc/my.cnf

[mysqld]下面加入port=3307

[root@zabbixsrvbjdb02 ~]# service mysqld restart

Shutting down MySQL.. SUCCESS!

Starting MySQL. SUCCESS!

[root@zabbixsrvbjdb02 ~]# netstat -utnalpo |grep -E "3306|3307"

tcp        0      0 :::3307                     :::*                        LISTEN      26914/mysqld        off (0.00/0/0)

 

 

3Amoeba的安装配置

参考文档:http://www.cnblogs.com/lhj588/archive/2012/11/19/2777897.html

 

1、两台机器(10.72.24.8810.72.24.89)都做如下授权用户

grant all on zabbix.* to admin@'localhost' identified by "1q2w3e4r";

grant all on zabbix.* to admin@'10.72.24.88' identified by "1q2w3e4r";

grant all on zabbix.* to admin@'10.72.24.89' identified by "1q2w3e4r";

)

 

2、安装JDK环境

         因为amoeba运行需要java1.5以上的版本。

    下载jdk1.5或者更新版本,

地址 http://www.oracle.com/technetwork/java/javase/downloads/index.html

    我用的是:jdk-6u20-linux-i586-rpm.bin

    10.72.24.8810.72.24.89上执行

chmod +x jdk-6u20-linux-i586-rpm.bin

./ jdk-6u20-linux-i586-rpm.bin

注:如果是rpm包可以执行:

[root@zabbixsrvbjdb01 soft]# rpm -Uvh jdk-8u45-linux-x64.rpm

Preparing...                ########################################### [100%]

   1:jdk1.8.0_45            ########################################### [100%]

Unpacking JAR files...

        rt.jar...

        jsse.jar...

        charsets.jar...

        tools.jar...

        localedata.jar...

        jfxrt.jar...

        plugin.jar...

        javaws.jar...

        deploy.jar...

 

然后按n次空格键,然后输入yes就可以了!^_ ^

ln -s /usr/java/jdk1.6.0_20/ /usr/java/jdk1.6

vi /etc/profile

#添加如下两行内容

export JAVA_HOME=/usr/java/jdk1.6

export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH

#执行下面的命令使更改的内容生效

source /etc/profile

 

3amoeba的安装和配置(10.72.24.89写的mysql

软件下载地址:http://sourceforge.net/projects/amoeba/files/

mkdir /usr/local/amoeba/

[root@zabbixsrvbjdb01 jdk1.8]# cd /soft/

[root@zabbixsrvbjdb01 soft]# tar -xvf amoeba-mysql-binary-2.2.0.tar.gz  -C /usr/local/amoeba/

[root@zabbixsrvbjdb01 soft]# cd /usr/local/amoeba/

[root@zabbixsrvbjdb01 amoeba]# ls

benchmark  bin  changelogs.txt  conf  lib  LICENSE.txt  README.html

 

配置文件位于conf目录下,执行文件位于bin目录下,解压后发现bin目录下的启动文件没有可执行权限,请执行:chmod -R +x /usr/local/amoeba/bin/

Amoeba For MySQL 的使用非常简单,所有的配置文件都是标准的XML 文件,总共有四个配置文件。分别为:

 amoeba.xml:主配置文件,配置所有数据源以及Amoeba 自身的参数设置;实现主从的话配置这个文件就可以了;

 rule.xml:配置所有Query 路由规则的信息;

 functionMap.xml:配置用于解析Query 中的函数所对应的Java 实现类;

 rullFunctionMap.xml:配置路由规则中需要使用到的特定函数的实现类;

下面我们就来通过更改amoeba.xmldbServers.xml配置文件实现mysql主从读写分离。

4amoeba修改启动内存

vi /usr/local/amoeba/bin/ amoeba
DEFAULT_OPTS="-server -Xms256m -Xmx256m -Xss512k"    #
启动内存的大小太小会导致启动不了

5  验证Amoeba是否安装成功的命令(如下图):/usr/local/amoeba/bin/amoeba

说明: http://images.cnblogs.com/cnblogs_com/gaizai/MySQLAmoeba/rw_1.jpg

(图1:安装成功)

6.      启动amoeba/usr/local/amoeba/bin/amoeba start

说明: http://images.cnblogs.com/cnblogs_com/gaizai/MySQLAmoeba/rw_2.jpg

(图2:启动成功)

 

7.      修改amoeba.xml,设置登陆amoeba的帐号密码。

[root@zabbixsrvbjdb01 conf]# vi amoeba.xml

只需要修改以下几行就行,其他的不用管。

3306

name="ipAddress">10.72.23.87

admin

zabbix_db=1234 --注意把此处的注释去掉,否则登录不了mysql

8.      测试使用上面帐号是否正常登陆,如果出现上面的2界面说明设置的帐号密码成功。

#mysql -uadmin -pzabbix_db=1234 -h 10.72.23.87 -P 3066

9.      修改dbServers.xml,设置数据库、登陆MySQL的帐号和密码。

3307

zabbix

 admin

1q2w3e4r  --这是登录mysql数据库真实的密码

10.      修改dbServers.xml,设置数据库服务器的IP地址和服务器别名。

   server1"  parent="abstractServer">

               

                       

                        10.72.23.88

               

       

 

        server2"  parent="abstractServer">

               

                       

                        10.72.23.89

               

       

11      修改dbServers.xml,设置ROUNDROBIN(轮询策略);

multiPool" virtual="true">

               

                       

                        1

 

                       

                        server2,server1,server1server1,server1

               

                       

12.      修改amoeba.xml,设置读写分离,修改queryRouter标签下的;

server2

server2

 multiPool

上面的server1multiPool都是dbServers.xml中定义的,注意保持一致。

13.      重新启动amoeba,如果出现上面的2界面说明设置成功;

14      如果你已经使用终端登陆了amoeba# mysql -uadmin -pzabbix_db=1234 -h 10.72.23.87 -P 3066),那么你需要重启打开终端;如果你使用SQLyog的工具登陆了amoeba,那么你需要关闭链接,再重新链接amoeba。如果你还是登录不上,那你看看你修改的amoeba.xmldbServer.xml文件的地方注释是否去掉了。

15、对于10.72.24.88mysqlamoeba安装方法和上面一样,不过为了实现写mysql宕机后,自动切到读mysql后仍然能读写。我把10.72.24.88mysql的配置文件进行的如下设置:

注:server1: 10.72.23.88  server2: 10.72.23.89

[root@zabbixsrvbjdb01 conf]#vi dbServers.xml

multiPool" virtual="true">

               

                       

                        1

 

                       

                        server1,server2

               

       

[root@zabbixsrvbjdb01 conf]# cat amoeba.xml server1

                server1

                multiPool

 

############################################### 

4keepalived的安装配置

 

yum -y install openssl-devel

yum install popt-devel

yum -y install openssl

 

tar xf keepalived-1.2.1.tar.gz

cd keepalived-1.2.1

 

./configure --prefix=/ --mandir=/usr/local/share/man/ 

--with-kernel-dir=/usr/src/kernels/2.6.18-194.el5xen-i686/

--选择和自己一样的kerneltab键补齐。

make

make install

 

主备机器都如上安装。

 

10.72.23.89master)上面配置

vim  /etc/keepalived/ keepalived.conf

global_defs {

router_id Hadb_1

}

vrrp_sync_group VGM {

group {

VI_HA

}

}

vrrp_script chk_mysql {

script "killall -0 mysqld"

#script "

#script "/opt/amoeba.sh"

interval 1

}

# vvrp_instance define #

vrrp_instance VI_HA {

state MASTER

interface eth0

virtual_router_id 45

priority 100

advert_int 1

authentication {

auth_type PASS

auth_pass hamysql

}

virtual_ipaddress {

10.72.23.87

}

track_script {

chk_mysql

}

}

 

 

10.72.23.88(backup)上面的配置:

vi /etc/keepalived/keepalived.conf

global_defs {

router_id Hadb_1

}

vrrp_sync_group VGM {

group {

VI_HA

}

}

vrrp_script chk_mysql {

script "killall -0 mysqld"

#script "

#script "/opt/amoeba.sh"

interval 1

}

# vvrp_instance define #

vrrp_instance VI_HA {

state BACKUP

interface eth0

virtual_router_id 45

priority 50

advert_int 1

authentication {

auth_type PASS

auth_pass hamysql

}

virtual_ipaddress {

10.72.23.87

}

track_script {

chk_mysql

}

}

启动 Keepalived 服务

分别启动两台服务器(10.72.23.8810.72.23.89)的 Keepalived 服务并观察其日志,校验高可用是否成功。

service keepalived start

tail /var/log/messages

通过停止mysqld服务和停止keepalived服务,来验证vip是否漂移。

通过ip a来看vip的绑定。

如果vip不漂移,可能是virtual_router_id的问题,把这个参数的值改一个别的试一下。因为要求的是virtual_router_id在网络中必须唯一。

 

5mysql AB复制

1 授权用户

 

10.72.23.89

grant replication slave,file on *.* to repl1@'10.72.23.88' identified by 'hnas#95071000';

 

10.72.23.88上:

grant replication slave,file on *.* to repl2@'10.72.23.89' identified by 'hnas#95071000';

 

2 修改配置文件

2.1 10.72.23.89

vi /etc/my.cnf

添加如下标黄色部分,其中只需要修改红色字体部分。

[mysqld]

datadir=/data/mysql/zabbix

socket=/tmp/mysqld.sock

user=mysql

port=3307

# Disabling symbolic-links is recommended to prevent assorted security risks

symbolic-links=0

log-bin=mysql-bin

server-id=1

binlog-do-db=zabbix #需要进行同步的数据库

binlog-ignore-db=mysql

replicate-do-db=zabbix #需要进行同步的数据库

replicate-ignore-db=mysql

log-slave-updates

slave-skip-errors=all

sync_binlog=1

auto_increment_increment=2

auto_increment_offset=1

#master-host=10.72.23.88

#master-user=repl2

#master-password=hnas#95071000

# Default to using old password format for compatibility with mysql 3.x

# clients (those using the mysqlclient10 compatibility package).

old_passwords=1

#加上如下四个参数可以设置数据库字符集,并且保证客户端连接数据库不会出现乱码

collation-server = utf8_general_ci

init-connect='SET NAMES utf8'

character-set-server = utf8

skip-character-set-client-handshake


 

[mysqld_safe]

log-error=/var/log/mysqld.log

pid-file=/var/run/mysqld/mysqld.pid

 

注:Mysql版本从5.1.7以后开始就不支持“master-host”、master-usermaster-password参数了,那就用下面的change master命令了。

4.2.2 10.72.23.88

vi /etc/my.cnf

添加如下标黄色部分,其中只需要修改红色字体部分。

 

[mysqld]

datadir=/data/mysql/zabbix

socket=/tmp/mysqld.sock

user=mysql

port=3307

# Disabling symbolic-links is recommended to prevent assorted security risks

symbolic-links=0

log-bin=mysql-bin

server-id=2

binlog-do-db=zabbix #需要同步的数据库

binlog-ignore-db=mysql

replicate-do-db=zabbix #需要同步的数据库

replicate-ignore-db=mysql

log-slave-updates

slave-skip-errors=all

sync_binlog=1

auto_increment_increment=2

auto_increment_offset=1

#master-host=10.72.23.89

#master-user=repl1

#master-password=hnas#95071000

# Default to using old password format for compatibility with mysql 3.x

# clients (those using the mysqlclient10 compatibility package).

old_passwords=1

#加上如下四个参数可以设置数据库字符集,并且保证客户端连接数据库不会出现乱码

collation-server = utf8_general_ci

init-connect='SET NAMES utf8'

character-set-server = utf8

skip-character-set-client-handshake


 

[mysqld_safe]

log-error=/var/log/mysqld.log

pid-file=/var/run/mysqld/mysqld.pid

 

~

4.3分别重启两服务器的 Mysql 服务

service mysqld restart

 

 

10.72.23.88上查看:

mysql> show master status;

+------------------+----------+--------------+------------------+-------------------+

| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |

+------------------+----------+--------------+------------------+-------------------+

| mysql-bin.000002 |      120 | zabbix       | mysql            |                   |

+------------------+----------+--------------+------------------+-------------------+

1 row in set (0.01 sec)

 

注意:为了保证在做AB复制的过程中,主库的数据不被人更新,可以在主库上加锁,该锁定为全局锁定,执行了命令之后所有库所有表都被锁定只读。一般都是用在数据库联机备份,这个时候数据库的写操作将被阻塞,读操作顺利进行。
FLUSH TABLES WITH READ LOCK;
解锁的语句也是unlock tables;

10.72.23.89上执行如下:

 

mysql> change master to master_host='10.72.23.88', master_user='repl2', master_password='hnas#95071000',Master_Port=3307, master_log_file='mysql-bin.000002', master_log_pos=120;

 

 

重启10.72.23.89mysql.

service mysqld restart

 

10.72.23.89上查看:

mysql> show slave status \G;

*************************** 1. row ***************************

               Slave_IO_State: Waiting for master to send event

                  Master_Host: 10.72.23.88

                  Master_User: repl2

                  Master_Port: 3307

                Connect_Retry: 60

              Master_Log_File: mysql-bin.000002

          Read_Master_Log_Pos: 120

               Relay_Log_File: zabbixsrvbjdb02-relay-bin.000003

                Relay_Log_Pos: 283

        Relay_Master_Log_File: mysql-bin.000002

             Slave_IO_Running: Yes

            Slave_SQL_Running: Yes

              Replicate_Do_DB: zabbix

          Replicate_Ignore_DB: mysql

           Replicate_Do_Table:

       Replicate_Ignore_Table:

      Replicate_Wild_Do_Table:

  Replicate_Wild_Ignore_Table:

                   Last_Errno: 0

                   Last_Error:

                 Skip_Counter: 0

          Exec_Master_Log_Pos: 120

              Relay_Log_Space: 466

              Until_Condition: None

               Until_Log_File:

                Until_Log_Pos: 0

           Master_SSL_Allowed: No

           Master_SSL_CA_File:

           Master_SSL_CA_Path:

              Master_SSL_Cert:

            Master_SSL_Cipher:

               Master_SSL_Key:

        Seconds_Behind_Master: 0

Master_SSL_Verify_Server_Cert: No

                Last_IO_Errno: 0

                Last_IO_Error:

               Last_SQL_Errno: 0

               Last_SQL_Error:

  Replicate_Ignore_Server_Ids:

             Master_Server_Id: 2

                  Master_UUID: 7f511acf-e93c-11e4-b916-002590abc576

             Master_Info_File: /data/mysql/zabbix/master.info

                    SQL_Delay: 0

          SQL_Remaining_Delay: NULL

      Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it

           Master_Retry_Count: 86400

                  Master_Bind:

      Last_IO_Error_Timestamp:

     Last_SQL_Error_Timestamp:

               Master_SSL_Crl:

           Master_SSL_Crlpath:

           Retrieved_Gtid_Set:

            Executed_Gtid_Set:

                Auto_Position: 0

1 row in set (0.00 sec)

 

ERROR:

No query specified

 

 

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

查看以上两项的值,均为 Yes 则表示状态正常

 

 

同理

10.72.23.89上查看:

mysql> show master status;

+------------------+----------+--------------+------------------+-------------------+

| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |

+------------------+----------+--------------+------------------+-------------------+

| mysql-bin.000002 |      278 | zabbix       | mysql            |                   |

+------------------+----------+--------------+------------------+-------------------+

1 row in set (0.00 sec)

 

10.72.23.88上执行:

 

mysql> change master to master_host='10.72.23.89', master_user='repl1', master_password='hnas#95071000',Master_Port=3307, master_log_file='mysql-bin.000002', master_log_pos=278;

 

重启10.72.23.88mysql

 

service mysqld restart

 

10.72.23.88上查看:

mysql> show slave status \G;

*************************** 1. row ***************************

               Slave_IO_State: Waiting for master to send event

                  Master_Host: 10.72.23.89

                  Master_User: repl1

                  Master_Port: 3307

                Connect_Retry: 60

              Master_Log_File: mysql-bin.000002

          Read_Master_Log_Pos: 515

               Relay_Log_File: zabbixsrvbjdb01-relay-bin.000003

                Relay_Log_Pos: 520

        Relay_Master_Log_File: mysql-bin.000002

             Slave_IO_Running: Yes

            Slave_SQL_Running: Yes

              Replicate_Do_DB: zabbix

          Replicate_Ignore_DB: mysql

           Replicate_Do_Table:

       Replicate_Ignore_Table:

      Replicate_Wild_Do_Table:

  Replicate_Wild_Ignore_Table:

                   Last_Errno: 0

                   Last_Error:

                 Skip_Counter: 0

          Exec_Master_Log_Pos: 515

              Relay_Log_Space: 703

              Until_Condition: None

               Until_Log_File:

                Until_Log_Pos: 0

           Master_SSL_Allowed: No

           Master_SSL_CA_File:

           Master_SSL_CA_Path:

              Master_SSL_Cert:

            Master_SSL_Cipher:

               Master_SSL_Key:

        Seconds_Behind_Master: 0

Master_SSL_Verify_Server_Cert: No

                Last_IO_Errno: 0

                Last_IO_Error:

               Last_SQL_Errno: 0

               Last_SQL_Error:

  Replicate_Ignore_Server_Ids:

             Master_Server_Id: 1

                  Master_UUID: 32ee02cb-e94d-11e4-b982-002590abc528

             Master_Info_File: /data/mysql/zabbix/master.info

                    SQL_Delay: 0

          SQL_Remaining_Delay: NULL

      Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it

           Master_Retry_Count: 86400

                  Master_Bind:

      Last_IO_Error_Timestamp:

     Last_SQL_Error_Timestamp:

               Master_SSL_Crl:

           Master_SSL_Crlpath:

           Retrieved_Gtid_Set:

            Executed_Gtid_Set:

                Auto_Position: 0

1 row in set (0.00 sec)

 

ERROR:

No query specified

 

mysql>

 

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

查看以上两项的值,均为 Yes 则表示状态正常

 

 

以上,我们搭建完成了MYSQL的主主复制和keepalived提供vip漂移的高可用以及amoeba读写分离。

 

6amoebakeepalived的维护

1、先分别把10.72.23.8910.72.23.88上的mysqlkeepalived启动起来;

2、由于10.72.23.89mysql写)的keepalived是主,所以虚拟ip 10.72.23.87就在10.72.23.89上绑定着,这时候先启动此机器的amoeba

nohup /usr/local/amoeba/bin/amoeba start &

3、当10.72.23.89mysql写)的amoeba启动起来后,把10.72.23.89mysql写)的keepalived停掉,以让虚拟ip 10.72.23.87自动漂移到10.72.23.88mysql读)服务器上。然后再启动10.72.23.88mysql读)服务器上的amoeba

4、最后再把10.72.23.89mysql写)的keepalived起来,以让10.72.23.89mysql写)把虚拟ip夺回来。

 

 

我用mysql-proxy做读写分离,发现性能不好,不过,我还是把我的操作步骤贴在这,以供参考

mysql-proxy 读写分离

1mysql代理软件下载地址:http://mirrors.sohu.com/mysql/

 

2、安装提供代理功能的软件 (lua语言写的,所以要安装lua语言包和开发环境包)

lua软件下载地址:http://rpmfind.net/

下载软件后,在10.72.23.8810.72.23.89都按照如下安装:

#rpm -ivh lua-5.0.2-1.el5.rf.i386.rpm

#rpm -ivh lua-devel-5.0.2-1.el5.rf.i386.rpm

#tar -zxvf mysql-proxy-0.8.0-linux-rhel5-x86-32bit.tar.gz  -C /usr/local

#cd /usr/local

#mv mysql-proxy-0.8.0-linux-rhel5-x86-32bit/ proxy

#cd /usr/local/proxy

include 头文件 lib libexec 库文件 share脚本文件

 

修改默认的分界值

*默认并发连接数小于等于4时,都将访问请求发给写服务器。

一旦读写分离后,即使小于等于4也不会再将查看请求发给写服务器。

vim /usr/local/proxy/share/doc/mysql-proxy/rw-splitting.lua

min_idle_connections = 4, ===>默认的最小并发连接数,可修改为1

 

[root@zabbixsrvbjdb02 ~]# /usr/local/proxy/bin/mysql-proxy -P 10.72.23.88:3306 -b 10.72.23.89:3307 -r 10.72.23.88:3307 -s /usr/local/proxy/share/doc/mysql-proxy/rw-splitting.lua &

注释:

-P指定代理主机

-b 指定写的主机

-r 指定读的主机

-s 指定运行的读写分离的脚本

 

如果出现警告:程序最大可打开的文件数大于系统可以打开的文件数,如下操作:

ulimit -a       查看可以打开的文件数

ulimit -n 10240 临时更改系统可打开的文件数

echo "ulimit -n 10240" >> /etc/rc.local 永久修改系统可打开的文件数。

 
另外,一定要在两个mysql读服务器和写服务器上面给够权限,特别是%,否则可能会出现通过mysql proxy连接数据库的时候提示用户名密码错误:
 grant all on *.* to root@'%' identified by "123";
flush privileges;

测试

[root@zbx-abj-nd-10 backup]# mysql -uroot -p -h10.72.23.89 -P3306

Enter password:

Welcome to the MySQL monitor.  Commands end with ; or \g.

Your MySQL connection id is 2

Server version: 5.6.23 Source distribution

 

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

 

Oracle is a registered trademark of Oracle Corporation and/or its

affiliates. Other names may be trademarks of their respective

owners.

 

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

 

mysql> select * from czx.czxt;

+------+

| id   |

+------+

|   88 |

+------+

1 row in set (0.00 sec)

 

mysql> insert into czx.czxt values(57);

Query OK, 1 row affected (0.01 sec)

 

mysql> select * from czx.czxt;

+------+

| id   |

+------+

|   88 |

+------+

1 row in set (0.38 sec)

看到数据没有插入到10.72.23.88(读)机器上,登录10.72.23.89(写)服务器,发现数据插入到了写服务器上面。

mysql> select * from czx.czxt;

+------+

| id   |

+------+

|   89 |

|   57 |

+------+

2 rows in set (0.00 sec)

 

 

看到上述现象,说明读写分离搭建成功。

 

 

 

请使用浏览器的分享功能分享到微信等