MySQL主从复制与读写分离

原理:

使用MySQL官方提供的MySQL-Proxy来搭建读写分离:
MySQL-Proxy在客户端请求与数据库DB之间建立了一个连接池,
所有客户端请求都是发向MySQL-Proxy,
然后经由MySQL-Proxy进行相应的分析,
判断出是读操作还是写操作,
分发至对应的数据库DB上。

主数据库负责写操作,
从数据库负责读操作,
主从数据库利用MySQL的二进制日志文件,
实现数据同步,
二进制日志由主数据库产生,
从数据库响应并同步数据库。

本次以内网3台数据库为例:

内网18:192.168.40.18(mysql-proxy代理)

内网32:192.168.40.32(master主)

内网32:192.168.40.38(slave从)


1、主从复制:

vim /etc/my.cnf
修改主数据库配置文件

在[mysqld]里面增加:
server-id=32     # 设置主数据库的唯一id,默认是1
log-bin=mysql-bin # 启用二进制日志
binlog-ignore-db = mysql,information_schema  # 忽略写入binlog的库

systemctl restart mysqld
重启主数据库


vim /etc/my.cnf
修改从数据库配置文件

在[mysqld]里面增加:
server-id=38                # 设置从数据库唯一id
replicate-do-db = test_db   # 只同步主数据库的test_db库
slave-skip-errors = all     # 忽略因复制出现的所有错误

systemctl restart mysqld
重启从数据库


mysql -uroot -p
登录主数据库

GRANT REPLICATION SLAVE ON *.* TO 'test'@'192.168.40.38' IDENTIFIED BY 'abcdef123456';
在主数据库上建立slave帐户并授权

FLUSH PRIVILEGES;
刷新权限

show master status;
查看主数据库状态

FLUSH TABLES WITH READ LOCK;
主数据库锁表
防止有写入操作

quit;
退出


mysql -uroot -p
登录从数据库

mysql> change master to
 -> master_host='192.168.40.32',
 -> master_user='test',
 -> master_password='abcdef123456',
 -> master_log_file='mysql-bin.000045';
配置从数据库

start slave;
启动slave同步进程

show slave status\G
查看状态

quit;
退出

UNLOCK TABLES;
主数据库解锁

此时,
在主数据库创建test_db库,
在从数据库就能看见了。




2、安装mysql-proxy实现读写分离

wget https://cdn.mysql.com/archives/mysql-proxy/mysql-proxy-0.8.3-linux-glibc2.3-x86-64bit.tar.gz
下载通用版

tar zxvf mysql-proxy-0.8.3-linux-glibc2.3-x86-64bit.tar.gz
解压

mv mysql-proxy-0.8.3-linux-glibc2.3-x86-64bit /usr/local/mysql-proxy
移动

cd /usr/local/mysql-proxy
进入/usr/local/mysql-proxy目录

mkdir lua
创建脚本存放目录

mkdir logs
创建日志目录

cp share/doc/mysql-proxy/rw-splitting.lua ./lua
复制读写分离配置文件

cp share/doc/mysql-proxy/admin-sql.lua ./lua
复制管理脚本

vim /etc/mysql-proxy.cnf
创建配置文件:

[mysql-proxy]
daemon=true     
#以守护进程方式运行
user=root
#运行mysql-proxy用户
keepalive=true
#mysql-proxy崩溃时,尝试重启
admin-username=proxy
#主从mysql共有的用户
admin-password=zxcvbn123456
#主从mysql共有的用户的密码
proxy-address=192.168.40.18:4000
#mysql-proxy运行ip和端口,不加端口,默认4040
proxy-read-only-backend-addresses=192.168.40.38:3306
#指定后端从slave读取数据
proxy-backend-addresses=192.168.40.32:3306
#指定后端主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)

chmod 660 /etc/mysql-porxy.cnf
授权

vim /usr/local/mysql-proxy/lua/rw-splitting.lua
修改读写分离配置文件:
这一段:
if not proxy.global.config.rwsplit then
 proxy.global.config.rwsplit = {
  min_idle_connections = 1, # 默认超过4个连接数时,才开始读写分离,改为1
  max_idle_connections = 1, # 默认8,改为1
  is_debug = false
 }
end


vim /etc/profile
配置环境变量:

LUA_PATH="/usr/local/mysql-proxy/share/doc/mysql-proxy/?.lua"
export LUA_PATH
export PATH=$PATH:/usr/local/mysql-proxy/bin

source /etc/profile
使生效

mysql-proxy -V
查看版本

/usr/local/mysql-proxy/bin/mysql-proxy --defaults-file=/etc/mysql-proxy.cnf

(或者mysql-proxy --defaults-file=/etc/mysql-proxy.cnf

启动

netstat -tupln | grep 4000
查看4000端口

killall -9 mysql-proxy
停止mysql-proxy服务

(需要时才用到)



grant all on *.* to 'proxy'@'192.168.40.18' identified by 'zxcvbn123456';
在主数据库创建proxy用户用于mysql-proxy使用,
从数据库也会同步这个操作



mysql -u proxy -h 192.168.40.18 -P 4000 -pzxcvbn123456
在主或从数据库登录mysql-proxy

(或者用SQLyog客户端连接)

 

posted @ 2018-09-28 20:42  此生不换Yang  阅读(387)  评论(0编辑  收藏  举报