性能达到瓶颈的解决方案html
MySQL扩展采用的方式读写分离
将数据库的访问拆分红两种访问,读(select)和写(增删改),经过调度器,将用户的不一样请求分别发送给读服务器或者写服务器,在写服务器增长数据时,须要使用主从复制机制来同步数据到读服务器前端
主从复制特征node
主从复制的功用mysql
读写分离应用:git
主从复制原理
github
MySQL垂直分区
web
MySQL水平分片(Sharding)
算法
主从复制架构:sql
主从配置官网资料
https://mariadb.com/kb/en/library/setting-up-replication/
https://dev.mysql.com/doc/refman/5.5/en/replication-configuration.htmlshell
主节点配置
log_bin
:启用二进制日志,在mariadb配置文件,[mysqld]内添加项 server_id=#
:为当前节点设置一个全局唯一的ID号,判断数据来源的标识,[mysqld]内添加项log-basename=master
:设置datadir中日志名称sync_binlog=1
: 每次写后当即同步二进制日志到磁盘,性能差innodb_flush_log_at_trx_commit=1
: 每次事务提交当即同步日志写磁盘innodb_support_xa=ON
: 默认值,分布式事务MariaDB10.3.0废除sync_master_info=#
:#次事件后master.info同步到磁盘REPLICATION SLAVE
:给予从服务器的权限,只能够同步复制二进制日志repluser
:用户帐号命名HOST
:从服务器IP或网段IDENTIFIED BY
:设置口令关键字从节点配置:
配置文件
server_id=#
:为当前节点设置一个全局唯的ID号relay_log=relay-log
:中继日志的文件路径,默认值文件名为hostname-relay-binrelay_log_index=relay-log.index
:中继日志索引文件路径,默认值hostname-relay-bin.indexskip_slave_start=ON
:不自动启动slavesync_relay_log=#
:#次写后同步relay log到磁盘sync_relay_log_info=#
:#次事务后同步relay-log.info到磁盘使用有复制权限的用户帐号链接至主服务器,并启动复制线程
复制架构中应该注意的问题
read_only=ON
mysql> FLUSH TABLES WITH READ LOCK;
STOP SLAVE
RESET SLAVE ALL
sql_slave_skip_counter = N
理论上应该保持主从服务器版本一致,避免出现未知错误
主从复制
已经有主从服务器,额外添加一个从服务器
--master-data=1
选项,会自动在备份文件中加入CHANGE MASTER TO
关键词,修改彻底备份文件,在导入时备份文件时,使其能够直接执行从服务器同步复制指令若是主服务器A宕机,在从服务器(B、C)中,选一个来充当主服务器
级联复制,给从服务器B再下设从服务器C
主从复制依赖的是二进制日志文件,而从服务器接收主服务器的二进制文件经过中继日志执行写入磁盘,不会产生新的二进制日志(二进制日志产生是对数据库直接进行增删改),想要在从服务器生成二进制文件供级联使用,就须要在配置文件中加入选项log_slave_updates
主服务器为A,从服务器为B,从服务器的下设从服务器为C;在从服务器B上修改配置文件,开启二进制日志功能,重启服务,查看二进制日志位置
在C上设置从服务器设置,修改配置文件,设置惟一id,设只读设置等,而后进入mysql设置从服务器,将主机指向B
容易产生的问题
数据同步有延迟,两主机可能修改的是同一个数据,容易冲突;所以慎用
考虑要点:自动增加id
主主复制的配置步骤:
默认状况下,MySQL的复制功能是异步的,异步复制能够提供最佳的性能,主库把binlog日志发送给从库即结束,并不验证从库是否接收完毕。
因为MySQL的复制内在机制,可能会产生比较大的延迟,这意味着当主服务器或从服务器端发生故障时,有可能从服务器没有接收到主服务器发送过来的binlog日志,这就会形成主服务器和从服务器的数据不一致,甚至在恢复时形成数据的丢失;而同步方式效率又不高。
rpl_semi_sync_master
,这个插件表现为库so文件/usr/lib64/mysql/plugin/semisync_master.so
/usr/lib64/mysql/plugin/semisync_slave.so
让从节点仅复制指定的数据库,或指定数据库的指定表
服务器选项:主服务器仅向二进制日志中记录与特定数据库相关的事件
注意:此项和binlog_format相关,基于二进制还原将没法实现;不建议使用
参看:https://mariadb.com/kb/en/library/mysqld-options/#-binlog-ignore-db
binlog-do-db = 数据库白名单列表,多个数据库需多行实现
binlog-ignore-db = 数据库黑名单列表
从服务器SQL_THREAD在replay中继日志中的事件时,仅读取与特定数据库(特定表)相关的事件并应用于本地
问题:会形成网络及磁盘IO浪费
示例,在从服务器上在白名单中添加数据库hellodb,只能对进入库操做起做用,须要use hellodb
进入数据库,改变数据后从服务器才能同步,hellodb.teacher写法会被过滤掉
在默认的主从复制过程或远程链接到MySQL/MariaDB全部的连接通讯中的数据都是明文的,外网里访问数据或则复制,存在安全隐患。经过SSL/TLS加密的方式进行复制的方法,来进一步提升数据的安全性
配置实现:
参看:https://mariadb.com/kb/en/library/replication-with-secure-connections/
配置示例
require ssl
8 主从复制的监控和维护
- 清理日志
- 删除指定部分二进制日志
- 删除二进制日志信息
- 删除从服务器信息
- 主从复制监控
- 查看当前二进制日志位置,白名单和黑名单
- 查看二进制日志记录详细内容
- 查看全部二进制日志大小及位置
- 查看从服务器同步复制信息
- 显示哪些链接线程正在运行
- 从服务器是否落后于主服务,在列表中
- 如何肯定主从节点数据是否一致
- 数据不一致如何修复
删除从数据库,从新复制9 MySQL高可用-集群架构
9.1 集群概述
实现高可用性解决方案
MHA集群架构
主服务器宕机缘由
为了尽量的减小主库硬件损坏宕机形成的数据丢失,所以在配置MHA的同时建议配置成MySQL 5.5的半同步复制
MHA软件由两部分组成,Manager工具包和Node工具包
工具 | 功能描述 |
---|---|
masterha_check_ssh | 检查MHA的SSH配置情况 |
masterha_check_repl | 检查MySQL复制情况 |
masterha_manger | 启动MHA |
masterha_check_status | 检测当前MHA运行状态 |
masterha_master_monitor | 检测master是否宕机 |
masterha_master_switch | 故障转移(自动或手动) |
masterha_conf_host | 添加或删除配置的server信息 |
工具 | 功能描述 |
---|---|
save_binary_logs | 保存和复制master的二进制日志 |
apply_diff_relay_logs | 识别差别的中继日志事件并将其差别的事件应用于其余的slave |
filter_mysqlbinlog | 去除没必要要的ROLLBACK事件(MHA已再也不使用此工具) |
purge_relay_logs | 清除中继日志(不会阻塞SQL线程) |
工具包安装位置
MHA集群搭建
vim /etc/mastermha/app1.cnf [server default] user=mhauser <==MHA服务器管理各主从服务器使用的帐号 password=magedu <==MHA服务器密码 manager_workdir=/data/mastermha/app1/ <==工做目录 manager_log=/data/mastermha/app1/manager.log <==日志 remote_workdir=/data/mastermha/app1/ <==被管理节点上manager的工做目录,自动生成 ssh_user=root <==主服务器上设置的管理员权限的帐号,用来读取日志、提高从服务器等 repl_user=repluser <==复制数据的帐号密码 repl_password=magedu ping_interval=1 <==1秒监控一次服务器是否正常工做 [server1] <==被管理的服务器 hostname=192.168.8.17 candidate_master=1 <==能够充当master的从服务器,人为定义充当主服务器 [server2] hostname=192.168.8.27 candidate_master=1 [server3] hostname=192.168.8.37
自定义扩展选项
secondary_check_script: ‘经过多条网络路由检测master的可用性’
master_ip_ailover_script: ‘更新Application使用的masterip’
shutdown_script: ‘强制关闭master节点’
report_script: ‘发送报告’
init_conf_load_script: ‘加载初始配置参数’
master_ip_online_change_script:‘更新master节点ip地址’
1. '修改配置文件' vim /etc/my.cnf [mysqld] log-bin server_id=1 skip_name_resolve=1 <==在MHA中,反向解析为强制项 2. '查看二进制文件,备用配置从服务器' mysql>show master logs 3. '建立从服务器复制权限帐号' mysql>grant replication slave on *.* to repluser@'192.168.8.%' identified by 'magedu'; 4. '建立高权限帐号查看二进制与提高从服务器' mysql>grant all on *.* to mhauser@'192.168.8.%’identified by‘magedu';
示例
在全部节点实现相互之间ssh key验证
实现主从关系
配置MHA,须要epel源,须要的工具包和
- 在manage管理端两个都要安装
- 1
- 2
测试manage,自动提高从服务器功能,宕掉主服务器
集成了Galera插件的MySQL集群,是一种新型的,数据不共享的,高度冗余的高可用方案;
目前Galera Cluster有两个版本,分别是Percona Xtradb Cluster及MariaDB Cluster,Galera自己是具备多主特性的,即采用multi-master的集群架构,是一个既稳健,又在数据一致性、完整性及高性能方面有出色表现的高可用解决方案
如图示:三个节点组成了一个集群,与普通的主从架构不一样,它们均可以做为主节点,三个节点是对等的,称为multi-master架构,当有客户端要写入或者读取数据时,链接哪一个实例都是同样的,读到的数据是相同的,写入某一个节点以后,集群本身会将新数据同步到其它节点上面,这种架构不共享任何数据,是一种高冗余架构想
同步复制与异步复制
同步复制优缺点
解决同步复制中的缺点
Galera集群使用的基于证书的复制系统就是创建如下方法之上的
基于认证的复制须要什么
Galera Cluster特色
Galera Cluster工做过程
Galera Cluster官方文档:
http://galeracluster.com/documentation-webpages/galera-documentation.pdf
http://galeracluster.com/documentation-webpages/index.html
https://mariadb.com/kb/en/mariadb/getting-started-with-mariadb-galera-cluster/
Galera Cluster包括两个组件
WSREP复制实现:
至少须要三个节点,不能安装mariadb-server
查看集群中相关系统变量和状态变量
Galera Cluster实现步骤
安装,须要配置yum源,这里使用清华的yum源
修改配置文件
下面为配置可选项
wsrep_cluster_name = ‘mycluster‘默认my_wsrep_cluster <==集群名称
wsrep_node_name = ‘node1’ <==自定义节点名称
wsrep_node_address = ‘192.168.8.7’
首次启动时,须要初始化集群,在其中一个节点上执行脚本mysql
mysql脚原本自安装包
在其中一个节点上运行此脚本,后面跟start --wsrep-new-cluster
表示开启新的组,后续的节点只要启动服务便可
数据库服务衡量指标:
压力测试工具
MYSQL压力测试工具Mysqlslap
来自于mariadb包,测试的过程默认生成一个mysqlslap的schema,生成测试表t1,查询和插入测试数据,mysqlslap库自动生成,若是已经存在则先删除。用–only-print来打印实际的测试过程,整个测试完成后不会在数据库中留下痕迹
--auto-generate-sql, -a
--auto-generate-sql-load-type=type
--auto-generate-sql-add-auto-increment
--number-char-cols=N, -x
--number-int-cols=N, -y
--number-of-queries=N
--query=name,-q
--create-schema
--commint=N
--compress, -C
--concurrency=N, -c
--concurrency=100,200,500
--engine=engine_name, -e engine_name
--iterations=N, -i
--only-print
--detach=N
--debug-info, -T
示例
mysqlslap -a -uroot -pmagedu
mysqlslap -a -c 100 -uroot -pmagedu
--number-of-queries 1000
:查询一千次--concurrency=50,100
:并发50和100分别测试--iterations=5
:迭代5次--engine=myisam,innodb
:分别对myisam,innodb引擎测试高并发大数据的互联网业务,架构设计思路是“解放数据库CPU,将计算转移到服务层”,并发量大的状况下,这些功能极可能将数据库拖死,业务逻辑放到服务层具有更好的扩展性,可以轻易实现“增机器就加性能”
'硬件:内存32G' innodb_file_per_table = 1 '打开独立表空间' max_connections = 8000 'MySQL服务所容许的同时会话数的上限,常常出现Too Many Connections的错误提示,则须要增大此值,根据服务器性能判断,防止设置过大超过承载能力崩溃' back_log = 300 'back_log 是操做系统在监听队列中所能保持的链接数,也就是最大会话数上限后,等待数上限' max_connect_errors = 1000 '每一个客户端链接最大的错误容许数量,当超过该次数,MYSQL服务器将禁止此主机的链接请求,直到MYSQL服务器重启或经过flush hosts命令清空此主机的相关信息' open_files_limit = 10240 '全部线程所打开表的数量' max_allowed_packet = 32M '每一个链接传输数据大小.最大1G,须是1024的倍数,通常设为最大的BLOB的值' wait_timeout = 10 '指定一个请求的最大链接时间,超时时长' sort_buffer_size = 16M '排序缓冲被用来处理相似ORDER BY以及GROUP BY队列所引发的排序' join_buffer_size = 16M '不带索引的全表扫描.使用的buffer的最小值' query_cache_size = 128M '查询缓冲大小' query_cache_limit = 4M '指定单个查询可以使用的缓冲区大小,缺省为1M' transaction_isolation = REPEATABLE-READ '设定默认的事务隔离级别' thread_stack = 512K '线程使用的堆大小. 此值限制内存中能处理的存储过程的递归深度和SQL语句复杂性,此容量的内存在每次链接时被预留.' log-bin '二进制日志功能' binlog_format=row '二进制日志格式' innodb_buffer_pool_size = 24G 'InnoDB使用一个缓冲池来保存索引和原始数据, 可设置这个变量到服务器物理内存大小的80%' innodb_file_io_threads = 4 '用来同步IO操做的IO线程的数量' innodb_thread_concurrency = 16 '在InnoDb核心内的容许线程数量,建议的设置是CPU数量加上磁盘数量的两倍' innodb_log_buffer_size = 16M '用来缓冲日志数据的缓冲区的大小' innodb_log_file_size = 512M '在日志组中每一个日志文件的大小' innodb_log_files_in_group = 3 '在日志组中的文件总数' innodb_lock_wait_timeout = 120 'SQL语句在被回滚前,InnoDB事务等待InnoDB行锁的时间' long_query_time = 2 '慢查询时长' log-queries-not-using-indexes '将没有使用索引的查询也记录下来'