zoukankan      html  css  js  c++  java
  • [mysql]linux mysql 读写分离

    [mysql]linux mysql 读写分离

    作者:flymaster

    qq:908601287

    blog:http://www.cnblogs.com/flymaster500/

    1、简介
      当今MySQL使用相当广泛,随着用户的增多以及数据量的增大,高并发随之而来。然而我们有很多办法可以缓解数据库的压力。分布式数据库、负载均衡、读写分离、增加缓存服务器等等。这里我们将采用读写分离技术进展缓解数据库的压力。
      其中实现读写分离的技术有很多方法,这里我们将采用mysql-proxy这个中间软件来实现。这个软件中含有一个读写分离的lua文件,这也是我们使用mysql-proxy实现读写分离必用的文件,它需要lua解析器进行解析。因此我们还需要安装一个lua解析器。
     
    回到顶部
    2、基本环境
      三台linux虚拟主机
      Linux版本CentOS6.6、MySQL 5.5
      mysql-proxy-0.8.5
      lua-5.1.4
      ip:192.168.95.11(写)、192.168.95.12(读)、192.168.95.13(mysql-proxy)
     
    回到顶部
    3、配置主从复制
    详细可以参考:mysql主从复制与主主复制
    http://www.cnblogs.com/phpstudy2015-6/p/6485819.html#_label2
    粗略介绍一下数据库的主从复制的配置:
    第一步:
    在192.168.95.11中创建一个192.168.95.12主机中可以登录的MySQL用户
    用户:mysql12
    密码:mysql12
    mysql>GRANT REPLICATION SLAVE ON *.* TO ‘mysql12’@’192.168.95.12’ IDENTIFIED BY ‘mysql12’;

    mysql>FLUSH PRIVILEGES;
     
    第二步:
    查看192.168.95.11MySQL服务器二进制文件名与位置
    mysql>SHOW MASTER STATUS;
     

    第三步:
    告知二进制文件名与位置
    在192.168.95.12中执行:

    mysql> change master to
    -> master_host='192.168.95.11',
    -> master_user='mysql12',
    -> master_password='mysql12',
    -> master_log_file='mysql-bin.000124',
    -> master_log_pos=586;

    第四步:
    在192.168.95.12中
    mysql>SLAVE START;   #开启复制
    mysql>SHOW SLAVE STATUSG   #查看主从复制是否配置成功

    主从复制配置成功!
    (注意:上面Relicate_Do_DB:aa表示主从复制只针对数据库aa【这是我之前设置的就没改了】,这里就不讲这个了,要想去了解学医这个的话可以参考文章http://www.cnblogs.com/phpstudy2015-6/p/6485819.html#_label7)
     
    回到顶部
    4、MySQL读写分离配置
    百度云下载:链接:http://pan.baidu.com/s/1slTl18L 密码:9j0m
    回到顶部
      4.1、安装lua
      官网下载:http://www.lua.org/download.html
      Lua 是一个小巧的脚本语言。Lua由标准C编写而成,代码简洁优美,几乎在所有操作系统和平台上都可以编译,运行。
      一个完整的Lua解释器不过200k,在目前所有脚本引擎中,Lua的速度是最快的。这一切都决定了Lua是作为嵌入式脚本的最佳选择。
      1)、安装lua需要依赖很多软件包。
      可以通过rpm -qa | grep name检查以下软件是否安装:
      gcc*、gcc-c++*、autoconf*、automake*、zlib*、libxml*、ncurses-devel*、libmcrypt*、libtool*、flex*、pkgconfig*、libevent*、glib*
      若缺少相关的软件包,可通过yum -y install方式在线安装,或直接从系统安装光盘中找到并通过rpm -ivh方式安装。(我的话一般是直接在系统光盘软件库中找到直接rpm安装的,有些找不到,则先在网上下载然后在ftp传给linux再进行安装)
      2)、依赖软件安装完毕后则进行编译安装lua
      MySQL-Proxy的读写分离主要是通过rw-splitting.lua脚本实现的,因此需要安装lua。
      官网下载:http://www.lua.org/download.html(下载源码包)

    # wget http://www.lua.org/ftp/lua-5.1.4.tar.gz
    # tar zxvf lua-5.1.4.tar.gz
    # cd lua-5.1.4
    # make linux
    # make install
    # export LUA_CFLAGS="-I/usr/local/include" LUA_LIBS="-L/usr/local/lib -llua -ldl" LDFLAGS="-lm"
    (我安装的时候是直接在光盘软件库中找到,直接rpm安装)

    回到顶部
      4.2、安装mysql-proxy
      1)、首先查看linux版本确认是32位还是64为系统
      查看linux内核版本
      # cat /etc/issue
      查看linux版本
      # cat /proc/version
      2)、按系统位数下载(上面百度云链接64位的文件)
      3)、安装
    # tar –zxvf mysql-proxy-0.8.5- linux-rhel5-x86-64bit.tar.gz
    # mkdir /usr/local/mysql-proxy
    # cp ./ mysql-proxy-0.8.5-linux-rhel5-x86-64bit/* /usr/local/mysql-proxy
    # cd /usr/local/mysql-proxy

    安装成功
     
    回到顶部
    5、MySQL读写分离测试
    回到顶部
      1)、修改rw-splitting.lua文件
      修改默认连接,进行快速测试,不修改的话要达到连接数为4时才启用读写分离
      #cp /usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua ./

      # vi rw-splitting.lua

    回到顶部
      2)、修改完成后,启动mysql-proxy
    # cd /usr/local/mysql/bin
    # ./mysql-proxy --proxy-read-only-backend-addresses=192.168.95.12:3306 --proxy-backend-addresses=192.168.95.11:3306 --proxy-lua-script=/usr/local/mysql-proxy/rw-splitting.lua &
    参数: 
      --proxy-read-only-backend-addresses  #只读服务器地址(ip)
      --proxy-backend-addresses       #服务器地址(主服务器)
      --proxy-lua-script            #lua脚本路劲
      &                     #表示后台执行

    回到顶部
      3)、创建用于读写分离的数据库连接用户
      用户名:proxy1
      密  码:321
    mysql>grant all on *.* to 'proxy1'@'192.168.95.13' identified by '321';
    mysql>use aa;
    mysql>create table tab1(id int auto_increment,name varchar(32) not null,primary key(id));
    【因为已经开启了主从复制所以,11、12主机mysql中都创建了这个用户】
    回到顶部
      4)、测试登陆账号proxy1@192.168.95.13进行添加数据
      可以使用任意ip客户端登陆这个账号
      在192.168.95.13登陆:
      # ./mysql -u proxy1 -P4040 -h192.168.95.13 –p

    在两个mysql中查看结果:一致

    结果表明:账号使用
    (ps:id是自增长,之前高主主复制的时候更改了配置文件,还没更改回来,就将就用着先吧)
    回到顶部
      5)、关闭12mysql的从复制
      mysql> stop slave;

    回到顶部
      6)、证明写分离
      使用proxy1@192.168.95.13账号打开多个客户端进行插入数据
      打开三个mysql客户端分别插入2条数据:
    mysql> insert into tab1 (name) values('stop_slave11111');

    ….

    mysql> insert into tab1 (name) values('stop_slave6666’);
     
      查看:
      分别登陆11mysql与12mysql查看aa.tab1中的数据
      主数据库:

    从数据库:

    结果中显示插入的数据存在与主数据库,而从数据库没有,所以证明写能够分离。
    回到顶部
      7)、证明读分离
      使用proxy1@192.168.95.13账号登陆mysql,查看aa.tab1中的数据
    mysql>use aa;
    mysql>select*from tab1;

    结果中显示只有从数据库的数据,结合上面的测试,可以证明读分离。
     
    回到顶部
    6、建议
    为了方便启动与管理mysql-proxy可以创建mysql-proxy服务管理脚本
    下面这个管理脚本仅适合以上我给出的安装路径位置
    【此管理脚本需要按照自己的安装路径做出相应的修改方可使用】

    1 #!/bin/sh
    2
    3 #
    4 # mysql-proxy This script starts and stops the mysql-proxy daemon
    5 #
    6 # chkconfig: - 78 30
    7 # processname: mysql-proxy
    8 # description: mysql-proxy is a proxy daemon to mysql
    9
    10 # Source function library.
    11 . /etc/rc.d/init.d/functions
    12
    13 #PROXY_PATH=/usr/local/bin
    14 PROXY_PATH=/usr/local/mysql-proxy/bin
    15
    16 prog="mysql-proxy"
    17
    18 # Source networking configuration.
    19 . /etc/sysconfig/network
    20
    21 # Check that networking is up.
    22 [ ${NETWORKING} = "no" ] && exit 0
    23
    24 # Set default mysql-proxy configuration.
    25 #PROXY_OPTIONS="--daemon"
    26
    27 PROXY_OPTIONS="--proxy-read-only-backend-addresses=192.168.95.12:3306 --proxy-backend-addresses=192.168.95.11:3306 --proxy-lua-script=/usr/local/mysql-proxy/rw-splitting.lua"
    28
    29 PROXY_PID=/usr/local/mysql-proxy/run/mysql-proxy.pid
    30
    31 # Source mysql-proxy configuration.
    32 if [ -f /etc/sysconfig/mysql-proxy ]; then
    33 . /etc/sysconfig/mysql-proxy
    34 fi
    35
    36 PATH=$PATH:/usr/bin:/usr/local/bin:$PROXY_PATH
    37 # By default it's all good
    38 RETVAL=0
    39
    40 # See how we were called.
    41 case "$1" in
    42 start)
    43 # Start daemon.
    44 echo -n $"Starting $prog: "
    45 $NICELEVEL $PROXY_PATH/mysql-proxy $PROXY_OPTIONS --daemon --pid-file=$PROXY_PID --user=root --log-level=debug --log-file=/usr/local/mysql-proxy/log/mysql-proxy.log
    46 RETVAL=$?
    47 echo
    48 if [ $RETVAL = 0 ]; then
    49 touch /var/lock/subsys/mysql-proxy]
    50 echo "ok"
    51 fi
    52 ;;
    53 stop)
    54 # Stop daemons.
    55 echo -n $"Stopping $prog: "
    56 killproc $prog
    57 RETVAL=$?
    58 echo
    59 if [ $RETVAL = 0 ]; then
    60 rm -f /var/lock/subsys/mysql-proxy
    61 rm -f $PROXY_PID
    62 fi
    63 ;;
    64 restart)
    65 $0 stop
    66 sleep 3
    67 $0 start
    68 ;;
    69 condrestart)
    70 [ -e /var/lock/subsys/mysql-proxy ] && $0 restart
    71 ;;
    72 status)
    73 status mysql-proxy
    74 RETVAL=$?
    75 ;;
    76 *)
    77 echo "Usage: $0 {start|stop|restart|status|condrestart}"
    78 RETVAL=1
    79 ;;
    80 esac
    81 exit $RETVAL

    #---我将mysql-proxy服务管理脚本放在了/usr/local/mysql-proxy/init.d/文件夹里
    #---给执行权限,建立相应目录
    #chmod +x /usr/local/mysql-proxy/init.d/mysql-proxy
    #mkdir /usr/local/mysql-proxy/run
    #mkdir /usr/local/mysql-proxy/log

    #cd /usr/local/mysql-proxy/init.d/
    #---启动mysql-proxy
    #./mysql-proxy start
    #---停止mysql-proxy
    #./mysql-proxy stop
    #---重启mysql-proxy
    #./mysql-proxy restart

     
    一些相关参数:
    PROXY_PATH=/usr/local/mysql-proxy/bin //定义mysql-proxy服务二进制文件路径
    --proxy-read-only-backend-addresses=192.168.95.12:3306   //定义后端只读从服务器地址
    --proxy-backend-addresses=192.168.95.11:3306   //定义后端主服务器地址
    --proxy-lua-script=/usr/local/mysql-proxy/rw-splitting.lua   //定义lua读写分离脚本路径
    PROXY_PID=/usr/local/mysql-proxy/run/mysql-proxy.pid   //定义mysql-proxy PID文件路径
    --daemon   //定义以守护进程模式启动
    --keepalive   //使进程在异常关闭后能够自动恢复【上面的管理脚本没有加上此参数】
    --user=root   //以root用户身份启动服务
    --log-level=debug   //定义log日志级别,由高到低分别有(error|warning|info|message|debug)
    --log-file=/usr/local/mysql-proxy/log/mysql-proxy.log   //定义log日志文件路径
     

    作者:flymaster

    qq:908601287

    blog:http://www.cnblogs.com/flymaster500/

    转载于:https://www.cnblogs.com/flymaster500/p/10155731.html

  • 相关阅读:
    linux查看CPU和内存信息
    linux yum命令详解
    查看文件中关键字前后几行的内容
    vue.js+web storm安装及第一个vue.js
    android GPS: code should explicitly check to see if permission is available
    ASP.NET MVC Identity 使用自己的SQL Server数据库
    阿里云服务器,tomcat启动,一直卡在At least one JAR was scanned for TLDs yet contained no TLDs就不动了
    ASP.NET MVC4 MVC 当前上下文中不存在名称“Scripts”
    python 将windows字体中的汉字生成图片的方法
    Java android DES+Base64加密解密
  • 原文地址:https://www.cnblogs.com/twodog/p/12135415.html
Copyright © 2011-2022 走看看