mysql 读集群_mysql集群搭建(一、读写分离)

@(MySQL系类)[mysql集群搭建]

mysql集群搭建(读写分离)

简介

当今MySQL使用相当广泛,随着用户的增多以及数据量的增大,高并发随之而来。然而我们有很多办法可以缓解数据库的压力。分布式数据库、负载均衡、读写分离、增加缓存服务器等等。这里我们将采用读写分离技术进展缓解数据库的压力。

其中实现读写分离的技术有很多方法,这里我们将采用mysql-proxy这个中间软件来实现。这个软件中含有一个读写分离的lua文件,这也是我们使用mysql-proxy实现读写分离必用的文件,它需要lua解析器进行解析。因此我们还需要安装一个lua解析器。

环境准备

三台Linux虚拟机

linux版本centos6.5 mysql5.5

mysql-proxy-0.8.5

lua-5.1.4

servicename: node1(写) node2(读) node3(mysql-proxy)

数据库配置

主从复制

一般Linux中的MySQL配置文件都在/etc/my.cnf(windows中的配置文件为mysql.ini)

log-bin=mysql-bin 开启二进制日志

注意:二进制日志必须开启,因为数据的同步实质上就是其他的MySQL数据库服务器将这个数据变更的二进制日志在本机上再执行一遍。

node1 为主服务器

[mysqld]

log-bin=mysql-bin

server-id=1

node2 为从服务器

[mysqld]

log-bin=mysql-bin

server-id=2

开始构建主从服务器

第一步:

在node1上创建一个node2可以登陆的账号

用户名:mysql2

密码:mysql2

msyql > GRANT REPLICATION SLAVE ON *.* TO ‘mysql2’@’node2’ IDENTIFIED BY ‘mysql2’;

msyql > FLUSH PRIVILEGES;

第二步:

查看node1msyql服务器的二进制文件与位置

msyql > show master status;

#在file和position中的两个字段

第三步:

告知二进制文件名与位置

在node2中执行:

mysql>CHANGE MASTER TO

>MASTER_HOST=’node1’,

>MASTER_USER=’mysql2’,

>MASTER_PASSWORD=’mysql2’,

>MASTER_LOG_FILE=’mysql-bin.000048’,

>MASTER_LOG_POS=432;

完成主从配置

测试主从复制

在node2中

mysql > slave start; #开启主从复制

mysql > show slave status\G #查看主从复制

在显示的字段中

Master_Host: node1 #master的ip

Master_log_File: mysql-bin.000048 #文件位置

Read_master_log_Pos: 432

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

当看到Slave_IO_Running: YES、Slave_SQL_Running: YES才表明状态正常

这里可以创建一个测试库看看是否同步过去

主从复制工作原理

(1) master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件。binary log events);

(2) slave将master的binary log events复制到它的中继日志(relay log)。

(3) slave重做中继日志中的事件,将改变反映它自己的数据。

主主复制

实现原理

主主复制即在两台MySQL主机内都可以变更数据,而且另外一台主机也会做出相应的变更。聪明的你也许已经想到该怎么实现了。对,就是将两个主从复制有机合并起来就好了。只不过在配置的时候我们需要注意一些问题,例如,主键重复,server-id不能重复等等。

配置文件

node1

server-id=11 #任意自然数n,只要保证两台MySQL主机不重复就可以了。

log-bin=mysql-bin #开启二进制日志

auto_increment_increment=2 #步进值auto_imcrement。一般有n台主MySQL就填n

auto_increment_offset=1 #起始值。一般填第n台主MySQL。此时为第一台主MySQL

binlog-ignore=mysql #忽略mysql库【我一般都不写】

binlog-ignore=information_schema #忽略information_schema库【我一般都不写】

replicate-do-db=aa #要同步的数据库,默认所有库

node2

server-id=12

log-bin=mysql-bin

auto_increment_increment=2

auto_increment_offset=2

replicate-do-db=aa

重启

开始构建主主复制

因为主主复制是两个主从复制组合一起,所以我就接着上面主从复制接着配置。

第一步:

在node2上创建一个node1上可以登陆的用户

用户:mysql11

密码:mysql11

mysql>GRANT REPLICATION SLAVE ON *.* TO ‘mysql11’@’node1’ IDENTIFIED BY ‘mysql11’;

mysql>FLUSH PRIVILEGES;

第二步:

在node2查看二进制日志名和位置

mysql>show master status;

第三步:

告知二进制文件名与位置

在node1中执行:

mysql>CHANGE MASTER TO

MASTER_HOST=’node2’,

MASTER_USER=’mysql11’,

MASTER_PASSWORD=’mysql11’,

MASTER_LOG_FILE=’mysql-bin.000084’,

MASTER_LOG_POS=107;

完成主主复制配置*

测试主主复制

分别开启slave start;

mysql>SHOW SLAVE STATUS\G #查看主从复制是否配置成功

注意:

1、主主复制配置文件中auto_increment_increment和auto_increment_offset只能保证主键不重复,却不能保证主键有序。

2、当配置完成Slave_IO_Running、Slave_SQL_Running不全为YES时,show slave status\G信息中有错误提示,可根据错误提示进行更正。

3、Slave_IO_Running、Slave_SQL_Running不全为YES时,大多数问题都是数据不统一导致。

常见出错:

1、两台数据库都存在db数据库,而第一台MySQL db中有tab1,第二台MySQL db中没有tab1,那肯定不能成功。

2、已经获取了数据的二进制日志名和位置,又进行了数据操作,导致POS发生变更。在配置CHANGE MASTER时还是用到之前的POS。

3、stop slave后,数据变更,再start slave。出错。

更正法:重新执行一遍CHANGE MASTER就好了。

安装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。

# 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"

安装mysql-proxy

1、首先查看linux版本确认是32位还是64为系统

下载地址:https://downloads.mysql.com/archives/proxy/

查看linux内核版本

cat /etc/issue

查看linux版本

cat /proc/version

# 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

mysql读写分离测试

1、修改rw-splitting.lua文件

修改默认连接,进行快速测试,不修改的话要达到连接数为4时才启用读写分离

#cp /usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua ./

vim rw-splitting.lua

--- config

--

-- 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

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'@'node3' 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中都创建了这个用户】

可以使用任意ip客户端端登陆这个账号

在node3登陆:

# ./mysql -u proxy1 -P4040 -h192.168.95.13 –p

创建数据库

use aa

insert into tab1(name) values("proxy111");

insert into tab1(name) values("proxy222");

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

结果表明:账号使用

5、关闭node2 mysql的主从复制

mysql > stop slave;

6、证明写分离

使用proxy1@node3账号打开多个客户端进行插入数据

打开三个mysql客户端分别插入2条数据:

mysql> insert into tab1 (name) values('stop_slave11111');

….

mysql> insert into tab1 (name) values('stop_slave6666’);

查看:

分别登陆node1 mysql与node2 mysql查看表中的数据

select * from tab1;

若node1有数据而node2中没有数据则证明写分离

7、证明读分离

使用proxy1@node3账号登陆mysql,查看tab1中的数据

mysql>use aa;

mysql>select*from tab1;

若没有数据刚刚才插入的数据则,证明读分离。

脚本

为了方便启动与管理mysql-proxy可以创建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=/usr/local/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.95.12:3306 --proxy-backend-addresses=192.168.95.11:3306 --proxy-lua-script=/usr/local/mysql-proxy/rw-splitting.lua"

PROXY_PID=/usr/local/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=/usr/local/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

#---我将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日志文件路径

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值