MySQL主从同步常用配置选项:
]#vim /etc/my.cnf
[mysqld]
....
:wq
]# systemctl restart mysqld
master选项
binlog_do_db=库名列表 //只允许同步的库
binlog_ignore_db=库名列表 //只不允许同步的库
slave 选项
slave_log_updates 级联复制 (主从从)
replicate_do_db=库名列表 //只同步的库
replicate_ignore_db=库名列表 //只不同步的库
+++++++++++++++++++++++++++
3.2主从同步复制模式
3.2主从同步复制模式
启用半同步复制模式
show varoables like 'have_dynamic_loading';(查看变量,允不允许动态加载模块)
master:
select plugin_name, plugin_status from information_schema.plugins where plugin_name like '%semi%'; (查看是否安装半同步插件)
install plugin rpl_semi_sync_master soname 'semisync_master.so'; (安装主库半同步插件)
mysql> set global rpl_semi_sync_master_enabled=1; (启用主库半同步)
show variables like 'rpl_semi_sync_%_enabled'; (查询半同步状态)
slave:
mysql> install plugin rpl_semi_sync_slave soname 'semisync_slave.so'; (安装从库半同步插件)
mysql> select plugin_name,plugin_status from information_schema.plugins where plugin_name like '%semi%'; (查看半同步状态) (变量名区分大小写)
(这些都是暂时性的,要想永久就得写入配置文件)
mysql> set global rpl_semi_sync_slave_enabled=1; (启用从库半同步)
mysql>show variables like 'rpl_semi_sync_%_enabled' (查看半同步状态)
休息到 11:10
55
vim /etc/my.cnf
[mysqld]
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
:wq
]# scqld
mysql> show variables like 'rpl_semi_sync_%_enabled'; (查看半同步状态)
++++++++++++++++++++++++++++++
DBA2_DAY02
MySQL数据读写分离
MySQL多实例
MySQL优化
]#mysql -h主库ip -uadmin -p123456
51
mysql> select * from t1; 查询数据 (读)
mysql> insert into t1 values(11); 存储数据(写)
MySQL数据读写分离: 把客户端查询数据库的请求和写入数据的请求,分别给不同的数据库服务器处理。
MySQL数据读写分离结构的目的: 减轻主库的并发访问压力,提高从库的硬件利用率。
部署MySQL数据读写分离:
手动分离:需要程序员协同完成,规定程序在存储数据时连接master数据库服务。查询数据时连接slave数据库服务。
部署实现数据读写分离服务实现: MySQL中间件
mycat mysql-proxy maxscale
配置数据读写分离服务:
1 部署MySQL主从同步结构(一主(51)一从(52))
mysql>change master to master_host="192.168.4.51",master_user="repluser",master_password="123qqq...A",master_log_file="db51.000001",master_log_pos=441;
mysql> start slave;
2测试主从同步配置
2.1 在主库给客户端授权存储数据时,连接服务器的用户密码密码
mysql>create database testdb;
mysql>create table testdb.t1(id int);
mysql>grant select ,insert on testdb.* to yaya99@"%" identified by "123qqq...A";
2.2 在客户端50连接主库存储数据
mysql -h192.168.4.51 -uyaya99 -p123qqq...A
mysql> insert into testdb.t1 values(888);
mysql> select * from testdb.t1;
2.3 在从库本机查看 是否同步主库的设置
select * from testdb.t1;
select user from mysql.user where user="yaya99";
select * from testdb.t1;
3 配置读写分离服务器56
装包
]# rpm -ivh maxscale-2.1.2-1.rhel.7.x86_64.rpm
修改配置文件
]# cp /etc/maxscale.cnf /etc/maxscale.cnf.bak (防止被改坏,备份一份)
vim /etc/maxscale.cnf
[maxscale]
10 threads=auto (线程数,auto自动定义的,根据cpu核数来创建)
18行
[server数字] (定义服务器名)
[MySQL Monitor]
[Read-Write Service]
[MaxAdmin Service]
[Read-Write Listener]
[MaxAdmin Listener]
[server1] 定义数据库服务主机名
type=server
address=192.168.4.51 //master主机ip地址
port=3306 端口号
protocol=MYSQLBackend (后端存储名)
[server2]
type=server
address=192.168.4.52从库
port=3306
protocol=MYSQLBackend
36行
[MYSQL Monitor] 定义要监视的数据库节点
type=monitor
module=mysqlmon
servers=server1,server2 主从数据库的主机名
user=scalemon 用户名可以随便定义
password=密码 用户连接的密码
monitor_interval=10000
53-58行注释掉(不然只能写不能读)
64行
[Read-Write Service] 定义读写分离的数据库节点
type=service
router=readwritesplit
servers=server1 ,server2 主从库的主机名
user=maxscale 用户名
password=密码
max_slave_connections=100%
注释掉86-90行(不然只能读不能写)
[MaxAdmin Service]
type=service
router=cli
[Read-Write Listener]
49 type=listener
50 service=Read-Write Service
51 protocol=MySQLClient
52 port=4006
4006(读写分离的端口)
[MaxAdmin Listener]
99 type=listener
100 service=MaxAdmin Service
101 protocol=maxscaled
102 socket=default
103 port=4016 (默认没指定端口号,给他指定端口号,范围在1024-65536)注意不要用其他服务软件的端口,不然被占用)
root@host56 ~]# sed -i '/^#/d' /etc/maxscale.cnf (删除配置文件#号开头的文件)
在数据库服务器上 根据配置文件的设置添加对应的授权用户
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>grant all on *.* to lisi@'%' identified by "123qqq...A" (创建访问数据用户)
mysql> select user from mysql.user where user in ("scalemon","maxscale");
在服务56主机上测试授权用户
]# which mysql
]# yum -y install mariadb
]# mysql -h192.168.4.51 -uscalemon -p123qqq...A
]# mysql -h192.168.4.52 -uscalemon -p123qqq...A
]# mysql -h192.168.4.51 -umaxscale -p123qqq...A
]# mysql -h192.168.4.52 -umaxscale -p123qqq...A
启动服务
]# maxscale -f /etc/maxscale.cnf
]# pkill -9 maxscale //停止服务
查看服务信息
[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
4 测试读写分离服务器的配置
4.1 在56本机访问管理服务,查看监控信息
[root@host56 ~]# maxadmin -uadmin -pmariadb -P4016
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
-------------------+-----------------+-------+-------------+--------------------
4.2在客户端 连接56 主机,测试其读写分离配置
50]# mysql -h192.168.4.56 -P4006 -uyaya99 -p123qqq...A
mysql> select * from testdb.t1;
mysql> insert into testdb.t1 values(999) ;
区分读写分离的方法:从库写入的数据不会同步,看到的是从库;主库写入的数据偏移量会变化。
1,这种结构缺点是单点故障,读写分离依赖于主从同步,主库挂掉主从就不存在就不能实现读写分离,从库挂掉代理服务器就会让主库承担所有工作,增加主库的负担。
++++++++++++++++++++++++++++++++++++++++++++
MySQL多实例:在一台 物理主机上运行多个mysql数据库服务。
为什么要配置多实例服务:1,节约成本,提高硬件利用率。 缺点:一个硬件坏掉所有都坏掉,一般不用。
配置多实例服务192.168.4.50
663 rpm -qa | grep -i mysql
664 systemctl stop mysqld
666 systemctl disable mysqld
装包
]# tar -zxvf mysql-5.7.20-linux-glibc2.12-x86_64.tar.gz
]# mv mysql-5.7.20-linux-glibc2.12-x86_64 /usr/local/mysql
]# vim /etc/profile
export PATH=/usr/local/mysql/bin:$PATH (把路径加入到PATH这个变量就可以tab,不用局限于绝对路径)
:wq
]# source /etc/profile
]# echo $PATH
创建主配置文件
]# mv /etc/my.cnf /etc/my.cnf.bak
]# 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 = /data3307 (数据库目录,,手动创建)
socket = /data3307/mysql.sock (指定sock文件的路径和名称)
pid-file = /data3307/mysqld.pid (进程pid号文件位置)
log-error = /data3307/mysqld.err (错误日志)
[mysqld2]
port = 3308
datadir = /data3308
socket = /data3308/mysql.sock
pid-file = /data3308/mysqld.pid
log-error = /data3308/mysqld.err
:wq
]#mkdir /data3307
]#mkdir /data3308
初始化授权库
]# mysqld --user=mysql --basedir=/usr/local/mysql --datadir=/data3307 --initialize
2018-07-21T09:55:03.752482Z 1 [Note] A temporary password is generated for root@localhost: lfy9t&_mondL
[root@host50 ~]# mysqld --user=mysql --basedir=/usr/local/mysql --datadir=/data3308 --initialize
]#mysqld_multi start /data3307
]mysal#mysqld_multi --user=root --password=密码 stop 实例编号(data3308 3307)
]# ls /data3307
]# mysql -uroot -p初始密码 -s sock文件
】#alter user user() identified by "新密码"-s sock文件
【#mysqld_multi start /data3307
【#mysql -uroot -p新密码
]#mysqld --user=mysql --basedir=/usr/local/mysql --datadir=/data3308 --initialize
2018-07-21T09:57:54.500857Z 1 [Note] A tempoMySQL读写分离 MySQL多实例 、 MySQL性能调优rary password is generated for root@localhost: (:sKl_<?#3py
]# ls /data3308
启动服务
测试配置
缓存参数控制:
选项 含义
key_buffer-size 用于MySAM引擎的关键索引缓存大小
sort_buffrr_size 为每个要排序的线程分配此大小的缓存空间
read_buffer_size 为顺序读取记录保留的缓存大小
thread_cache_size允许保存在缓存中被重用的线程数量
table_open_cache为所有线程缓存的打开表的数量
。并发及连接控制
max_connections 允许的最大并发连接数
connect_timeout 等待连接超时,默认10秒,仅登录时有效
wait_timeout 等待关闭连接的不活动超时的秒数,默认28800秒(8小时)
.关于查询的缓存
查看缓存的大小:show variables like "query_cache%";
查看当前的查询缓存统计:show global status like "qcache%";
故障分析及排除:连接使用的用户名或密码错误, mysql-proxy没有启动
解决办法:查看授权用户是否存在:select user,host from mysql.user
查看mysql-proxy是否运行:ps aux | grep "mysql-proxy"
缓存参数控制
key_buffer_size=8M (当key_reads /key_read_requests较低时可适当加大此缓存值)
show global status like "key_read%";
show variables like "key_buffer_size";
缓存参数控制2:
sort_buffer_size=256k(增大此值可提高order和group的速度)
show variables like "sort_buffer_size";
缓存参数控制3:
查看表记录读取缓存(此缓存影响sql查询的响应速度)
show variables like "read_%_size";
缓存参数控制4:
查看可重用线程数:show variables like "thread_%_size";
查看当前的线程重用状态:show global status like "threads_%";
缓存参数控制5:
查看已打开,打开过多少个表:show global status like "open%tables";
查看可缓存多少个打开的表:show variables like "table_open_cache"; (理想比例小于等于95)
并发及连接控制:
查看当前已使用的连接数:flush status;
show global status like "max_used_connections";
查看默认的最大连接数:show variables like "max_connections";
调优思路总结:
手段 具体操作
升级硬件: cpu 内存,硬盘
加大网络带宽:付费加大带宽
调整mysql服务运行参数:并发连接数,连接超时时间,重复使用线程数。。。
调整与查询相关的参数:查询缓存,索引缓存。。。
启用慢查询日志:slow-query-log
网络架构不合理:调整网络架构
mysql日志类型
常用日志种类及选项:
类型 用途 配置
错误日志: 记录启动/运行/停止过程的错误消息 log-error[=name]
查询日志 : 记录客户端连接和查询操作 general-log
general-log-file=
慢查询日志: 记录耗时较长或不使用索引的查询操作: slow-query-log
slow-query-log-file=
long-query-time=
优化sql查询:
。记录慢查询
选项 含义
slow-query-log 启用慢查询
slow-query-log-file 指定慢查询日志文件
long-query-time 超过时间(默认10秒)
log-queries-not-using-indexes 未使用索引的查询
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
service mysql restart
优化sql查询2:
查看慢查询日志:使用mysqldumpslow工具
mysql>mysqldumslow /var/lib/mysql/mysql-slow.log