对比两种方式的读写分离效果——
主从复制:客户机访问Master服务器来写数据库,客户机访问Slave服务 器来读数据库。这种情况下,需要客户端自行区分向何处写、从何处读。
MySQL主从复制+代理:客户机访问Proxy服务器,读、写请求交给Proxy识别,如果是写数据库操作则交给Master,如果是读数据库操作则交给Slave处理,具体由分配策略控制。这种情况下,无需客户端区分读、写目标,而是由Proxy服务器代劳了,从而降低了客户端程序的复杂度。
redhat 6.5
selinux=disabled
火墙关闭
主数据库:172.25.60.1
从数据库:172.25.60.2
proxy代理端:172.25.60.3
首先要确保主从服务器的mysql数据库的版本一致,这里我们采用系统自带的版本,即
yum install mysql-server -y ##下载数据库
mysql_secure_installation ##数据库初始化
##配置主配置文件,启动二进制日志
vim /etc/my.cnf(配置完成后,重启服务)
[mysqld]
server-id=1 ##服务器默认ip,我这里取了IP最后一位
log-bin=mysql-bin ##开启二进制日志
read-only=0 ##由于是主数据库,可以读写
binlog-do-db=test ##需要同步的数据库名称
binlog-ignore-db=mysql ##禁止同步的数据库名称
/etc/init.d/mysqld restart ##重启服务
##在主服务器上建立帐户并授权slave
[root@server1 ~]# mysql -uroot -p
Enter password:
mysql> grant replication slave on *.* to 'backup'@'172.25.60.2' identified by 'westos';
mysql> flush privileges;
##查看二进制日志是否开启
mysql> show variables like 'log_%';
##查看主数据库信息
mysql> show master status;
yum install mysql-server -y ##下载数据库
mysql_secure_installation ##数据库初始化
##配置主配置文件
vim /etc/my.cnf(配置完成后,重启服务)
[mysqld]
server-id=2 ##服务器默认ip,不能与mater相同
read-only ##只读设置
/etc/init.d/mysqld restart ##重启服务
##配置从服务器Slave
[root@server2 ~]# mysql -uroot -p
Enter password:
mysql> change master to master_host='172.25.60.1',master_user='backup',master_password='westos',master_log_file='mysql-bin.000001',master_log_pos=189;
##这里配置要与主数据库信息一致
##master_host 主数据库主机
##master_user 主数据库用户
##master_password 密码
##master_log_file 二进制日志
##master_log_pos pos
mysql> start slave; ##开启服务
##查看从数据库的信息
mysql> show slave status\G;
需要的语言lua
yum install lua -y
下载地址:https://downloads.mysql.com/archives/get/file/mysql-proxy-0.8.5-linux-el6-x86-32bit.tar.gz
mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz
tar zxf mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz ##解压
ln -s /mnt/mysql-proxy-0.8.5-linux-el6-x86-64bit/ /usr/local/mysql-proxy ##创建软链接
useradd -u 1000 -s /sbin/nologin -M -d /usr/local/mysql-proxy/ mysql ##创建mysql用户
chmod 755 -R /usr/local/mysql-proxy/ mysql-proxy/ ##设置权限
chown mysql.mysql -R /usr/local/mysql-proxy/ mysql-proxy/ ##更改权限
vim /et/profile
LUA_PATH="/usr/local/mysql-proxy/share/doc/mysql-proxy/?.lua"
export LUA_PATH
export PATH=$PATH:/usr/local/mysql-proxy/bin
主数据库:
mysql> grant all on *.* to 'proxy'@'172.25.60.3' identified by 'westos';
从数据库:
mysql> grant all on *.* to 'proxy'@'172.25.60.3' identified by 'westos';
vim mysql-proxy.sh
./mysql-proxy.sh ##启动proxy服务
#!/bin/bash
mysql-proxy \
--daemon \
--log-level=debug \
--log-file=/var/log/mysql-proxy.log \
--plugins=proxy -b 172.25.60.1:3306 -r 172.25.60.2:3306 \ ##-b(backend)主库写的ip -r(read-only)只读的从库的ip
--proxy-lua-script="/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua" \ ##rw-splitting.lua读写分离脚本
--plugins=admin \
--admin-username="proxy" \
--admin-password="westos" \
--admin-lua-script="/usr/local/mysql-proxy/share/doc/mysql-proxy/admin.lua"
客户端主机:
[root@foundation60 ~]# mysql -h172.25.60.3 -P4040 -uproxy -pwestos
##PS
观察主从库日志文件,发现查询发生在主库?
日志文件: tail -f /var/log/mysqld.log
这是因为 Mysql Proxy 代理会检测客户端连接,当连接没有超过min_idle_connections 预设值时,不会进行读写分离,即查询操作会发生到主库上。
这样就实现了mysql的读写分离