在mysql主从同步中,slave会同步master的数据。因此写数据要向master中写,读数据要从slave中读。
通过中间件(代理)实现读写分离。
1、为master,slave配置主从同步
2、部署mysql代理:
rpm -ivh maxscale-xxxx.rhel.7.x86_64.rpm #安装中间件
vim /etc/maxscale.cnf #修改配置文件
[maxscale]
threads=auto #线程数量,自动,根据cpu核心数生成
[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=monuser #监控用户,要在server1和server2上授权
passwd=123456 #密码
monitor_interval=10000
#[Read-Only Service] #只读服务,注释掉
#...
[Read-Write Service] #读写分离服务
type=service
router=readwritesplit #读写分离
servers=server1, server2 #指明数据库服务器列表,不能写ip
user=routeruser #路由用户,用于验证数据库服务器是否存在,要在server1和server2上授权
passwd=123456
max_slave_connections=100%
[MaxAdmin Service] #定义管理服务
type=service
router=cli
#[Read-Only Listener] #只读服务的监听端口,注释掉
#...
[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
3、在master上授权用户:(slave会自动同步)
监听用户:(用于连接数据库服务器)
grant replication slave,replication client on *.* to monuser@"%" indentified by "123456"
路由用户:(用户验证数据库服务器是否存在,以及用户是否存在)
grant select on mysql.* to routeruser@"%" identified by "123456";
4、启动服务:(192.168.4.10,代理服务器)
maxscale -f /etc/maxscale.cnf
5、查看监听状态:(192.168.4.10代理服务器)
maxadmin -uadmin -pmariadb -P4016
MaxScale> list servers;
6、client连接测试:(192.168.4.5,client)
①在master上添加访问数据库的用户:
grant all on *.* to testuser@"%" indentified by "123456"
②连接:
mysql -h 192.168.4.10 -P4006 -utestuser -p123456
③测试读写分离:
写:
通过客户机插入数据,在slave可以找到
读:
通过slave向slave中插入一条数据,使用client读取,可以读到数据。
#master不会同步slave的数据,因此仅向slave中写数据,在master中则找不到这条数据
写总结的第三十九天!!!