目录
MaxScale 简介
从负载均衡来说,传统的LB模型有:基于传输层和基于应用层的模型,HAProxy是一种很好的TCP负载均衡器,但它不是一个SQL-aware型的负载均衡器,不具备这一特性限制了它在分布式数据库环境中解决某些扩展问题的能力。在开源世界中,有一些支持SQL的负载均衡器,即MySQL Proxy、ProxySQL和MaxScale
Maxscale是MariaDB的一个开源产品,一个可以为MySQL/MariaDB 做代理和负载均衡器,它可以向MySQL集群的某一节点发送写查询,并向另外节点发送读查询,从而避免了向多个节点写入时的一些麻烦。
读写分离需要考虑的几个问题
1.Master服务器上同时具备写压力和读压力
在读写操作上,我们可以在Master服务器上即读又写,而一般来说读操作要比写操作多的多,我们不可能总是修改文章内容,大部分时候我们只需要读一读文章即可.
既然读操作远远的次数远远大于写操作,那么为什么我们不专门弄一台机器负责读操作,弄一台机器负责写操作,以此来降低单台服务器处理量。
2.在客户端区分还是在服务端区分
我们把读写请求的识别交给客户端还是服务端?肯定是服务端,因为客户可不想用自己的计算机资源做这些本不应该是自己做的事,客户总是享受服务的
3. 数据同步延迟
由于从服务器需要从主服务器复制数据,因此在进行数据同步时可能会出现延迟。如果主服务器上的数据频繁更改,则从服务器上的数据可能会滞后于主服务器,从而导致数据不一致的问题。
如何解决数据同步延迟问题?有几种方式可以优化这个问题:
- 使读写服务器在一个局域网内,并且使用性能好的交换机
- 采用数据分片技术,将热点业务的流量分流到特定的服务器上
- 可将异步复制调整为全同步或半同步复制模式,虽然牺牲了写响应速度
读写分离配置
1.架构
共三台服务器
- 将读请求交给slave服务器
- 将写请求交给master服务器
- 代理服务器上安装Maxscale
Mysql代理起到提供统一接口的作用,客户端只需要访问这个接口,Mysql代理负责识别请求,将读操作交给Slave服务器处理,并且将结果返回给客户端
2.配置主从同步
1)配置主服务器192.168.4.51
# vim /etc/my.cnf
[mysqld]
server_id=51 //指定服务器ID号
log-bin=master51 //启用binlog日志,并指定文件名前缀
...
[root@master10 ~]# systemctl restart mysqld //重启mysqld
2)主服务器授权用户,并查看binlog日志信息
# mysql -uroot -p123456
mysql> grant all on *.* to 'repluser'@'%' identified by '123456';
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> show master status;
+-----------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-----------------+----------+--------------+------------------+-------------------+
| master51.000001 | 449 | | | |
+-----------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
3)配置从服务器192.168.4.52
# vim /etc/my.cnf
[mysqld]
server_id=52 //指定服务器ID号,不要与Master的相同
# systemctl restart mysqld
指定主服务器信息,日志文件、偏移位置(参考MASTER上的状态输出)
# mysql -uroot -p123456
mysql> change master to master_host='192.168.4.51',
-> master_user='repluser',
-> master_password='123456',
-> master_log_file='master51.000001',
-> master_log_pos=449;
Query OK, 0 rows affected, 2 warnings (0.01 sec)
mysql> start slave; //开启线程
Query OK, 0 rows affected (0.01 sec)
mysql> show slave status\G; //查看线程是否启动
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.4.51
Master_User: repluser
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: master51.000001
Read_Master_Log_Pos: 738
Relay_Log_File: slave20-relay-bin.000002
Relay_Log_Pos: 319
Relay_Master_Log_File: master51.000001
Slave_IO_Running: Yes //IO线程YES
Slave_SQL_Running: Yes //SQL线程YES
......
1 row in set (0.00 sec)
# systemctl restart mysqld
4)测试配置,在主服务器本机创建数据库 aa库
]# mysql –uroot –p123456
mysql> create database aa;
Query OK, 1 row affected (0.00 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| aa |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)
从服务器上查看,有aa库
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| aa |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)
3.配置Mysql代理服务器,安装maxscale
[maxscale下载地址]MariaDB Products & Tools Downloads | MariaDB
1)环境准备
保证yum源可以正常使用,安装提供服务的软件
$rpm -ivh maxscale-2.1.2-1.rhel.7.x86_64.rpm
2)添加授权用户
根据maxscale.cnf文件配置,在主/从服务器上添加对应的授权用户,因为2台数据库服务器是主从同步结构,只在主数据库服务器添加用户即可,从服务器会自动同步,这里需要授权两个用户,在mysql上创建,一个是监控用户(监控的数据库服务器),一个是路由用户(监控读写分离),这两个用户是用来在maxscale中使用的
mysql> grant replication slave,replication client on *.* to maxscalemon@'%' identified by "123qqq…A";
mysql> grant select on mysql.* to maxscalerouter@"%" identified by "123qqq…A";
3)查看授权用户
分别在主/从服务器上面查看
mysql> select user,host from mysql.user where user like “maxscale%”;
+----------------+------+
| user | host |
+----------------+------+
| maxscalemon | % |
| maxscalerouter | % |
+----------------+------+
2 rows in set (0.00 sec)
在代理服务器57主机,测试授权用户
]# yum -y install mariadb //安装提供mysql命令的软件包
]# mysql -h 192.168.4.51 -umaxscalemon -p123qqq…A
]# mysql -h 192.168.4.52 -umaxscalemon -p123qqq…A
]# mysql -h 192.168.4.51 -umaxscalerouter -p123qqq…A
]# mysql -h 192.168.4.52 -umaxscalerouter -p123qqq…A
4)修改主配置文件
由于我们这里只配置读写分离,所以需要删除掉一些配置信息,可以只留下下文定义的内容
# vim /etc/maxscale.cnf
[maxscale]
threads=auto //运行的线程的数量
[server1] //定义数据库服务器
type=server
address=192.168.4.51 //主服务器ip
port=3306
protocol=MySQLBackend
[server2]
type=server
address=192.168.4.52 //从服务器IP
port=3306
protocol=MySQLBackend
[MySQL Monitor] //定义监控的数据库服务器
type=monitor
module=mysqlmon
servers=server1, server2 //监控的数据库列表
user=maxscalemon //监控用户
passwd=123qqq...A //密码
monitor_interval=10000
[Read-Write Service] //定义读写分离服务
type=service
router=readwritesplit
servers=server1, server2
user=maxscalerouter //路由用户
passwd=123qqq…A //密码
max_slave_connections=100%
[MaxAdmin Service] //定义管理服务
type=service
router=cli
[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=4016
5)启动服务代理服务
# maxscale -f /etc/maxscale.cnf
# ps -C maxscale //查看进程
PID TTY TIME CMD
17930 ? 00:00:00 maxscale
# netstat -antup | grep :4006 //查看读写分离端口
tcp6 0 0 :::4006 :::* LISTEN 17930/maxscale
# netstat -antup | grep :4016 //查看管理服务端口
tcp6 0 0 :::4016 :::* LISTEN 17930/maxscale
6)查看监控是否开启
使用命令maxadmin登录maxscale服务,用户名和密码默认为admin , mariadb
# maxadmin -uadmin -pmariadb -P4016
MaxScale> list servers
Servers.
-------------------+-----------------+-------+-------------+--------------------
Server | Address | Port | Connections | Status
-------------------+-----------------+-------+-------------+--------------------
server1 | 192.168.4.51 | 3306 | 0 | Master, Running
server2 | 192.168.4.52 | 3306 | 0 | Slave, Running
-------------------+-----------------+-------+-------------+--------------------
读写分离常见错误
问题:客户端连接mysql代理服务器失败
报错信息:ERROR 2003(HY000):Can't connect to Mysql Serve...
原因分析:
-登录账号或密码错误
-mysql服务器未开启mysql-proxy服务
解决方式:
-查看登录用户账号密码
select user,host from mysql.user;
-查看mysql-proxy服务是否开启
ps aux | grep "mysql-proxy"