MySQL中可以实现读写分离的插件有mysql-proxy / Mycat / Amoeba ,这些工具都可以实现效果,mysql-proxy是系统自带的一个插件,我们可以用它来进行操作实验
操作配置
读写分离的操作也是要基于主从复制,这里使用gtid的复制方式就可以,
如果之前有配置就先关闭mysqld服务,更改配置文件,清空/var/lib/mysql目录里的数据,重新进行安全初始化。
读写分离配置
这里我们配置的主机有三台,两台作为数据库主从复制,一个作为读,一个作为写,第三台主机作为porxy节点
mysql-porxy的下载地址:https://downloads.mysql.com/archives/proxy/
下载proxy的安装包解压拆分到 /usr/local/ 下
tar xfz mysql-proxy-0.8.5-linux-glibc2.3-x86-64bit.tar.gz -C /usr/local/
为了方便使用做一个软连接
需要注意的是mysql-proxy里面是没有带配置文件的,所以需要自行建立conf目录写入一个配置文件
配置文件的内容如下:
[mysql-proxy] #指定语句块
proxy-address=0.0.0.0:3306 #指定proxy访问的主机和端口,3306是一个对外的通用端口
proxy-backend-addresses=172.25.254.5:3306 #执行写主机的ip和端口
proxy-read-only-backend-addresses=172.25.254.7:3306 #指定读主机的ip和端口
proxy-lua-script=/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua #只当读写分离操作使用的lua文件路径
pid-file=/usr/local/mysql-proxy/log/mysql-proxy.pid #指定pid的存放路径
log-file=/usr/local/mysql-proxy/log/mysql-proxy.log #指定日志的存放路径
log-level=message #指定日志的等级
daemon=true #使用后台方式运行
keepalive=true #开启守护进程
plugins=proxy #指定使用的插件
保存后记着要创建 log 目录,还需要将配置文件的权限改为660
这里因为我们没有那么多测试主机,所以将lua脚本里原本启动机制的最小4个最大8个连接,改为1和2
运行mysql-proxy,查看日志是否运行正常
读写分离测试
proxy启动正常后,做测试还需要在主节点的数据库添加一个用用户授权他可以执行添加、查看、更新等远程操作
mysql> grant insert,update,select on *.* to testuser@'%' identified by 'He1234..';
mysql> FLUSH PRIVILEGES; #刷新授权表
mysql> use local #使用自己创建的数据库
mysql> create table users ( #在数据库里创建一个表格
-> username varchar(10) not null,
-> password varchar(10) not null );
使用访问测试主机去通过配置proxy的主机使用创建的远程用户登录MySQL,这里使用的测试登录的主机可以使用linux真机,或使用安装mariadb的虚拟机进行登录,
172.25.254.6上是我们配置proxy的主机
我们使用测试主机去同时连接3次查看数据库,在proxy的配置主机上使用命令: lsof -i:3306 ,查看3306接口的状态
[root@server6 mysql-proxy]# lsof -i:3306
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
mysql-pro 21517 root 10u IPv4 77924 0t0 TCP *:mysql (LISTEN)
mysql-pro 21517 root 11u IPv4 77932 0t0 TCP server6.hehe.com:mysql->172.25.254.4:59918 (ESTABLISHED) #第一次被172.25.254.4主机连接
mysql-pro 21517 root 12u IPv4 77933 0t0 TCP server6.hehe.com:52034->server5.hehe.com:mysql (ESTABLISHED) #寻找server5 MySQL的主节点
mysql-pro 21517 root 13u IPv4 78019 0t0 TCP server6.hehe.com:mysql->172.25.254.4:59920 (ESTABLISHED) #第二次连接
mysql-pro 21517 root 14u IPv4 78020 0t0 TCP server6.hehe.com:52036->server5.hehe.com:mysql (ESTABLISHED)
mysql-pro 21517 root 15u IPv4 78133 0t0 TCP server6.hehe.com:mysql->172.25.254.4:59922 (ESTABLISHED) #第三次连接
mysql-pro 21517 root 16u IPv4 78134 0t0 TCP server6.hehe.com:45020->server7.hehe.com:mysql (ESTABLISHED) #因为之前更改的配置两次请求以上就会开启读写分离,所以去寻找server7这台只读的数据库节点
读写分离的读访问测试完。我们来测试写
这里先去关闭server7上的主从复制,使它无法再从主节点server5上获取数据。然后我们在测试机的访问上写入数据是成功的,但是查看不到数据,因为读是访问的server7,而写是在server5上,所以在测试机上看不到写入的数据
#server7上停止主从复制
mysql> stop slave;
Query OK, 0 rows affected (0.14 sec)
#测试机写入数据,并查看数据
MySQL [local]> insert into users values ('user2','222');
Query OK, 1 row affected (0.08 sec)
MySQL [local]> select * from users;
+----------+----------+
| username | password |
+----------+----------+
| user1 | 111 |
+----------+----------+
1 row in set (0.00 sec)
#在server5上可以看到写入的数据
mysql> use local
Database changed
mysql> select * from users;
+----------+----------+
| username | password |
+----------+----------+
| user1 | 111 |
| user2 | 222 |
+----------+----------+
2 rows in set (0.00 sec)
这样我们就证明了实现了读写分离