Amoeba+keepalived架构MySQL读写分离与容灾
--For zabbix
一、项目背景
目前公司的zabbix系统在运行过程中,频繁出现数据库瓶颈导致应用卡死,故时常发送大量误报短信。
截止至今,zabbix应用基本上没有重大问题(如有,也可以通过升级的方式解决),但是数据库相关问题较多:
1、数据库未进行合理的优化;
2、数据库读写量较大,但是未做读写分离工作;
3、zbbix定期数据清理工作耗费资源较多,替代的方式是需要进行表分区工作;
4、zabbix支持多种数据库,如MySQL/Oracle,可以根据各地支持情况进行部署,但是建议MySQL。
笔者接到该项目,准备运用mysql 主主复制+amoeba(读写分离)+keepalived来实现上述需求。
二、拓扑图
Amoeba是阿里巴巴陈思儒写的开源软件,用来实现mysql的读写分离。据说该软件比Mysql官方的mysql-proxy(也是个读写分离软件)更加稳定。笔者最初打算用mysql-proxy做读写分离了,但是笔者安装测试后,确实发现用 mysql-proxy连接数据库有时能连上,有时连接失败。于是笔者决然放弃mysql-proxy,转而使用Amoeba。
MySQL的AB复制就不用再多说了,是很好的解决数据容灾的方案。
至于我为什么用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用户登录,默认无密码(此root与linux的root不是一回事)
可以使用硬连接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.88和10.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)
3、Amoeba的安装配置
参考文档:http://www.cnblogs.com/lhj588/archive/2012/11/19/2777897.html
1、两台机器(10.72.24.88和10.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.88和10.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
3、amoeba的安装和配置(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.xml和dbServers.xml配置文件实现mysql主从读写分离。
4、amoeba修改启动内存
vi /usr/local/amoeba/bin/ amoeba
DEFAULT_OPTS="-server -Xms256m -Xmx256m -Xss512k" #启动内存的大小太小会导致启动不了
5、 验证Amoeba是否安装成功的命令(如下图):/usr/local/amoeba/bin/amoeba
(图1:安装成功)
6. 启动amoeba:/usr/local/amoeba/bin/amoeba start
(图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,server1,server1,server1
12. 修改amoeba.xml,设置读写分离,修改queryRouter标签下的;
server2
server2
multiPool
上面的server1和multiPool都是dbServers.xml中定义的,注意保持一致。
13. 重新启动amoeba,如果出现上面的图2界面说明设置成功;
14 如果你已经使用终端登陆了amoeba(# mysql -uadmin -pzabbix_db=1234 -h 10.72.23.87 -P 3066),那么你需要重启打开终端;如果你使用SQLyog的工具登陆了amoeba,那么你需要关闭链接,再重新链接amoeba。如果你还是登录不上,那你看看你修改的amoeba.xml和dbServer.xml文件的地方注释是否去掉了。
15、对于10.72.24.88读mysql的amoeba安装方法和上面一样,不过为了实现写mysql宕机后,自动切到读mysql后仍然能读写。我把10.72.24.88读mysql的配置文件进行的如下设置:
注: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
multiPool
###############################################
4、keepalived的安装配置
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/
--选择和自己一样的kernel,tab键补齐。
make
make install
主备机器都如上安装。
在10.72.23.89(master)上面配置
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.88和10.72.23.89)的 Keepalived 服务并观察其日志,校验高可用是否成功。
service keepalived start
tail /var/log/messages
通过停止mysqld服务和停止keepalived服务,来验证vip是否漂移。
通过ip a来看vip的绑定。
如果vip不漂移,可能是virtual_router_id的问题,把这个参数的值改一个别的试一下。因为要求的是virtual_router_id在网络中必须唯一。
5、mysql 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-user、master-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.89的mysql.
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.88的mysql
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读写分离。
6、amoeba和keepalived的维护
1、先分别把10.72.23.89和10.72.23.88上的mysql和keepalived启动起来;
2、由于10.72.23.89(mysql写)的keepalived是主,所以虚拟ip 10.72.23.87就在10.72.23.89上绑定着,这时候先启动此机器的amoeba
nohup /usr/local/amoeba/bin/amoeba start &
3、当10.72.23.89(mysql写)的amoeba启动起来后,把10.72.23.89(mysql写)的keepalived停掉,以让虚拟ip 10.72.23.87自动漂移到10.72.23.88(mysql读)服务器上。然后再启动10.72.23.88(mysql读)服务器上的amoeba。
4、最后再把10.72.23.89(mysql写)的keepalived起来,以让10.72.23.89(mysql写)把虚拟ip夺回来。
附
我用mysql-proxy做读写分离,发现性能不好,不过,我还是把我的操作步骤贴在这,以供参考
mysql-proxy 读写分离
1、mysql代理软件下载地址:http://mirrors.sohu.com/mysql/
2、安装提供代理功能的软件 (lua语言写的,所以要安装lua语言包和开发环境包)
lua软件下载地址:http://rpmfind.net/
下载软件后,在10.72.23.88和10.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)
看到上述现象,说明读写分离搭建成功。