什么是数据读写分离?
–把查询请求和写请求分别给不同的数据库服务器处理。
为什么要配置数据读写分离?
读写分离适用与读远大于写的场景,如果只有一台服务器,当select很多时,update和delete会被这些select访问中的数据堵塞,等待select结束,并发性能不高。 对于写和读比例相近的应用,应该部署双主相互复制。
读写分离的好处:
1.增加冗余
2.增加了机器的处理能力
3.对于读操作为主的应用,使用读写分离是最好的场景,因为可以确保写的服务器压力更小,而读又可以接受点时间上的延迟。
如何配置?
方法一、人肉分离(由程序员写程序实现)
没有配置分离服务器
查询就去主库 select ----------> 主库
写、更新、删除就去从库 insert update delete ----->从库
方法二、部署数据库读写分离服务器
mysql 分离服务器(中间件):基于数据库客户端和主、从服务端的软件
如:maxscale、mycat、mysql-proxy
一、配置步骤
1、配置主从同步结构
主库:
启用binlog日志、用户授权、查看日志信息
从库:
指定server_id、指定主库信息
2、部署数据库读写分离服务器(中间件即分离服务器56操作)
**a、**装包maxscale
**b、**修改配置文件
vim /etc/maxscale.cnf
9 [maxscale] //定义服务运行时线程的数量
10 threads=auto //自动创建
18 [server1] //定义数据库服务器
19 type=server
20 address=192.168.4.51 //ip地址
21 port=3306 //端口
22 protocol=MySQLBackend
23 [server2] //定义服务运行时线程的数量
24 type=server
25 address=192.168.4.52
26 port=3306
27 protocol=MySQLBackend
34 [MySQL Monitor] //定义监控的数据库服务器
35 type=monitor
36 module=mysqlmon
37 servers=server1,server2 //主、从数据库的主机名
38 user=maxmon //监控连接数据库服务器的用户
39 [email protected]
40 monitor_interval=10000
注释51~60行
51 ##[Read-Only Service] //不定义只读服务器
52 #type=service
53 #router=readconnroute
54 #servers=server1
55 #user=myuser
56 #passwd=mypwd
57 #router_options=slave
58 #
59 # ReadWriteSplit documentation:
60 # https://github.com/mariadb-corporation/MaxScale/blob/2.1/Documentation/Routers/ReadWriteSplit.md
[Read-Write Service] //定义读写分离的数据节点
63 type=service
64 router=readwritesplit
65 servers=server1,server2 //主、从数据库的主机名
66 user=monscale //连接数据库服务器的监控用户,
67 [email protected] //密码
68 max_slave_connections=100%
74 [MaxAdmin Service] //定义管理服务
75 type=service
76 router=cli
注释84~88
84 #[Read-Only Listener] //不定义只读服务使用的端口
85 #type=listener
86 #service=Read-Only Service
87 #protocol=MySQLClient
88 #port=4008
90 [Read-Write Listener] //定义读写分离服务使用的端口
91 type=listener
92 service=Read-Write Service //读写分离服务的名称
93 protocol=MySQLClient
94 port=4006
96 [MaxAdmin Listener] //定义管理服务使用的端口
97 type=listener
98 service=MaxAdmin Service
99 protocol=maxscaled
100 socket=default
101 port=4016
**c、**根据配置文件的配置做对应的设置
server1
server2
maxmon [email protected]
monscale [email protected]
授权要与配置文件改的内容一致(在主库授权)
mysql> grant replication slave,replication client on * . * to maxmon@"%" identified by "[email protected]"; //创建监控用户
mysql> grant select on mysql.* to monscale@"%" identified by "[email protected]"; //创建路由用户
mysql> select user,host from mysql.user in("maxmon","monscale");
在中间件服务验证
]# yum -y install mariadb
mysql -h192.168.4.51 -u maxmon [email protected]
mysql -h192.168.4.51 -u monscale [email protected]
mysql -h192.168.4.52 -u maxmon [email protected]
mysql -h192.168.4.52 -u monscale [email protected]
**d、**启动服务(maxscale)(在中间件操作)
maxscale -f /etc/maxscale.cnf
停止服务
pkill -9 maxscale
若使用systemctl restat maxscale 启动服务会使pkill杀不死进程,无法正常停止服务。
注意:若服务没起来就是配置文件错误
]# ss -nuplt | grep maxscale //查看服务是否启动
tcp LISTEN 0 128 :::4016 :::* users:(("maxscale",pid=3552,fd=12))
tcp LISTEN 0 128 :::4006 :::* users:(("maxscale",pid=3552,fd=11))
]# maxadmin -P4016 -uadmin -pmariadb //查看管理服务信息
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
-------------------+-----------------+-------+-------------+--------------------
在主库授权访问数据的用户
mysql> create database bbsdb;
mysql> create table bbsdb.a(id int);
mysql> grant select,insert on bbsdb.* to student@"%" identified by "[email protected]"; //创建访问数据用户
在从库查看
mysql> desc bbsdb.a;
3、在客户端主机,测试读写分离的配置
在客户端连接数据读写分离服务器(中间件)
]# mysql -h192.168.4.56 -P4006 -u student [email protected]
mysql> select
nysql> insert
主库添加的数据其他从库可以看到
从库添加的数据主库查不到其他从库、客户端可以
在维护数据读写分离要注意什么?
给中间件即(分离服务器)、主库、从库做备用机。
需要的软件包:
mysql-5.7.20-linux-glibc2.12-x86_64.tar.gz
什么是多实例?
–在一台物理主机上运行多个数据库服务
为什么要使用多实例?
—节约运维成本
—提高硬件利用率
环境准备:
1)停止主机rpm包的mysqld数据库服务(可以在新机操作)
]#systemctl restart stop mysqld
]# mv /etc/my.cnf /root/
]# tar -xf mysql-5.7.20-linux-glibc2.12-x86_64.tar.gz
]# mv mysql-5.7.20-linux-glibc2.12-x86_64 /usr/local/mysql
]# ls /usr/local/mysql
bin COPYING docs include lib man README share support-files
]# vim /etc/my.cnf
[mysqld_multi]
mysqld = /usr/mysql/bin/mysqld_safe
mysqladmin = /usr/mysql/bin/mysqladmin
user = root
[mysqld1] //实例进程名称
datadir=/dir1 //数据库目录
port=3307 //端口号
socket=/dir1/mysql1.sock //socket文件
log-error=/dir1/mysql1.log //错误日志
pid-file=/dir1/mysql1.pid //进程PID号文件
[mysqld2]
datadir=/dir2
port=3308
socket=/dir2/mysql2.sock
log-error=/dir2/mysql2.log
pid-file=/dir2/mysql2.pid
根据修改的主配置文件创建目录
]# mkdir /dir1
]# mkdir /dir2
4)启动服务
启动服务的时候会自动初始化授权库
]# /usr/local/mysql/bin/mysql_multi start 1 //启动mysql1
2019-01-14T08:36:48.330315Z 1 [Note] A temporary
password is generated for root@localhost: MijjajtUW6%6 //密码
]# ss -unlpt |grep 3307
]# ls /dir1
5)客户端测试
]# /usr/local/mysql/bin/mysql -u root -p'MijjajtUW6%6' -S /dir1/mysql1.sock //初始密码登陆
mysql> alter user user() identified by '123456'; //修改本机密码
]#/usr/local/mysql/bin/mysql -u root -p123456 -S /dir1/mysql1.sock //修改密码后登陆
mysql> create database fan;
mysql> create table fan.a(id int);
#创建数据库、表后目录会有对应的文件
]# ls /dir1/fan/
a.frm a.ibd db.opt
mysql2同上
停止服务:
/usr/local/mysql/bin/mysqld_multi --user=root --password=123456 stop 1 //停止mysql1服务
在配置多实例机子上添加授权用户使客户端可以访问
多实例:
]# /usr/local/mysql/bin/mysql -u root -p123456 -S /dir2/mysql2.sock
mysql> grant all on * . * fan@"%" identified by "123456";
mysql> select user,host from mysql.user;
客户端
]# mysql -h192.168.4.50 -P3308 -u fan -p123456
1)MySQL体系结构
2)MySQL执行流程
3)MySQL性能调优
4)并发及连接控制
图一、
图二、
5)缓冲参数控制
图一、
图二、
图三、
图四、
图五、
图六、
]# vim /etc/my.cnf
[mysqld]
..........
slow_query_log=1
slow_query_log_file=mysql-slow.log
slow_query_time=5
log_queries_not_using_indexes=1 //启用慢查询日志,为1秒
]# service mysql restart
]# mysqldumpslow /var/lib/mysql/mysql-slow.log