利用mysql-proxy实现读写分离

使用mysql-proxy实现主从同步、读写分离

1.安装mysql


下载安装包
[root@localhost src]#wget http://mirrors.163.com/mysql/Downloads/MySQL-5.6/mysql-5.6.39-linux-glibc2.12-x86_64.tar.gz
解压安装包
[root@localhost src]# tar zxvf mysql-5.6.39-linux-glibc2.12-x86_64.tar.gz 
移动安装包
[root@localhost src]# mv mysql-5.6.39-linux-glibc2.12-x86_64 /usr/local/mysql
创建目录和用户
[root@localhost src]#mkdir /data/
[root@localhost src]#useradd mysql
进入mysql目录
[root@localhost src]# cd /usr/local/mysql/
安装mysql
[root@localhost mysql]#./scripts/mysql_install_db --user=mysql --datadir=/data/mysql
修改my.cnf文件
[root@localhost mysql]# vi /etc/my.cnf
拷贝配置文件
[root@localhost mysql]# cp support-files/mysql.server /etc/init.d/mysqld
修改启动文件中的datadir和basedir

[root@localhost mysql]#vi /etc/init.d/mysqld
创建开机启动项
[root@localhost mysql]#chkconfig --add mysqld
启动mysql
[root@localhost mysql]#/etc/init.d/mysqld start

mysql安装需要的一些安装包

[root@homework1 ~]#    yum install -y perl
[root@homework1 ~]#    yum install -y perl-XML-Dumper.noarch 
[root@homework1 ~]#    yum install -y autoconf
[root@homework1 ~]#    yum install libaio* -y

 

2.设置mysql主从同步

准备2台虚拟机(最好不要在mysql安装后克隆)

配置主

修改/etc/mycnf 增加server-id和log_bin

[mysqld]
datadir=/data/mysql
socket=/tmp/mysql.sock
server-id=128
log_bin=xiaoqi

更改后重启mysql

[root@localhost ~]# /etc/init.d/mysqld restart
Shutting down MySQL.. SUCCESS! 
Starting MySQL. SUCCESS! 

查看/data/mysql目录下,发现生成了几个新文件

[root@localhost ~]# ll -t /data/mysql/
总用量 110640
-rw-rw----. 1 mysql mysql 50331648 7月  19 14:31 ib_logfile0
-rw-rw----. 1 mysql mysql 12582912 7月  19 14:31 ibdata1
-rw-rw----. 1 mysql mysql    22594 7月  19 14:31 localhost.localdomain.err
-rw-rw----. 1 mysql mysql        5 7月  19 14:31 localhost.localdomain.pid
-rw-rw----. 1 mysql mysql       16 7月  19 14:31 xiaoqi.index
-rw-rw----. 1 mysql mysql      120 7月  19 14:31 xiaoqi.000001
-rw-rw----. 1 mysql mysql       56 6月  26 10:54 auto.cnf
drwx------. 2 mysql mysql     4096 6月  26 10:36 mysql
drwx------. 2 mysql mysql     4096 6月  26 10:36 performance_schema
-rw-rw----. 1 mysql mysql 50331648 6月  26 10:36 ib_logfile1
drwx------. 2 mysql mysql        6 6月  26 10:36 test

准备数据用作演示;备份mysql库

[root@localhost ~]# mysqldump -uroot -p123456 mysql > /tmp/mysql.sql
Warning: Using a password on the command line interface can be insecure.
[root@localhost ~]# du -sh /tmp/mysql.sql 
644K	/tmp/mysql.sql

创建一个test2库,把mysql备份的库恢复到test2里面

[root@localhost ~]# mysql -uroot -p123456 -e "create database test2"
Warning: Using a password on the command line interface can be insecure.
把之前备份的库恢复到test2里
[root@localhost ~]# mysql -uroot -p123456 test2 < /tmp/mysql.sql 
Warning: Using a password on the command line interface can be insecure.

创建用户,用作同步数据。

[root@localhost ~]# mysql -uroot -p123456
Warning: Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 5
Server version: 5.6.36-log MySQL Community Server (GPL)

Copyright (c) 2000, 2017, 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> grant replication slave on *.* to 'repl'@'192.168.246.78' identified by '123456';
Query OK, 0 rows affected (0.00 sec)               来源ip                          密码

锁表操作,无法继续写入

mysql> flush tables with read lock;
Query OK, 0 rows affected (0.27 sec)

记住binlog的name和位置

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

配置从

修改/etc/my.cnf增加server-id 要和主不一样

[root@localhost ~]# vim /etc/my.cnf

[mysqld]
datadir=/data/mysql
socket=/tmp/mysql.sock
server-id=77

[root@localhost ~]# vim /etc/my.cnf
[root@localhost ~]# /etc/init.d/mysqld restart 
Shutting down MySQL.. SUCCESS! 
Starting MySQL. SUCCESS! 

拷贝主上面备份的配置文件;新机器。。所以没有几个库

[root@localhost ~]# scp 192.168.246.111:/tmp/*.sql /tmp/The authenticity of host '192.168.246.99 (192.168.246.99)' can't be established.
ECDSA key fingerprint is 97:43:61:ff:59:85:a5:54:f4:96:f3:6c:b0:49:ec:7b.
Are you sure you want to continue connecting (yes/no)? y
Please type 'yes' or 'no': yes     
Warning: Permanently added '192.168.246.99' (ECDSA) to the list of known hosts.
root@192.168.246.99's password: 
Permission denied, please try again.
root@192.168.246.99's password: 
mysql.sql            100%  774KB 773.7KB/s   00:00  

[root@localhost ~]# ls /tmp/
mysql.sock
mysql.sql
systemd-private-7e3f84055419416499eb48ca78be4d87-vmtoolsd.service-aqhNZd
test3.sql
xiaoqi.sql

创建库

mysql> create database test2;
Query OK, 1 row affected (0.28 sec)

mysql> quit
Bye

[root@localhost ~]# mysql -uroot test3 < /tmp/test3.sql 
[root@localhost ~]# mysql -uroot test2 < /tmp/mysql.sql 
[root@localhost ~]# mysql -uroot xiaoqi < /tmp/xiaoqi.sql 

查看主从mysql目录是否一致

在从上面登录mysql

stop slave


mysql> change master to master_host='192.168.246.111', master_user='repl', master_password='123456', master_log_file='xiaoqi.000001', master_log_pos=2932484;
Query OK, 0 rows affected, 2 warnings (0.02 sec)

mysql> start slave;
Query OK, 0 rows affected (0.00 sec)

查看是否成功Slave_IO_Running和Slave_SQL_Running都是yes。

mysql>  show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.246.111
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: xiaoqi.000001
          Read_Master_Log_Pos: 656543
               Relay_Log_File: localhost-relay-bin.000002
                Relay_Log_Pos: 280
        Relay_Master_Log_File: xiaoqi.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           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: 656543
              Relay_Log_Space: 457
              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: 128
                  Master_UUID: 910b5eeb-99e2-11e8-88fc-000c29a93e96
             Master_Info_File: /data/mysql/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)

到主机器上解锁表

mysql> unlock tables;
Query OK, 0 rows affected (0.00 sec)

克隆虚拟机容易有bug!!!在虚拟机上浪费2天时间。。

测试主从同步,在主机器上创建一个库test4.

mysql> create database test3;
Query OK, 1 row affected (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
| test2              |
| test4              |
+--------------------+
6 rows in set (0.00 sec)

从机器上也自动生成了test3

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
| test2              |
| test4              |
+--------------------+
6 rows in set (0.27 sec)

主从成功

 

3.用mysql-proxy实现读写分离

环境如下,两台已经实现主从同步的机器,和一台mysql-proxy机器。

72dd2eb74638cf42b595f275f02432d5848.jpg

mysql-proxy下载地址http://ftp.ntu.edu.tw/MySQL/Downloads/MySQL-Proxy/

[root@localhost src]# ls
mysql-5.6.36-linux-glibc2.5-x86_64.tar.gz          nginx-1.8.0.tar.gz
mysql-proxy-0.8.4-linux-el6-x86-32bit.tar.gz       php-5.6.32
mysql-proxy-0.8.5-linux-glibc2.3-x86-32bit.tar.gz  php-5.6.32.tar.bz2
nginx-1.8.0      

安装配置mysql-proxy

解压并移动目录

[root@localhost src]# tar zxvf mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz 
[root@localhost src]# mv mysql-proxy-0.8.5-linux-el6-x86-64bit /usr/local/mysql-proxy
[root@localhost src]# cd !$
cd /usr/local/mysql-proxy

创建mysql-proxy用户,创建lua目录,log目录。

[root@localhost mysql-proxy]#  useradd -r mysql-proxy

[root@localhost mysql-proxy]# ls
bin  include  lib  libexec  licenses  share
[root@localhost mysql-proxy]# ls bin/
mysql-binlog-dump  mysql-myisam-dump  mysql-proxy



lua脚本所在位置


[root@localhost mysql-proxy]# ls share/doc/mysql-proxy/
active-queries.lua       ro-balance.lua           tutorial-resultset.lua
active-transactions.lua  ro-pooling.lua           tutorial-rewrite.lua
admin-sql.lua            rw-splitting.lua         tutorial-routing.lua
analyze-query.lua        tutorial-basic.lua       tutorial-scramble.lua
auditing.lua             tutorial-constants.lua   tutorial-states.lua
commit-obfuscator.lua    tutorial-inject.lua      tutorial-tokenize.lua
commit-obfuscator.msc    tutorial-keepalive.lua   tutorial-union.lua
COPYING                  tutorial-monitor.lua     tutorial-warnings.lua
histogram.lua            tutorial-packets.lua     xtab.lua
load-multi.lua           tutorial-prep-stmts.lua
README                   tutorial-query-time.lua

[root@localhost mysql-proxy]# mkdir log
[root@localhost mysql-proxy]# mkdir lua

复制读写和管理脚本到lua目录

[root@localhost mysql-proxy]# cp share/doc/mysql-proxy/rw-splitting.lua ./lua
[root@localhost mysql-proxy]# cp share/doc/mysql-proxy/admin-sql.lua ./lua
[root@localhost mysql-proxy]# 

创建mysql-proxy配置文件 /etc/mysql-proxy.cnf 其中log选项可以注释掉。容易报错

[root@localhost mysql-proxy]# vi /etc/mysql-proxy.cnf

user=root #运行mysql-proxy用户
admin-username=xiaoqi #主从mysql共有的用户
admin-password=123456 #用户的密码
proxy-address=192.168.246.99:4040 #mysql-proxy运行ip和端口,不加端口,默认4040
proxy-read-only-backend-addresses=192.168.246.112 #指定后端从slave读取数据
proxy-backend-addresses=192.168.246.111 #指定后端主master写入数据
proxy-lua-script=/usr/local/mysql-proxy/lua/rw-splitting.lua #指定读写分离配置文件位置
admin-lua-script=/usr/local/mysql-proxy/lua/admin-sql.lua #指定管理脚本
log-file=/usr/local/mysql-proxy/logs/mysql-proxy.log #日志位置
log-level=info #定义log日志级别,由高到低分别有(error|warning|info|message|debug)
daemon=true    #以守护进程方式运行
keepalive=true #mysql-proxy崩溃时,尝试重启
~                                              

修改配置文件权限

[root@localhost mysql-proxy]# chmod 660 !$
chmod 660 /etc/mysql-proxy.cnf

修改读写分离文件,数值改为1,方便实验

-- connection pool
if not proxy.global.config.rwsplit then
        proxy.global.config.rwsplit = {
                min_idle_connections = 1,   什么时候开始读写分离
                max_idle_connections = 1,

                is_debug = false
        }

配置环境变量

[root@localhost mysql-proxy]# export PATH=$PATH:/usr/local/mysql-proxy/bin/

查看帮助文档

[root@localhost mysql-proxy]# mysql-proxy --help
Usage:
  mysql-proxy [OPTION...] - MySQL Proxy

Help Options:
  -?, --help                                              Show help options
  --help-all                                              Show all help options
  --help-proxy                                            Show options for the proxy-module

Application Options:
  -V, --version                                           Show version
  --defaults-file=<file>                                  configuration file
  --verbose-shutdown                                      Always log the exit code when shutting down
  --daemon                                                Start in daemon-mode
  --user=<user>                                           Run mysql-proxy as user
  --basedir=<absolute path>                               Base directory to prepend to relative paths in the config
  --pid-file=<file>                                       PID file in case we are started as daemon
  --plugin-dir=<path>                                     path to the plugins
  --plugins=<name>                                        plugins to load
  --log-level=(error|warning|info|message|debug)          log all messages of level ... or higher
  --log-file=<file>                                       log all messages in a file
  --log-use-syslog                                        log all messages to syslog
  --log-backtrace-on-crash                                try to invoke debugger on crash
  --keepalive                                             try to restart the proxy if it crashed
  --max-open-files                                        maximum number of open files (ulimit -n)
  --event-threads                                         number of event-handling threads (default: 1)
  --lua-path=<...>                                        set the LUA_PATH
  --lua-cpath=<...>                                       set the LUA_CPATH

--help-all   :获取全部帮助信息;
--proxy-address=host:port  :代理服务监听的地址和端口;
--admin-address=host:port  :管理模块监听的地址和端口;
--proxy-backend-addresses=host:port :后端mysql服务器的地址和端口;
--proxy-read-only-backend-addresses=host:port :后端只读mysql服务器的地址和端口;
--proxy-lua-script=file_name :完成mysql代理功能的Lua脚本;
--daemon  :以守护进程模式启动mysql-proxy;
--keepalive  :在mysql-proxy崩溃时尝试重启之;
--log-file=/path/to/log_file_name :日志文件名称;
--log-level=level :日志级别;
--log-use-syslog :基于syslog记录日志;
--plugins=plugin:在mysql-proxy启动时加载的插件;
--user=user_name  :运行mysql-proxy进程的用户;
--defaults-file=/path/to/conf_file_name : 默认使用的配置文件路径;其配置段使用[mysql-proxy]标识;
--proxy-skip-profiling : 禁用profile;
--pid-file=/path/to/pid_file_name :进程文件名;

作者:Catke
链接:https://www.jianshu.com/p/552b1307dd22
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

启动mysql-proxy

[root@localhost mysql-proxy]# mysql-proxy --defaults-file=/etc/mysql-proxy.cnf

[root@localhost mysql-proxy]# ps aux|grep proxy
root       3033  0.0  0.0  37912   876 ?        S    15:02   0:00 /usr/local/mysql-proxy/libexec/mysql-proxy --defaults-file=/etc/mysql-proxy.cnf
root       3123  0.0  0.0  37912   872 ?        S    15:05   0:00 /usr/local/mysql-proxy/libexec/mysql-proxy --defaults-file=/etc/mysql-proxy.cnf
root       3146  0.0  0.1  40036  1440 ?        S    15:06   0:00 /usr/local/mysql-proxy/libexec/mysql-proxy --defaults-file=/etc/mysql-proxy.cnf
root       3158  0.0  0.1  40036  1456 ?        S    15:06   0:00 /usr/local/mysql-proxy/libexec/mysql-proxy --defaults-file=/etc/mysql-proxy.cnf
root       3160  0.0  0.0 112720   972 pts/0    S+   15:07   0:00 grep --color=auto proxy

查看监听端口

[root@localhost mysql-proxy]# netstat -lntp|grep proxy
tcp        0      0 192.168.246.99:3306     0.0.0.0:*               LISTEN      3146/mysql-proxy    
tcp        0      0 192.168.246.99:4040     0.0.0.0:*               LISTEN      3158/mysql-proxy    

连接mysql-proxy,进行读、写等操作,所有写请求都被分发到主库,所有读请求被分发到从库;

读写有延迟!!!

实际实验很乱。。不熟悉操作方式,浪费太多时间。mysql-proxy使用好像有bug。。很多次才启动成功。也可能是没配置好、

 

 

失败操作流程

mysql-proxy提供SysV服务脚本(来源google)

[root@localhost mysql-proxy]# vi /etc/init.d/mysql-proxy



#!/bin/bash
#
# mysql-proxy This script starts and stops the mysql-proxy daemon
#
# chkconfig: - 78 30
# processname: mysql-proxy
# description: mysql-proxy is a proxy daemon for mysql

# Source function library.
. /etc/init.d/functions

prog="/usr/local/mysql-proxy/bin/mysql-proxy"

# Source networking configuration.
if [ -f /etc/sysconfig/network ]; then
    . /etc/sysconfig/network
fi

# Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 0

# Set default mysql-proxy configuration.
ADMIN_USER="admin"
ADMIN_PASSWD="admin"
ADMIN_LUA_SCRIPT="/usr/local/mysql-proxy/share/doc/mysql-proxy/admin.lua"
PROXY_OPTIONS="--daemon"
PROXY_PID=/var/run/mysql-proxy.pid
PROXY_USER="mysql-proxy"

# Source mysql-proxy configuration.
if [ -f /etc/sysconfig/mysql-proxy ]; then
    . /etc/sysconfig/mysql-proxy
fi

RETVAL=0

start() {
    echo -n $"Starting $prog: "
    daemon $prog $PROXY_OPTIONS --pid-file=$PROXY_PID --proxy-address="$PROXY_ADDRESS" --user=$PROXY_USER --admin-username="$ADMIN_USER" --admin-lua-script="$ADMIN_LUA_SCRIPT" --admin-password="$ADMIN_PASSWORD"
    RETVAL=$?
    echo
    if [ $RETVAL -eq 0 ]; then
        touch /var/lock/subsys/mysql-proxy
    fi
}

stop() {
    echo -n $"Stopping $prog: "
    killproc -p $PROXY_PID -d 3 $prog
    RETVAL=$?
    echo
    if [ $RETVAL -eq 0 ]; then
        rm -f /var/lock/subsys/mysql-proxy
        rm -f $PROXY_PID
    fi
}
# See how we were called.
case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    restart)
        stop
        start
        ;;
    condrestart|try-restart)
        if status -p $PROXY_PIDFILE $prog >&/dev/null; then
            stop
            start
        fi
        ;;
    status)
        status -p $PROXY_PID $prog
        ;;
    *)
        echo "Usage: $0 {start|stop|restart|reload|status|condrestart|try-restart}"
        RETVAL=1
        ;;
esac

exit $RETVAL

修改权限已经增加开机启动

[root@localhost mysql-proxy]# chmod +x /etc/init.d/mysql-proxy 

[root@localhost mysql-proxy]# chkconfig --add mysql-proxy

为服务脚本提供配置文件/etc/sysconfig/mysql-proxy  内容如下(来自google)

   [root@localhost mysql-proxy]# vi /etc/sysconfig/mysql-proxy

  # Options for mysql-proxy

      ADMIN_USER="admin"   #mysql-proxy的管理账号

      ADMIN_PASSWORD="admin"

      ADMIN_ADDRESS=""

      ADMIN_LUA_SCRIPT="/usr/local/mysql-proxy/share/doc/mysql-proxy/admin.lua"   #完成mysql-proxy管理功能的脚本

      PROXY_ADDRESS=""

      PROXY_USER="mysql-proxy"   #以什么身份运行mysql-proxy

      PROXY_OPTIONS="--daemon --log-level=info --log-use-syslog --plugins=proxy --plugins=admin --proxy-backend-addresses=192.168.246.111:3306 --proxy-read-only-backend-addresses=192.168.246.112:3306 --proxy-lua-script=/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua"

编辑admin.lua 内容如下

[root@localhost mysql-proxy]# vi share/doc/mysql-proxy/admin.lua

    proxy.response = {
        type = proxy.MYSQLD_PACKET_OK,
        resultset = {
            fields = fields,
            rows = rows
        }
    }
    return proxy.PROXY_SEND_RESULT
end

mysql-proxy --daemon --log-level=debug --log-file=/var/log/mysql-proxy.log --plugins="proxy" --proxy-backend-addresses="192.168.246.111:3306" --proxy-read-only-backend-addresses="192.168.246.112:3306"  --proxy-lua-script=/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua" --plugins=admin --admin-username="admin" --admin-password="admin" --admin-lua-script="/usr/local/mysql-proxy/share/doc/mysql-proxy/admin.lua"



/usr/local/mysql-proxy/bin/mysql-proxy --daemon --log-level=debug --log-file=/var/log/mysql-proxy.log --plugins="proxy" --proxy-backend-addresses="192.168.246.111:3306" --proxy-read-only-backend-addresses="192.168.246.112:3306" --proxy-lua-script=/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua  --plugins=admin --admin-username="admin" --admin-password="admin" --admin-lua-script="/usr/local/mysql-proxy/share/doc/mysql-proxy/admin.lua"

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

转载于:https://my.oschina.net/u/3850968/blog/1923935

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值