maxscale实现读写分离

本文介绍MaxScale的安装配置及读写分离实践,包括环境搭建、软件安装、配置文件详解及注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.前言

        maxscale是mariadb公司开发的一套数据库中间件,可以很方便的实现读写分离方案;并且提供了读写分离的负载均衡和高可用性保障。另外maxscale对于前端应用而言是透明的,我们可以很方便的将应用迁移到maxscale中实现读写分离方案,来分担主库的压力。maxscale也提供了sql语句的解析过滤功能。这里我们主要讲解maxscale的安装、配置以及注意事项。

2.安装环境

使用我之前的MHA环境

1)server1(node节点)
OS:CentOS 6.4 X64
IPADDR:172.16.21.12(eth0);192.168.8.6(eth1)
HOSTNAME:MySQL-mha01
DB:Mariadb10.0.21
防火墙关闭;selinux关闭;
2)server2(node节点)
OS:CentOS 6.4 X64
IPADDR:172.16.21.13(eth2);192.168.8.7(eth3)
HOSTNAME:mysql-mha02
DB:DB:Mariadb10.0.21
防火墙关闭;selinux关闭;
3)server3(node节点,manager节点)
OS:CentOS 6.4 X64
IPADDR:172.16.21.15(eth2);192.168.8.8(eth3)
HOSTNAME:mysql-mha01
DB:DB:Mariadb10.0.21
防火墙关闭;selinux关闭;


使用软件:maxscale-1.4.1-1.rhel_6.x86_64.rpm

3.安装软件

在主节点192.168.8.7上安装maxscale
[html]
  1. yum install maxscale-1.4.1-1.rhel_6.x86_64.rpm  
[html]
  1. mkdir -p /maxscale/cache    
  2. mkdir -p /maxscale/data    
  3. mkdir -p /maxscale/log    
  4. mkdir -p /maxscale/pid    
  5. mkdir -p /maxscale/tmp  

4.maxscale配置

4.1配置文件

[html]
  1. [root@mysql-mha02 etc]# cat /etc/maxscale.cnf  
  2. # MaxScale documentation on GitHub:  
  3. # https://github.com/mariadb-corporation/MaxScale/blob/master/Documentation/Documentation-Contents.md  
  4.   
  5. # Global parameters  
  6. #  
  7. # Complete list of configuration options:  
  8. # https://github.com/mariadb-corporation/MaxScale/blob/master/Documentation/Getting-Started/Configuration-Guide.md  
  9.   
  10. [maxscale]  
  11. threads=auto               #开启线程个数,默认为1.设置为auto会同cpu核数相同  
  12. ms_timestamp=1             #timestamp精度  
  13. syslog=1                   #将日志写入到syslog中    
  14. maxlog=1                   #将日志写入到maxscale的日志文件中  
  15. log_to_shm=0               #不将日志写入到共享缓存中,开启debug模式时可打开加快速度  
  16. log_warning=1              #记录告警信息  
  17. log_notice=1               #记录notice  
  18. log_info=1                 #记录info  
  19. log_debug=0                #不打开debug模式  
  20. log_augmentation=1         #日志递增  
  21. #相关目录设置  
  22. logdir=/maxscale/log/  
  23. datadir=/maxscale/data/  
  24. libdir=/usr/lib64/maxscale/  
  25. cachedir=/maxscale/cache/  
  26. piddir=/maxscale/pid/  
  27. execdir=/usr/bin/  
  28.   
  29. # Server definitions  
  30. #  
  31. # Set the address of the server to the network  
  32. # address of a MySQL server.  
  33. #  
  34. [server1]  
  35. type=server  
  36. address=192.168.8.6  
  37. port=3306  
  38. protocol=MySQLBackend  
  39.   
  40. [server2]  
  41. type=server  
  42. address=192.168.8.7  
  43. port=3306  
  44. protocol=MySQLBackend  
  45.   
  46. [server3]  
  47. type=server  
  48. address=192.168.8.8  
  49. port=3306  
  50. protocol=MySQLBackend  
  51.   
  52. # Monitor for the servers  
  53. #  
  54. # This will keep MaxScale aware of the state of the servers.  
  55. # MySQL Monitor documentation:  
  56. # https://github.com/mariadb-corporation/MaxScale/blob/master/Documentation/Monitors/MySQL-Monitor.md  
  57.   
  58. #相关的监控信息,监控的用户需要对后端数据库有访问replication client的权限:grant replication client  
  59. [MySQL Monitor]  
  60. type=monitor  
  61. module=mysqlmon  
  62. servers=server1,server2,server3  
  63. user=root  
  64. passwd=7AE087FBF864EBB87D108C3AB1603D0D  
  65. monitor_interval=1000              #监控心跳为1秒   
  66. detect_replication_lag=true        #监控主从复制延迟,可用后续指定router service的max_slave_replication_lag单位是秒,来控制maxscale运行的最大延迟  
  67. detect_stale_master=true           #当复制slave全部断掉时,maxscale仍然可用,将所有的访问指向master节点  
  68.   
  69. # Service definitions  
  70. #  
  71. # Service Definition for a read-only service and  
  72. # a read/write splitting service.  
  73. #  
  74.   
  75. # ReadConnRoute documentation:  
  76. # https://github.com/mariadb-corporation/MaxScale/blob/master/Documentation/Routers/ReadConnRoute.md  
  77.   
  78. #read-only的只读节点slave分离  
  79. [Read-Only Service]  
  80. type=service  
  81. router=readconnroute  
  82. servers=server1,server2,server3  
  83. user=root  
  84. passwd=7AE087FBF864EBB87D108C3AB1603D0D  
  85. router_options=slave  
  86. enable_root_user=1  
  87.   
  88. # ReadWriteSplit documentation:  
  89. # https://github.com/mariadb-corporation/MaxScale/blob/master/Documentation/Routers/ReadWriteSplit.md  
  90.   
  91. #读写分离,用户需要有SELECT ON mysql.db;SELECT ON mysql.tables_priv;SHOW DATABASES ON *.*的权限  
  92. [Read-Write Service]  
  93. type=service  
  94. router=readwritesplit  
  95. servers=server1,server2,server3  
  96. user=root  
  97. passwd=7AE087FBF864EBB87D108C3AB1603D0D  
  98. use_sql_variables_in=master                  #sql语句中的存在变量只指向master中执行  
  99. enable_root_user=1                           #允许root用户登录执行  
  100. master_accept_reads=true                     #master节点也可以转发读请求  
  101. max_slave_replication_lag=5                  #复制延迟最大为5秒(必须比monitor的interval大)  
[html]
  1. #maxscale管理节点信息  
  2. [MaxAdmin Service]  
  3. type=service  
  4. router=cli  
  5.   
  6. # Listener definitions for the services  
  7. #  
  8. # These listeners represent the ports the  
  9. # services will listen on.  
  10. #  
  11.   
  12. #各个请求的端口信息  
  13. [Read-Only Listener]  
  14. type=listener  
  15. service=Read-Only Service  
  16. protocol=MySQLClient  
  17. port=4008  
  18.   
  19. [Read-Write Listener]  
  20. type=listener  
  21. service=Read-Write Service  
  22. protocol=MySQLClient  
  23. port=4006  
  24.   
  25. [MaxAdmin Listener]  
  26. type=listener  
  27. service=MaxAdmin Service  
  28. protocol=maxscaled  
  29. port=6603  


4.2加密密码

配置文件中的密码都是经过maxscale进行加密后的,可以防止密码泄露,具体的操作步骤为
在刚才配置文件中的datadir目录下创建加密文件
[html]
  1. maxkeys /maxscale/keys/.secrets  

生成加密后的密码
[html]
  1. [root@mysql-mha02 data]# maxpasswd /maxscale/data/.secrets 123456  
  2. 7AE087FBF864EBB87D108C3AB1603D0D  
7AE087FBF864EBB87D108C3AB1603D0D就是123456加密后的密码啦。我们可以添加到配置文件中。

4.3启动maxscale

[html]
  1. maxscale -f /etc/maxscale.cnf  

5.验证读写分离

5.1创建测试表

在主节点server2 192.168.8.7上建立测试表
[html]
  1. MariaDB [test]> create table test_maxscale(id int);  
  2. Query OK, 0 rows affected (0.02 sec)  
  3.   
  4. MariaDB [test]> insert into test_maxscale values(87);  
  5. Query OK, 1 row affected (0.02 sec)  
  6.   
  7. MariaDB [test]> select * from test_maxscale;  
  8. +------+  
  9. | id   |  
  10. +------+  
  11. |   87 |  
  12. +------+  
  13. 1 row in set (0.00 sec)  
在节点server1 192.168.8.6上额外加入测试信息
[html]
  1. MariaDB [test]> insert into test_maxscale values(86);  
  2. MariaDB [test]> select * from test_maxscale;  
  3. +------+  
  4. | id   |  
  5. +------+  
  6. |   87 |  
  7. |   86 |  
  8. +------+  
  9. 2 rows in set (0.00 sec)  
在节点server3 192.168.8.8上额外加入测试信息
[html]
  1. MariaDB [test]> insert into test_maxscale values(88);  
  2. Query OK, 1 row affected (0.00 sec)  
  3.   
  4. MariaDB [test]> select * from test_maxscale;  
  5. +------+  
  6. | id   |  
  7. +------+  
  8. |   87 |  
  9. |   88 |  
  10. +------+  
  11. 2 rows in set (0.00 sec)  

5.2只读访问maxscale

通过mysql命令行访问maxscale所在节点192.168.8.7的读写分离listener 4006端口
  1. [root@mysql-mha01 ~]# mysql -P4006 -uroot -p123456 -h192.168.8.7 -e "select * from test.test_maxscale;"  
  2. +------+  
  3. | id   |  
  4. +------+  
  5. |   87 |  
  6. |   86 |  
  7. +------+  
发现分到了server1上面

5.3读写分离

加入包含insert的sql语句
[html]
  1. [root@mysql-mha02 log]# mysql -P4006 -uroot -p123456 -h192.168.8.7 -e "insert into test.test_maxscale values(90);select * from test.test_maxscale;"  
  2. +------+  
  3. | id   |  
  4. +------+  
  5. |   87 |  
  6. |   88 |  
  7. |   90 |  
  8. +------+  
发现转发到server3中,但是也包含90的值,我们需要到主节点server2和另外一个slave进行验证
在server2主节点中
[html]
  1. MariaDB [(none)]> select * from test.test_maxscale;  
  2. +------+  
  3. | id   |  
  4. +------+  
  5. |   87 |  
  6. |   90 |  
  7. +------+  
  8. 2 rows in set (0.00 sec)  
在server1另一个slave节点中
[html]
  1. MariaDB [test]> select * from test_maxscale;  
  2. +------+  
  3. | id   |  
  4. +------+  
  5. |   87 |  
  6. |   86 |  
  7. |   90 |  
  8. +------+  
  9. 3 rows in set (0.00 sec)  
maxscale实现了读写分离。

6.注意事项

这里我主要讲些重点需要注意的:
1)创建链接的时候,不支持压缩协议
2)转发路由不能动态的识别master节点的迁移
3)LONGLOB字段不支持
4)在一下情况会将语句转到master节点中(保证事务一致):
      明确指定事务;
     prepared的语句;
     语句中包含存储过程,自定义函数
    包含多条语句信息: INSERT INTO ... ; SELECT LAST_INSERT_ID();
5)一些语句默认会发送到后端的所有server中,但是可以指定
use_sql_variables_in=[master|all] (default: all)

为master的时候可以将语句都转移到master 上执行。但是自动提交值和prepared的语句仍然发送到所有后端server。

这些语句为
[html]
  1. COM_INIT_DB (USE <db name> creates this)  
  2. COM_CHANGE_USER  
  3. COM_STMT_CLOSE  
  4. COM_STMT_SEND_LONG_DATA  
  5. COM_STMT_RESET  
  6. COM_STMT_PREPARE  
  7. COM_QUIT (no response, session is closed)  
  8. COM_REFRESH  
  9. COM_DEBUG  
  10. COM_PING  
  11. SQLCOM_CHANGE_DB (USE ... statements)  
  12. SQLCOM_DEALLOCATE_PREPARE  
  13. SQLCOM_PREPARE  
  14. SQLCOM_SET_OPTION  
  15. SELECT ..INTO variable|OUTFILE|DUMPFILE  
  16. SET autocommit=1|0  

6)maxscale不支持主机名匹配的认证模式,只支持IP地址方式的host解析。所以在添加user的时候记得使用合适的范式。
7)跨库查询不支持,会显示的指定到第一个数据库中
8)通过select方式改变会话变量的行为不支持

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值