mysql数据读写分离:
把客户端访问数据库服务时的查询请求和写数据的请求给不同的数据库服务器处理。这里的数据读写分离是对数据
进行读写分离,指的是对数据的操作,对建库,建表是无意义的。
实现的效果:
在代理服务器上使用中间件maxscale,实现读写分离的相关的配置,从而使得客户端连接代理服务器的时候,在
实现查询的时候都在从库中查询,在写入数据的时候在主库中写入。
client43
mysql -h192.168.4.100 -u -p
MySQL>select ------->10
mysql>insert/delete/update ---->20
100 ----单点故障
代理服务器(服务) ----->配置i文件
读 写
select insert/delete/update
slave master
mysql42 mysql41
部署MySQL数据读写分离架构
主机41主库
从库42从库
代理服务器46
1 配置MySQL主从同步
要求把42配置为41的从库
配置主库41
启用binlog日志
用户授权
查看日志信息
配置从库42
验证授权
指定server_id
指定主库信息
查看从库状态
客户端验证主从同步配置
在主库添加访问数据的连接用户并设置密码
create database db12;
grant all on db12.* to yaya@"%" identified by "123456";
客户端连接主机 执行sql命令
在从库主机上可以看到同样的数据
mysql读写分离可以使用的中间件:mysql-proxy mycat maxscale
在主库上进行(给代理服务器授权)
[root@host41 ~]# mysql -uroot -p123456
mysql> grant replication slave,replication client on *.* to scalemon@"%" identified by "123456";
Query OK, 0 rows affected, 1 warning (0.04 sec)
mysql> grant select on mysql.* to maxscale@"%" identified by "123456";
Query OK, 0 rows affected, 1 warning (0.04 sec)
在从库上进行(验证从库上是否同步了主机的授权信息)
select user from mysql.user where user in ("scalemon","maxscale");
[root@host42 ~]# mysql -u root -p123456
mysql> select user from mysql.user where user in ("scalemon","maxscale");
+----------+
| user |
+----------+
| maxscale |
| scalemon |
+----------+
在主机46上部署代理服务,实现数据读写分离
[root@host46 ~]# rpm -ivh maxscale-2.1.2-1.rhel.7.x86_64.rpm
修改配置文件,并根据配置文件的设置在数据库服务器上添加对应的授权用户
[root@host46 ~]# cp /etc/maxscale.cnf /etc/maxscale.cnf.bak
[root@host46 ~]# vim /etc/maxscale.cnf
9 [maxscale] ----读写分离maxscale服务起来的名称
10 threads=auto -----maxscale服务运行的线程数量默认是1,auto是根据CPU的核心自动设置的线程数
指定数据库的服务器,有多少台数据库服务器就需要写几个这样的例子
18 [server1] ----数据库的名词
19 type=server --类型是服务器
20 address=192.168.4.41 ---服务器的IP地址
21 port=3306 ------指定IP地址
22 protocol=MySQLBackend -----指定协议是后端的数据库服务器
24 [server2]
25 type=server
26 address=192.168.4.42
27 port=3306
28 protocol=MySQLBackend
监控的mysql服务器是谁
35 [MySQL Monitor]
36 type=monitor
37 module=mysqlmon
38 servers=server1,server2 ----监控的服务器
39 user=scalemon ----用于连接数据库的用户和密码,该用户和密码需要在主从数据库添加相应用户和密码
40 passwd=123456
41 monitor_interval=10000
注释掉只读服务器,这主要是用来配置从库只能进行读不进行写的内容
47 #[Read-Only Service]
48 #type=service
49 #router=readconnroute
50 #servers=server1
51 #user=myuser
52 #passwd=mypwd
53 #router_options=slave
63 [Read-Write Service] -----读写分离在哪进行
64 type=service
65 router=readwritesplit ---脚本去进行读写分离
66 servers=server1,server2 ---说明读写分离是在这两个服务器上进行的
67 user=maxscale ----取验证自己接受到客户端的请求的时候,用的用户名和密码是否在读写分离数据库上存在
68 passwd=123456
69 max_slave_connections=100%
定义管理服务
75 [MaxAdmin Service]
76 type=service
77 router=cli
注释掉和上面只读服务器呼应的端口,这两种是匹配的。
80 #[Read-Only Listener]
81 #type=listener
82 #service=Read-Only Service
83 #protocol=MySQLClient
84 #port=4008
-提供读写分离的端口,对应上面的读写分离服务
91 [Read-Write Listener]
92 type=listener
93 service=Read-Write Service
94 protocol=MySQLClient
95 port=4006 -----可以改。但是要是1024以上的
-----主机的管理服务需要访问的端口,管理服务对应的端口
97 [MaxAdmin Listener]
98 type=listener
99 service=MaxAdmin Service
100 protocol=maxscaled
101 socket=default
102 port=4099 ---管理服务的时候可以访问的端口,可以更改
测试连接
[root@host46 ~]# mysql -uscalemon -p123456 -h192.168.4.41
[root@host46 ~]# mysql -uscalemon -p123456 -h192.168.4.42
[root@host46 ~]# mysql -umaxscale -p123456 -h192.168.4.42
[root@host46 ~]# mysql -umaxscale -p123456 -h192.168.4.41
启动服务
[root@host46 ~]# max
maxadmin maxbinlogcheck maxpasswd
maxavrocheck maxkeys maxscale
[root@host46 ~]# maxscale -f /etc/maxscale.cnf 启动服务命令
查看服务
[root@host46 ~]# ps -C maxscale ----查看进程
PID TTY TIME CMD
2891 ? 00:00:00 maxscale
[root@host46 ~]# ss -utnlp | grep maxscale --查看端口
tcp LISTEN 0 128 :::4099 :::* users:(("maxscale",pid=2891,fd=12))
tcp LISTEN 0 128 :::4006 :::* users:(("maxscale",pid=2891,fd=11))
测试配置
思路:采用maxscale的服务查看是否有主从库的信息,并使用客户端进行连接代理服务器,
为了方便的展示。我在从库上写了一条主库没有的信息,当我们进行读操作的时候。可以看到
从库多出来的信息,当对数进行改变操作的时候,可以看到主从中都有相关的信息。
在主机46上连接管理服务查看监控信息
[root@host46 ~]# maxadmin -uadmin -pmariadb -P4099
MaxScale> list servers
Servers.
-------------------+-----------------+-------+-------------+--------------------
Server | Address | Port | Connections | Status
-------------------+-----------------+-------+-------------+--------------------
server1 | 192.168.4.41 | 3306 | 0 | Master, Running
server2 | 192.168.4.42 | 3306 | 0 | Slave, Running
-------------------+-----------------+-------+-------------+-----------------
MaxScale> exit
在客户端连接46主机,访问数据时能否实现数据读写分离
实现查询的时候都在从库中查询,在写入数据的时候在主库中写入
[root@host41 ~]# mysql -uroot -p123456
mysql> select * from zhy;
+------+------+
| name | age |
+------+------+
| zhu | 12 |
+------+------+
1 row in set (0.00 sec)
[root@host42 ~]# mysql -u root -p123456
mysql> select * from zhy;
+------+------+
| name | age |
+------+------+
| zhu | 12 |
| hai | 22 |
+------+------+
2 rows in set (0.00 sec)
[root@room9pc01 ~]# mysql -h192.168.4.46 -P4006 -uyaya -p123456
MySQL [db12]> insert into zhy values("yan",12);
Query OK, 1 row affected (0.10 sec)
MySQL [db12]> select * from zhy;
+------+------+
| name | age |
+------+------+
| zhu | 12 |
| hai | 22 |
| yan | 12 |
+------+------+