2020年1月
高并发下,php与redis实现的抢购、秒杀功能
InnoDB性能调优基础(进阶)
https://blog.csdn.net/zhu19774279/article/details/38645663
- 硬件
今天,大数据集(largedatasets)的内存一般都是数以百G,即使是T级别也没什么好惊讶。MySQL需要足够多的内存,以提供最佳性能,如缓存热点数据、索引、大量变化(ongoing changes)。InnoDB有更短的响应时间,并能以更合理的方式利用磁盘IO。从CPU来看,当然是核越多、速度越快越好。32/64核的CPU已经越来越普遍,最新版本的MySQL在对多核CPU的支持上也比以前的版本要好得多。再来看存储,SSD正在取代传统的机械硬盘,并获得了巨大的成功,当然这是用钱来换最好的性能。RAID 10仍然是多数情况下的首选,但要确保你的RAID控制器能够很好的支持SSD硬盘,以免成为瓶颈。当然如果你对IOPS有很高的需求,可以选择多个PCI-e Flash卡。
- 操作系统
Linux是最常见的高性能MySQL的服务器。请确保使用最新的内核和现代的文件系统,如EXT 4或XFS。两种文件系统都有各自的优缺点:如XFS删大文件时比较快,EXT4却能让SSD硬盘有更好的性能。选择权在你手上。这篇文章(www.ssdperformanceblog.com/2013/04/testing-the-micron-p320h/)(很奇怪这个网站用Firefox、chrome或IE都打不开,翻墙也打不开,实在不知道什么原因——译者注)告诉你如何让EXT4比XFS有更好的性能。当你的表特别多,而你又使用了innodb_file_per_table参数的时候,noatime和nodiratime将会给你带来一点点的性能提升。Linux的默认I/O调度程序是CFQ(Completely Fair Queuing),实际上多数情况下Noop/Deadline有更好的性能。对于MySQL专用服务器,将swappiness设为0是一个不错的选择,因为这可以降低swapping的延迟。要确保MySQL的主机不会出现内存不足的情况。swapping对MySQL是有害的,并且会阻止内存中的缓存。想了解更多有关swapping的知识,可以阅读这篇文章(www.mysqlperformanceblog.com/2008/04/06/should-you-have-your-swap-file-enabled-while-running-mysql/)。
- MySQL InnoDB 配置
从5.5开始,InnoDB是默认的引擎,所以这些参数能够比以前更好的优化性能。最重要的是以下这些:
innodb_buffer_pool_size:缓冲池对InnoDB的影响很大,一定要配置正确,因此要给这个值分配足够的内存。通常是可用内存的70%-80%。更确切地说,如果你的内存比数据集大那么一点,那么让这个值比数据库的大小大一点最好,当然你需要注意数据库大小的增长,并经常调整innodb缓冲池的大小,使二者大小保证一致。(这句话没看太懂,原文是:More precisely, if you have RAM bigger than your dataset setting itbit larger should be appropriate with that keep in account of your databasegrowth and re-adjust innodb buffer pool size accordingly.)如果你用的是PerconaServer 5.1或Percona Server 5.5,那么在代码级别对InnoDB的缓冲有优化,相关知识可以看这篇文章http://www.percona.com/doc/percona-server/5.5/scalability/innodb_split_buf_pool_mutex.html。
innodb_buffer_pool_instances:InnoDB1.1和MySQL5.5中介绍了多Innodb缓冲池。5.5中这个值默认大小是1,而5.6中是8。这个参数的取值范围是1-64。在高并发的任务中允许使用innodb_buffer_pool_instances会非常有效,因为它能够减少全局互斥锁(global mutexes)的存在。(这个参数在CentOS版的MySQL-5.5.39的配置文件中没有,不知原文作者说的5.5中的默认值哪来的——译者注)
Dump/Restore Buffer Pool:这个参数能够在重启时,提高保存、恢复缓冲池内容的速度。这个特性最早出现在Percona Server 5.5中,可以通过这两篇文章做进一步了解(http://www.percona.com/doc/percona-server/5.5/management/innodb_lru_dump_restore.html?id=percona-server:features:innodb_lru_dump_restore,http://www.mysqlperformanceblog.com/2010/01/20/xtradb-feature-save-restore-buffer-pool/)。MySQL 5.6中也加入了该特性,要在数据库启动或关闭时自动dump数据,需要将innodb_buffer_pool_dump_at_shutdown和innodb_buffer_pool_load_at_startup设置为ON。
innodb_log_file_size:足够大的InnoDB事务日志,对于稳定的、高质量写性能至关重要。但巨大的日志文件同样意味着崩溃以后的恢复会很慢。当然,在5.5进行巨大改进以后,这一点已经不再是经常争论的重点。MySQL 5.6将默认值从5MB调整到50MB,但这个值对于很多情况依然太小。另外,在MySQL 5.6中,如果这个参数值被改变,那么MySQL将会在重启的时候自动调整大小。在MySQL 5.6中,合并后的日志文件大小从4G调整到512G。有关日志最佳大小的问题,可以阅读这篇文章(http://www.mysqlperformanceblog.com/2008/11/21/how-to-calculate-a-good-innodb-log-file-size/)
innodb_log_buffer_size:InnoDB的写操作,将数据写入到内存中的日志缓存中,由于InnoDB在事务提交前,并不将改变的日志写入到磁盘中,因此在大事务中,可以减轻磁盘I/O的压力。通常情况下,如果不是写入大量的超大二进制数据(a lot of huge blobs),4MB-8MB已经足够了。
innodb_flush_log_at_trx_commit:这个值设为1时,将会在每次日志提交时,将日志缓冲(log buffer)中的内容刷入硬盘,以确保数据最大限度的完整性,当然这样也会对性能带来影响。如果设为2,表示每次日志提交时,仅仅将日志缓冲中的内容刷入操作系统的文件缓存。如果你对ACID不那么关注,并且对于OS崩溃前最后一两秒的事务丢失不那么在意的话,设为2将带来更好的性能。
innodb_thread_concurrency:随着InnoDB的改善,现在推荐大家使用默认值0,即由InnoDB引擎自己控制并发。如果你看到并发相关的讨论,可以调整这个参数。推荐值的简单计算方法是(CPU的数量+硬盘数量)*2(2 times the number of CPUs plus the number of disks)。这是一个动态变量,这意味着改变这个值不用重启MySQL即可生效。
innodb_flush_method:DIRECT_IO能减轻I/O的压力。直接I/O不进行缓存,如果设置为O_DIRECT可以避免缓冲池与文件系统的双缓冲,但是需要有RAID控制器以及电池备份的写缓存。(原文不是这样,但原文没看太懂Given that you have hardware RAID controller and battery-backedwrite cache.)
innodb_file_per_table:从MySQL 5.6开始,这个值默认是ON。这个是默认值是因为可以避免产生巨大的共享表空间,并且可以在drop和truncate一张表的时候,迅速释放空间。独立的表空间同样在Xtrabackup的部分备份时有优势。
除了以上这些,Percona Server 5.5和MySQL 5.6对InnoDB有很多增强。在Percona Server 5.5的XtraDB中加入了Persistentoptimizer statistics,通过innodb_use_sys_stats_table参数控制,相关知识可以阅读这篇文章(http://www.percona.com/doc/percona-server/5.5/diagnostics/innodb_stats.html?id=percona-server:features:innodb_stats&redirect=1#innodb_use_sys_stats_table),在MySQL 5.6中也引入了这个特性。在MySQL5.6中,使用两个新表mysql.innodb_index_stats和mysql.innodb_table_stats来存储persistentstats。通过这个,在查询(query)的时候,能够保证更精确和一致性。更多细节请阅读文档这里http://dev.mysql.com/doc/refman/5.6/en/innodb-performance.html#innodb-persistent-stats。同样PerconaServer 5.5里介绍了来自于线程池的特性,可以阅读这个官方文档http://www.percona.com/doc/percona-server/5.5/performance/threadpool.html。另外线程池的知识还可以还可以阅读这里http://www.mysqlperformanceblog.com/2013/03/16/simcity-outages-traffic-control-and-thread-pool-for-mysql/。
PerconaServer是免费且开源的。是在MySQL基础上修改的,上面有的特性只有Percona Server才有。
还有很多参数可以调整,但是在这篇文章我们只关注InnoDB。
- 为InnoDB优化应用程序
对于应用程序,尤其是以前使用MyISAM引擎的程序来说,需要进行以下调整。
首先,确保在更新操作(update)时使用事务,这样既可以保证一致性,也能够获得更好的性能。其次,如果你的程序有任何写操作,都应该要考虑可能发生的死锁。再次,请检查你的表结构,以确保他们能从InnoDB属性中获得性能改善,如:用主键聚集数据,所有索引都有主键(因此要保证主键短),用主键进行快速查找(试着使用join),大的未压缩的索引(使主键尽可能的简单。)(这一段话不太懂:clustering by primary key, having primary key in all indexes (sokeepprimary key short), fast lookups by primary keys (try to use it in joins),largeunpacked indexes(try to be easy on indexes).)
- 总结
本文几乎覆盖了所有和MySQL性能有关的参数,包括InnoDB的基础或进阶参数、OS的参数和硬件配置。通过这些修改,可以确保所有MySQL服务器的性能都得到优化。
docker 常用命令
1.查看docker版本
docker -v
2.查看镜像仓库中某个镜像
docker search docker镜像
镜像的核心概念
- 容器技术募集硬件资源的目的,是为了运行软件,提供服务
- 镜像是容器中运行软件的集合
Docker镜像仓库: https://hub.docker.com/
3.镜像仓库中下载某个镜像
docker pull ubuntu
4.查看当前已经下载的镜像
docker images
根据"镜像ID"将镜像保存成一个tar文件:
docker save 镜像ID -o 输出文件名.tar
将本地tar镜像载入:
docker load -i 本地tar镜像文件名.tar
载入后会没有tag名称,需要更改tag
docker tag 镜像ID tag名称
5.查看当前所有容器
docker ps -a
6.启动一个新容器
docker run --name 容器名称 -p 宿主端口:容器端口 -d 镜像 -v 宿主数据目录:容器数据目录
跟随宿主主机启动容器
--restart=always
交互式进入容器:
docker exec -it 容器名称 /bin/bash
7.启动/重启/停止一个容器
docker start/restart/stop 容器ID
8.删除一个容器
docker rm -f 容器ID
9.查看运行容器中的进程信息
docker top 容器名称
10.优化Docker镜像代理
查看docker信息
docker info
11.将容器导出为压缩文件
docker export -o 保存文件.tar 容器id或容器名称
优化docker代理
vim /etc/docker/daemon.json
在daemon.json文件中输入以下代理配置
{"registry-mirrors":["https://obou6wyb.mirror.aliyuncs.com"]}
加载代理配置
加载代理配置
systemctl daemon-reload
重启docker服务
systemctl restart docker
查看docker信息 验证配置
docker info
搭建Docker可视化管理工具 Portainer
ubuntu 16.04 (+) Docker 安装——入门实战
激活windows server 2019
通过KMS激活服务器激活windows
1.清除旧密钥
slmgr.vbs -upk
2.添加产品新密钥(windows server 2019 ServerStandard edition)
slmgr.vbs -ipk N69G4-B89J2-4G8F4-WWYCC-J464C
如果产品密钥没选对,则会出现错误
3.设置KMS激活服务器IP
slmgr.vbs -skms 10.1.45.250
4.开始激活
slmgr.vbs -ato
5.显示激活后信息
slmgr.vbs -dlv
一、windows server 2019零售版永久激活码:
Windows Server 2019 Datacenter Retail:
[Key]:RC4VN-4GQBW-WYPTV-3BD66-FVXR6
Windows Server 2019 Standard Retail:
[Key]:N3P28-TW9C9-69PWP-YQVC3-YBKR4
Windows Server 2019 Essential Retail:
[Key]:NMB98-MKJBC-FTVQ9-J3XK6-QYKTQ
二、Windows Server 2019批量授权版KMS客户端安装密钥Volume:GVLK
Windows Server 2019 Datacenter
[Key]:WMDGN-G9PQG-XVVXX-R3X43-63DFG
Windows Server 2019 Standard
[Key]:N69G4-B89J2-4G8F4-WWYCC-J464C
Windows Server 2019 Essential
[Key]:WVDHN-86M7X-466 P 6-VHXV7-YY726
一、windows server 2016零售版永久激活码
1、Windows Server 2016数据中心版零售版
Windows Server 2016 Datacenter Retail:
[Key]:6CNGG-BJP34-H923Y-6DMWR-37BMF
[Key]:HHRN4-BW4JY-GC9FP-TW3V8-7FT34
[Key]:DBNBR-9R8Q8-PPPT7-8J64C-MP3D4
[Key]:JD3N6-PXR8T-JQGRD-WVTXB-VQXQ4
2、Windows Server 2016标准版零售版
Windows Server 2016 Standard Retail:
[Key]:P96NB-8TJQB-BW47F-TQRMX-T839R
[Key]:QN6PR-XJQQK-KWRWK-8BC2T-6839R
[Key]:QXN3J-843V9-89VM3-KWXFJ-7FT3F
[Key]:RBKMW-YNB8P-WRC27-HK9BR-K4T3F
3、Windows Server 2016基础版零售版
Windows Server 2016 Essential Retail:
[Key]:XY9TM-N67HT-DDMJ7-M2HDW-82Q9J
[Key]:CTFPM-YN9D3-PT2CR-GTDJ4-8446W
二、windows server 2016批量授权版kms密钥
Windows Server 2016 KMS 客户端安装密钥
Windows Server 2016 Datacenter:CB7KF-BWN84-R7R2Y-793K2-8XDDG
Windows Server 2016 Standard:WC2BQ-8NRM3-FDDYY-2BFGV-KHKQY
Windows Server 2016 Essentials:JCKRF-N37P4-C2D82-9YXRT-4M63B
搭建windows KMS激活服务器
前提需要linux 服务器
LINUX搭建KMS服务器,SSH下执行一下命令:
wget https://github.com/Wind4/vlmcsd/releases/download/svn1111/binaries.tar.gz
或者
wget http://dgq.msdgq.com/down/binaries.tar.gz
tar -zxvf binaries.tar.gz
cd binaries/Linux/intel/static/
./vlmcsd-x64-musl-static
需要防火墙允许tcp1688端口
firewall-cmd --add-port=1688/tcp --permanent
firewall-cmd --reload
windows下Mysql8.0.12安装详解
https://www.cnblogs.com/wuxunyan/p/9648326.html
下载mysql-8.0.19-winx64.zip
mysql-8.0.19-winx64.zip
在Windows server Core 版本上安装SQL2016
在Windows Server 2012 Core上安装SQL Server 2012 Core Edition
首先要谈一下为什么要在Core模式上安装SQL。主要原因就是-这是个服务器,不需要向客户端一样的华丽的GUI,只要安装配置完成之后,基本上不愿意对它进行操作。当然更重要的是对于服务器来说最重要的是性能、稳定性、安全性、可用性这些指标。从性能上来说其实Core模式上的SQL Server并没有什么变化,所以我更看重的是安全性和可用性。毕竟对于SQL Server来说GUI是不需要的,IE也是不需要的,这样相关的补丁就少多了,如果你仔细看微软的补丁,很多都与GUI相关。如果需要GUI完全可以通过远程管理的方式来实现。在客户端上安装服务器管理工具和SSMS,也就不会在意服务器是不是有GUI了。我们需要的就是服务器能在哪里老老实实的干活,究竟是什么模式?Who Care?另外有一点不得不说,在Core模式下安装SQL Server你只能选择通过命令行来进行安装,安装的速度快很多,之前安装SQL Server 2012多数时间都是在等待UI,从部署的效率来讲,Core模式是最佳选择。
整个安装的过程非常的简单,在虚拟机上安装Windows Server 2012 Core最多10分钟就能搞定。安装完成之后需要安装一下.net framework 3.5.1,这个安装可以通过dism命令来实现,只不过需要注意一点,需要指定Source参数
DISM /Online /Enable-Feature /FeatureName:NetFx3 /All /LimitAccess /Source:d:\sources\sxs
也就是说需要你提供Windows Server 2012的安装文件,否则没法安装。
安装完成之后就可以把ISO换成SQL Server的安装文件了,我的安装文件是从MSDN上下载的,不知道到Core Edition与其他的安装介质是否有区别,其他的应该也可以(没测试过),貌似这个Core Edition应该是一个子集。 安装的时候需要一些参数
Setup.exe /q /ACTION=Install /FEATURES=SQL /INSTANCENAME=MSSQLSERVER /SQLSVCACCOUNT="
那个SQLSYSADMINACCOUNTS是必须的,其他的启动帐号都可以可选,如果需要SQL验证,需要添加一个SecurityMode和PWD参数,具体的参数可以参考 http://msdn.microsoft.com/en-us/library/ms144259.aspx 如果只安装DB Engine,整个过程应该在15分钟左右。
在Windows server 2019 Core 版本上安装SQL2016
安装系统后,通过网络等方式先把安装ISO的文件copy过来,虚拟机则用挂一个虚拟光驱即可,然后cd进入目录,执行以下命名即可安装核心服务了:
Setup.exe /qs /ACTION=Install /FEATURES=SQLEngine,Replication /INSTANCENAME=MSSQLSERVER /SQLSVCACCOUNT="计算机名\登陆用户名" /SQLSVCPASSWORD="windows的登陆密码" /SQLSYSADMINACCOUNTS="计算机名\登陆用户名" /AGTSVCACCOUNT="NT AUTHORITY\Network Service" /TCPENABLED=1 /IACCEPTSQLSERVERLICENSETERMS /SECURITYMODE=SQL /SAPWD=sa的密码
安装完成后,后端口打开,以便管理工具连接:
netsh firewall set portopening protocol = TCP port = 1433 name = SQLPort mode = ENABLE scope = SUBNET profile = CURRENT
netsh advfirewall firewall add rule name = SQLPort dir = in protocol = tcp action = allow localport = 1433 remoteip = localsubnet profile = DOMAIN
使用sql命令行工具sqlcmd.exe进行创建数据库与执行sql查询
1、找到sqlcmd.exe路径
c:\> dir sqlcmd.exe /s
结果显示如下:
C:\Program Files\Microsoft SQL Server\Client SDK\ODBC\130\Tools\Binn 的目录
2、将上面路径添加到path中
c:\> path=%path%;C:\Program Files\Microsoft SQL Server\Client SDK\ODBC\130\Tools\Binn;
3、执行sqlcmd.exe进入sql命令行
c:\> sqlcmd.exe
1>
4、创建数据库test
1> create database test;
2> go
5、更改当前数据库为test
1> use test;
2> go
6、创建一个表:users
1> create table users( id int, username varchar(32), password varchar(32));
2> go
7、查询表:
1> select * from users;
2> go