DBA02 一、实现MySQL读写分离 二、配置MySQL多实例 三、MySQL性能优化

一、实现MySQL读写分离

什么是数据读写分离?
–把查询请求和写请求分别给不同的数据库服务器处理。
为什么要配置数据读写分离?
读写分离适用与读远大于写的场景,如果只有一台服务器,当select很多时,update和delete会被这些select访问中的数据堵塞,等待select结束,并发性能不高。 对于写和读比例相近的应用,应该部署双主相互复制。
读写分离的好处:
1.增加冗余
2.增加了机器的处理能力
3.对于读操作为主的应用,使用读写分离是最好的场景,因为可以确保写的服务器压力更小,而读又可以接受点时间上的延迟。
如何配置?
方法一、人肉分离(由程序员写程序实现)
没有配置分离服务器
查询就去主库 select ----------> 主库
写、更新、删除就去从库 insert update delete ----->从库
方法二、部署数据库读写分离服务器
DBA02 一、实现MySQL读写分离 二、配置MySQL多实例 三、MySQL性能优化_第1张图片
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

主库添加的数据其他从库可以看到
从库添加的数据主库查不到其他从库、客户端可以

在维护数据读写分离要注意什么?
给中间件即(分离服务器)、主库、从库做备用机。
DBA02 一、实现MySQL读写分离 二、配置MySQL多实例 三、MySQL性能优化_第2张图片

二、配置MySQL多实例

需要的软件包:
mysql-5.7.20-linux-glibc2.12-x86_64.tar.gz
什么是多实例?
–在一台物理主机上运行多个数据库服务
为什么要使用多实例?
—节约运维成本
—提高硬件利用率

环境准备:
DBA02 一、实现MySQL读写分离 二、配置MySQL多实例 三、MySQL性能优化_第3张图片
1)停止主机rpm包的mysqld数据库服务(可以在新机操作)

]#systemctl restart stop mysqld
]# mv /etc/my.cnf     /root/

安装支持多实例服务的软件包
DBA02 一、实现MySQL读写分离 二、配置MySQL多实例 三、MySQL性能优化_第4张图片
装源码包

]# 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

2)修改主配置文件
配置文件参数说明
DBA02 一、实现MySQL读写分离 二、配置MySQL多实例 三、MySQL性能优化_第5张图片

]# 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

3)初始化授权库(可省略这一步)
DBA02 一、实现MySQL读写分离 二、配置MySQL多实例 三、MySQL性能优化_第6张图片

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

三、MySQL性能优化

DBA02 一、实现MySQL读写分离 二、配置MySQL多实例 三、MySQL性能优化_第7张图片
1)MySQL体系结构
DBA02 一、实现MySQL读写分离 二、配置MySQL多实例 三、MySQL性能优化_第8张图片
2)MySQL执行流程
DBA02 一、实现MySQL读写分离 二、配置MySQL多实例 三、MySQL性能优化_第9张图片
3)MySQL性能调优

  • 提高MySQL系统的性能、响应速度
    —替换有问题的硬件(CPU、磁盘、内存等)
    —服务程序的运行参数调整
    —对SQL查进行优化

4)并发及连接控制
图一、
DBA02 一、实现MySQL读写分离 二、配置MySQL多实例 三、MySQL性能优化_第10张图片
图二、
DBA02 一、实现MySQL读写分离 二、配置MySQL多实例 三、MySQL性能优化_第11张图片
5)缓冲参数控制
图一、
DBA02 一、实现MySQL读写分离 二、配置MySQL多实例 三、MySQL性能优化_第12张图片
图二、
DBA02 一、实现MySQL读写分离 二、配置MySQL多实例 三、MySQL性能优化_第13张图片
图三、
DBA02 一、实现MySQL读写分离 二、配置MySQL多实例 三、MySQL性能优化_第14张图片
图四、
DBA02 一、实现MySQL读写分离 二、配置MySQL多实例 三、MySQL性能优化_第15张图片
图五、
DBA02 一、实现MySQL读写分离 二、配置MySQL多实例 三、MySQL性能优化_第16张图片
图六、
DBA02 一、实现MySQL读写分离 二、配置MySQL多实例 三、MySQL性能优化_第17张图片

二、SQL查询优化

1)MySQL日志类型
DBA02 一、实现MySQL读写分离 二、配置MySQL多实例 三、MySQL性能优化_第18张图片
2)优化SQL查询
DBA02 一、实现MySQL读写分离 二、配置MySQL多实例 三、MySQL性能优化_第19张图片

  • 调整服务配置
 ]# 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 工具
]# mysqldumpslow /var/lib/mysql/mysql-slow.log

三、查询的缓存

图一、
DBA02 一、实现MySQL读写分离 二、配置MySQL多实例 三、MySQL性能优化_第20张图片
图二、
DBA02 一、实现MySQL读写分离 二、配置MySQL多实例 三、MySQL性能优化_第21张图片
四、调优思路总结
DBA02 一、实现MySQL读写分离 二、配置MySQL多实例 三、MySQL性能优化_第22张图片

你可能感兴趣的:(MySQL数据库知识集,MySQL读写分离,配置MySQL多实例,MySQL性能优化)