您的位置:首页 > 数据库 > MySQL

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

2019-01-19 19:54 232 查看

一、实现MySQL读写分离

什么是数据读写分离?
–把查询请求和写请求分别给不同的数据库服务器处理。
为什么要配置数据读写分离?
读写分离适用与读远大于写的场景,如果只有一台服务器,当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 passwd=123456@qq.Com
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 passwd=123456@qq.Com		//密码
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 123456@qq.Com
monscale 123456@qq.Com
授权要与配置文件改的内容一致(在主库授权)

mysql> grant  replication slave,replication client on * . * to maxmon@"%" identified by "123456@qq.Com";		//创建监控用户
mysql> grant select on mysql.* to monscale@"%" identified by "123456@qq.Com";		//创建路由用户
mysql> select user,host from mysql.user in("maxmon","monscale");

在中间件服务验证

]# yum -y install mariadb
mysql -h192.168.4.51 -u maxmon -p123456@qq.Com
mysql -h192.168.4.51 -u monscale -p123456@qq.Com
mysql -h192.168.4.52 -u maxmon -p123456@qq.Com
mysql -h192.168.4.52 -u monscale -p123456@qq.Com

**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 "123456@qq.Com";		//创建访问数据用户
在从库查看
mysql> desc bbsdb.a;

3、在客户端主机,测试读写分离的配置
在客户端连接数据读写分离服务器(中间件)

]# mysql -h192.168.4.56 -P4006 -u student -p123456@qq.Com
mysql> select
nysql> insert

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

在维护数据读写分离要注意什么?
给中间件即(分离服务器)、主库、从库做备用机。

二、配置MySQL多实例

需要的软件包:
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

2)修改主配置文件
配置文件参数说明

]# 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)初始化授权库(可省略这一步)

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性能优化


1)MySQL体系结构

2)MySQL执行流程

3)MySQL性能调优

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

4)并发及连接控制
图一、

图二、

5)缓冲参数控制
图一、

图二、

图三、

图四、

图五、

图六、

二、SQL查询优化

1)MySQL日志类型

2)优化SQL查询

  • 调整服务配置
]# 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

三、查询的缓存

图一、

图二、

四、调优思路总结

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: