一、数据读写分离
1.1 什么是数据读写分离?把客户端访问数据时的查询请求和写请求分别给不同的数据库服务器处理。
1.2 为要对数据做读写分离?
减轻单台数据库服务器的并发访问压力
提高数据库服务器硬件利用率
1.3 实现数据读写分离的方式?
人肉分离: 做不同的数据操作时,访问指定的数据库服务器
使用mysql中间件提供的服务实现:mycat mysql-proxy maxscale
1.4 使用中间件提供的服务做数据读写分离的缺点?
单点故障
当访问量大时,会成为网络瓶颈

二、配置数据读写分离
2.1 拓扑结构 webuser 123456
       

client(192.168.4.12)mysql  -h192.168.4.56  -u用户名    -p密码
                    |
            代理服务器(192.168.4.13)
                    |
__________|________________________
   write                                 read
     |                                           |
  master                               slave
192.168.4.10                      192.168.4.11

2.2 配置数据读写分离
2.2.1 配置一主一从 主从同步结构,并在客户端测试配置(之前文档中有主从搭建方法这儿就不赘述了)。
2.2.2 配置数据读写分离服务器
2.2.2.1环境准备

setenforce  0
systemctl  stop  firewalld
yum repolist
ping  -c  2  192.168.4.10
ping  -c  2  192.168.4.11


2.2.2.2 安装maxscale
MaxScale 是 Mysql 的兄弟公司 MariaDB 开发的,下载地址 https://downloads.mariadb.com/files/Ma
xScale,主配置文件 /etc/maxscale.cnf。
[root@maxscale ~]# rpm -ivh maxscale-2.1.2-1.rhel.7.x86_64.rpm
2.2.2.3 配置数据读写分离服务器13

[root@maxscale ~]# rpm -qa  | grep maxscale
maxscale-2.1.2-1.x86_64
[root@maxscale ~]# rpm -qc  maxscale
/etc/maxscale.cnf.template


2.2.2.4 修改配置文件

ls /etc/maxscale.cnf
/etc/maxscale.cnf
[root@maxscale ~]#cp /etc/maxscale.cnf   /etc/maxscale.cnf.bak
[root@maxscale ~]# vim   /etc/maxscale.cnf
[maxscale]
threads=1  #服务运行后开启线程的数量
#定义数据库服务器
[server1]
type=server
address=192.168.4.10
port=3306
protocol=MySQLBackend[server2]
type=server
address=192.168.4.11
port=3306
protocol=MySQLBackend
#定义监控的数据库服务器
[MySQL Monitor]
type=monitor
module=mysqlmon
servers=server1,server2
user=scalemon #监视数据库服务器时连接的用户名
passwd=123456 #密码
monitor_interval=10000
#不定义只读服务
#[Read-Only Service]
#type=service
#router=readconnroute
#servers=server1
#user=myuser
#passwd=mypwd
#router_options=slave
#定义读写分离服务
[Read-Write Service]
type=service
router=readwritesplit
servers=server1,server2
user=maxscale    #验证连接代理服务访问数据库服务器的用户是否存在
passwd=123456
max_slave_connections=100%
#定义管理服务
[MaxAdmin Service]
type=service
router=cli
#不指定只读服务使用的端口号
#[Read-Only Listener]
#type=listener
#service=Read-Only Service
#protocol=MySQLClient
#port=4008
#定义读写分离服务使用的端口号
[Read-Write Listener]
type=listener
service=Read-Write Service
protocol=MySQLClient
port=4006
#定义管理服务使用的端口
[MaxAdmin Listener]
type=listener
service=MaxAdmin Service
protocol=maxscaled
socket=default
port=4018   #不设置使用的默认端口

2.2.2.5 根据配置文件做相应的设置(在2台数据库服务器上添加用户)
监控数据库服务器时,连接数据库服务器的用户(创建监控用户):

mysql> grant  replication  slave, replication client   on *.*  to  scalemon@'%'    identified by   "123456";
创建路由用户:
mysql> grant select on mysql.* to maxscale@'%' identified by “123456”; 
创建访问数据用户:
mysql> grant  all  on  *.*  to  student@'%'  identified  by  "123456"; 
查看用户情况mysql> select user,host from mysql.user;
+-----------+--------------+
| user           | host         |
+-----------+--------------+
| maxscale    | %            |
| scalemon   | %            |
| student      | %            |
+----------+--------------+


2.2.2.6 启动服务

[root@maxscale ~]#  maxscale  -f  /etc/maxscale.cnf
查看服务进程和端口
[root@maxscale ~]#  maxscale  -f  /etc/maxscale.cnf
[root@maxscale ~]#  netstat -utnlp  | grep :4006
tcp6       0      0 :::4006                 :::*                    LISTEN      8536/maxscale       
[root@maxscale ~]# netstat -utnlp  | grep :4018
tcp6       0      0 :::4018                 :::*                    LISTEN      8536/maxscale 
[root@maxscale ~]# ps -C maxscale
  PID TTY          TIME CMD
 8536 ?        00:00:00 maxscale
停止服务
[root@maxscale ~]# kill -9 8536


2.2.3 测试配置
模板:连接 MySQL 代理服务器
在代理本机连接管理端口
– maxadmin -uadmin -pmariadb -p 端口
连接 MySQL 代理服务器
– mysql -h 代理的 IP 地址 -P 端口 -u 用户名 -p 密码
测试 SQL 查询、更新操作
– 可成功查询表记录
– 可成功写入数据
A :在本机访问管理管端口查看监控状态

[root@maxscale ~]#  maxadmin  -P4018  -uadmin  -pmariadb
MaxScale> list servers
Servers.
-------------------+-----------------+-------+-------------+--------------------
Server             | Address         | Port  | Connections | Status              
-------------------+-----------------+-------+-------------+--------------------
server1            | 192.168.4.10    |  3306 |           0 | Master, Running
server2            | 192.168.4.11    |  3306 |           0 | Slave, Running
-------------------+-----------------+-------+-------------+--------------------
MaxScale> exit

B:客户端访问数据读写分离服务器

[root@client ~]# mysql -h192.168.4.13 -P4006 -ustudent -p123456
mysql> select @@hostname;
+------------+
| @@hostname |
+------------+
| slave1     |
+------------+
1 row in set (0.01 sec)