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=;     //这是日志开始的位置,也可以是主服务器记录的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

CentOS下MySQL主从复制,读写分离的更多相关文章

  1. mysql主从复制-读写分离

    mysql主从复制+读写分离 环境:mysql主:193.168.1.1mysql从:193.168.1.2amoeba代理:193.168.1.3########################## ...

  2. MySQL 主从复制&读写分离 简介

    1. 读写分离&读写分离 简介 主从同步延迟 分配机制 解决单点故障 总结 2. 主从复制&读写分离 搭建 搭建主从复制(双主) 搭建读写分离 1. 读写分离&读写分离 简介 ...

  3. Mycat+MySql 主从复制-读写分离 看这一篇就够了

    ​ 通过mycat和mysql的主从复制配合搭建数据库的读写分离,可以实现mysql的高可用性,下面我们来搭建mysql的读写分离. 1.一主一从 1.在node01上修改/etc/my.cnf的文件 ...

  4. mysql主从复制-读写分离-原理

    Mysql主从复制和读写分离 在实际的生产环境中,如果对mysql数据库的读和写都在一台数据库服务器中操作,无论是在安全性.高可用性,还是高并发等各个方面都是不能满足实际需求的.因此,一般通过主从复制 ...

  5. Mysql主从复制读写分离

    一.前言:为什么MySQL要做主从复制(读写分离)?通俗来讲,如果对数据库的读和写都在同一个数据库服务器中操作,业务系统性能会降低.为了提升业务系统性能,优化用户体验,可以通过做主从复制(读写分离)来 ...

  6. mysql主从复制+读写分离 菜鸟入门

    MYsql主从复制 1.mysql主从复制原理: Master将数据变化记录到二进制日志中[binary log] Slave将master的二进制日志[binary log]拷贝到自己的中继日志[r ...

  7. MYSQL 主从复制,读写分离(8)

    Mysql 数据库的主从复制方案,是其自带的功能,并且主从复制并不是复制磁盘上的数据文件,而是通过binlog日志复制到需要同步的服务器上. 一 主从复制的原理实现 原理图解说: 数据库更改 生成数据 ...

  8. Mycat实现mysql主从复制(读写分离)

    数据库性能瓶颈主要原因: 随着用户数的增多,带来的是数据库连接的大幅度增长 随着业务体量的增长,表数据量(空间存储的问题)的大幅增长,其中涉及到索引的优化,mysql默认的索引是硬盘级别的,BTREE ...

  9. MySQL主从复制&读写分离&分库分表

    MySQL主从复制 MySQL的主从复制只能保证主机对外提供服务,从机是不提供服务的,只是在后台为主机进行备份数据 首先我们说说主从复制的原理,这个是必须要理解的玩意儿: 理解: MySQL之间的数据 ...

随机推荐

  1. 安徽师大附中%你赛day5 T3 树上行走 解题报告

    树上行走 题目背景 \(\mathrm{Smart}\) 的脑洞非常大, 经常幻想出一些奇怪的东西. 题目描述 某一天,\(\mathrm{Smart}\) 幻想出了一棵没有边际的二叉树,脑补着在那棵 ...

  2. 获取Parameter参数值,方便调试使用

    #region #warning 调试使用,获取sql参数化,拼接出完整的sql语句,复制sql明文到mssql中运行 string debugSql = queryHelper.CommandTex ...

  3. 停课day5

    一转眼,已经停课五天了. 高二大佬们已经都走了,在机房里面呆着,有时感觉很孤寂. 但是为了能学好竞赛,这些都是在所不惜的. 好像多打打比赛啊,可是cf要FQ,洛谷之类的比赛还不勤. 哎,先去学一发SP ...

  4. Linux Top 命令参数解析

    转载自:http://www.jb51.net/LINUXjishu/34604.html TOP是一个动态显示过程,即可以通过用户按键来不断刷新当前状态.如果在前台执行该命令,它将独占前台,直到用户 ...

  5. eclipse调试java技巧

    详细内容请看: http://www.oschina.net/question/82993_69439

  6. Centos7下redis设置密码、开放远程访问权限

    redis的安装与启动可参考前一篇文章:http://www.cnblogs.com/zuidongfeng/p/8032505.html redis安装成功后,默认是没有设置密码的启动redis-c ...

  7. Spring学习-- Bean 的作用域

    Bean 的作用域: 在 Spring 中 , 可以在 <bean> 元素的 scope 属性里设置 bean 的作用域. 默认情况下 , Spring 只为每个在 IOC 容器里声明的 ...

  8. jquery.cookie.js 的使用指南

    转自:http://www.cnblogs.com/yjzhu/p/4359420.html 介绍: jquery.cookie.js 是一款轻量级的 cookie 插件,可以读取,写入和删除 coo ...

  9. charles 踩坑记录

    charles破解教程:http://www.jianshu.com/p/12e75eb8f53d 1.需注意软件和破解脚本的版本是否正确(例如3.x.x版本的破解脚本不能用于4.x.x版本的char ...

  10. Spring--环境配置

    目录 1.1 Spring jar包下载 1.2 Hello World 参考资料 1.1 Spring jar包下载 (1)进入官网http://repo.spring.io(或者 http://m ...