CentOS下MySQL主从复制,读写分离

1.环境:所有系统都是CentOS5.5 mysql-5.6.31-2.el5,MySQL中都没有数据

主服务器IP为192.168.128.230

从服务器IP为192.168.128.235

代理服务器IP为192.168.128.233

2.MySQL主从复制有两种:基于日志(binlog)和基于GTID(全局事务标示符)。其中GTID有可能是不支持临时表的,所以本篇通过日志做主从复制

2.1主服务器配置

2.1.1进入mysql中,输入命令建立复制所需的用户

grant replication slave on *.* to repl@192.168.128.235 identified by ‘password’;

 

2.1.2进入主服务器,通过命令找到my.cnf文件所在位置,这一步需要自己一个个试过去

mysql --help | grep my.cnf

 

2.1.3在my.cnf中[mysqld]添加部分代码

//server-id和log-bin必须要有

server-id = 1    //数据库ID号,值必须为1到2^32–1之间的一个正整数值,且唯一。 
log-bin=mysql-bin        //启用二进制日志;mysql-bin可以自定义,也可以加上路径(主从可能有联系)

 

//如果以下两个都没指定,则从服务器默认全部复制
binlog-do-db=data       //需要同步的二进制数据库名;
binlog-ignore-db=mysql           //不同步的二进制数据库名;


log-slave-updates         //用来配置从服务器的更新是否写入日志,如果B服务器为A服务器的从服务器,并且是C服务器的主服务器,那么需要这个选项,这样B服务器才能将它得到的更新同步到C服务器上

 

//slave-skip-errors有四个可选值,off、all、ddl_exist_errors和错误代码([list of error codes]),没有默认为off
slave-skip-errors=1062,1053    //跳过错误,继续执行复制;

slave-skip-errors=all

slave-skip-errors=ddl_exist_errors

 

//这是为了取消TIMESTAMP的警告

explicit_defaults_for_timestamp=true

 

而我加了如下部分

保存退出,输入命令service mysqld restart,重启mysql(由于安装Mysql的方法不同,还有可能是service mysql restart)

 

2.1.4再次进入mysql,运行show master status;查看主数据库master状态

 

记录一下File和Position两个数据,从服务器配置需要用到。

2.1.5最后还需要修改iptables,对数据库端口3306放行

vi /etc/sysconfig/iptables

新增-A INPUT –m state --state NEW –m tcp –p --dport 3306 –j ACCEPT

个人建议复制iptables上面的代码进行修改,毕竟已经可以正常运行

接着重启iptables,service iptables restart以及验证iptables –L

 

2.2从服务器配置

2.2.1同样需要配置my.cnf,方法和配置主服务器的时候差不多(不知道_)

//指定唯一的server_id

server_id=2

 

//虽然从服务器没有必须开启二进制,但是建议开启一系列相关操作

log_bin=mysql-bin

relay_log=mysql-relay-bin           //配置中继日志

log_slave_updates=1     //将复制事件写进自己的二进制日志

read_only=1      //防止改变数据(除特殊的线程),但也会阻止需要在从服务器上创建表的应用

 

//使用以下部分,则可以跳过2.2.2(不保证成功)

master-host=192.168.128.230

master-user=root

master-password=password

master-port=3306

master-connect-retry=60             //如果发现主服务器断线,重连时间差

 

我添加了如下的代码

 

重启mysqld

2.2.2连接主服务器,并开始重做主服务器二进制日志中的事件。进入mysql使用change master to语句。

change master to master_host=’192.168.128.230’,           //貌似也可以是server1

master_user=’repl’,

master_password=’password’,

master_log_file=’mysql-bin.000001’,    //主服务器记录的File数据

master_log_pos=0;     //这是日志开始的位置,也可以是主服务器记录的Position数据。如果和我一样是0,则不需要2.3操作

 

输入show slave status\G检查一下配置

 

这里面Slave_IO_State为空,Slave_IO_Running和Slave_SQL_Running为NO表示还没开始复制。Pos结尾的为4而不为0,是因为0只是日志开始位置,实际MYSQL的第一个时间位置是4.

2.2.3开启slave

直接在mysql中输入start slave;

 

再次输入show slave status\G检查,这次Slave_IO_State应该为Waiting for master to send event,Slave_IO_Running和Slave_SQL_Running应该为Yes。

 

2.3如果主数据库已有数据,再进行主从复制时需要增加以下操作:

2.3.1主数据库锁表,不让数据再写入数据库

mysql>flush tables with read lock;

2.3.2使用mysqldump创建一个数据转储(也可以用其他方法,只要能复制数据)

Shell>mysqldump --all-database --lock-all-tables >dbdump.db

2.3.3释放锁

mysql>unlock tables

2.4最后可以根据个人需求,在主服务器上创建测试表,进行测试

3读写分离都是在代理服务器上操作,需要用到中间件,运行流程大概如下图。我这里使用的中间件是MySQL-Proxy。

 

3.1安装lua

3.1.1安装lua的前置软件

yum –y install gcc* ncurses-devel libevent-devel libtermcap-devel

readline需要手动安装不然安装lua时有问题,通过命令下载软件包wget ftp://ftp.gnu.org/gnu/readline/readline-6.3.tar.gz

 

tar –zxvf readline-6.3.tar.gz        //输入解压

cd readline-6.3        //进入加压后的文件夹

//以下是配置安装

./configure --prefix=/usr

make SHLIB_LIBS=-lncurses

make install

ldconfig

3.1.2开始安装lua

首先在http://www.lua.org/ftp/上确认需要的版本号,转到打算解压的文件夹下,输入命令wget http://www.lua.org/ftp/lua-5.3.3.tar.gz下载lua。

 

接着输入解压命令tar –zxvf lua-5.3.3.tar.gz

 

cd lua-5.3.3

make linux

 

make install

 

5.1.3测试lua

lua

print(“Hello!”);

 

5.2安装MySQL-Proxy

通过命令下载wget http:// cdn.mysql.com/Downloads/MySQL-Proxy /mysql-proxy-0.8.5-linux-rhel5-x86-64bit.tar.gz

这个地址不是最新的地址,但是官网会自动转过去,不用担心。

 

解压tar –zxvf mysql-proxy-0.8.5-linux-rhel5-x86-64bit.tar.gz

cd mysql-proxy-0.8.5-linux-rhel5-x86-64bit

创建mysql-proxy服务器脚本,mkdir /sw/ mysql-proxy-0.8.5-linux-rhel5-x86-64bit/init.d

编辑脚本,vim mysql-proxy

=============以下是脚本===================

#!/bin/sh

#

# mysql-proxy This script starts and stops the mysql-proxy daemon

#

# chkconfig: - 78 30

# processname: mysql-proxy

# description: mysql-proxy is a proxy daemon to mysql

 

# Source function library.

. /etc/rc.d/init.d/functions

 

#PROXY_PATH=/usr/local/bin

PROXY_PATH=/sw/mysql-proxy-0.8.5-linux-rhel5-x86-64bit/bin

 

prog="mysql-proxy"

 

# Source networking configuration.

. /etc/sysconfig/network

 

# Check that networking is up.

[ ${NETWORKING} = "no" ] && exit 0

 

# Set default mysql-proxy configuration.

#PROXY_OPTIONS="--daemon"

PROXY_OPTIONS="--proxy-read-only-backend-addresses=192.168.128.235:3306 --proxy-backend-addresses=192.168.128.230:3306 --proxy-lua-script=/sw/mysql-proxy-0.8.5-linux-rhel5-x86-64bit/scripts/rw-splitting.lua"

PROXY_PID=/sw/mysql-proxy-0.8.5-linux-rhel5-x86-64bit/run/mysql-proxy.pid

 

# Source mysql-proxy configuration.

if [ -f /etc/sysconfig/mysql-proxy ]; then

        . /etc/sysconfig/mysql-proxy

fi

           

PATH=$PATH:/usr/bin:/usr/local/bin:$PROXY_PATH

 

# By default it's all good

RETVAL=0

 

# See how we were called.

case "$1" in

  start)

        # Start daemon.

        echo -n $"Starting $prog: "

        $NICELEVEL $PROXY_PATH/mysql-proxy $PROXY_OPTIONS --daemon --pid-file=$PROXY_PID --user=root --log-level=warning --log-file=/sw/mysql-proxy-0.8.5-linux-rhel5-x86-64bit/log/mysql-proxy.log

        RETVAL=$?

        echo

        if [ $RETVAL = 0 ]; then

                touch /var/lock/subsys/mysql-proxy

                echo “ok”

        fi

       ;;

  stop)

        # Stop daemons.

        echo -n $"Stopping $prog: "

        killproc $prog

        RETVAL=$?

        echo

        if [ $RETVAL = 0 ]; then

                rm -f /var/lock/subsys/mysql-proxy

                rm -f $PROXY_PID

        fi

       ;;

  restart)

        $0 stop

        sleep 3

        $0 start

       ;;

  condrestart)

       [ -e /var/lock/subsys/mysql-proxy ] && $0 restart

      ;;

  status)

        status mysql-proxy

        RETVAL=$?

       ;;

  *)

        echo "Usage: $0 {start|stop|restart|status|condrestart}"

        RETVAL=1

       ;;

esac

 

exit $RETVAL

====================脚本编辑完成==============

注意事项:1. 第五行代码#chkconfig: - 78 30,这里减号前后要有空格,不然开机自启会失败

2.${NETWORKING}这部分中间不能出现空格

3.如果出现syntax error near unexpected token报错,这是由于转行符的问题,完成脚本后重新编辑一下,基本就好了。还有问题就上网搜一下,这个网上还是后很多解决办法的。

==================脚本参数详解=================

PROXY_PATH=/sw/mysql-proxy-0.8.5-linux-rhel5-x86-64bit/bin      //定义mysql-proxy服务二进制文件路径

PROXY_OPTIONS="--proxy-read-only-backend-addresses=192.168.10.235:3306 \        //定义后端只读从服务器地址
--proxy-backend-addresses=192.168.10.230:3306 \   //定义后端主服务器地址
--proxy-lua-script=/sw/mysql-proxy-0.8.5-linux-rhel5-x86-64bit/scripts/rw-splitting.lua" \       //定义lua读写分离脚本路径

PROXY_PID=/sw/mysql-proxy-0.8.5-linux-rhel5-x86-64bit/run/mysql-proxy.pid   //定义mysql-proxy PID文件路径

$NICELEVEL $PROXY_PATH/mysql-proxy $PROXY_OPTIONS \
--daemon \ //定义以守护进程模式启动
--keepalive \ //使进程在异常关闭后能够自动恢复
--pid-file=$PROXY_PID \    //定义mysql-proxy PID文件路径
--user=root \ //以root用户身份启动服务
--log-level=warning \        //定义log日志级别,可自选,由高到低分别有(error|warning|info|message|debug)
--log-file=/sw/mysql-proxy-0.8.5-linux-rhel5-x86-64bit/log/mysql-proxy.log       //定义log日志文件路径

编写完成后将脚本拷贝到指定地点,cp mysql-proxy /sw/mysql-proxy-0.8.5-linux-rhel5-x86-64bit/init.d/

 

添加执行权限

chmod +x /sw/mysql-proxy-0.8.5-linux-rhel5-x86-64bit/init.d/mysql-proxy

 

创建脚本中需要用到的目录

mkdir /sw/mysql-proxy-0.8.5-linux-rhel5-x86-64bit/run

mkdir /sw/mysql-proxy-0.8.5-linux-rhel5-x86-64bit/log

mkdir /sw/mysql-proxy-0.8.5-linux-rhel5-x86-64bit/scripts

 

回到sw文件夹下cd /sw,通过命令下载包含rw-splitting.lua读写分离脚本的文件wget http:// cdn.mysql.com/Downloads/MySQL-Proxy /mysql-proxy-0.8.5.tar.gz

 

解压tar –zxvf mysql-proxy-0.8.5.tar.gz

 

cd mysql-proxy-0.8.5.tar.gz

拷贝rw-splitting.lua到指定地点,cp lib/rw-splitting.lua /sw/mysql-proxy-0.8.5-linux-rhel5-x86-64bit/scripts

修改默认连接,进行测试如不修改需要达到4个连接数才会启动读写分离,vim /sw/mysql-proxy-0.8.5-linux-rhel5-x86-64bit/scripts/rw-splitting.lua

找到一下部分进行修改(测试完自己按需求修改)

=================修改目标===================

-- connection pool
if not proxy.global.config.rwsplit then
proxy.global.config.rwsplit = {
min_idle_connections = 1, //默认为4
max_idle_connections = 1, //默认为8
is_debug = false
}
end

=================完成修改===================

修改完成后,启动mysql-proxy,/sw/mysql-proxy-0.8.5-linux-rhel5-x86-64bit/init.d/mysql-proxy start

 

防火墙端口处理一下,主从3306,代理4040

vi /etc/sysyconfig/iptables

将22端口的代码复制黏贴,再将22改为3306/4040

/etc/init.d/iptables restart

5.3测试mysql-proxy

 

登录主服务器给代理服务器权限

mysql>grant all on *.* to proxy1@192.168.128.233 identified by ‘password’;

 

并且创建测试表

create database test;

use test;

create table first_tb(id int,name varchar(10));

 

登录从服务器暂时关闭主从复制功能

mysql>stop slave;

 

 

登录代理服务器上,通过远程连接主服务器上的mysql

mysql –u proxy1 –p –h 192.168.128.233 –P 4040 //看好了这里是代理服务器IP,我竟然在这里坑了好几天了

 

之后登上主从服务上查看,会发现不一样的搜索结果。

主服务器:

 

从服务器:

 

PS:测试完记得打开从服务器的复制start slave;

5.4设置开机自启

cp /sw/mysql-proxy-0.8.5-linux-rhel5-x86-64bit/init.d/mysql-proxy /etc/init.d/

chmod +x /etc/init.d/mysql-proxy

chkconfig --add mysql-proxy

chkconfig mysql-proxy on

最后查看一下chkconfig --list | grep mysql-proxy

参考:http://www.jb51.net/article/29818.htm

http://blog.csdn.net/ccrrt/article/details/8514842

http://www.linuxidc.com/Linux/2014-06/103752.htm

http://blog.csdn.net/jesseyoung/article/details/40585809

http://my.oschina.net/u/1169079/blog/390726

http://www.cnblogs.com/hustcat/archive/2009/12/19/1627525.html

http://tieba.baidu.com/p/4375578387

http://blog.csdn.net/mycwq/article/details/48690915

http://www.server110.com/mysql/201312/3628.html

http://blog.csdn.net/qustdjx/article/details/26937325

http://blog.csdn.net/e421083458/article/details/19697701

posted @ 2016-07-26 15:34  苦逼运维  阅读(674)  评论(0编辑  收藏  举报