Rootop 服务器运维与web架构

配置mysql实现读写分离

| 暂无评论

环境信息:
mysql_master centos6.5_x64 ip:192.168.0.75
mysql_slave    centos6.5_x64 ip:192.168.0.76
mysql_proxy  centos6.5_x64 ip:192.168.0.77

selinux iptables 关闭
mysql_master 和 mysql_slave 做主从复制,过程略过。
可参考:https://www.rootop.org/pages/1503.html
mysql_proxy 代理,将写操作分到mysql_master,读操作分到mysql_slave。

 mysql_proxy 配置:

mysql-proxy的读写分离是通过 rw-splitting.lua 脚本实现的,因此需要安装lua开发语言。
目前最新版下载:http://www.lua.org/ftp/lua-5.2.3.tar.gz

[root@localhost ~]# yum install -y gcc gcc-c++ libedit libedit-devel libtermcap-devel ncurses-devel libevent-devel readline-devel
[root@localhost ~]# wget -c http://www.lua.org/ftp/lua-5.2.3.tar.gz
[root@localhost ~]# tar zxvf lua-5.2.3.tar.gz
[root@localhost ~]# cd lua-5.2.3
[root@localhost ~]# make linux
[root@localhost ~]# make install

下载mysql_proxy,目前最新版本 mysql-proxy-0.8.4,处于某些因素,推荐采用已经编译好的二进制版本
[root@localhost ~]# wget -c http://cdn.mysql.com/Downloads/MySQL-Proxy/mysql-proxy-0.8.4-linux-glibc2.3-x86-64bit.tar.gz
[root@localhost ~]# tar zxvf mysql-proxy-0.8.4-linux-glibc2.3-x86-64bit.tar.gz
[root@localhost ~]# mv mysql-proxy-0.8.4-linux-glibc2.3-x86-64bit /usr/local/mysql_proxy

复制读写分离脚本:
[root@localhost ~]# mkdir /usr/local/mysql_proxy/scripts
[root@localhost ~]# cp /usr/local/mysql_proxy/share/doc/mysql-proxy/rw-splitting.lua /usr/local/mysql_proxy/scripts                                                                                                

编辑rw-splitting.lua:
[root@localhost ~]# vi /usr/local/mysql_proxy/scripts/rw-splitting.lua

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

当会话数达到最小为4时,才会进行读写分离。改为1,直接读写分离。

编辑代理配置文件(手动创建):
[root@localhost ~]# vi /usr/local/mysql_proxy/proxy.conf
[mysql-proxy]
admin-username=root
admin-password=root

admin-lua-script=/usr/local/mysql_proxy/lib/mysql-proxy/lua/admin.lua #定义管理脚本路径
proxy-read-only-backend-addresses=192.168.0.76 #读服务器地址,如果有多个的话,以逗号分开。
proxy-backend-addresses=192.168.0.75 #写服务器地址
proxy-lua-script=/usr/local/mysql_proxy/scripts/rw-splitting.lua #读写分离脚本路径
log-file=/var/log/mysql-proxy.log
log-level=debug
daemon=true
keepalive=true #启动两个进程,互相监视,提高可靠性。

[root@localhost mysql_proxy]# chmod 660 /usr/local/mysql_proxy/proxy.conf #改为660权限,否则启动报错。
启动代理:

 [root@localhost ~]#/usr/local/mysql_proxy/bin/mysql-proxy -P 192.168.0.77:3306 --defaults-file=/usr/local/mysql_proxy/proxy.conf

代理监听占用4040端口,但是为了方便php连接,通过-P将其代理监听为3306。
[root@localhost ~]# lsof -i:3306
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
mysql-pro 1924 root 10u IPv4 15349 0t0 TCP 192.168.0.77:mysql (LISTEN)

开启mysql主、从的允许远程连接:
mysql>use mysql;
mysql> grant all privileges on *.*to ‘root’@’%’ identified by ‘root’ with grant option;
mysql> flush privileges;

读写分离测试:
想达到测试效果,先停掉mysql slave的复制功能
我这里windows下装了mysql,通过mysql的-h参数远程连接 mysql-proxy 执行操作。

声明:因为之前配置好mysql主从复制,那么这里直接用 venus 库为测试数据库,venus_tab为测试表名。
首先在主库的 venus 库创建表 venus_tab ,因为主从同步现在已经被手动停止了,所以从库也需要创建 venus_tab 表,语句为:
create table venus_tab(id int,name varchar(40),birthday date);

windows mysql客户端执行:

C:\Program Files\MySQL\MySQL Server 5.6\bin>mysql -uroot -proot -h192.168.0.77 -e “Insert into venus.venus_tab values(6,’fff’,19991212);”
Warning: Using a password on the command line interface can be insecure.

去主库中查询:
mysql> select * from venus.venus_tab;
+——+——+————+
| id | name | birthday |
+——+——+————+
| 2 | bbb | 1999-12-12 |
| 1 | aaa | 1999-12-12 |
| 3 | ccc | 1999-12-12 |
| 4 | d | 1999-12-12 |
| 5 | eee | 1999-12-12 |
| 6 | fff | 1999-12-12 |
+——+——+————+
6 rows in set (0.00 sec)

发现数据插入。

从mysql proxy查询数据:
C:\Program Files\MySQL\MySQL Server 5.6\bin>mysql -uroot -proot -h192.168.0.77 -e “select * from venus.venus_tab;”
Warning: Using a password on the command line interface can be insecure.
+——+——+————+
| id | name | birthday |
+——+——+————+
| 2 | bbb | 1999-12-12 |
| 1 | aaa | 1999-12-12 |
| 3 | ccc | 1999-12-12 |
| 4 | d | 1999-12-12 |
+——+——+————+
发现查询没有数据,这是因为主从停掉的原因(去从库查询也没有数据)。

现在用discuz正式测试一下:
编辑主从mysql配置文件,否则客户端查询会出现乱码,添加:
[mysqld]
default-character-set=utf8 #默认编码
init_connect=’SET NAMES utf8′ #连接使用的编码
skip-character-set-client-handshake #忽略客户端字符集

[client]
default-character-set=utf8

启动mysql的主从复制,清空主、从的 venus 库。
在master中解压discuz,开始安装。为了方便,这里直接用设置好同步的venus库。
先指定连接数据库名称为venus,mysql的ip为master的ip,数据会自行同步到slave中。
安装完成后修改数据库ip为mysql proxy的ip,访问没问题。发表新帖,测试通过。

原创文章,转载请注明。本文链接地址: https://www.rootop.org/pages/2413.html

作者:Venus

服务器运维与性能优化

发表回复