mysql 主从复制读写分离

目标:实现主从复制,读写分离

环境:
mysql-proxy:192.168.1.21      version:5.0.77
mysql-master:192.168.1.24     version:5.0.95
mysql-slave:192.168.1.7       version:5.0.95

一.主从配置过程:
登陆mysql-master:
授权给从数据库服务器192.168.1.7
mysql> GRANT REPLICATION SLAVE ON *.* to ‘rep1‘@‘192.168.1.7‘ identified by ‘123qwe‘;
查询主数据库状态
Mysql> show master status;
----------------问题解决办法---------------------------------------------
问题1:
show master status;
没有数据显示
解决办法:
1.关闭从库
2.show variables like ‘%log_bin%‘;
查看是否是OFF,如果是
在/etc/my.cnf中添加
log-bin=mysql-bin
重启主mysql
--------------------------------------------------------------------------

mysql> show master status;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 |       98 |              |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

记录下 FILE 及 Position 的值,在后面进行从服务器操作的时候需要用到。

配置从库
登陆mysql-slave:
修改从服务器的配置文件/etc/my.cnf
将 server-id = 1修改为 server-id = 10,并确保这个ID没有被别的MySQL服务所使用。
启动mysql

执行同步SQL语句
mysql> change master to
master_host=‘192.168.1.24‘,
master_user=‘rep1‘,
master_password=‘123qwe‘,
master_log_file=‘mysql-bin.000001‘,
master_log_pos=98;

正确执行后启动Slave同步进程
mysql> start slave;
主从同步检查
mysql> show slave status\G
*************************** 1. row ***************************
             Slave_IO_State: Waiting for master to send event
                Master_Host: 192.168.1.24
                Master_User: rep1
                Master_Port: 3306
              Connect_Retry: 60
            Master_Log_File: mysql-bin.000002
        Read_Master_Log_Pos: 98
             Relay_Log_File: mysqld-relay-bin.000004
              Relay_Log_Pos: 235
      Relay_Master_Log_File: mysql-bin.000002
           Slave_IO_Running: Yes
          Slave_SQL_Running: Yes
            Replicate_Do_DB:

其中Slave_IO_Running 与 Slave_SQL_Running 的值都必须为YES,才表明状态正常。
-----------------------------问题解决办法-----------------------------------------------
问题:这里的Slave_IO_Running与Slave_SQL_Running必须都为YES才行,如果不行,可以使用以下命令查看问题原因:
tail /var/log/mysqld.log
比如:140220 21:59:29 [ERROR] Error reading packet from server: Misconfigured master - server id was not set ( server_errno=1236)
这句是说主数据库没有设置server-id值
解决办法:
在主数据库/etc/my.cnf配置
server-id=1
------------------------------------------------------------------------------------

如果主服务器已经存在应用数据,则在进行主从复制时,需要做以下处理:
(1)主数据库进行锁表操作,不让数据再进行写入动作
mysql> FLUSH TABLES WITH READ LOCK;
(2)查看主数据库状态
mysql> show master status;
(3)记录下 FILE 及 Position 的值。
mysql> show master status;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000002 |       98 |              |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
将主服务器的数据文件(整个/opt/mysql/data目录)复制到从服务器,建议通过tar归档压缩后再传到从服务器解压。
(4)取消主数据库锁定
mysql> UNLOCK TABLES;

从服务器上操作
change master to
master_host=‘192.168.1.24‘,
master_user=‘rep1‘,
master_password=‘123qwe‘,
master_log_file=‘mysql-bin.000002‘,
master_log_pos=411;
mysql> start slave;
主从同步检查
mysql> show slave status\G

二.主从复制效果验证
主服务器上的操作
在主服务器上创建数据库first_db1
mysql> create database first_db1;
Query Ok, 1 row affected (0.01 sec)
在主服务器上创建表first_tb
mysql> use first_db1;
mysql> create table first_tb1(id int(3),name char(10));
Query Ok, 1 row affected (0.00 sec)
在主服务器上的表first_tb1中插入记录
mysql> insert into first_tb1 values (001,‘myself‘);
Query Ok, 1 row affected (0.00 sec)

在从服务器上查看
mysql> show databases;
记录也已经存在
由此,整个MySQL主从复制的过程就完成了。
==========================================================================================
三.进行MySQL读写分离的安装与配置。
数据库Master主服务器:192.168.1.24
数据库Slave从服务器:192.168.1.7
Mysql-proxy调度服务器:192.168.1.21

登陆Mysql-proxy:
检查系统所需软件包
通过 rpm -qa | grep name 的方式验证以下软件包是否已全部安装。
gcc* gcc-c++* autoconf* automake* zlib* libxml* ncurses-devel* libmcrypt* libtool* flex* pkgconfig*
libevent* glib*

编译安装lua
MySQL-Proxy的读写分离主要是通过rw-splitting.lua脚本实现的,因此需要安装lua。
lua安装:
lua可通过以下方式获得
wget http://www.lua.org/ftp/lua-5.1.4.tar.gz
tar -xzvf lua-5.1.4.tar.gz
cd lua-5.1.4
vi src/Makefile
在 CFLAGS= -O2 -Wall $(MYCFLAGS) 这一行记录里加上-fPIC,更改为 CFLAGS= -O2 -Wall -fPIC $(MYCFLAGS) 来避免编译过程中出现错误。
make linux
make install
cp etc/lua.pc /usr/lib/pkgconfig/
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/lib/pkgconfig
proxy安装:
tar -xzvf mysql-proxy-0.8.3-linux-rhel5-x86-32bit.tar.gz
mv mysql-proxy-0.8.3-linux-rhel5-x86-32bit /opt/mysql-proxy
创建mysql-proxy服务管理脚本
mkdir /opt/mysql-proxy/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=/opt/mysql-proxy/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.23.132:3306 --proxy-backend-addresses=192.168.23.131:3306 --proxy-lua-script=/opt/mysql-proxy/share/rw-splitting.lua"  
      
    PROXY_PID=/opt/mysql-proxy/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=debug --log-file=/opt/mysql-proxy/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

--proxy-read-only-backend-addresses=192.168.1.7:3306 \ //定义后端只读从服务器地址
--proxy-backend-addresses=192.168.1.24:3306 \ //定义后端主服务器地址
--proxy-lua-script=/opt/mysql-proxy/scripts/rw-splitting.lua" \ //定义lua读写分离脚本路径
PROXY_PID=/opt/mysql-proxy/run/mysql-proxy.pid //定义mysql-proxy PID文件路径

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

cp mysql-proxy /opt/mysql-proxy/init.d/
chmod +x /opt/mysql-proxy/init.d/mysql-proxy
mkdir /opt/mysql-proxy/run
mkdir /opt/mysql-proxy/log
mkdir /opt/mysql-proxy/scripts

配置并使用rw-splitting.lua读写分离脚本
最新的脚本我们可以从最新的mysql-proxy源码包中获取
cp /home/buniao/mysql-proxy-0.8.3-linux-rhel5-x86-32bit/share/doc/mysql-proxy/rw-splitting.lua /opt/mysql-proxy/scripts
修改读写分离脚本rw-splitting.lua
修改默认连接,进行快速测试,不修改的话要达到连接数为4时才启用读写分离
vim /opt/mysql-proxy/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
/opt/mysql-proxy/init.d/mysql-proxy start

测试读写分离效果
创建用于读写分离的数据库连接用户
登陆主数据库服务器192.168.1.24,通过命令行登录管理MySQL服务器
/opt/mysql/bin/mysql -uroot -p
mysql> GRANT ALL ON *.* TO ‘proxy1‘@‘192.168.1.21‘ IDENTIFIED BY ‘password‘;
由于我们配置了主从复制功能,因此从数据库服务器192.168.1.7上已经同步了此操作。

为了清晰的看到读写分离的效果,需要暂时关闭MySQL主从复制功能
登陆从数据库服务器:
mysq -uroot -p
mysql> slave stop;
mysql> select name from first_tb.first_tb;
+------+------------+
| id   | name       |
+------+------------+
|  123 | abcdefghij |
|  321 | buniao   |
|    1 | dgd        |
|    1 | term       |
|    2 | test       |
|    3 | sun        |
|    4 | dgd        |
+------+------------+
登陆主数据库服务器:
mysql> insert into first_tb values("005","mjj");
mysql> select * from first_tb;
+------+------------+
| id   | name       |
+------+------------+
|  123 | abcdefghij |
|  321 | buniao   |
|    1 | dgd        |
|    1 | term       |
|    2 | test       |
|    3 | sun        |
|    4 | dgd        |
|    5 | mjj        |
+------+------------+
此时,由于关闭了主从复制功能,所以在从服务器上不会看到数据更新

登陆proxy服务器
mysql -h192.168.1.21 -uproxy1 -p123qwe -P4040
mysql> select * from first_tb.first_tb;
+------+------------+
| id   | name       |
+------+------------+
|  123 | abcdefghij |
|  321 | buniao   |
|    1 | dgd        |
|    1 | term       |
|    2 | test       |
|    3 | sun        |
|    4 | dgd        |
|    5 | mjj        |
+------+------------+
8 rows in set (0.00 sec)
会看到在查主服务器上进行了查询
接着打开三个终端
[[email protected] ~]# mysql -h192.168.1.21 -uproxy1 -p123qwe -P4040
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 7
Server version: 5.0.95 Source distribution

Type ‘help;‘ or ‘\h‘ for help. Type ‘\c‘ to clear the buffer.

mysql> select * from first_tb.first_tb;
+------+------------+
| id   | name       |
+------+------------+
|  123 | abcdefghij |
|  321 | buniao   |
|    1 | dgd        |
|    1 | term       |
|    2 | test       |
|    3 | sun        |
|    4 | dgd        |
+------+------------+
7 rows in set (0.00 sec)
会发现在从数据库上进行了查询

自此,数据库主从复制,读写分离完成。
在测试完后,将从服务器上同步功能打开
mysql> slave start;
Query OK, 0 rows affected (0.00 sec)
mysql> select name from first_tb.first_tb;
+------------+
| name       |
+------------+
| abcdefghij |
| buniao   |
| dgd        |
| term       |
| test       |
| sun        |
| dgd        |
| mjj        |
+------------+
8 rows in set (0.00 sec)
此时,数据重新进行同步

参考文档
http://www.cnblogs.com/luckcs/articles/2543607.html
http://www.linuxidc.com/Linux/2014-05/102265.htm

时间: 2024-10-25 13:53:11

mysql 主从复制读写分离的相关文章

mysql主从复制读写分离-Altas

mysql主从复制读写分离 本文读写分离使用的软件是Altas,altas是奇虎360公司开发的开源数据库代理软件.它是基于mysql-proxy开发而成的 它集中地响应应用的请求,依据用户事先设置的规则,将SQL请求发送到特定的数据库上执行.基于此可以实现负载均衡.读写分离.高可用性等需求. mysql读写分离原理: 数据库层在高并发的情况下,i/o会产生瓶颈.而实际上用户读的请求要远远大于写的请求. 使用代理服务作为数据库前端,将不同的请求根据规则分配到不同的后端数据上面去,比如将写的请求分

【实战】Amoeba 代理 MySQL 主从复制 + 读写分离 【提供源码包】

目录简介: 1· Amoeba 的介绍2· MySQL 主从复制原理3· MySQL 读写分离原理4· 实战案例5· 总结归纳 Amoeba 的介绍 1)Amoeba 是什么: 1·Amoeba 的中文名是:变形虫.它是一个以MySQL为底层数据存储,并对应用提供MySQL协议接口的proxy.它集中地响应应用的请求,依据用户事先设置的规则,将SQL请求发送到特定的数据库上执行.基于此可以实现负载均衡.读写分离.高可用性等需求. 2·Amoeba相当于一个SQL请求的路由器,目的是为负载均衡.读

mysql主从复制读写分离之——proxysql应用

一.说明ProxySQL是一个开源的MySQL代理服务器,这意味着它充当MySQL服务器和访问其数据库的应用程序之间的中介.ProxySQL可以通过在多个数据库服务器池之间分配流量来提高性能,并且如果一个或多个数据库服务器发生故障,还可以通过自动故障切换到备用数据库来提高可用性. 系统环境:master1:ubuntu16.04 mysql5.6 192.168.1.10 3307 master2:ubuntu16.04 mysql5.6 192.168.1.20 3307slave1: ubu

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

Mysql主从复制和读写分离 在实际的生产环境中,如果对mysql数据库的读和写都在一台数据库服务器中操作,无论是在安全性.高可用性,还是高并发等各个方面都是不能满足实际需求的.因此,一般通过主从复制的方式来同步数据,再通过读写分离来提升数据库的并发负载能力. Mysql主从复制和读写分离 l 主从复制: Mysql的主从复制和mysql的读写分离两者有紧密的联系,首先要部署主从复制,只有主从复制完成了,才能再此基础上进行数据的读写分离. Mysql支持的复制类型: 1. 基于语句的复制:在主服

利用amoeba实现mysql主从复制读写分离

一般大型网站为了缓解大量的并发访问,会在web端实现负载均衡,但是这是远远不够的.到了数据存储层.数据访问层,如果还是传统的架构,或者只是依靠一台服务器,大量的数据库连接操作,会导致数据库面临崩溃的危险.进而造成数据丢失,后果不堪设想.所以我们会考虑如何减少数据库的连接,一方面进行代码的优化,采用优秀的数据缓存技术如memcached,如果资金丰厚的话,必然会想到假设服务器群,来分担主数据库的压力.今天我们就利用MySQL主从配置,实现读写分离,分散数据库的压力.这种方式,很多网站都有应用,今天

数据库---mysql主从复制读写分离

http://m.open-open.com/m/lib/view/1413274853450.html 原理及架构分析 部署前准备 下载好源码包存放位置要与脚本中对应 mysql-5.5.22.tar.gz,cmake-2.8.6.tar.gz,amoeba-mysql-binary-2.2.0.tar.gz,jdk-6u14-linux-x64.bin selinux和iptables不做设置,关闭 系统光盘镜像为本地yum源,配置好yum文件 环境介绍: 主服务器(master):192.

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

MYsql主从复制 1.mysql主从复制原理: Master将数据变化记录到二进制日志中[binary log] Slave将master的二进制日志[binary log]拷贝到自己的中继日志[relay log]中. Slave将中继入日志[relay log]事件在做一次,将数据变化,反应到自身数据库. 简述:mysql主从复制其实就是完全备份,和二进制日志备份还原的过程.二进制日志的还原基本上是实时进行的.注意不是完全实时,而是异步实时,主从直接的执行有延迟.如果master压力过大,

mysql主从复制读写分离

一.环境 1.主服务器操作系统:Mac OS MySQL版本:5.1.6 2.从服务器操作系统:Centos 6.5 MySQL版本:5.1.6 二.实战 2.1MySQL主从复制,读写分离示意图 MySQL 复制的工作方式很简单,一台服务器作为主机,一台或多台服务器作为从机.主机会把数据库的变化记录到日志.一旦这些变化被记录到日志,就会立刻(或者以设定的时间间隔)被送到从机. 2.2 主服务器IP:172.16.151.1 从服务器IP:172.16.151.130 在两台服务器分别安装好My

mysql主从复制-读写分离

mysql5.6版本: mysql的主从复制环境构建故障恢复 基于GTID的mysql中从复制 使用atlas实现读写分离 文章下载包地址: 链接:https://pan.baidu.com/s/1ht1y9HnqcfrDdWuPHUq_gg 提取码:cxql 原文地址:https://www.cnblogs.com/myself-technology-summary/p/10859878.html