DBA07 - MySQL读写分离 MySQL多实例、MySQL性能调优

一、数据读写分离

1.1 什么是数据读写分离

把客户端访问数据时的查询请求和写请求分别给不同的数据库服务器处理。

1.2 为要对数据做读写分离

减轻单台数据库服务器的并发访问压力
提高数据库服务器硬件利用率

1.3 实现数据读写分离的方式

人肉分离:  做不同的数据操作时,访问指定的数据库服务器
使用mysql中间件提供的服务实现:mycat   mysql-proxy   maxscale

1.4 使用中间件提供的服务做数据读写分离的缺点

单点故障(当从库挂掉的时候,主库会承担用户的所有读写请求。当主库挂掉的时候,从库无法提供任何服务)
当访问量大时,会成为网络瓶颈

二、配置数据读写分离

2.1  拓扑结构            

client254   mysql  -h192.168.4.56  -u用户名    -p密码      //webuser    123456
                      |
             代理服务器56
                       |
__________________________________
        write                     read
            |                           |
        master                 slave
          51                          52

2.2 配置数据读写分离

2.2.1  配置一主一从  主从同步结构,并在客户端测试配置
master51> grant  all  on  webdb.*  to webuser@"%"  identified by " 123456";

2.2.2  配置数据读写分离服务器
2.2.2.1环境准备
setenforce  0
systemctl  stop  firewalld
yum repolist
ping  -c  2  192.168.4.51
ping  -c  2  192.168.4.52
下载软件包 maxscale-2.1.2-1.rhel.7.x86_64.rpm

2.2.2.2 配置数据读写分离服务器56
1 装包

2 修改配置文件
vim  /etc/maxscale.cnf
  9 [maxscale]  //服务运行后开启线程的数量
 10 threads=auto

#定义数据库服务器
 18 [名称]    
 19 type=server
 20 address=数据库服务器的ip地址
 21 port=3306
 22 protocol=MySQLBackend

扫描二维码关注公众号,回复: 2532516 查看本文章

#定义监控的数据库服务器
 36 [MySQL Monitor]
 37 type=monitor
 38 module=mysqlmon
 39 servers=数据库服务器列表
 40 user=监视数据库服务器时连接的用户名
 41 passwd=密码
 42 monitor_interval=10000

#不定义只读服务
 53 #[Read-Only Service]
 54 #type=service
 55 #router=readconnroute
 56 #servers=server1
 57 #user=myuser
 58 #passwd=mypwd
 59 #router_options=slave

#定义读写分离服务
 64 [Read-Write Service]
 65 type=service
 66 router=readwritesplit
 67 servers=数据库服务器列表
 68 user=用户名 #验证连接代理服务访问数据库服务器的用户是否存在
 69 passwd=密码
 70 max_slave_connections=100%

#定义管理服务
 76 [MaxAdmin Service]
 77 type=service
 78 router=cli

#不指定只读服务使用的端口号
 86 #[Read-Only Listener]
 87 #type=listener
 88 #service=Read-Only Service
 89 #protocol=MySQLClient
 90 #port=4008

#定义读写分离服务使用的端口号
 92 [Read-Write Listener]
 93 type=listener
 94 service=Read-Write Service
 95 protocol=MySQLClient
 96 port=4006  #设置使用的端口

#定义管理服务使用的端口
 98 [MaxAdmin Listener]
 99 type=listener
100 service=MaxAdmin Service
101 protocol=maxscaled
102 socket=default
       port=4018    #不设置使用的默认端口

3 根据配置文件的设置,在2台数据库服务器上添加授权用户

mysql>grant replication slave, replication client on *.* to scalemon@'%'  identified by  '123qqq...A'; 

mysql> grant select on mysql.* to maxscale@"%" identified by  '123qqq...A';

mysql> select  user from mysql.user  where  user  in ("scalemon","maxscale"); 

4 启动服务

]# maxscale  -f /etc/maxscale.cnf

]# pkill  -9 maxscale   //停止服务

5 查看服务进程和端口

[root@host56 ~]# ps -C maxscale
  PID TTY          TIME CMD
25957 ?        00:00:00 maxscale

[root@host56 ~]# netstat -utnlp | grep -i  maxscale
tcp6       0      0 :::4016                 :::*                    LISTEN      25957/maxscale
      
tcp6       0      0 :::4006                 :::*                    LISTEN      25957/maxscale  

2.2.3 测试配置
a 在本机访问管理管端口查看监控状态
]#maxadmin  -P端口  -u用户   -p密码
]#maxadmin -P4016  -uadmin   -pmariadb 

MaxScale>list  servers
 
b 客户端访问数据读写分离服务
]#which  mysql
]#mysql  -h读写分离服务ip   -P4006   -u用户名  -p密码

]# mysql -h192.168.4.56 -P4006 -uwebuser -p123456
mysql>  select  @@hostname
mysql>  执行插入或查询 ( 在51 和 52 本机查看记录)
+++++++++++++++++++++++++++++++++++++++++++++++++
二、mysql多实例
2.1 多实例介绍
2.2 配置多实例
1 环境准备
2 安装提供多多实例服务的mysql数据库服务软件
3 编辑配置文件  /etc/my.cnf
]#rm  -rf  /etc/my.cnf
]#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=/dataone   #数据库目录

socket=/dataone/mysqld.sock    #sock文件
log-error=/dataone/mysqld.log #错误日志

pid-file=/dataone/mysqld.pid   #pid号文件

4 根据配置文件的设置,做相应的配置
4.1创建数据库目录
4.2创建进程运行的所有者和组 mysql
4.3 初始化授权库
]#mysqld  --user=mysql  --basedir=软件安装目录  --datadir=数据库目录   --initialize
5 启动多实例服务
]# mysqld_multi   start   实例编号
6 访问多实例服务
]#mysql -uroot   -p'密码'  -S    sock文件   #首次登录,使用初始密码
+++划重点:使用初始密码登录后,要求修改登录密码
mysql> ALTER USER user() identified   by   "新密码";
7 停止多实例服务
]# mysqld_multi  --user=root  --password=密码  stop  实例编号

+++++++++++++++++++++++++++++++++++++++++++++++++++
三、mysql调优
3.1 mysql体系结构 (由8个功能模块组成):
管理工具: 安装服务软件后,提供的命令 
                                mysqldump  
        mysqlbinlog
        mysqladmin
连接池: 当接收到客户端的连接请求后,检查是否有资源响应客户端的连接请求。
 
SQL接口: 把sql传递给mysqld线程处理

分析器: 检查执行的sql命令是否有语法错误,和是否有访问权限。

优化器:优化执行的sql命令,已最节省资源的方式执行sql命令

查询缓存: 缓存曾经查找到的记录,缓存空间从物理内存划分出来的。

存储引擎: 是表的处理器,不同的存储引擎有不同的功能和数据存储方式。Myisam   innodb

文件系统: 存储表中记录的磁盘

3.2mysql服务处理查询请求过程:
数据服务器接收到查询请求后,先从查询缓存里查找记录,若查询缓存里有查找记录,直接从缓存提取数据给客户端,

反之到表去查询记录,把查到的记录先存放到查询缓存里在返回给客户端。

3.3mysql调优
3.3.1 如何优化mysql数据库服务器(那些原因会导致数据库服务器处理客户端的连接请求慢)
A、硬件配置低,导致处理速度慢。 CPU  内存  存储磁盘
                                                               接口   转速    15000/s
uptime     free  -m      top  --> 0.0 wa

b  、网络带宽窄   网络测速软件


c 、提供服务软件的版本低,导致性能低下:
1 查看服务运行时的参数配置   my.cnf
mysql> show  variables;
mysql> show  variables   like "%innodb%";
2 常用参数:
并发连接数量
Max_used_connections/max_connections=0.85
  500/x=0.85  * 100%   = 85%

show  global  status  like "Max_used_connections";
set  global   max_connections  =   数字;

连接超时时间
show   variables   like   "%timeout%";
connect_timeout  客户端与服务器建立连接时tcp三次握手超时是时间
wait_timeout  户端与服务器建立连接后,等待执行sql命令的超时时间。


可以重复使用的线程的数量  thread
show   variables   like   "%thread%";
thread_cache_size = 9

所有线程同时打开表的数量
show   variables   like   "%open%";
table_open_cache

mysqld  -----> disk ---->x.ibd ----> memory  ----> disk

与查询相关参数的设置  (字节)   mysqld
select   *  from   t1;   read_buffer_size

select   *  from   t1  order  by   字段名;sort_buffer_size


select   *  from   t1  group  by   字段名;read_rnd_buffer_size
name ----> index
select  * from  t1  where  name="jim"; key_buffer-size  


与查询缓存相关参数的设置
show   variables   like   "%cache%";
show   variables   like   "query_cache%";

query_cache_wlock_invalidate | OFF  关
当对myisam存储引擎的表执行查询时,若检查到有对表做写de sql操作,不从查询缓存里查询数据返回给客户端,而是

等写操作完成后,重新查询数据返回给客户端。

pc1   select    name  from t1  where name="bob";
                   cache --->  name=bob

pc2 select    name  from t1  where name="bob";
     mysqld->  name= bob;

pc3  update  t1  set  name="jack" wehre  name="bob";

查看查询缓存的统计信息:
show   global   status   like   "qcache%";
Qcache_hits        10     记录在查询缓存里查询到数据的次数     
Qcache_inserts   100   记录在查询缓存里查找数据的次数  
Qcache_lowmem_prunes    清理查询缓存空间的次数

3 修改服务运行时的参数:
3.1 命令行设置,临时生效。
mysql>  set   [global]  变量名=值;

3.2在配置文件里设置永久生效:
vim /etc/my.cnf
[mysqld]
变量名=值
:wq

4、程序编写sql查询语句太复杂导致,数据库服务器处理速度慢。
开启数据库服务器的慢查询日志,记录超过指定时间显示查询结果的sql命令。                                           10s

4.1 mysql数据库服务日志类型:
错误日志  默认开启 记录服务在启动和运行过程中产生的错误信息log-error=/var/log/mysqld.log
binlog日志 又被称作二进制日志:
慢查询日志: 记录超过指定时间显示查询结果的sql命令
查询日志: 记录所有sql命令。
5、网络架构有问题(有数据传输瓶颈) 

猜你喜欢

转载自blog.csdn.net/qq_36441027/article/details/81157032