maxscale是一个实现读写分离的中间件,他可以根据主从状态实现写库的自动切换。
#####################################################
使用4台虚拟机,其中192.168.4.51和192.168.4.52,分别提供读、写服务,均衡流量,通过主从复制保持数据一致性,由MySQL代理192.168.4.57面向客户端提供服务,收到SQL写请求时,交给主服务器处理,收到SQL读请求时,交给从服务器处理。在客户机192.168.4.50测试配置。
###################################################
1.首先搭建51和52的主从同步
主服务器配置:
主服务器开起bin-log日志,设置服务器id,然后赋予用户权限
[mysqld]
server_id=51 //指定服务器ID号
log-bin=db51 //启用binlog日志
-> grant all on *.* to 'dada'@'%' identified by '123456';
-> show master status; //查看binlog日志信息
从服务器配置:
mysql> change master to master_host='192.168.4.51',
-> master_user='dada',
-> master_password='123456',
-> master_log_file='db51.000001',
-> master_log_pos=154;
-> start slave;
-> show slave status\G;
至此已完成主从同步
#######################################################
2.安装maxscale服务包
在代理服务器57上安装maxscale服务包
服务包下载点 http://downloads.mariadb.com/enterprise/awjc-3f2j/generate/10.0/mariadb-enterprise-repository.rpm
下载完成直接rpm安装
主配置文件: /etc/maxscale.cnf
日志目录: /var/log/maxscale
修改主配置文件
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=dada //监控用户
passwd=123dada..A //密码
monitor_interval=10000
#[Read-Only Service] //不定义只读服务
要实现读写分离,直接注释掉
这里只写出要修改的配置
[Read-Write Service] //定义读写分离服务
servers=server1, server2
user=dadarouter //路由用户
passwd=123dada..A //密码
#[Read-Only Listener] //不定义只读服务使用的端口号
该列全部注释
[Read-Write Listener] //定义读写服务使用的端口号
该列不做操作
[MaxAdmin Listener] //管理服务使用的端口号
port=4016 //手动添加,不指定时使用的是默认端口在启动服务以后可以知道默认端口是多少
数据库赋予用户权限
grant replication slave,replication client on *.* to dada@'%' identified by "123dada..A";
grant select on mysql.* to dadaouter@"%" identified by "123dada..A";
因为已经设置好主从同步,所以只需在主服务器配置.
开启服务
maxscale -f /etc/maxscale.cnf
停止服务
killall -9 maxscale
然后测试监听端口是否开启
[root@mysql57 ~]# netstat -antup | grep :4006
tcp6 0 0 :::4006 :::* LISTEN 1602/maxscale
[root@mysql57 ~]# netstat -antup | grep :4016
tcp6 0 0 :::4016 :::* LISTEN 1602/maxscale
cat /var/log/maxscale/maxscale.log //查看日志文件
注意:以上配置不能复制,请手敲
#####################################################
查看监控信息
[root@mysql57 ~]# 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
-------------------+-----------------+-------+-------------+--------------------
#################################################################
验证测试
在主服务器上赋予一个权限为select和insert的用户xzj
grant select,insert on db7.* to xzj@'%' identified by '123qqq...A';
使用客户端50来连接数据库插入查询数据
50 ~]# mysql -h192.168.4.57 -P4006 -uxzj -p123dada..A
使用从服务器插入一条数据,可以在50访问到,表示实验成功!!
#############################################################
一台服务器运行多台mysql数据库服务
优点: 节约运维成本,提高硬件利用率
源码编译解包
修改主配置文件
首次启动服务会做数据初始化 并初始和提示数据库管理员本机登录密码
]# vim /etc/my.cnf
[mysqld_multi] //启用多实例
mysqld = /usr/local/mysql/bin/mysqld_safe //指定进程文件路径
mysqladmin = /usr/local/mysql/bin/mysqladmin //指定管理命令路径
user = root //指定进程用户
[mysqld1] //实例进程名称
port=3307 //端口号
datadir=/dir1 //数据库目录 ,要手动创建
socket=/dir1/mysqld1.sock //指定sock文件的路径和名称
pid-file=/dir1/mysqld1.pid //进程pid号文件位置
log-error=/dir1/mysqld1.err //错误日志位置
[mysqld2]
port=3308
datadir=/dir2
socket=/dir2/mysqld2.sock
pid-file=/dir2/mysqld2.pid
log-error=/dir2/mysqld2.err
分别开启实例1.2
mysqld_multi start (1/2)
开启后会出现root@localhost的初始密码
~]# mysql -uroot -p'rm0d/k)H?!?m' -S /dir2/mysqld2.sock
-> alter user root@'localhost' identified by '123456';
停止多实例服务
mysqld_multi --user=root --password=密码 stop 实例编号