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=; //这是日志开始的位置,也可以是主服务器记录的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主从复制,读写分离的更多相关文章
- mysql主从复制-读写分离
mysql主从复制+读写分离 环境:mysql主:193.168.1.1mysql从:193.168.1.2amoeba代理:193.168.1.3########################## ...
- MySQL 主从复制&读写分离 简介
1. 读写分离&读写分离 简介 主从同步延迟 分配机制 解决单点故障 总结 2. 主从复制&读写分离 搭建 搭建主从复制(双主) 搭建读写分离 1. 读写分离&读写分离 简介 ...
- Mycat+MySql 主从复制-读写分离 看这一篇就够了
通过mycat和mysql的主从复制配合搭建数据库的读写分离,可以实现mysql的高可用性,下面我们来搭建mysql的读写分离. 1.一主一从 1.在node01上修改/etc/my.cnf的文件 ...
- mysql主从复制-读写分离-原理
Mysql主从复制和读写分离 在实际的生产环境中,如果对mysql数据库的读和写都在一台数据库服务器中操作,无论是在安全性.高可用性,还是高并发等各个方面都是不能满足实际需求的.因此,一般通过主从复制 ...
- Mysql主从复制读写分离
一.前言:为什么MySQL要做主从复制(读写分离)?通俗来讲,如果对数据库的读和写都在同一个数据库服务器中操作,业务系统性能会降低.为了提升业务系统性能,优化用户体验,可以通过做主从复制(读写分离)来 ...
- mysql主从复制+读写分离 菜鸟入门
MYsql主从复制 1.mysql主从复制原理: Master将数据变化记录到二进制日志中[binary log] Slave将master的二进制日志[binary log]拷贝到自己的中继日志[r ...
- MYSQL 主从复制,读写分离(8)
Mysql 数据库的主从复制方案,是其自带的功能,并且主从复制并不是复制磁盘上的数据文件,而是通过binlog日志复制到需要同步的服务器上. 一 主从复制的原理实现 原理图解说: 数据库更改 生成数据 ...
- Mycat实现mysql主从复制(读写分离)
数据库性能瓶颈主要原因: 随着用户数的增多,带来的是数据库连接的大幅度增长 随着业务体量的增长,表数据量(空间存储的问题)的大幅增长,其中涉及到索引的优化,mysql默认的索引是硬盘级别的,BTREE ...
- MySQL主从复制&读写分离&分库分表
MySQL主从复制 MySQL的主从复制只能保证主机对外提供服务,从机是不提供服务的,只是在后台为主机进行备份数据 首先我们说说主从复制的原理,这个是必须要理解的玩意儿: 理解: MySQL之间的数据 ...
随机推荐
- 理解NLP中的卷积神经网络(CNN)
此篇文章是Denny Britz关于CNN在NLP中应用的理解,他本人也曾在Google Brain项目中参与多项关于NLP的项目. · 翻译不周到的地方请大家见谅. 阅读完本文大概需要7分钟左右的时 ...
- UDP收/发广播包原理及步骤
原文链接地址:http://www.2cto.com/net/201311/254834.html UDP收/发广播包原理及步骤 如果网络中两个主机上的应用程序要相互通信,其一要知道彼此的IP,其二要 ...
- 特殊密码锁 的通过码是:(请注意,在openjudge上提交了程序并且通过以后,就可以下载到通过码。请注意看公告里关于编程作业的说明)
// // main.cpp // openjudge特殊密码锁 // // Created by suway on 17/11/20. // Copyright © 2017年 suway. // ...
- Spring源码解析-事件
Spring事件的组件 主要是3个组件: 1.ApplicationEvent 事件 2.ApplicationListener 监听器,对事件进行监听 3.ApplicationEventMul ...
- HDU3829:Cat VS Dog(最大独立集)
Cat VS Dog Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 125536/65536 K (Java/Others)Total ...
- linux启动一个web项目时验证码不能出现的问题的解决
解决方法: 在tomcatcatalina.sh中搜索cygwin=false,然后在它的上面加上这句话JAVA_OPTS='-Djava.awt.headless=true' 具体参考如下图片: 然 ...
- codeforces2015ICL,Finals,Div.1#J Ceizenpok’s formula 扩展Lucas定理 扩展CRT
默默敲了一个下午,终于过了, 题目传送门 扩展Lucas是什么,就是对于模数p,p不是质数,但是不大,如果是1e9这种大数,可能没办法, 对于1000000之内的数是可以轻松解决的. 题解传送门 代码 ...
- tcp/ip网络协议学习
链路层介绍 网络层协议的数据单元是 IP 数据报 ,而数据链路层的工作就是把网络层交下来的 IP 数据报 封装为 帧(frame)发送到链路上,以及把接收到的帧中的数据取出并上交给网络层. 以太网 以 ...
- AWS文档与用户指南
AWS Command Line Interface http://docs.amazonaws.cn/cli/latest/userguide/cli-chap-welcome.html VM Im ...
- HDU1272---(并查集)简单应用
http://acm.hdu.edu.cn/showproblem.php?pid=1272 小希的迷宫 Time Limit: 2000/1000 MS (Java/Others) Memor ...