1.主从复制应用的局限性
首先你要明确为什么做主从复制,因为我们要做主从数据同步,也就是为数据库服务器做实时数据备份,以防宕机.那么它的局限性在哪呢?在读写操作上,我们总是在主服务器上即读又写,一般来说读操作要比写操作多的多,我们不可能总是修改文章内容,大部分时候我们只需要读一读文章即可.
既然读操作远远的次数远远大于写操作,那么为什么我们不专门弄一台机器负责读操作,弄一台机器复制写操作,以此来降低主服务器的处理量,那么我们就弄懂了主从复制的局限性,即读写操作不分机,主服务器工作量大,从服务器基本无工作.
2.如何分离Mysql读,写流量
如何做读写分离,如果你知道数据库主从同步的原理,那么要弄懂读写分离非常简单,只需要修改一下配置文件,使主服务器复制处理写请求,从服务复制处理读请求即可.
[主从同步原理与配置]https://blog.csdn.net/ck784101777/article/details/100898344
3.在客户端区分还是在服务端区分
我们把读写请求的识别交给客户端还是服务端?肯定是服务端,因为客户可不想用自己的计算机资源做这些本不应该是自己做的事,客户总是享受服务的
由一台Mysql代理面向客户端提供服务
-将读请求交给从服务器
-将写请求交给主服务器
案例:
1.拓扑图
Mysql代理起到提供统一接口的作用,客户端只需要访问这个接口,Mysql代理负责识别请求,将读操作交给Slave服务器处理,并且将结果返回给客户端
2.配置思路
1)准备两台Mysql服务器,并且配置主从同步
2)准备一台Mysql代理服务器,使用maxscale软件
3.配置主从同步
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的相同
:wq
]# systemctl restart mysqld
4)配置从服务器192.168.4.52,指定主服务器信息,日志文件、偏移位置(参考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)
5)测试配置,在主服务器本机创建数据库 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)
6)从服务器上查看,有aa库,验证主从同步配置
- mysql> show databases;
- +--------------------+
- | Database |
- +--------------------+
- | information_schema |
- | aa |
- | mysql |
- | performance_schema |
- | sys |
- +--------------------+
- 5 rows in set (0.00 sec)
4.配置Mysql代理服务器
我们使用maxscale软件来实现读写分离功能,这个软件是由Mariadb公司开发,专门用来处理读写分离,我们使用的环境是Linux,你需要下载一个rpm包来安装软件
[maxscale下载地址]https://mariadb.com/downloads/#mariadb_platform-mariadb_maxscale
1)环境准备
关闭防火墙和SElinux,保证yum源可以正常使用,安装提供服务的软件
- ]# rpm -ivh maxscale-2.1.2-1.rhel.7.x86_64.rpm //安装maxscale
- warning: maxscale-2.1.2-1.rhel.7.x86_64.rpm: Header V4 RSA/SHA1 Signature, key ID 8167ee24: NOKEY
- Preparing... ################################# [100%]
- Updating / installing...
- 1:maxscale-2.1.2-1 ################################# [100%]
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 //监控的数据库列表,不能写ip
- user=maxscalemon //监控用户
- passwd=123qqq...A //密码
- monitor_interval=10000
- #[Read-Only Service] //只读服务[不定义]
- #type=service
- #router=readconnroute
- #servers=server1
- #user=myuser
- #passwd=mypwd
- #router_options=slave
- [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-Only Listener] //服务使用的端口号[不定义]
- #type=listener
- #service=Read-Only Service
- #protocol=MySQLClient
- #port=4008
- [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
- -------------------+-----------------+-------+-------------+--------------------
5. 测试
要想验证为什么是从服务器负责处理读请求,可以通过这样的思路去测试:
在从服务器上插入数据-->在主服务器上查看数据(无数据)-->通过访问代理服务器查看数据(有数据)-->证明读请求是由服务器处理的
1)在主服务器上添加访问数据连接用户
在主服务器添加即可,从服务器会自动同步数据
- mysql> create database gamedb;
- mysql> create table gamedb.a(id int);
- mysql> grant select,insert on gamedb.* to yaya66@"%" identified by "123qqq...A";
2)验证57主机的数据读写分离功能
在从服务器添加新纪录
Mysql> insert into gamedb.values(52);
Mysql> select * from mysql> select * from gamedb.a;
+------+
| id |
+------+
| 99 |
| 52 |
+------+
在主服务器查看记录
Mysql> select * from mysql> select * from gamedb.a;
+------+
| id |
+------+
| 99 |
+------+
客户端连接代理服务器57 访问数据
]# mysql -h192.168.4.57 -P4006 -uyaya66 -p123qqq...A
Mysql> select * from mysql> select * from gamedb.a;
+------+
| id |
+------+
| 99 |
| 52 |
+------+
三、读写分离常见错误
问题:客户端连接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"