当前位置:   article > 正文

Mariadb读写分离(ProxySQL)

mariadb读写分离

读写分离原理

当用户在发送请求数据时,请求经过中间件,中间件将请求中的读和写操作分辨。将读请求发送给后端的从服务器;将写请求发送给后端的主服务器,然后主服务器通过主从复制将数据复制给其他从服务器;

实验环境

  1. 主机 ip地址
  2. Master 192.168.14.210
  3. Slave 192.168.14.211
  4. Client 192.168.14.212
  5. ProxySQL 192.168.14.213

注意事项:ProxySQL在实现读写分离之前先要实现主从复制的共功能;主从复制时从节点在配置文件中必须要设置read_only,这是ProxySQL区分是用来作为读服务器还是写服务器的依据;

一、实现主从复制

1、查看文章https://blog.csdn.net/tladagio/article/details/103137845

二、ProxySQL配置读写分离

1、添加yum源

  1. [root@proxysql ~]# vi /etc/yum.repos.d/proxysql.repo
  2. [proxysql_repo]
  3. name= ProxySQL YUM repository
  4. baseurl=http://repo.proxysql.com/ProxySQL/proxysql-1.4.x/centos/\$releasever
  5. gpgcheck=1
  6. gpgkey=http://repo.proxysql.com/ProxySQL/repo_pub_key

2、安装ProxySQL和mariadb客户端

[root@proxysql ~]# yum install -y proxysql mariadb

3、启动ProxySQL服务

  1. [root@proxysql ~]# systemctl start proxysql
  2. [root@proxysql ~]# firewall-cmd --permanent --zone=public --add-port=6032/tcp
  3. [root@proxysql ~]# firewall-cmd --permanent --zone=public --add-port=6033/tcp
  4. [root@proxysql ~]# firewall-cmd --reload

ProxySQL所使用的端口为6032和6033
6032:用来配置ProxySQL,是个管理接口
6033:用来被远程用户连接端口

4、连接管理端口

  1. [root@proxysql ~]# mysql -uadmin -padmin -P6032 -h127.0.0.1
  2. Welcome to the MariaDB monitor. Commands end with ; or \g.
  3. Your MySQL connection id is 1
  4. Server version: 5.5.30 (ProxySQL Admin Module)

5、将MySQL主从服务器信息添加入mysql_servers表中

先将主从服务器存放在同一组内,等指定好读写规则后,系统会根据配置文件中的read-only值自动将其分别添加至读组和写组。

  1. MySQL [(none)]> INSERT INTO mysql_servers(hostgroup_id,hostname,port) VALUES (10,'192.168.14.210',3306);
  2. MySQL [(none)]> INSERT INTO mysql_servers(hostgroup_id,hostname,port) VALUES (10,'192.168.14.211',3306);
  3. MySQL [(none)]> select * from mysql_servers;

6、在MySQL服务器的主节点(192.168.14.210)上为ProxySQL添加账号用来查看MySQL节点是主还是从

[root@master ~]# mysql -e "GRANT REPLICATION SLAVE ON *.* TO 'monitor'@'192.168.14.%' IDENTIFIED BY 'centos';"  

7、在Proxy上配置监控账号

  1. MySQL [(none)]> SET mysql-monitor_username='monitor';
  2. MySQL [(none)]> SET mysql-monitor_password='centos';

8、配置加载至内存,将配置保存至磁盘

  1. MySQL [(none)]> LOAD MYSQL VARIABLES TO RUNTIME;
  2. MySQL [(none)]> SAVE MYSQL VARIABLES TO DISK;

9、测试,查看连接状态

MySQL [(none)]> select * from mysql_server_connect_log;

10、设置读写分组

  1. MySQL [(none)]> INSERT INTO mysql_replication_hostgroups VALUES(10,20,"test");
  2. MySQL [(none)]> SELECT * FROM mysql_replication_hostgroups;

11、让读写表生效

MySQL [(none)]> LOAD MYSQL SERVERS TO RUNTIME;

12、查看mysql_server表此时已经将服务器分组

MySQL [(none)]> SELECT * FROM mysql_servers;

13、保存配置至磁盘

MySQL [(none)]> SAVE MYSQL SERVERS TO DISK;

至此读写分离配置完毕,接下来需要定义读写分离的规则

三、定义读写分离规则

1、在主节点(192.168.14.210)上创建一个账户让客户端连接调度器去访问主从服务器(此处授予的权限较大,实际生产中可以根据需要定义指定的那张表)

[root@master ~]# mysql -e "GRANT ALL ON *.* TO 'sqluser'@'192.168.14.%' IDENTIFIED BY 'centos';"

2、在ProxySQL服务器上,将sqluser用户添加至mysql_users表中

MySQL [(none)]> INSERT INTO mysql_users(username,password,default_hostgroup) VALUES ('sqluser','centos',10);

3、查看mysql_user表信息

MySQL [(none)]> SELECT * FROM mysql_users;

4、生效存盘

  1. MySQL [(none)]> load mysql users to runtime;
  2. MySQL [(none)]> SAVE MYSQL USERS TO DISK;

5、Client测试

[root@client ~]# mysql -usqluser -pcentos -h192.168.14.213 -P6033 -e "SELECT @@server_id;"

6、在ProxySQL上定义调度规则

MySQL [(none)]> INSERT INTO mysql_query_rules(rule_id,active,match_digest,destination_hostgroup,apply) VALUES (1,1,'^SELECT.*FOR UPDATE$',10,1),(2,1,'^SELECT',20,1);  

7、查看定义规则

  1. MySQL [(none)]> select * from mysql_query_rules \G
  2. *************************** 1. row ***************************
  3. rule_id: 1
  4. active: 1
  5. username: NULL
  6. schemaname: NULL
  7. flagIN: 0
  8. client_addr: NULL
  9. proxy_addr: NULL
  10. proxy_port: NULL
  11. digest: NULL
  12. match_digest: ^SELECT.*FOR UPDATE$
  13. match_pattern: NULL
  14. negate_match_pattern: 0
  15. re_modifiers: CASELESS
  16. flagOUT: NULL
  17. replace_pattern: NULL
  18. destination_hostgroup: 10
  19. cache_ttl: NULL
  20. reconnect: NULL
  21. timeout: NULL
  22. retries: NULL
  23. delay: NULL
  24. next_query_flagIN: NULL
  25. mirror_flagOUT: NULL
  26. mirror_hostgroup: NULL
  27. error_msg: NULL
  28. OK_msg: NULL
  29. sticky_conn: NULL
  30. multiplex: NULL
  31. log: NULL
  32. apply: 1
  33. comment: NULL
  34. *************************** 2. row ***************************
  35. rule_id: 2
  36. active: 1
  37. username: NULL
  38. schemaname: NULL
  39. flagIN: 0
  40. client_addr: NULL
  41. proxy_addr: NULL
  42. proxy_port: NULL
  43. digest: NULL
  44. match_digest: ^SELECT
  45. match_pattern: NULL
  46. negate_match_pattern: 0
  47. re_modifiers: CASELESS
  48. flagOUT: NULL
  49. replace_pattern: NULL
  50. destination_hostgroup: 20
  51. cache_ttl: NULL
  52. reconnect: NULL
  53. timeout: NULL
  54. retries: NULL
  55. delay: NULL
  56. next_query_flagIN: NULL
  57. mirror_flagOUT: NULL
  58. mirror_hostgroup: NULL
  59. error_msg: NULL
  60. OK_msg: NULL
  61. sticky_conn: NULL
  62. multiplex: NULL
  63. log: NULL
  64. apply: 1
  65. comment: NULL
  66. 2 rows in set (0.00 sec)

8、生效存盘

  1. MySQL [(none)]> LOAD MYSQL QUERY RULES TO RUNTIME;
  2. MySQL [(none)]> SAVE MYSQL QUERY RULES TO DISK;

四、Client端测试

1、客户端连接proxysql,写入数据;主从节点实现复制

mysql -usqluser -h 192.168.14.213 -P 6033 -p

2、客户端查询(客户端是proxysql读取slave的数据,单独在slave创建新的数据,然后对比master和client节点)

到此,读写分离成功完成

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/230586
推荐阅读
相关标签
  

闽ICP备14008679号