数据库_读写分离-多实例应用
1.数据读写分离介绍及搭建案例; 2.多实例服务.
一,数据读写分离介绍
1.概念:把客户端访问的查询请求和写请求,分别给不同的数据库服务器处理.
2.优点: 减轻主服务器的工作压力; 提高从服务器的硬件利用率
3.实现方式,有客户端指定和服务端指定两种.
客户端指定:程序写代码实现.例,插入数据的时候,连接主库;查询数据的时候,连接从库.
服务端指定:在服务器上部署数据读写分离的服务.
4.数据分离的软件:maxscal,mysql-proxy,mycat.这些软件也叫中间件.
5.原理: 由mysql代理服务器面向客户端提供服务,收到读请求时,分配给slave服务器处理;收到写请求时,分配给master服务器处理.
二,构建读写分离架构
思路:
->部署一主一从数据库结构(192.168.4.51为主库,192.168.4.52为从库)
->部署mysql代理服务器(即安装maxscale数据库代理软件,配置,启服务)
->测试配置(即客户端连接代理服务器,访问数据)
拓扑图:
步骤:
1.部署一主一从数据库结构(192.168.4.51为主库,192.168.4.52为从库)
1.1配置主库192.168.4.51
#vim /etc/my.cnf
[mysqld]
log-bin=db51 //启动日志
server_id=51 //指定服务器id
:wq
Systemctl restart mysqld
mysql> grant replication slave on *.* to repluser@"%" identified by "123qqq...A"; //授权用户repluser
mysql> show master status; //查看日志信息
1.2配置从库192.168.4.52
#vim /etc/my.cnf
[mysqld]
server_id=52 //指定服务器id
:wq
#systemctl restart mysqld
1.2.1指定从库信息
Show slave status; 显示当前从库的信息
mysql> change master to
->master_host="192.168.4.51", //指定主库IP
->master_user="repluser", //指定授权用户
->master_password="123qqq...A", //指定授权用户的密码
-> master_log_file="db51.000001", //vim db2.sql查询得到主库的日志文件
->master_log_pos=441; //vim db2.sql查询得到主库的日志偏移量
Mysql>start slave; //启动slave进程
mysql> show slave status \G; 查看slave状态信息
*************************** 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: db51.000001
Read_Master_Log_Pos: 441
Relay_Log_File: db52-relay-bin.000002
Relay_Log_Pos: 315
Relay_Master_Log_File: db51.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
2. 配置mysql代理服务器192.168.4.57
2.1 安装代理软件包:# rpm -ivh maxscale-2.1.2-1.rhel.7.x86_64.rpm
2.2 修改主配置文件:#vim /etc/maxscale.cnf
[maxscale]
threads=auto //更改线程为auto
[server1] //定义第1台数据库服务器
type=server
address=192.168.4.51 //更改为主数据库ip
port=3306
protocol=MySQLBackend
[server2] //server2默认没有,需要赋值serve1后做修改
type=server
address=192.168.4.52 //更改为从数据库ip
port=3306
protocol=MySQLBackend
[MySQL Monitor] //定义要监视的数据库节点:1.是否启用;2.查询主从情况
type=monitor
module=mysqlmon
servers=server1,server2 //监控server1和server2
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 //路由用户名,代理服务器用这个账户及密码去验证用户输入的用户及密码是否存在于主库4.51或从库4.52.
passwd=123qqq...A
max_slave_connections=100%
#[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 //监听管理服务的端口,手动增加
2.3 配置数据库服务器(在主从数据库服务器上创建授权用户)
mysql> grant replication slave,replication client on *.* to maxscalemon@"%" identified by '123qqq...A'; //创建,授权给监控用户(在主服务器4.51上操作,自动同步到4.52)
mysql> grant select on mysql.* to maxscalerouter@"%" identified by "123qqq...A"; //创建,授权给路由用户(在主服务器4.51上操作,自动同步到4.52)
mysql> select user,host from mysql.user where user like "maxscale%"; //查看授权状况(主库4.51,从库4.52都需要查看)
2.4 启动代理服务(在4.57上操作)
[root@db57 ~]# maxscale -f /etc/maxscale.cnf
2.5 查看服务状态(在4.57上操作)
[root@db57 ~]# netstat -apntul|grep maxscale
tcp6 0 0 :::4006 :::* LISTEN 941/maxscale
tcp6 0 0 :::4016 :::* LISTEN 941/maxscale
[root@db57 ~]# ls /var/log/maxscale/ //服务启动后,产生日志
maxscale.log
2.6在代理服务器本机上,访问管理服务,并查看监控信息
[root@db57 ~]# maxadmin -uadmin -pmariadb -P4016 //注意这里的P是大写
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
-------------------+-----------------+-------+-------------+--------------------
2.7 验证数据读写分离
2.7.1 在主服务器上添加访问数据的连接用户(从服务器自动同步)
Mysql>create database gamedb;
Mysql>create table gamedb.a(id int,name char(10));
Mysql>grant select,insert on gamedb.* to yaya66@”%” identified by “123qqq...A” //授权用户yaya66
2.7.2 客户端192.168.4.50连接到代理,访问数据
]# mysql -h192.168.4.57 -P4006 -uyaya66 -p123qqq...A //连接到代理服务器
三, mysql多实例
1.多实例的概念
在一台物理主机上运行多个数据库服务
2.目的: 节约成本; 提高硬件的利用率.
在主机192.168.4.56上实验.
思路: 装软件->配置文件->启动服务->查看服务状态->客户端访问.
1.装包
真机scp -r mysql-5.7.20-linux-glibc2.12-x86_64.tar.gz root@192.168.4.56:/root/
56]# tar -xvf mysql-5.7.20-linux-glibc2.12-x86_64.tar.gz
56]# mv mysql-5.7.20-linux-glibc2.12-x86_64 /usr/local/mysql //改名为mysql
2.配置文件
#vim /etc/my.cnf //该文件需要手动创建
[mysqld_multi] //启用多实例
mysqld = /usr/local/mysql/bin/mysqld_safe //指定进程文件路径
mysqladmin = /usr/local/myslq/bin/mysqladmin //指定管理命令路径
user = root //指定进程用户
[mysqld1] //实例进程名称,实例1
datadir = /dir1 //数据库目录,需要手动创建
port=3307 //端口号
log-error = /dir1/mysqld1.err //错误日志位置
pid-file = /dir1/mysqld1.pid //进程pid号文件位置
socket = /dir1/mysqld1.socket //指定socket文件的路径和名称
[mysqld2] //实例进程名称,实例2
datadir = /dir2
port=3307
log-error = /dir2/mysqld2.err
pid-file = /dir2/mysqld2.pid
socket = /dir2/mysqld2.socket
# mkdir /dir1 //创建配置文件中指定的目录dir1
# mkdir /dir2 //创建配置文件中指定的目录dir2
3.启动服务
3.1第一次启动,会报错路径PATH没有定义. 需要定义变量路径及开机自启
# PATH=/usr/local/mysql/bin:$PATH
#echo “export PATH=/usr/local/mysql/bin:$PATH” >> /etc/bashrc
3.2 第二次启动,会报错提示有一个依赖包libaio需要安装
# yum -y install libaio*
3.3 第三次启动,会报错提示没有mysql这个账号
#useradd mysql
3.4 第四次启动,成功. 而且会在命令执行的末行产生一个初始密码(用于客户端登录)
3.5 查看目录/dir1内是否有产生文件
[root@db56 ~]# ls /dir1 //查看目录下内容
4.客户端访问,使用初始密码连接
#/usr/local/mysql/bin/mysql -uroot -p初始密码 -S sock文件 //使用初始密码登录
Mysql>alter user root@”localhost” identified by ‘新密码’ //修改密码