读写分离和多实例
mysql-day07 读写分离和多实例
问题配置条件
代理服務器 53 55
主庫52 从库54
案例拓扑
• 添加一个 MySQL 代理
– 为客户端提供统一的数据库接口
读写分离的原理
• 多台 MySQL 服务器
– 分别提供读、写服务,均衡流量
– 通过主从复制保持数据一致性
• 由 MySQL 代理面向客户端
– 收到 SQL 写请求时,交给服务器 A 处理
– 收到 SQL 读请求时,交给服务器 B 处理
– 具体区分策略由服务设置
1)装包
rpm -ivh maxscale-2.1.2-1.rhel.7.x86_64.rpm
[root@host53~]#cd /soft/mysqld/
[root@host53~]#rpm -qa | grep maxscale
maxscale-2.1.2-1.x86_64
[root@host53~]#rpm -qc maxscale
/etc/maxscale.cnf.template
[root@host53~]#
2)修改配置文件
[root@host53~]#ls /etc/maxscale.cnf
/etc/maxscale.cnf
[root@host53~]#cp /etc/maxscale.cnf /etc/maxscale.cnf.bak备份默认文件
[root@host53~]#vim /etc/maxscale.cnf //配置文件maxscale.cnf
2)根据配置文件做相应的设置(在2台数据库服务器上添加用户
v //主库52添加,从库54自动同步
监控数据库服务器时,连接数据库服务器的用户 《创建监控用户》
mysql>grant replication slave,replication client on *.* to scalemon@'%'
identified by "123456";
v 验证访问数据时,连接数据库服务器使用的用户,是否在数据库服务器上存在的,连接用户, 《创建路由用户》
mysql>grant select on mysql.*to maxscale@'%' identified by "123456";
v 创建连接用户,通过这个用户名连接数据库,进行访问 《创建访问数据用户》
mysql> grant all on *.* to student@'%' identified by "123456";
v 查看授权用户主库,从库
mysql> select user,host from mysql.user where user in("scalemon","maxscale");
4)验证在代理服务器上授权用户是否可以登入
[root@host53~]#mysql -h192.168.4.52 -uscalemon -p123456
[root@host53~]#mysql -h192.168.4.54 -umaxscale -p123456
5)启动服务
[root@host53~]#maxscale -f /etc/maxscale.cnf
6)查看服务进程和端口
查看端口
[root@host53~]#netstat -utnlp | grep :4006
[root@host53~]#netstat -utnlp | grep:4018
[root@host53~]#maxadmin -P4018 -uadmin -pmariadb
MaxScale>list servers
7)客户端访问数据读写分离服务器
]#which mysql
]#mysql -h192.168.4.53 -p4006 -ustudent -p123456
mysql>select @@hostname; //这条命令,查看的读取的主机host
mysql>执行插入或查询(在51和52本机查看记录)
配置mysql多实例
mysql多实例的原理
mysql多实例,简单的说,就是在一台服务器上开启多个不同的mysql服务端口(如 3306,3307),运行多个mysql服务进程。这些服务进程通过不同的socket监听 不同的服务端口,来提供各自的服务。
这些mysql实例共用一套mysql安装程序,使用不同的my.cnf配置文件、启动程序、 数据文件。在提供服务时,mysql多实例在逻辑上看来是各自独立的,各个实例之间 根据配置文件的设定值,来取得服务器的相关硬件资源。
要求:在主机192.168.4.56配置mysql多实例:
运行2个数据库服务
² 第1个数据库服务数据库目录/dataone
服务端口号3307
sock文件/dataone/mysqld.sock
日志文件/dataone/mysqld.log
² 第2个数据库服务
数据库目录/datatow
服务端口号3308
sock文件/datatwo/mysqld.sock
日志文件/datatwo/mysqld.log环境准备
Netstat - utnalp | grep:3307
Netstat - utnalp | grep:3308
1)下载软件
[root@redhat~]#wget https://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.20-linux-glibc2.12-x86_64.tar.gz
[root@host50~]#tar -xf mysql-5.7.20-linux-glibc2.12-x86_64.tar.gz
[root@host50~]#mv mysql-5.7.20-linux-glibc2.12-x86_64/usr/local/mysql
[root@host56~]#echo "export PATH=/usr/local/mysql/bin:$PATH" >> /etc/profile
[root@host56~]#source /etc/profile
[root@host56~]#echo $PATH
/usr/local/mysql/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
2)编辑配置文件
]#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
log-error=/dataone/mysqld.log
pid-file=/dataone/mysqld.pid
[mysqld2]
port=3308
datadir=/datatwo
socket=/datatwo/mysqld.sock
log-error=/datatwo/mysqld.log
pid-file=/datatwo/mysqld.pid
:wq
3)根据配置文件的设置,做相应的配置
3.1创建数据库目录
3.2创建进程运行的所有者和组mysql
[root@host56~]#mkdir -p /dataone
[root@host56~]#mkdir -p /datatwo
[root@host56~]#useradd mysql
c[root@host56~]#chown mysql:mysql /data*
3.3初始化授权库
]#mysqld --user=mysql --basedir=/usr/local/mysql --datadir=/dataone --initialize
2018-05-05T08:47:48.992696Z 1[Note]A temporary password is generated for root@localhost:bXk.5j!pjto#
[root@host56~]#ls /dataone/
]#mysqld --user=mysql --basedir=/usr/local/mysql --datadir=/datatwo --initialize
2018-05-05T08:50:09.429934Z 1[Note]A temporary password is generated for root@localhost:bKsaf+xzk0V3
[root@host56~]#ls /datatwo/
4)启动多实例服务
[root@host56~]#mysqld_multi start 1
[root@host56~]#mysqld_multi start 2
[root@host56~]#netstat -utnlp | grep:3308
tcp6 0 0:::3308:::*LISTEN 1156/mysqld
[root@host56~]#netstat -utnlp | grep:3307
tcp6 0 0:::3307:::*LISTEN 927/mysqld
5)访问多实例服务
连接实例服务1
[root@host56~]#mysql -uroot -p'bXk.5j!pjto#' -S /dataone/mysqld.sock
mysql>ALTER USER user()identified by"123456";
mysql>show databases;
[root@host56~#mysql -uroot -p123456 -S /dataone/mysqld.sock
6)连接实例服务2
[root@host56~]#mysql -uroot -p'bKsaf+xzk0V3' -S /datatwo/mysqld.sock
mysql>alter user user() identified by"123456";
mysql>show databases;
[root@host56~]#mysql -uroot -p123456 -S /datatwo/mysqld.sock
7)停止启动的实例服务
]#mysqld_multi --user=root --password=密码 stop 实例编号
[root@host56~]#mysqld_multi --user=root --password=123456 stop 1
[root@host56~]#netstat -utnlp | grep:3307
[root@host56~]#mysqld_multi --user=root --password=123456 stop 2
[root@host56~]#netstat -utnlp | grep:3308
[root@host56~]#mysql -uroot -p123456 -S /datatwo/mysqld.sock
注意:启动不了,启动数据库
*************************************************
总结:
mysql优化
1)启用慢查询日志
vim/etc/my.cnf
[mysqld]
slow-query-loglong-query-time=2
log-queries-not-using-indexes
:wq
]#systemctl restart mysqld
]#mysql-uroot-p123456
mysql>select sleep(3);
mysql>select sleep(5);
查看日志文件内容
]#cat /var/lib/mysql/主机名-slow.log
统计日志文件记录信息
~]#mysqldumpslow /var/lib/mysql/db55-slow.log > /tmp/sql.txt
启用查询日志
vim/etc/my.cnf
[mysqld]
general-log
]#systemctl restart mysqld
]#cat /var/lib/mysql/db55.log
MySQL性能调优
mysql>show variables like"%变量名%";
•提高MySQL系统的性能、响应速度
–替换有问题的硬件(CPU/磁盘/内存等)
–服务程序的运行参数调整
–对SQL查询进行优化
1)查看变量
mysql>show variables like"%time%";
2)设置等待连接时间
mysql>set innodb_lock_wait_timeout=100;
3)查看允许最大并发连接
mysql>show variables like"%max_connections%";
4)更改连接时间
mysql>set global max_connections=300;
5)最大的使用连接
mysql>show global status like"max_used_connections";
6)刷新
mysql>flush status;
7)等待建立连接的超时秒数,默认10秒,只在登录时有效
mysql>show variables like"%connect_timeout%";
8)等待关闭连接的不活动超时秒数,默认28800秒(8小时)
mysql>show variables like"%wait_timeout%";
9)缓存参数控制单位:字节
•缓冲区、线程数量、开表数量
选项含义
key_buffer-size用于MyISAM引擎的关键索引缓存大小
sort_buffer_size为每个要排序的线程分配此大小的缓存空间
read_buffer_size为顺序读取表记录保留的缓存大小
thread_cache_size允许保存在缓存中被重用的线程数量
table_open_cache为所有线程缓存的打开的表的数量
query_cache查询缓存
+------------------------------+---------+--------------
|Variable_name|Value|
+------------------------------+---------+--------------
|query_cache_limit|1048576|
|query_cache_min_res_unit|4096|
|query_cache_size|1048576|
|query_cache_type|OFF|
|query_cache_wlock_invalidate|OFF|
+------------------------------+---------+---------------
10)查看当前的查询缓存统计
mysql>show global status like"qcache%";
11)所有软件没有独立的日志储存的地方
[root@host52~]#vim /var/log/messages
12)记录慢查询
² 选项含义
slow-query-log启用慢查询
slow-query-log-file指定慢查询日志文件
long-query-time超过指定秒数(默认10秒)的查询才被记录
log-queries-not-using-indexes记录未使用索引的查询
² 调整服务配置
[root@dbsvr1~]#vim /etc/my.cnf
[mysqld]
....
slow_query_log=1
slow_query_log_file=mysql-slow.log
long_query_time=5
log_queries_not_using_indexes=1
[root@dbsvr1~]#service mysql restart
- 常用日志种类及选项<一般要开启>
² 类型用途配置
错误日志记录启动/运行/停止过程中l og-error[=name]的错误消息
查询日志记录客户端连接和查询操作general-log
general-log-file=
慢查询日志记录耗时较长或不使用索引的查询操作slow-query-log
slow-query-log-file=
long-query-time=
[root@host52 mysql]#vim /etc/my.cnf
[mysqld]
general-log//查询日志host52.log
slow-query-log//慢查询日志host52-slow.log
long-query-time=5
log-queries-not-using-indexes
[root@host52 mysql]#systemctl restart mysqld
1)保存到新文件
[root@host52 mysql]#mysqldumpslow host52-slow.log > /tmp/sql.txt
2)动态查询记录文件日志
[root@host52 mysql]#tail -f host52-slow.log
###########################################
办理主库从库快捷设置
半开同步复制式 /et/my.cnf
plugin-load= "rpl_semi_sync_master=semisync_master.so;
rpl_semi_sync_slave=semisync_slave.so"
rpl-semi-sync-master-enabled = 1
rpl-semi-sync-slave-enabled = 1
l 主库设置 /et/my.cnf
[mysqld]
#skip-grant-tables
plugin-load = "rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so"
rpl-semi-sync-master-enabled = 1
rpl-semi-sync-slave-enabled = 1
server_id=54
log-bin=master54
binlog-format="mixed"
lower_case_table_names = 1
validate_password_policy=0
validate_password_length=6
l 从库 /et/my.cnf
[mysqld]
skip-grant-tables
server_id=56
#validate_password_policy=0
#validate_password_length=6