可以做读写分离的软件有maxscale,mycat,mysql-proxy
[maxscale实现读写分离]https://blog.csdn.net/ck784101777/article/details/100932870
读写分离的本质就是将写请求与读请求分开来,分别由不同的服务器接受处理,一般将写请求交给主服务器,将读请求交给从服务器.所以做读写分离你得做主从同步保证其数据的一致性.
[mysql主从同步]https://blog.csdn.net/ck784101777/article/details/100898344
mycat是基于java的,所以需要java环境
[mycat下载地址]http://www.mycat.io/
1)准备java环境
]# yum -y install java-1.8.0-openjdk //安装JDK
[root@mycat56 ~]# which java //查看命令
/usr/bin/java
[root@mycat56 ~]# java –version //显示版本
openjdk version "1.8.0_161"
OpenJDK Runtime Environment (build 1.8.0_161-b14)
OpenJDK 64-Bit Server VM (build 25.161-b14, mixed mode)
2)安装提供服务的软件包
[root@mycat56 ~]# tar -zxvf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz //解压源码
[root@mycat56 ~]# mv mycat /usr/local/ //移动目录
[root@mycat56 ~]# ls /usr/local/mycat/ //查看文件列表
bin catlet conf lib logs version.txt
1)server.xml
]# vim /usr/local/mycat/conf/server.xml
//连接mycat服务时使用的用户名
123456 //用户连接mycat用户时使用的密码
TESTDB //逻辑库名
user
TESTDB
true //只读权限,连接mycat服务后只有读记录的权限,不写这一行则是可读可写
:wq
重点关注上面这段配置,其他默认即可。
=======================================
参数 说明
user 用户配置节点
name 登录的用户名,也就是连接Mycat的用户名。
password 登录的密码,也就是连接Mycat的密码
schemas 数据库名,这里会和schema.xml中的配置关联,多个用逗号分开,例如需要这个用户需要管理两个数据库db1,db2,则配置db1,dbs
privileges 配置用户针对表的增删改查的权限
readOnly mycat逻辑库所具有的权限。
true
为只读,
false
为读写,默认为
false
。
=======================================
我这里配置了一个账号
root,密码为123456,逻辑数据库为
TESTDB(默认),这些信息都可以自己随意定义,读写权限都有,没有针对表做任何特殊的权限。
注意:
- server.xml文件里登录
TESTDB的用户名和密码可以任意定义,这个账号和密码是为客户机登录
TESTDB时使用的账号信息。
- 逻辑库名(
逻辑库是对外展示的库,并非真实用于存储数据的库,逻辑库位于mycat代理服务器上,真实库位于数据库服务器上,如这里配置的逻辑库TESTDB,真实库需要在server.xml中配置,接下来会将)
- 这里只定义了一个标签,所以把多余的都注释了。如果定义多个标签,即设置多个连接mycat的用户名和密码,那么就需要在schema.xml文件中定义多个对应的库!
schema.xml是最主要的配置项,此文件关联mysql读写分离策略!读写分离、分库分表策略、分片节点都是在此文件中配置的!
MyCat作为中间件,它只是一个代理,本身并不进行数据存储,需要连接后端的MySQL物理服务器,此文件就是用来连接MySQL服务器的!
schemaxml文件中配置的参数解释
1 2 3 4 |
|
配置说明
1 2 3 4 |
|
每个节点的属性逐一说明
1 2 3 4 5 |
|
table
1 2 3 4 5 6 |
|
dataNode
1 2 3 4 |
|
schema.xml文件dataHost
中有三点需要注意:balance="1",writeType="0" ,switchType="1"
schema.xml中的balance的取值决定了负载均衡对非事务内的读操作的处理。balance 属性负载均衡类型,目前的取值有 4 种:
1 2 3 4 5 6 7 8 9 10 |
|
writeType 属性,负载均衡类型,目前的取值有 3 种
1 2 3 |
|
对于事务内的SQL默认走写节点
1 2 3 4 5 |
|
主从切换(双主failover):switchType 属性
1 2 3 4 5 6 7 8 |
|
dbType属性
1 |
|
dbDriver属性指定连接后端数据库使用的
1 2 3 4 5 6 7 |
|
heartbeat标签
1 2 3 4 5 6 |
|
writeHost标签、readHost标签
1 2 3 4 5 6 |
|
dataHost
1 2 3 4 5 6 |
|
拓扑结构如下,你需要准备5台虚拟机,ip配在同一网段即可
我们将为服务配置主从同步结构,为Mycat服务器安装mycat服务并修改配置文件以实现读写分离
这里需要准备三台服务器,一台主服务器,二台从服务器
准备好后保证三台主机能互相ping通,然后安装mysql服务
[mysql安装]https://blog.csdn.net/ck784101777/article/details/100584825
主服务器配置:
1)启用binlog日志
]# vim /etc/my.cnf
[mysqld]
server_id=51 //server_id
log-bin=master51 //日志名
:wq
]# systemctl restart mysqld
2)用户授权
用户名自定义、客户端地址使用% 或 只指定 从服务器的地址 都可以、只给复制数据的权限即可。
]# mysql -uroot -p密碼
mysql> grant replication slave on *.* to repluser@"%" identified by "123qqq...A";
mysql>quit;
3)查看binlog日志信息
查看日志文件名 和 偏移量位置。
mysql> show master status\G;
*************************** 1. row ***************************
File: master51.000001 //日志名
Position: 441 //偏移量
Binlog_Do_DB:
Binlog_Ignore_DB:
Executed_Gtid_Set:
1 row in set (0.00 sec)
从服务器配置(两台都需要配置):
1)指定server_id
Server_id值可以自定义,但不可以与主服务器相同。(取值范围1-255)
]# vim /etc/my.cnf
[mysqld]
server_id=52 //server_id值
:wq
]# systemctl restart mysqld //重启服务
2)确保与主服务器数据一致(如果是使用2台新部署的数据库服务器配置主从同步,此操作可以忽略)
密码写你登录数据库的密码,导入的时候如果
]# mysqldump -uroot –p密码 -A > /allbak.sql //在主服务器上备份全部数据
]# scp /allbak.sql [email protected]:/root/ //将备份文件拷贝给从服务器
]# mysql -uroot –p密码 数据库名 < /root/allbak.sql //从服务器使用备份文件恢复数据
3)指定主服务器信息
数据库管理员root本机登录,指定主服务器信息,其中日志文件名和偏移量 写allbak.sql文件记录的。
指定主服务器信息后,会将主服务器信息保存在/var/lib/mysql/master.info文件下,若需要修改,则有两种途径,一种是在mysql下通过命令修改,而是修改上述文件.修改前必须停止slave线程,命令:stop slave 修改完后开启线程 : start slave
]# mysql -uroot –p密码 //管理员root 本机登录
mysql> show slave status; //查看状态信息,还不是从服务器
Empty set (0.00 sec)
mysql> change master to //指定主服务器
-> master_host=“192.168.4.51”, //主服务器ip地址
-> master_user=“repluser”, //主服务器授权用户
-> master_password=“123qqq…A”, //主服务器授权用户密码
-> master_log_file=“master51.000001 ”, //主服务器日志文件,以主服务器显示的为主
-> master_log_pos=441; //主服务器日志偏移量,切忌不可加双引号
-> start slave; //启动线程
mysql> show slave status\G; //查看状态信息,主要查看两个线程是否启动
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.4.51 //主服务器ip地址
Master_User: repluser
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: master51.000001
Read_Master_Log_Pos: 437
Relay_Log_File: host52relay-bin.000002
Relay_Log_Pos: 604
Relay_Master_Log_File: master51.000001
Slave_IO_Running: Yes //IO线程yes状态
Slave_SQL_Running: Yes //SQL线程yes状态
...........................
4)在主数据库上添加授权用户
只需要在主服务器上插入即可,因为你已经配置了主从同步
- mysql> grant all on *.* to adminplj@"%" identified by "123qqq...A" ;
准备一台主机做Mycat服务器
修改mycat的schema.xml:
balance为1:让全部的readHost及备用的writeHost参与select的负载均衡。
switchType为2:基于MySQL主从同步的状态决定是否切换。
heartbeat:主从切换的心跳语句必须为show slave status。
1)修改server.xml
]# vim /usr/local/mycat/conf/server.xml
123456
TESTDB
user
TESTDB
true
2)修改 schema.xml
如果不知道配置标签的含义请往上翻
我这里只配置了一个数据节点,一个数据主机(一主writeHost二从readHost)
select user()
上面配置中,balance改为1,表示读写分离。
以上配置达到的效果就是192.168.4.100为主库,192.168.4.110和192.168.4.120为从库。
MyCat支持双主多从,如果有N个主,那么就配置N个writeHost兄弟节点;如果有M个从节点,那么就配置M个readHost节点即可。
也可以有多台MySQL服务器,或者SQL Server、Oracle等,配置多个dataHost节点就可以。
需要注意的是:
Mycat主从分离只是在读的时候做了处理,写入数据的时候,只会写入到writehost,需要通过mycat的主从复制将数据复制到readhost!这个问题需要弄明白!!
如果没有提前做mysql主从复制,会发现Mycat读写分离配置后,数据写入writehost后,readhost一直没有数据!因为Mycat就没有实现主从复制的功能,毕竟数据库本身自带的这个功能才是最高效稳定的。
3)开启mycat服务
[root@mycat56 ~]/usr/local/mycat/bin/mycat --help //查看一下可以用的命令
Usage /usr/local/mycat/bin/mycat {console | start | stop | restart | status | dump}
[root@mycat56 ~]# /usr/local/mycat/bin/mycat start
Starting Mycat-server...
查看服务状态[root@mycat56 ~]# netstat -utnlp | grep :8066 //查看端口
tcp6 0 0 :::8066 :::* LISTEN 2924/java
[root@mycat56 ~]# ps -C java //查看进程
PID TTY TIME CMD
2924 ? 00:00:01 java
测试授权用户:在mycat主机,使用授权用户分别连接3台数据库服务器,若连接失败,请检查数据库服务器是否有对应的授权用户。确认三台数据库服务器可以使用
[root@mycat56 ~]# which mysql || yum -y install mariadb //安装提供mysql命令的软件包
//连接数据库服务器192.168.4.110
[root@mycat56 ~]# mysql -h192.168.4.110 -uadminplj -p123qqq...A
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 54
Server version: 5.7.17 MySQL Community Server (GPL)
mysql> exit; //连接成功 断开连接
Bye
//连接数据库服务器192.168.4.120
[root@mycat56 ~]# mysql -h192.168.4.120 -uadminplj -p123qqq...A
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 47
Server version: 5.7.17 MySQL Community Server (GPL)
mysql> exit; //连接成功 断开连接
Bye//连接数据库服务器192.168.4.130
[root@mycat56 ~]# mysql -h192.168.4.130 -uadminplj -p123qqq...A
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 47
Server version: 5.7.17 MySQL Community Server (GPL)
mysql> exit; //连接成功 断开连接
Bye
讲解一下测试流程:想确定读写是否分离,在从服务器上插入一条数据,如果在mycat上可以读到,则说明读写分离成功.
你在从服务器上插入数据在主服务器是读不到的,但是mycat读到了,说明读请求确实交给了从服务器
1)在从服务器上插入数据
原数据库上只有一条数据,再插入一条数据
[root@mysql2 opt]# mysql -uroot -p123qqq...A
mysql> use db1
mysql> insert into test value(2);
Query OK, 1 row affected (0.05 sec)mysql> select *from test;
+------+
| id |
+------+
| 1 |
| 2 |
+------+
2 rows in set (0.00 sec)
2)连接mycat服务器读取
读的到证明读写分离成功,如果觉得还不确定就在数据库主服务器上查看是否记录
[root@client opt]# mysql -h192.168.4.140 -P8066 -p123456
MySQL [TESTDB]> select *from test; //在插入之前读
+------+
| id |
+------+
| 1 |
+------+
1 row in set (0.01 sec)MySQL [TESTDB]> select *from test; //插入之后读
+------+
| id |
+------+
| 1 |
| 2 |
+------+
2 rows in set (0.01 sec)MySQL [TESTDB]> exit
Bye