原理图:mysql
mysql ab复制linux
A->B
master:
vim /etc/my.cnf
添加
log-bin=mysql-bin
server_id=1
show master status
grant replication slave on *.* to repl@'%' identified by 'repl'
mysql-bin.000001 position 111
重启mysql服务器sql
slave:
vim /etc/my.cnf
log-bin=mysql-bin
server_id=2vim
重启mysql服务器
CHANGE MASTER TO
MASTER_HOST='mysql-master-host',
MASTER_USER='repl',
MASTER_PASSWORD='repl',
MASTER_PORT=3306,
MASTER_LOG_FILE='当前二进制日志文件',
MASTER_LOG_POS=position,
MASTER_CONNECT_RETRY=10;后端
A->B OK
A<->B ?
A->B->C ?
A->B->C->A ?服务器
A->B
User1---insert--->A----->B
User1---insert--->B------>??????
ab复制
单向复制tcp
A<->B
User1---insert--->A----->B
User2---insert--->B----->A
疑问若是两个用户都DML同一条记录,那应该是A->B,仍是B->A????
双向复制ide
A->B->C
A->B
A->C
支持一主多从ui
A->B
C->B
不支持多主一从lua
对于已有数据的mysql服务器作ab复制
1.全库备份 --master-data=2 mysql-bin.xxxx position xxx2.从库导入主库备份
3.change master to mysql-bin.xxxx position xxx
问题:始终会浪费服务器
解决:告知应用DML操做连接主mysql,select操做连接从mysql
读写分离
mysql-proxy
Amoeba
mysql集群
mysql-cluster
MMM
mysql ab双向复制 + keepalived
grant replication slave on *.* to repl@'%' identified by 'repl';
总结:
前提:
ab复制的mysql server版本必须一致
主必须开启二进制日志
步凑:
master:
/etc/my.cnf
log-bin=mysql-bin 开启二进制日志
server_id=1设置服务器ID
mysql>grant replication slave on *.* to repl@'%' identified by 'repl';
mysql>show master status;
记住修改配置文件以后要重启mysql
slave:
/etc/my.cnf
log-bin=mysql-bin开启二进制日志
server_id=2设置服务器ID
记住修改配置文件以后要重启mysql
mysql>CHANGE MASTER TO
MASTER_HOST='mysql-master-host',master主机地址
MASTER_USER='repl',受权复制的用户
MASTER_PASSWORD='repl',密码
MASTER_PORT=3306,master端口
MASTER_LOG_FILE='mysql-bin.00001',当前二进制日志文件
MASTER_LOG_POS=111,从那个position开始
MASTER_CONNECT_RETRY=10;重试次数
mysql>start slave;
mysql>show slave status\G;
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
以上两个出现yes就算是完成ab复制的功能
验证:
可在主库上建立库,在从库上看是否有这个库生成
mysql-proxy 是一个mysql代理程序,主要目的实现mysql的读写分离
是经过lua脚原本实现
软件版本:mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz
这是一个通用的二进制安装包
1.解压,安装
tar -xvf mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz
mv mysql-proxy-0.8.5-linux-el6-x86-64bit /usr/local/mysql-proxy
chown root.root /usr/local/mysql-proxy -R
useradd mysql-proxy -s /sbin/nologin
2.设置
2.1因为二进制包中没有提供启动脚本因此须要自行编写启动,我这里已经为你们提供了一个启动脚本(启动脚本名称:mysql-proxy)
2.2修改lua脚本
vim /usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua
min_idle_connections = 1,
max_idle_connections = 1,
2.3添加mysql-proxy的配置文件
vim /etc/sysconfig/mysql-proxy
ADMIN_USER="admin"
ADMIN_PASSWORD="admin"
ADMIN_ADDRESS=""
ADMIN_LUA_SCRIPT="/usr/local/mysql-proxy/share/doc/mysql-proxy/admin.lua"
PROXY_ADDRESS=""
PROXY_USER="mysql-proxy"
PROXY_OPTIONS="--daemon --log-level=info --log-use-syslog --plugins=proxy --plugins=admin --proxy-backend-addresses=192.168.242.134:3306 --proxy-read-only-backend-addresses=192.168.242.135:3306 --proxy-lua-script=/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua"
#//--daemon:以守护进程模式启动mysql-proxy
#//--proxy-backend-addresses:后端可读写的mysql服务器的地址和端口
#//--proxy-read-only-backend-addresses:后端只读mysql服务器的地址和端口
#//--proxy-lua-script:完成mysql代理功能的Lua脚本
2.4启动mysql-proxy
/etc/init.d/mysql-proxy start
netstat -anutlp|grep mysql
2.5验证
因为须要在mysql-prxoy上面登陆mysql服务器因此须要安装一个mysql客户端,若是你不在proxy上登陆,那么mysql-proxy服务器连mysql客户端都不准要安装
在master上面建立一个用户
grant all on *.* to 'jack'@'%' identified by '123456'
flush privileges
登陆mysql-proxy的管理端
mysql -uadmin -padmin -h mysql-proxy-ip --prot 4041
这里的用户名和密码是启动脚本中设置的用户名和密码并不是mysql master所受权的用户
登陆mysql真实提供功能的服务器
mysql -ujack -p123456 -h mysql-proxy-ip --port 3306
而后在master上使用tcpdump抓包分析
tcpdump -i eth0 -nn -XX ip dst mysql-master-ip and tcp dst port 3306
在从服务器上也使用tcpdump抓包分析
tcpdump -i eth0 -nn -XX ip dst mysql-slave-ip and tcp dst port 3306
mysql -ujack -p123456 -h mysql-proxy-ip --port 3306
create database db_name能够看到数据在master上抓包了
select * from up01;能够看到数据在slave上抓包了
若是没有实现,请多开几个mysql-proxy的链接会话
并多执行几回select语句
能够在mysql-proxy的管理端上使用 select * from backends去查看后端相应信息 +-------------+----------------------+-------+------+------+-------------------+ | backend_ndx | address | state | type | uuid | connected_clients | +-------------+----------------------+-------+------+------+-------------------+ | 1 | 192.168.242.134:3306 | up | rw | NULL | 0 | | 2 | 192.168.242.135:3306 | up | ro | NULL | 0 | +-------------+----------------------+-------+------+------+-------------------+ 2 rows in set (0.00 sec) 若是不想写启动脚本就要用如下命令和参数去启动 /usr/local/mysql-proxy/libexec/mysql-proxy --daemon --log-level=info --log-use-syslog --plugins=proxy --plugins=admin --proxy-backend-addresses=192.168.242.134:3306 --proxy-read-only-backend-addresses=192.168.242.135:3306 --proxy-lua-script=/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua --pid-file=/var/run/mysql-proxy.pid --proxy-address= --user=mysql-proxy --admin-username=admin --admin-lua-script=/usr/local/mysql-proxy/share/doc/mysql-proxy/admin.lua --admin-password=admin