mysql主从复制和读写分离

MySQL读写分离的实现

mysql主从复制和读写分离_第1张图片

对比两种方式的读写分离效果——

  • 主从复制:客户机访问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数据库的版本一致,这里我们采用系统自带的版本,即

配置master主数据库

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主从复制和读写分离_第2张图片

##查看主数据库信息

mysql> show master status;

mysql主从复制和读写分离_第3张图片

配置slaver从数据库

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;

mysql主从复制和读写分离_第4张图片

测试

在主数据库上创建表并插入数据
(1)主数据库
这里写图片描述
这里写图片描述
这里写图片描述
mysql主从复制和读写分离_第5张图片

再从数据库上查看表和信息(实现了主从复制)
(2)从数据库
mysql主从复制和读写分离_第6张图片
mysql主从复制和读写分离_第7张图片
mysql主从复制和读写分离_第8张图片
mysql主从复制和读写分离_第9张图片

利用proxy实现读写分离

需要的语言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

配置proxy

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

mysql主从复制和读写分离_第10张图片

查看数据库
这里写图片描述
mysql主从复制和读写分离_第11张图片

向数据库插入数据
mysql主从复制和读写分离_第12张图片

##PS
观察主从库日志文件,发现查询发生在主库?
日志文件: tail -f /var/log/mysqld.log

这是因为 Mysql Proxy 代理会检测客户端连接,当连接没有超过min_idle_connections 预设值时,不会进行读写分离,即查询操作会发生到主库上。

这样就实现了mysql的读写分离

你可能感兴趣的:(运维,mysql)