MySqL的主从复制和读写分离

前面写过mysql数据库的读写分离是用 Amoeba来实现的,下面来用Mysql-proxy来实现一下

1、 MySqL数据库的主从复制

在主服务器上的操作

修改配置文件/etc/my.cnf(也不用修改的主要看下面所提到的是否一样)

# vim /etc/my.cnf

/修改: 

server-id = 1 (默认是1) 开启二进制日志定位到:log-bin 

log-bin=mysql-bin 这个也是默认开启的 修改完成后重新启动mysql服务 

# service mysqld restart

连接到mysql数据库创建用户并赋于复制的权限

mysql>GRANT REPLICATION CLIENT,REPLICATION SLAVE ON *.* TO repl@'172.16.%.%' IDENTIFIED BY '123456';

对从 服务器

vim /etc/my.cnf

修改:   

servier-id = 11   ## id号一定不能与主服务器的id号相同

关掉二进制日志

#log-bin=mysql-bin

添加如下内容:   ##这些是开启中继日志的

relay-log=relay-bin

relay-log-index=relay-bin.index

修改完成后重启一下服务

# service mysqld restart

好了,配置文件修改完成了,重启MySqL

因为主数据库上有数据,为了方便,可以把主mysql上的数据备份,然后把数据库清空只留下原始数据库(也就是刚安装好mysql后的数据库,然后全部备份下来,再导入从数据库中。这样做可以确保主从复制的准确性,也会防止数据在导入导出的时候不会出错。),然后继续下面的步骤。

在主从服务器上各自清空一下日志,也是同时用命令:

在主服务器上:mysql>flush master;

在从服务器上:mysql> flush slave;

这样做要使主从服务器的日志位于同一个结点,否则这样会易出错。

清空日志后就可以在从服务器上连接到主服务器上了

mysql>    CHANGE MASTER TO MASTER_HOST='172.16.35.1',MASTER_USER='repl',MASTER_PASSWORD='123456';

 

用命令:mysql> show slave status\G 来查看一下是否已经连接上

如果出现以下结果表明连接成功

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

如果有一个结果为No说明主从同步失败

失败的原因有多种:

最常见的情况分别是:

1、在主服务器上的用户可能出错

2、没有重新滚动一下主从服务器的日志,在连接前有必要重新滚动一下。

下面就可以测试了。

在主服务器上创建或者删除数据库、表,就可以同步到从服务器上了。

在从服务器上也可以查看到从服务器要比主服务器慢多少时间用命令:

mysql> show slave status\G

定位到:Second_Behind_Master0 0,表示时间说明没有延迟)

主从同步后就可以把前面备份的数据从主MySqL服务器上导入,这样从服务器会从主服务器上同步下来。数据导入之后就完成了。

 

 

 

 

 

 

下面来说一下MySqL的读写分离器MySql-Proxy

MySql Proxy是一个处于MySql Client端和MySql Server端之间的简单程序,它可以监测、分析或改变它们的通信。它使用灵活,没有限制,常见的用途包括:负载平衡、故障分析、查询过渡和修改等。MySqL Proxy就是这么一个中间层代理,简单地说,MySql Proxy就是一个连接池,负责将前台应用的连接请求转发给后台的数据库,并且通过使用Lua脚本,实现复杂的连接控制和过渡,从而实现读写分离和负载平衡。

对于应用来说,Mysql Proxy是完全透明的,应用则只是需要连接到MySql Proxy的监听端口即可。当然,这样Proxy机器可能成为单点失效,但完全可以使用多个Proxy机器作为冗余,在应用服务器的连接池配置中配置多个Proxy的连接参数即可。

MySql Proxy更强大的一项功能是实现“读写分离”,基本原理是让主数据库处理事务性查询,让从数据库处理SELECT查询,数据复制(Replication)用来把主库的变更同步到集群中的从库上。在生成MySqlM-S结构后,实现读写分离,需要使用MySql Proxy。目前MySql Proxy版本为0.8.2

MySql Proxy0.8.2安装步骤

先从官方地址http://dev.mysql.com/downloads/mysql-proxy/下载源码包。安装之前的先决条件如下:

# libevent1.x或者更高

#glib2 2.6.0或者更高

#lua5.1.x或者更高

#pkg-config

#libtool 1.5或者更高

#mysql5.0.x或者更高的开发库

 

root用户

yum install gcc gcc-c++ autoconf libtool pkgconfig ncurses ncurses-devel

\\\这些都要提前安装好。

安装libevent-2.0.13-stable.tar.gz

# tar zxvf libevent-2.0.13-stable.tar.gz

# cd libevent-2.0.13-stable

# ./configure

# make

# make install

安装glib-2.18.4.tar.gz

# tar zxvf glib-2.18.4.tar.gz

# cd glib-2.18.4

# make

# make install

安装:redline-6.1.tar.gz

# tar zxvf redline-6.1.tar.gz

# cd redline-6.1

# ./configure

# make

# make install

完成后,为了让动态链接库为系统所共享,运行ldconfig命令。

# ldconfig

# ldconfig -v

\\\这个是显示正在扫描的目录及搜索到的动态链接库,还有它所创建的连接的名字。

安装lua-5.1.4.tar.gz

tar zxvf lua-5.1.4.tar.gz

cd lua-5.1.4

make linux

make install

cp etc/lua.pc /usr/local/lib/pkgconfig/

export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig

安装mysql-proxy-0.8.2.tar.gz

tar zxvf mysql-proxy-0.8.2.tar.gz

cd mysql-proxy-0.8.2

./configure --prefix=/usr/local/mysql-proxy

make && make install

cp lib/rw-splitting.lua /usr/local/lib/

cp lib/admin.lua /usr/local/lib/

创建mysql-proxy的启动配置文件

vim /etc/mysql-proxy.cnf

文件内容如下:

[mysql-proxy]

admin-username = admin

admin-password = oreilly

admin-lua-script = /usr/local/lib/admin.lua

proxy-read-only-backend-addresses = 172.16.35.2  \\\只读数据库

proxy-backend-addresses = 172.16.35.1   \\\\读写数据库

proxy-lua-script = /usr/local/lib/rw-splitting.lua  \\\读写分离脚本

log-file = /var/log/mysql-proxy.log  \\\日志文件

log-level = debug

daemon = true

keepalive = true

修改这个文件的权限为660否则无法启动。

# chmod 660 /etc/mysql-proxy.cnf

修改读写分离脚本,让测试更容易。

Lua脚本默认最小4个最大8个以上的客户连接才会实现读写分离(这是因为Mysql Proxy会检测客户端连接,当连接没有超过min_idle_connections预设的值时,不会进行读写分离,即查询操作会发生到Master上),现改为最小1个,最大2

vim /usr/local/lib/rw-splitting.lua

修改:

min_idle_connections = 1,

max_idle_connections = 2,

启动:

/usr/local/mysql-proxy/bin/mysql-proxy -P 172.16.35.2:8066 --proxy-fix-bug-25371 --defaults-file=/etc/mysql-proxy.cnf

 

#mysql-proxy选项说明

可以用 mysql-proxy –help-all来查看

管理功能选项:

--admin-address=host:port指定一个mysql-proxy的管理端口,默认是4041

--admin-username= username to allow to log in

--admin-password=password to allow to log in

--admin-lua-script=script to execute by the admin plugin

代理功能选项:

-P ,--proxy-address=mysql-proxy服务器的监听端口,默认是4040

-r--proxy-read-only-backend-addresses=只读Slave的地址和端口,默认为不设置。

-b--proxy-backend-addresses=远程Master地址和端口,可设置多个failoverload balance

--proxy-skip-profiling关闭查询分析功能,默认是打开的

--proxy-fix-bug-25371修正mysqllibmysql版本大于5.1.12的一个#25371Bug

-s--proxy-lua-script=指定一个Lua脚本控制mysql-proxy的运行和设置,这个脚本在每次新建连接和脚本发生修改时将重新调用。

其他选项:

--defaults-file=配置文件,可以把mysql-proxy的参数信息置入配置文件里,这样做比较方便。

--daemon mysql-proxy 以守护进程的方式运行。

--pid-flie=file设置mysql-proxy的存储PID文件的路径。

--keepalive try to restart the proxy if it crashed,保持连接启动进程会有2 个,一号进程用来监视二号进程,如果二号进程死掉自动重启Proxy,这是新版MySql Proxy 增加的Keepalived功能,它修正了以前的Mysql Proxy容易死掉的bug 开启此功能。

 

 

 

以上就是MysqL Proxy的全部过程。