动态 版块 发帖 消息 我的
Loading...
HuPei.net
商•龙虎纹青铜尊及其虎食人纹局部,战国•玉螭虎食人佩!
子版块
hupeinet
99
用多了apache的ab工具之后你就会发现ab存在很多问题, 那么怎么办呢, 今天推荐一个神器---webbench       webbench最多可以模拟3万个并发连接去测试网站的负载能力,个人感觉要比Apache自带的ab压力测试工具好,安装使用也特别方便。 webbench的安装wget http://www.ha97.com/code/webbench-1.5.tar.gz tar zxvf webbench-1.5.tar.gz cd webbench-1.5 make && make installwebbench使用方法webbench -c 500 -t 30 http://127.0.0.1/test.jpgwebbench的参数说明-c表示并发数,-t表示时间(秒) 测试结果示例引用Webbench - Simple Web Benchmark 1.5 Copyright (c) Radim Kolar 1997-2004, GPL Open Source Software. Benchmarking: GET http://127.0.0.1/test.jpg 500 clients, running 30 sec. Speed=3230 pages/min, 11614212 bytes/sec. Requests: 1615 susceed, 0 failed.---------------------------一、简介Webbench是知名的网站压力测试工具,能测试处在相同硬件上,不同服务的性能以及不同硬件上同一个服务的运行状况。webbench的标准测试可以向我们展示服务器的两项内容:每秒钟相应请求数和每秒钟传输数据量。Webbench最多可以模拟3万个并发连接去测试网站的负载能力 二、安装webbench-1.5.tar.gz1、将webbench-1.5.tar.gz文件上传至服务器的/opt/目录下;2、对webbench-1.5.tar.gz文件进行解压操作:[root@besttest opt]# tar -xvf webbench-1.5.tar.gzwebbench-1.5/webbench-1.5/webbench.1webbench-1.5/socket.cwebbench-1.5/webbench.cwebbench-1.5/Makefilewebbench-1.5/debian/webbench-1.5/debian/ruleswebbench-1.5/debian/dirswebbench-1.5/debian/copyrightwebbench-1.5/debian/controlwebbench-1.5/debian/changelogwebbench-1.5/COPYRIGHTwebbench-1.5/ChangeLog3、进入webbench-1.5目录进行编译操作:[root@besttest opt]# cd webbench-1.5[root@besttest webbench-1.5]# make &&make install-bash: make: command not found安装make编译器:[root@besttest webbench-1.5]# yum  -y install make再次进行编译操作:[root@besttest webbench-1.5]# make && make installcc -Wall -ggdb -W -O -c -o webbench.o webbench.cmake: cc:命令未找到提示cc命令未找到,安装gcc编译器:[root@besttest ~]# yum -y install gcc automake autoconf libtool make再次进行make编译:[root@besttest webbench-1.5]# make && make installcc -Wall -ggdb -W -O -c -o webbench.o webbench.cwebbench.c: 在函数‘alarm_handler’中:webbench.c:77: 警告:未使用的参数‘signal’cc -Wall -ggdb -W -O -o webbench webbench.o ctags *.c/bin/sh: ctags: command not foundmake: [tags] 错误 127 (忽略)install -s webbench /usr/local/bininstall -m 644 webbench.1 /usr/local/man/man1install: 无法创建普通文件"/usr/local/man/man1": 没有那个文件或目录编译成功:[root@besttest webbench-1.5]# ll webbench-rwxr-xr-x. 1 root root 24442 5月 10 18:55 webbenchwebbench的使用说明:[root@besttest webbench-1.5]# ./webbenchwebbench [option]... URL-f|--force Don't wait for reply from server.-r|--reload Send reload request - Pragma: no-cache.-t|--time <sec> Run benchmark for <sec> seconds. Default 30.-p|--proxy <server:port> Use proxy server for request.-c|--clients <n> Run <n> HTTP clients at once. Default one.-9|--http09 Use HTTP/0.9 style requests.-1|--http10 Use HTTP/1.0 protocol.-2|--http11 Use HTTP/1.1 protocol.--get Use GET request method.--head Use HEAD request method.--options Use OPTIONS request method.--trace Use TRACE request method.-?|-h|--help This information.-V|--version Display program version. 三、使用[root@besttest webbench-1.5]# ./webbench -t 30 -c 10 http://sports.163.com/Webbench - Simple Web Benchmark 1.5Copyright (c) Radim Kolar 1997-2004, GPL Open Source Software.Benchmarking: GET http://sports.163.com/10 clients, running 30 sec.Speed=54 pages/min, 423497 bytes/sec.Requests: 27 susceed, 0 failed.由执行结果可以算出tps的值:tps=Requests27/30sec但是不知道任务是对还是错,在日志中查看[root@besttest webbench-1.5]# ./webbench -t 1 -c 1 http://192.168.20.128/bugfree/index.php/site/login/Webbench - Simple Web Benchmark 1.5Copyright (c) Radim Kolar 1997-2004, GPL Open Source Software.Benchmarking: GET http://192.168.20.128/bugfree/index.php/site/login/1 client, running 1 sec.Speed=1979 pages/min, 143286 bytes/sec.Requests: 33 susceed, 0 failed.[root@besttest logs]# cat access_log |grep "/bugfree/index.php/site/login/ HTTP/1.0" | wc -l34为什么100个并发的时候比10个并发所发的请求数要少,因服务器的处理能力有限,服务器处理不过来,cpu切片。 四、测试结果分析1、测试环境(软件、硬件、数据库数据、脚本、测试场景等)判断2xx状态,不接收服务器的返回值2、同时lr测试,环境都一样,数据不一样(2.1,2.3秒)每一次的执行结果会不一样(why?差异在可接受范围内)出现差异怎么办:多次测试取平均值3、lr测试:2.9s  开发:日志打印1.8s1)排除开发打的计时是否正确(请求数lr使用录制html方式录制,一个html请求可能对应多个url请求等)2)client → webservice(代码、web容器) → db①客户端发送请求时间②请求传输时间③服务器空闲线程取请求④服务器代码执行时间⑤请求传输到数据库时间⑥数据库线程池拿到请求的时间⑦数据库语法检查、语义分析、open表、生成执行计划、按照执行计划到内存或者磁盘中拿数据到内存中再返回、DML处理时间⑧数据库处理结果返回到服务器时间⑨服务器线程唤醒的时间⑩服务器执行代码的时间①①服务器执行结果返回客户端的时间①②客户端接收数据的时间开发的响应时间:比方说,在代码的调用sql前开始计时,执行完相关方法后停止计时,并且打印时间,从第④步开始计时到代码块执行完毕的时间,第⑩步的执行时间响应时间相差大,慢在哪里?分析:步骤① ② ③ ①① ①②会慢,client端口是否有问题、网络是否有问题、线程池是否有性能问题(拿不到线程)
 0    0  71天前
hupeinet
137
Linux虚拟机扩展根分区—数据盘篇本操作有风险,建议操作前先备份。虚拟机根分区空间不够用,在虚拟机扩展磁盘后发现文件系统并未生效,以下是分区相关操作让扩展的空间生效:(个人使用xshell设置中文转换,界面稍有不同)登录系统之后:准备:df -h  发现空间没有发生变化:fdisk -l   发现磁盘容量已经扩展:对扩展的磁盘进行分区:命令依次为:fdisk /dev/sdb ------对/dev/sdb进行分区n ----- 新建分区1 ----- 分区号为1两次回车 ----- 选择默认起始和结束位置P ----- 查看分区w ----- 写入分区重启系统:LVM操作,扩展根分区将之前创建的分区/dev/sdb1创建为物理卷:pvcreate /dev/sdb1 ----- 创建物理卷vgs ----- 查看卷将卷加入系统卷组:命令为:vgextend vg_centos6 /dev/sdb1 ----- 卷组增加/dev/sdb1卷vgs ----- 查看卷增加根目录所在逻辑卷大小lvextend -L +19.99g /dev/mapper/vg_centos6-lv_root ----- 将根目录的逻辑卷增加19.99G,大小等同于前面查询的空闲空间命令:resize2fs+文件系统名称-----增加根目录文件系统空间    (或者使用命令:xfs_growfs+文件系统名称-----增加根目录文件系统空间)----扩展完成,可使用df命令验证。
 0    0  146天前
hupeinet
617
本文以CentOS 6.9为例,查看当前linux服务器分区:df -h查看当前linux服务器硬盘:fdisk -l/dev/sda 第一块硬盘    /dev/sdb 第二块硬盘依此类推以/dev/sdb为新增硬盘为例,需要进行以下操作方可正常使用1、分区fdisk /dev/sdb依次输入n,回车p,回车1,回车回车回车w 保存退出!2、格式化(输入命令后稍等片刻即可完成)mkfs -t ext4 -c /dev/sdb13、挂载(挂载目录可自行定义,挂载后会覆盖原文件尽量选取空目录或新建目录)mount /dev/sdb1 /opt4、设置开机自动挂载vi /etc/fstab配置完毕,再使用df -h查看是否正常挂载了。重启服务器系统,再次使用df -h命令验证。
 0    0  146天前
hupeinet
153
Linux安装后 设置dns方法:登陆服务器后 输入:vi /etc/sysconfig/network-scripts/ifcfg-eth0回车输入键盘 i后是插入状态 用光标 选中DSN1=114.114.114.114 修改成自己需要的dnsDNS2=8.8.8.8 修改成自己需要的dns按键盘Esc然后键入shift+;wq保存退出输入 reboot 重启后就正常了。或者使用service network restart 重启网卡。
 0    0  146天前
hupei
147
今天跟大家分享下Redis 常见面试题的知识。1 什么是 Redis?简述它的优缺点?Redis 的全称是:Remote Dictionary.Server,本质上是一个 Key-Value 类型的内存数据库,很像memcached,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据 flush 到硬盘上进行保存。因为是纯内存操作,Redis 的性能非常出色,每秒可以处理超过 10 万次读写操作,是已知性能最快的Key-Value DB。Redis 的出色之处不仅仅是性能,Redis 最大的魅力是支持保存多种数据结构,此外单个 value 的最大限制是 1GB,不像 memcached 只能保存 1MB 的数据,因此 Redis 可以用来实现很多有用的功能。比方说用他的 List 来做 FIFO 双向链表,实现一个轻量级的高性 能消息队列服务,用他的 Set 可以做高性能的 tag 系统等等。另外 Redis 也可以对存入的 Key-Value 设置 expire 时间,因此也可以被当作一 个功能加强版的memcached 来用。Redis 的主要缺点是数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,因此 Redis 适合的场景主要局限在较小数据量的高性能操作和运算上。2 Redis 与 memcached 相比有哪些优势?1.memcached 所有的值均是简单的字符串,redis 作为其替代者,支持更为丰富的数据类型2.redis 的速度比 memcached 快很多 redis 的速度比 memcached 快很多3.redis 可以持久化其数据 redis 可以持久化其数据3 Redis 支持哪几种数据类型?String、List、Set、Sorted Set、hashes4 Redis 主要消耗什么物理资源?内存。5 Redis 有哪几种数据淘汰策略?1.noeviction:返回错误当内存限制达到,并且客户端尝试执行会让更多内存被使用的命令。2.allkeys-lru: 尝试回收最少使用的键(LRU),使得新添加的数据有空间存放。3.volatile-lru: 尝试回收最少使用的键(LRU),但仅限于在过期集合的键,使得新添加的数据有空间存放。4.allkeys-random: 回收随机的键使得新添加的数据有空间存放。5.volatile-random: 回收随机的键使得新添加的数据有空间存放,但仅限于在过期集合的键。6.volatile-ttl: 回收在过期集合的键,并且优先回收存活时间(TTL)较短的键,使得新添加的数据有空间存放。6 Redis 官方为什么不提供 Windows 版本?因为目前 Linux 版本已经相当稳定,而且用户量很大,无需开发 windows 版本,反而会带来兼容性等问题。7 一个字符串类型的值能存储最大容量是多少?512M8 为什么 Redis 需要把所有数据放到内存中?Redis 为了达到最快的读写速度将数据都读到内存中,并通过异步的方式将数据写入磁盘。所以 redis 具有快速和数据持久化的特征,如果不将数据放在内存中,磁盘 I/O 速度为严重影响 redis 的性能。在内存越来越便宜的今天,redis 将会越来越受欢迎, 如果设置了最大使用的内存,则数据已有记录数达到内存限值后不能继续插入新值。9 Redis 集群方案应该怎么做?都有哪些方案?1.codis2.目前用的最多的集群方案,基本和 twemproxy 一致的效果,但它支持在节点数量改变情况下,旧节点数据可恢复到新 hash 节点。redis cluster3.0 自带的集群,特点在于他的分布式算法不是一致性 hash,而是 hash 槽的概念,以及自身支持节点设置从节点。具体看官方文档介绍。3.在业务代码层实现,起几个毫无关联的 redis 实例,在代码层,对 key 进行 hash 计算,然后去对应的redis 实例操作数据。这种方式对 hash 层代码要求比较高,考虑部分包括,节点失效后的替代算法方案,数据震荡后的自动脚本恢复,实例的监控,等等。Java 架构学习资料(里面有高可用、高并发、高性能及分布式、Jvm 性能调优、Spring 源码,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx 等多个知识点的架构资料)合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!10 Redis 集群方案什么情况下会导致整个集群不可用?有 A,B,C 三个节点的集群,在没有复制模型的情况下,如果节点 B 失败了,那么整个集群就会以为缺少5501-11000 这个范围的槽而不可用。11 MySQL 里有 2000w 数据,redis 中只存 20w 的数据,如何保证 redis 中的数据都是热点数据?redis 内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略。其实面试除了考察 Redis,不少公司都很重视高并发高可用的技术,特别是一线互联网公司,分布式、JVM、spring 源码分析、微服务等知识点已是面试的必考题。文末分享给大家一线互联网公司最新的技术知识(彩蛋)12 Redis 有哪些适合的场景?(1)会话缓存(Session Cache)最常用的一种使用 Redis 的情景是会话缓存(sessioncache),用 Redis 缓存会话比其他存储(如Memcached)的优势在于:Redis 提供持久化。当维护一个不是严格要求一致性的缓存时,如果用户的购物车信息全部丢失,大部分人都会不高兴的,现在,他们还会这样吗?幸运的是,随着 Redis 这些年的改进,很容易找到怎么恰当的使用 Redis 来缓存会话的文档。甚至广为人知的商业平台 Magento 也提供 Redis 的插件。(2)全页缓存(FPC)除基本的会话 token 之外,Redis 还提供很简便的 FPC 平台。回到一致性问题,即使重启了 Redis 实例,因为有磁盘的持久化,用户也不会看到页面加载速度的下降,这是一个极大改进,类似 PHP 本地FPC。再次以 Magento 为例,Magento 提供一个插件来使用 Redis 作为全页缓存后端。此外,对 WordPress 的用户来说,Pantheon 有一个非常好的插件 wp-redis,这个插件能帮助你以最快速度加载你曾浏览过的页面。(3)队列Reids 在内存存储引擎领域的一大优点是提供 list 和 set 操作,这使得 Redis 能作为一个很好的消息队列平台来使用。Redis 作为队列使用的操作,就类似于本地程序语言(如 Python)对 list 的 push/pop操作。如果你快速的在 Google 中搜索“Redis queues”,你马上就能找到大量的开源项目,这些项目的目的就是利用 Redis 创建非常好的后端工具,以满足各种队列需求。例如,Celery 有一个后台就是使用Redis 作为 broker,你可以从这里去查看。(4)排行榜/计数器Redis 在内存中对数字进行递增或递减的操作实现的非常好。集合(Set)和有序集合(SortedSet)也使得我们在执行这些操作的时候变的非常简单,Redis 只是正好提供了这两种数据结构。所以,我们要从排序集合中获取到排名最靠前的 10 个用户–我们称之为“user_scores”,我们只需要像下面一样执行即可:当然,这是假定你是根据你用户的分数做递增的排序。如果你想返回用户及用户的分数,你需要这样执行:ZRANGE user_scores 0 10 WITHSCORESAgora Games 就是一个很好的例子,用 Ruby 实现的,它的排行榜就是使用 Redis 来存储数据的,你可以在这里看到。(5)发布/订阅最后(但肯定不是最不重要的)是 Redis 的发布/订阅功能。发布/订阅的使用场景确实非常多。我已看见人们在社交网络连接中使用,还可作为基于发布/订阅的脚本触发器,甚至用 Redis 的发布/订阅功能来建立聊天系统!13 Redis 支持的 Java 客户端都有哪些?官方推荐用哪个?Redisson、Jedis、lettuce 等等,官方推荐使用 Redisson。14 Redis 和 Redisson 有什么关系?Redisson 是一个高级的分布式协调 Redis 客服端,能帮助用户在分布式环境中轻松实现一些 Java 的对象 (Bloom filter, BitSet, Set, SetMultimap, ScoredSortedSet, SortedSet, Map, ConcurrentMap,List, ListMultimap, Queue, BlockingQueue, Deque, BlockingDeque, Semaphore, Lock,ReadWriteLock, AtomicLong, CountDownLatch, Publish / Subscribe, HyperLogLog)。15 Jedis 与 Redisson 对比有什么优缺点?Jedis 是 Redis 的 Java 实现的客户端,其 API 提供了比较全面的 Redis 命令的支持;Redisson 实现了分布式和可扩展的 Java 数据结构,和 Jedis 相比,功能较为简单,不支持字符串操作,不支持排序、事务、管道、分区等 Redis 特性。Redisson 的宗旨是促进使用者对 Redis 的关注分离,从而让使用者能够将精力更集中地放在处理业务逻辑上。16 说说 Redis 哈希槽的概念?Redis 集群没有使用一致性 hash,而是引入了哈希槽的概念,Redis 集群有 16384 个哈希槽,每个 key 通过 CRC16 校验后对 16384 取模来决定放置哪个槽,集群的每个节点负责一部分 hash 槽。17 Redis 集群的主从复制模型是怎样的?为了使在部分节点失败或者大部分节点无法通信的情况下集群仍然可用,所以集群使用了主从复制模型,每个节点都会有 N-1 个复制品.18 Redis 集群会有写操作丢失吗?为什么?Redis 并不能保证数据的强一致性,这意味这在实际中集群在特定的条件下可能会丢失写操作。19 Redis 集群之间是如何复制的?异步复制20 Redis 集群最大节点个数是多少?16384 个21 Redis 集群如何选择数据库?Redis 集群目前无法做数据库选择,默认在 0 数据库。22 Redis 中的管道有什么用?一次请求/响应服务器能实现处理新的请求即使旧的请求还未被响应,这样就可以将多个命令发送到服务器,而不用等待回复,最后在一个步骤中读取该答复。这就是管道(pipelining),是一种几十年来广泛使用的技术。例如许多 POP3 协议已经实现支持这个功能,大大加快了从服务器下载新邮件的过程。23 怎么理解 Redis 事务?事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行,事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。事务是一个原子操作:事务中的命令要么全部被执行,要么全部都不执行。24 Redis 事务相关的命令有哪几个?MULTI、EXEC、DISCARD、WATCH25 Redis key 的过期时间和永久有效分别怎么设置?EXPIRE 和 PERSIST 命令26 Redis 如何做内存优化?尽可能使用散列表(hashes),散列表(是说散列表里面存储的数少)使用的内存非常小,所以你应该尽可能的将你的数据模型抽象到一个散列表里面。比如你的 web 系统中有一个用户对象,不要为这个用户的名称,姓氏,邮箱,密码设置单独的 key,而是应该把这个用户的所有信息存储到一张散列表里面。27 Redis 回收进程如何工作的?一个客户端运行了新的命令,添加了新的数据。Redi 检查内存使用情况,如果大于 maxmemory 的限制, 则根据设定好的策略进行回收。一个新的命令被执行,等等。所以我们不断地穿越内存限制的边界,通过不断达到边界然后不断地回收回到边界以下。如果一个命令的结果导致大量内存被使用(例如很大的集合的交集保存到一个新的键),不用多久内存限制就会被这个内存使用量超越。28 加锁机制咱们来看上面那张图,现在某个客户端要加锁。如果该客户端面对的是一个 redis cluster 集群,他首先会根据 hash 节点选择一台机器。这里注意,仅仅只是选择一台机器!这点很关键!紧接着,就会发送一段 lua 脚本到 redis 上,那段 lua 脚本如下所示:为啥要用 lua 脚本呢?因为一大坨复杂的业务逻辑,可以通过封装在 lua 脚本中发送给 redis,保证这段复杂业务逻辑执行的原子性。那么,这段 lua 脚本是什么意思呢?这里 KEYS[1]代表的是你加锁的那个 key,比如说:RLock lock = redisson.getLock("myLock");这里你自己设置了加锁的那个锁 key 就是“myLock”。ARGV[1]代表的就是锁 key 的默认生存时间,默认 30 秒。ARGV[2]代表的是加锁的客户端的 ID,类似于下面这样:8743c9c0-0795-4907-87fd-6c719a6b4586:1给大家解释一下,第一段 if 判断语句,就是用“exists myLock”命令判断一下,如果你要加锁的那个锁 key 不存在的话,你就进行加锁。如何加锁呢?很简单,用下面的命令:hset myLock8743c9c0-0795-4907-87fd-6c719a6b4586:1 1,通过这个命令设置一个 hash 数据结构,这行命令执行后,会出现一个类似下面的数据结构:上述就代表“8743c9c0-0795-4907-87fd-6c719a6b4586:1”这个客户端对“myLock”这个锁 key 完成了加锁。接着会执行“pexpire myLock 30000”命令,设置 myLock 这个锁 key 的生存时间是 30 秒。好了,到此为止,ok,加锁完成了。29 锁互斥机制那么在这个时候,如果客户端 2 来尝试加锁,执行了同样的一段 lua 脚本,会咋样呢?很简单,第一个 if 判断会执行“exists myLock”,发现 myLock 这个锁 key 已经存在了。接着第二个 if 判断,判断一下,myLock 锁 key 的 hash 数据结构中,是否包含客户端 2 的 ID,但是明显不是的,因为那里包含的是客户端 1 的 ID。所以,客户端 2 会获取到 pttl myLock 返回的一个数字,这个数字代表了 myLock 这个锁 key的剩余生存时间。比如还剩 15000 毫秒的生存时间。此时客户端 2 会进入一个 while 循环,不停的尝试加锁。30 watch dog 自动延期机制客户端 1 加锁的锁 key 默认生存时间才 30 秒,如果超过了 30 秒,客户端 1 还想一直持有这把锁,怎么办呢?简单!只要客户端 1 一旦加锁成功,就会启动一个 watch dog 看门狗,他是一个后台线程,会每隔 10 秒检查一下,如果客户端 1 还持有锁 key,那么就会不断的延长锁 key 的生存时间。31 可重入加锁机制那如果客户端 1 都已经持有了这把锁了,结果可重入的加锁会怎么样呢?比如下面这种代码:这时我们来分析一下上面那段 lua 脚本。第一个 if 判断肯定不成立,“exists myLock”会显示锁key 已经存在了。第二个 if 判断会成立,因为 myLock 的 hash 数据结构中包含的那个 ID,就是客户端 1 的那个 ID,也就是“8743c9c0-0795-4907-87fd-6c719a6b4586:1”此时就会执行可重入加锁的逻辑,他会用:incrby myLock 8743c9c0-0795-4907-87fd-6c71a6b4586:1 1 ,通过这个命令,对客户端 1的加锁次数,累加 1。此时 myLock 数据结构变为下面这样:大家看到了吧,那个 myLock 的 hash 数据结构中的那个客户端 ID,就对应着加锁的次数32 释放锁机制如果执行 lock.unlock(),就可以释放分布式锁,此时的业务逻辑也是非常简单的。其实说白了,就是每次都对 myLock 数据结构中的那个加锁次数减 1。如果发现加锁次数是 0 了,说明这个客户端已经不再持有锁了,此时就会用:“del myLock”命令,从 redis 里删除这个 key。然后呢,另外的客户端 2 就可以尝试完成加锁了。这就是所谓的分布式锁的开源 Redisson 框架的实现机制。一般我们在生产系统中,可以用 Redisson 框架提供的这个类库来基于 redis 进行分布式锁的加锁与释放锁。33 上述 Redis 分布式锁的缺点其实上面那种方案最大的问题,就是如果你对某个 redis master 实例,写入了 myLock 这种锁key 的 value,此时会异步复制给对应的 master slave 实例。但是这个过程中一旦发生 redis master 宕机,主备切换,redis slave 变为了 redis master。接着就会导致,客户端 2 来尝试加锁的时候,在新的 redis master 上完成了加锁,而客户端 1也以为自己成功加了锁。此时就会导致多个客户端对一个分布式锁完成了加锁。这时系统在业务语义上一定会出现问题,导致各种脏数据的产生。所以这个就是 redis cluster,或者是 redis master-slave 架构的主从异步复制导致的 redis 分布式锁的最大缺陷:在 redis master 实例宕机的时候,可能导致多个客户端同时完成加锁。34 使用过 Redis 分布式锁么,它是怎么实现的?先拿 setnx 来争抢锁,抢到之后,再用 expire 给锁加一个过期时间防止锁忘记了释放。如果在 setnx 之后执行 expire 之前进程意外 crash 或者要重启维护了,那会怎么样?set 指令有非常复杂的参数,这个应该是可以同时把 setnx 和 expire 合成一条指令来用的!35 使用过 Redis 做异步队列么,你是怎么用的?有什么缺点?一般使用 list 结构作为队列,rpush 生产消息,lpop 消费消息。当 lpop 没有消息的时候,要适当 sleep一会再重试。缺点:在消费者下线的情况下,生产的消息会丢失,得使用专业的消息队列如 rabbitmq 等。能不能生产一次消费多次呢?使用 pub/sub 主题订阅者模式,可以实现 1:N 的消息队列。36 什么是缓存穿透?如何避免?什么是缓存雪崩?何如避免?缓存穿透一般的缓存系统,都是按照 key 去缓存查询,如果不存在对应的 value,就应该去后端系统查找(比如DB)。一些恶意的请求会故意查询不存在的 key,请求量很大,就会对后端系统造成很大的压力。这就叫做缓存穿透。如何避免?1:对查询结果为空的情况也进行缓存,缓存时间设置短一点,或者该 key 对应的数据 insert 了之后清理缓存。2:对一定不存在的 key 进行过滤。可以把所有的可能存在的 key 放到一个大的 Bitmap 中,查询时通过该 bitmap 过滤。缓存雪崩当缓存服务器重启或者大量缓存集中在某一个时间段失效,这样在失效的时候,会给后端系统带来很大压力。导致系统崩溃。如何避免?1:在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个 key 只允许一个线程查询数据和写缓存,其他线程等待。2:做二级缓存,A1 为原始缓存,A2 为拷贝缓存,A1 失效时,可以访问 A2,A1 缓存失效时间设置为短期,A2 设置为长期3:不同的 key,设置不同的过期时间,让缓存失效的时间点尽量均匀37 redis 和 memcached 什么区别?为什么高并发下有时单线程的 redis 比多线程的memcached 效率要高?区别:1.mc 可缓存图片和视频。rd 支持除 k/v 更多的数据结构;2.rd 可以使用虚拟内存,rd 可持久化和 aof 灾难恢复,rd 通过主从支持数据备份;3.rd 可以做消息队列。原因:mc 多线程模型引入了缓存一致性和锁,加锁带来了性能损耗。redis 主从复制如何实现的?redis 的集群模式如何实现?redis 的 key 是如何寻址的?主从复制实现:主节点将自己内存中的数据做一份快照,将快照发给从节点,从节点将数据恢复到内存中。之后再每次增加新数据的时候,主节点以类似于 mysql 的二进制日志方式将语句发送给从节点,从节点拿到主节点发送过来的语句进行重放。分片方式:-客户端分片-基于代理的分片● Twemproxy● codis-路由查询分片● Redis-cluster(本身提供了自动将数据分散到 Redis Cluster 不同节点的能力,整个数据集合的某个数据子集存储在哪个节点对于用户来说是透明的)redis-cluster 分片原理:Cluster 中有一个 16384 长度的槽(虚拟槽),编号分别为 0-16383。每个 Master 节点都会负责一部分的槽,当有某个 key 被映射到某个 Master 负责的槽,那么这个 Master 负责为这个 key 提供服务,至于哪个 Master 节点负责哪个槽,可以由用户指定,也可以在初始化的时候自动生成,只有 Master 才拥有槽的所有权。Master 节点维护着一个 16384/8 字节的位序列,Master 节点用 bit 来标识对于某个槽自己是否拥有。比如对于编号为 1 的槽,Master 只要判断序列的第二位(索引从 0 开始)是不是为 1 即可。这种结构很容易添加或者删除节点。比如如果我想新添加个节点 D, 我需要从节点 A、B、C 中得部分槽到 D 上。38 使用 redis 如何设计分布式锁?说一下实现思路?使用 zk 可以吗?如何实现?这两种有什么区别?redis:1.线程 A setnx(上锁的对象,超时时的时间戳 t1),如果返回 true,获得锁。2.线程 B 用 get 获取 t1,与当前时间戳比较,判断是是否超时,没超时 false,若超时执行第 3 步;3.计算新的超时时间 t2,使用 getset 命令返回 t3(该值可能其他线程已经修改过),如果t1==t3,获得锁,如果 t1!=t3 说明锁被其他线程获取了。4.获取锁后,处理完业务逻辑,再去判断锁是否超时,如果没超时删除锁,如果已超时,不用处理(防止删除其他线程的锁)。zk:1.客户端对某个方法加锁时,在 zk 上的与该方法对应的指定节点的目录下,生成一个唯一的瞬时有序节点 node1;2.客户端获取该路径下所有已经创建的子节点,如果发现自己创建的 node1 的序号是最小的,就认为这个客户端获得了锁。3.如果发现 node1 不是最小的,则监听比自己创建节点序号小的最大的节点,进入等待。4.获取锁后,处理完逻辑,删除自己创建的 node1 即可。区别:zk 性能差一些,开销大,实现简单。39 知道 redis 的持久化吗?底层如何实现的?有什么优点缺点?RDB(Redis DataBase:在不同的时间点将 redis 的数据生成的快照同步到磁盘等介质上):内存到硬盘的快照,定期更新。缺点:耗时,耗性能(fork+io 操作),易丢失数据。AOF(Append Only File:将 redis 所执行过的所有指令都记录下来,在下次 redis 重启时,只需要执行指令就可以了):写日志。缺点:体积大,恢复速度慢。bgsave 做镜像全量持久化,aof 做增量持久化。因为 bgsave 会消耗比较长的时间,不够实时,在停机的时候会导致大量的数据丢失,需要 aof 来配合,在 redis 实例重启时,优先使用 aof 来恢复内存的状态,如果没有 aof 日志,就会使用 rdb 文件来恢复。Redis 会定期做aof 重写,压缩 aof 文件日志大小。Redis4.0 之后有了混合持久化的功能,将 bgsave 的全量和 aof 的增量做了融合处理,这样既保证了恢复的效率又兼顾了数据的安全性。bgsave 的原理,fork 和 cow, fork 是指 redis 通过创建子进程来进行 bgsave 操作,cow 指的是 copy onwrite,子进程创建后,父子进程共享数据段,父进程继续提供读写服务,写脏的页面数据会逐渐和子进程分离开来。redis 过期策略都有哪些?LRU 算法知道吗?写一下 java 代码实现?过期策略:定时过期(一 key 一定时器),惰性过期:只有使用 key 时才判断 key 是否已过期,过期则清除。定期过期:前两者折中。LRU:new LinkedHashMap<K, V>(capacity, DEFAULT_LOAD_FACTORY, true);//第三个参数置为 true,代表 linkedlist 按访问顺序排序,可作为 LRU 缓存;设为 false 代表按插入顺序排序,可作为 FIFO 缓存LRU 算法实现:1.通过双向链表来实现,新数据插入到链表头部;2.每当缓存命中(即缓存数据被访问),则将数据移到链表头部;3.当链表满的时候,将链表尾部的数据丢弃。LinkedHashMap:HashMap 和双向链表合二为一即是 LinkedHashMap。HashMap 是无序的,LinkedHashMap 通过维护一个额外的双向链表保证了迭代顺序。该迭代顺序可以是插入顺序(默认),也可以是访问顺序。40 缓存穿透、缓存击穿、缓存雪崩解决方案?缓存穿透:指查询一个一定不存在的数据,如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到 DB 去查询,可能导致 DB 挂掉。解决方案:1.查询返回的数据为空,仍把这个空结果进行缓存,但过期时间会比较短;2.布隆过滤器:将所有可能存在的数据哈希到一个足够大的 bitmap 中,一个一定不存在的数据会被这个 bitmap 拦截掉,从而避免了对 DB 的查询。缓存击穿:对于设置了过期时间的 key,缓存在某个时间点过期的时候,恰好这时间点对这个 Key 有大量的并发请求过来,这些请求发现缓存过期一般都会从后端 DB 加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把 DB 压垮。解决方案:1.使用互斥锁:当缓存失效时,不立即去 load db,先使用如 Redis 的 setnx 去设置一个互斥锁,当操作成功返回时再进行 load db 的操作并回设缓存,否则重试 get 缓存的方法。2.永远不过期:物理不过期,但逻辑过期(后台异步线程去刷新)。缓存雪崩:设置缓存时采用了相同的过期时间,导致缓存在某一时刻同时失效,请求全部转发到 DB,DB 瞬时压力过重雪崩。与缓存击穿的区别:雪崩是很多 key,击穿是某一个key 缓存。解决方案:将缓存失效时间分散开,比如可以在原有的失效时间基础上增加一个随机值,比如 1-5 分钟随机,这样每一个缓存的过期时间的重复率就会降低,就很难引发集体失效的事件。41 在选择缓存时,什么时候选择 redis,什么时候选择 memcached?选择 redis 的情况:1、复杂数据结构,value 的数据是哈希,列表,集合,有序集合等这种情况下,会选择redis, 因为 memcache 无法满足这些数据结构,最典型的的使用场景是,用户订单列表,用户消息,帖子评论等。2、需要进行数据的持久化功能,但是注意,不要把 redis 当成数据库使用,如果 redis挂了,内存能够快速恢复热数据,不会将压力瞬间压在数据库上,没有 cache 预热的过程。对于只读和数据一致性要求不高的场景可以采用持久化存储3、高可用,redis 支持集群,可以实现主动复制,读写分离,而对于 memcache 如果想要实现高可用,需要进行二次开发。4、存储的内容比较大,memcache 存储的 value 最大为 1M。选择 memcache 的场景:1、纯 KV,数据量非常大的业务,使用 memcache 更合适,原因是:a)memcache 的内存分配采用的是预分配内存池的管理方式,能够省去内存分配的时间,redis 是临时申请空间,可能导致碎片化。b)虚拟内存使用,memcache 将所有的数据存储在物理内存里,redis 有自己的 vm 机制,理论上能够存储比物理内存更多的数据,当数据超量时,引发 swap,把冷数据刷新到磁盘上,从这点上,数据量大时,memcache 更快c)网络模型,memcache 使用非阻塞的 IO 复用模型,redis 也是使用非阻塞的 IO 复用模型,但是 redis 还提供了一些非 KV 存储之外的排序,聚合功能,复杂的 CPU 计算,会阻塞整个 IO 调度,从这点上由于 redis 提供的功能较多,memcache 更快些d) 线程模型,memcache 使用多线程,主线程监听,worker 子线程接受请求,执行读写,这个过程可能存在锁冲突。redis 使用的单线程,虽然无锁冲突,但是难以利用多核的特性提升吞吐量。缓存与数据库不一致怎么办假设采用的主存分离,读写分离的数据库,如果一个线程 A 先删除缓存数据,然后将数据写入到主库当中,这个时候,主库和从库同步没有完成,线程 B 从缓存当中读取数据失败,从从库当中读取到旧数据,然后更新至缓存,这个时候,缓存当中的就是旧的数据。发生上述不一致的原因在于,主从库数据不一致问题,加入了缓存之后,主从不一致的时间被拉长了处理思路:在从库有数据更新之后,将缓存当中的数据也同时进行更新,即当从库发生了数据更新之后,向缓存发出删除,淘汰这段时间写入的旧数据。主从数据库不一致如何解决场景描述,对于主从库,读写分离,如果主从库更新同步有时差,就会导致主从库数据的不一致1、忽略这个数据不一致,在数据一致性要求不高的业务下,未必需要时时一致性2、强制读主库,使用一个高可用的主库,数据库读写都在主库,添加一个缓存,提升数据读取的性能。3、选择性读主库,添加一个缓存,用来记录必须读主库的数据,将哪个库,哪个表,哪个主键,作为缓存的 key,设置缓存失效的时间为主从库同步的时间,如果缓存当中有这个数据,直接读取主库,如果缓存当中没有这个主键,就到对应的从库中读取。42 Redis 常见的性能问题和解决方案1、master 最好不要做持久化工作,如 RDB 内存快照和 AOF 日志文件2、如果数据比较重要,某个 slave 开启 AOF 备份,策略设置成每秒同步一次3、为了主从复制的速度和连接的稳定性,master 和 Slave 最好在一个局域网内4、尽量避免在压力大得主库上增加从库5、主从复制不要采用网状结构,尽量是线性结构,Master<--Slave1<----Slave2 ....43 Redis 的数据淘汰策略有哪些voltile-lru 从已经设置过期时间的数据集中挑选最近最少使用的数据淘汰voltile-ttl 从已经设置过期时间的数据库集当中挑选将要过期的数据voltile-random 从已经设置过期时间的数据集任意选择淘汰数据allkeys-lru 从数据集中挑选最近最少使用的数据淘汰allkeys-random 从数据集中任意选择淘汰的数据no-eviction 禁止驱逐数据44 Redis 当中有哪些数据结构字符串 String、字典 Hash、列表 List、集合 Set、有序集合 SortedSet。如果是高级用户,那么还会有,如果你是 Redis 中高级用户,还需要加上下面几种数据结构 HyperLogLog、Geo、Pub/Sub。假如 Redis 里面有 1 亿个 key,其中有 10w 个 key 是以某个固定的已知的前缀开头的,如果将它们全部找出来?使用 keys 指令可以扫出指定模式的 key 列表。对方接着追问:如果这个 redis 正在给线上的业务提供服务,那使用 keys 指令会有什么问题?这个时候你要回答 redis 关键的一个特性:redis 的单线程的。keys 指令会导致线程阻塞一段时间,线上服务会停顿,直到指令执行完毕,服务才能恢复。这个时候可以使用 scan 指令,scan 指令可以无阻塞的提取出指定模式的 key 列表,但是会有一定的重复概率,在客户端做一次去重就可以了,但是整体所花费的时间会比直接用 keys 指令长。45 使用 Redis 做过异步队列吗,是如何实现的使用 list 类型保存数据信息,rpush 生产消息,lpop 消费消息,当 lpop 没有消息时,可以 sleep 一段时间,然后再检查有没有信息,如果不想 sleep 的话,可以使用 blpop, 在没有信息的时候,会一直阻塞,直到信息的到来。redis 可以通过 pub/sub 主题订阅模式实现一个生产者,多个消费者,当然也存在一定的缺点,当消费者下线时,生产的消息会丢失。46 Redis 如何实现延时队列使用 sortedset,使用时间戳做 score, 消息内容作为 key,调用 zadd 来生产消息,消费者使用 zrangbyscore 获取 n 秒之前的数据做轮询处理。参考文献:http://rrd.me/euEdM今天就分享这么多,关于Redis 常见面试题,你学会了多少?
 0    0  156天前
hupei
286
) 1. Linus TorvaldsLinus Torvalds两次改变了技术,第一次是Linux内核,它帮助互联网的发展;第二次是Git,全球开发者使用的源代码管理系统。在一次TED的采访中,Torvalds以极其开放的态度讨论了他独特的工作方式和性格特点。Torvalds说:“我不是一个空想家,我是一名工程师,我非常乐意跟梦想家在一起,他们行走四方,仰望苍穹,看着满天星辰说,“我想到那儿去。”但我是低头看路的那种人,我只想填好眼前这个坑,不让自己掉进去,这就是我。”2. 关于开源Linus Torvalds说:Linux并不是一个合作的产物,它是我一系列项目中的一个,纯粹出于自己当时的需要,部分原因是我需要得到结果,但更重要的原因是我享受编程。这段旅程的终点,在25年后的今天(2016),我们仍未达到。当年我只是想做一个完全属于自己的项目,我压根就没想过开源这件事。但在那之后,随着项目越来越大, 你会开始想让别人知道。感觉就像“哇,快来看看我的成果!”成千上万的人想参与进来(Linux内核项目),但很多时候,我成为了那个断点,我无法让自己跨出那一步,同上千人合作。因此Git是我的第二个大项目,它存在的意义就是维护我的第一个大项目。事实上这就是我的工作方式。我编程并不是为了… ,我编程是因为好玩,但我也想做一些有意义的事情,因此我设计每一个程序仅仅是因为我自己需要。而我喜欢开源软件的一点就是,它能让形形色色的人在一起合作。我们不必相互喜欢,有时候我们甚至互相讨厌。是真的,我们经常吵得不可开交。科学界的开源显然是一种回归,科学最初是开源的。但之后变得越来越封闭,只存在那些昂贵的科学期刊上。开源让科学回归了,我们有了arXiv和开放期刊。小编有话说:Linux并不是选择了开源,只是因为开源恰好是Linux需要的。就如Linus Torvalds所说:“纯粹出于自己当时的需要。”Linus Torvalds是睿智的,做好自己能控制的。开源不仅仅代表源代码的开放,开源更是一种工作方式,一种教育方式。因为有了开源,我们多了一种更好的合作共赢的工作方式;因为有了开源,让更多从业者和学生能够学习到更好的技术。3. 代码的品味Linus Torvalds说:有时候你可以换个角度看问题,重写代码,排除特例,完美覆盖所有情况,这就是好的代码。同时也很简单,这是最基本的原则。细节非常重要。对我来说,我愿意与之共事的人,必须有好的品位。采访中Linus Torvalds对比了以下2个函数:小编有话说:大牛们总是对自己严格要求,不仅仅是要实现功能,并且要优雅的实现。下面我们来看看采访中Linus Torvalds对比的两段代码:1. 不怎么漂亮的代码remove_list_entry(entry){ prev = NULL; walk = head; // Walk the list while (walk != entry) { prev = walk; walk = walk->next;    }     // Remove the entry by updating the // head or the previous entry if(!prev) { head = entry->next; } else { prev->next = entry->next;    } }上面的代码,需要区分要移除的成员是否为链表的头一个成员。需要单独处理特例情况(要移除的成员为链表的头一个成员)。这个函数比较好理解,这里小编就不做更多的解释了,如有疑问,请添加小编微信交流。 2. 好的代码remove_list_entry(entry){ // The "indirect" pointer points to the // *address* of the thing we'll update indirect = &head; // Walk the list, looking for the thing that // points to the entry we want to remove while ((*indirect) != entry)) { indirect = &(*indirect)->next; } // .. and just remove it *indirect = entry->next;}这个代码完全不需要单独处理特例情况,程序整体更加整洁、优雅。其实现原理为:指针变量indirect保存的是链表成员结构体中的next成员的地址(head指针也可这样看),如下图所示:所以变量*indirect就相当于是前一个链表成员的next成员(相对于要移除的成员来说)。当找到要移除的成员后,进行如下操作即可:*indirect = entry->next;本文整理自 Linus 的一次 TED 分享,详情查看原视频:https://mp.weixin.qq.com/s/qWz_8avqdWi3tVLRz5In8Q
 0    0  205天前
hupei
377
如果您很注重网站SEO优化,伪静态设置这项是绝对不能忽略的,它除了能更符合搜索引擎排名规则之外,还可以使得网页URL更趋人性化和迷惑黑客等功能。由本程序(02408.com免费全能建站系统)修改制作而成的仿天涯论坛论坛系统,以及其他网站系统,使用了最简单的伪静态设置方法。这里举例使用bbs论坛系统讲一下htaccess伪静态文件设置方法和在bbs二级目录中htaccess伪静态文件设置方法,这里只是以bbs目录为例,其它目录也可以。假如网站安装在了根目录,如果您的服务器空间默认支持.htaccess伪静态文件,那么系统安装过程会自动将您的网站设置成伪静态,无需额外操作。如果您的网站默认没有开启,您可以联系您的空间提供技术支持的客服,让他帮助您开通伪静态设置。当前,大多数的服务器都是可以支持伪静态设置的。关于部分Windows环境的支持的web.config的伪静态写法,在写这篇文章的时候,还没有真实的服务器环境进行测试,所以这里把web.config伪静态写法放在了最后,供大家参考。阿帕奇环境的根目录使用的伪静态写法如下:<IfModule mod_rewrite.c>Options +FollowSymlinksRewriteEngine OnRewriteCond %{REQUEST_FILENAME} !-dRewriteCond %{REQUEST_FILENAME} !-fRewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]</IfModule>本程序已经在根目录准备了一个.htaccess伪静态文件,待服务器开通伪静态设置之后,您只需要将本系统重新安装,然后登陆管理后台,进入“缓存设置”,然后点击一键清理所有缓存,就可以了。Nginx服务器环境伪静态写法如下:location / {  if (!-e $request_filename){    rewrite ^(.*)$ /index.php/$1 break;  }}待服务器开通伪静态设置之后,您只需要将本系统重新安装,然后登陆管理后台,进入“缓存设置”,然后点击一键清理所有缓存,就可以了。下面说一下在网站二级目录下的伪静态设置方法,这里以bbs二级目录为例,其它目录也可以。例如您准备将本程序安装在网站根目录的bbs目录中运行,安装前请先将index.php文件同目录下的.htaccess文件删除,然后在浏览器地址输入http://您的域名/bbs/,进入程序的安装,安装成功后,建议您再做一下伪静态设置。第一步,您需要确认,您的服务器空间支持伪静态,并且已经成功开通了伪静态;第二步,将bbs目录中的02408.com_config.php文件下载到本地,然后用网页制作软件,或文本编辑器打开,将define('URL',那行的index.php/删除,保存;第三步,将修改完的02408.com_config.php文件上传,并覆盖原来的文件;第四步,伪静态规则设置与在根目录差不多,区别就是在原有路径中添加bbs/,如果是阿帕奇环境,请将RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]这行修改为RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L],如果是Nginx环境,将rewrite ^(.*)$ /index.php/$1 break;这行修改为rewrite ^/bbs/(.*)$ /bbs/index.php/$1 break;即可;第五步,浏览器地址输入http://您的域名/bbs/admin/login.html,登录后,进入“缓存设置”,然后点“一键清理全部缓存”,到这里伪静态设置完成了。-----------  附:供大家参考的web.config伪静态写法----------------<?xml version="1.0" encoding="UTF-8"?><configuration>    <system.webServer>        <rewrite>            <rules>            <rule name="OrgPage" stopProcessing="true">            <match url="^(.*)$" />            <conditions logicalGrouping="MatchAll">            <add input="{HTTP_HOST}" pattern="^(.*)$" />            <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />            <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />            </conditions>            <action type="Rewrite" url="index.php/{R:1}" />            </rule>            </rules>        </rewrite>    </system.webServer> </configuration>
 0    0  233天前
hupei
453
1、对于码农来说,有时候可能会需要实时查看自己的程序执行的sql语句以方便排查问题调试程序,实时监控查看mysql执行的sql语句,下面主要介绍两种方法:1)启用记录sql的日志文件:查看是否开启日志记录sql, general_log的值为off,则没有开启 mysql> SHOW VARIABLES LIKE "general_log%"; +------------------+----------------------------------+ | Variable_name | Value | +------------------+----------------------------------+ | general_log | OFF | | general_log_file | /var/lib/mysql/VM_0_8_centos.log | +------------------+----------------------------------+ 2 rows in set (0.06 sec) 执行下面命令可临时开启sql记录功能 mysql> SET GLOBAL general_log = 'ON'; mysql> SET GLOBAL general_log_file = '/topath/sql.log';如果想永久开启记录sql功能,则需要修改mysql的配置文件my.cnf,重启mysql使之生效。general_log = 1 general_log_file = /topath/sql.log2)在客户端服务器上使用抓包命令实时监控sql语句(推荐),127.0.0.1和3306分别替换成自己的mysql地址和端口号,-i参数指定网络接口名称,换成自己的。[root@VM_0_8_centos ~]# tcpdump -s 0 -l -w - dst 127.0.0.1 and port 3306 -i eth0 |strings tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes 2、修改mysql密码策略,mysql8默认开启了密码安全检查插件,目前很多客户端都不支持此插件,需要修改密码验证策略,它要求要求密码必须包含:数字、大小写字母和特殊符号,且长度不能少于8个字符,否则会提示错误:ERROR 1819 (HY000): Your password does not satisfy the current policy requirements,可按照下面步骤修改密码验证策略:修改mysql配置文件my.cnf [root@VM_0_8_centos ~]# vim /etc/my.cnf 找到关键字default_authentication_plugin这一行,修改它的值为mysql_native_password default_authentication_plugin = mysql_native_password登录mysql终端,执行sql语句ALTER USER ‘root’@’localhost’ IDENTIFIED BY ‘YourNewPassword’。[root@VM_0_8_centos ~]# mysql -u root -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 15516 Server version: 8.0.17 MySQL Community Server - GPL Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'YourNewPassword'; #刷新权限 mysql> FLUSH PRIVILEGES;如果报错误ERROR 1396 (HY000): Operation ALTER USER failed for ‘root’@’localhost’,说明@后面的登录地址不正确,然后执行进行下面操作:mysql> use mysql; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> select Host,User from user where User='root'; +------+------+ | Host | User | +------+------+ | % | root | +------+------+ 1 row in set (0.00 sec) mysql> ALTER USER 'root'@'%' IDENTIFIED BY 'YourNewPassword'; #刷新权限 mysql> FLUSH PRIVILEGES;3、对于很多情况我们需要远程连接mysql进行操作,而不是每次登录到mysql所在的服务器上去操作,下面介绍下远程连接的配置:mysql> use mysql; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed #为了安全起见不要设置root用户远程连接 mysql> CREATE USER 'user'@'%' IDENTIFIED BY 'userPassword'; #授予user用户dbname数据库的所有权限 mysql> grant all on dbname.* to 'user'@'%';4、msyql8.0忘记密码以后如何修改密码,步骤如下:编辑mysql配置文件:[root@VM_0_8_centos ~]# vim /etc/my.cnf最末尾添加一行skip-grant-tables,保存退出重启mysql:[root@VM_0_8_centos ~]# systemctl restart mysqld.service如果重启失败执行下面命令强制杀死所有mysql进程:[root@VM_0_8_centos ~]# ps -ef | grep mysql | awk '{print $2}' | xargs kill -9执行命令mysql -u root -p直接回车进入mysql[root@VM_0_8_centos ~]# mysql -u root -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 16306 Server version: 8.0.17 MySQL Community Server - GPL Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql>修改root密码为空mysql> use mysql; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> update user set authentication_string='' where user='root'; Query OK, 1 row affected (0.03 sec) Rows matched: 1 Changed: 1 Warnings: 0 退出mysql,修改mysql配置文件/etc/my.cnf,删掉skip-grant-tables,再次用命令systemctl restart mysqld.service重启mysql登录mysql:#直接回车即可进入mysql [root@VM_0_8_centos ~]# mysql -u root -p修改密码:mysql> use mysql; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> alter user 'root' identified by 'yourPassword'; Query OK, 0 rows affected (0.01 sec) mysql> flush privileges;大功告成!
 0    0  287天前
hupei
435
在这里不给大家列出最基本的linux命令,相信大家从网上一搜就是一堆基本命令的使用手册,这里只给同学们列出来最干货的,最能解决实际问题的命令:1、强制杀死所有指定进程。相信同学们在杀进程的时候经常用到是kill -9 进程号,这样的命令,但是这样只针对杀单进程,如果进程有成百上千个呢,总不能手动一个个得杀死吧,所以这个命令组合就派上用场了:#其中PROCESS为进程名称 [root@ixxxx ~]# ps -ef | grep PROCESS | grep -v grep | awk '{print $2}' | xargs kill -92、查看文件总行数。我们在运维工作中避免不了查看文件总行数,如果文件很小还可以但要是文件很大,甚至超过了服务器内存,那么我们就不能简单的使用vim 然后set nu查看行数了,这样会把文件整个加载到内存里,造成服务器崩溃,这个时候就该cat命令上场了,cat不会把文件一次性加载到内存里,所以不会大量占用内存的情况,命令如下:[root@ixxxx ~]# cat index.php |wc -l 173、查看占用系统内存最高的进程。如果发现系统负载过高,内存占用情况是我们排查的重要指标,其中找出内存占用最高的进程显得尤为重要,如下面的命令,默认找出前10个内存占用最高的进程,如果想列出top5 则在head后面追加 -n 5即可:#默认找出占用内存最高的top10进程 [root@ixxxx ~]# ps aux|head -1;ps aux|grep -v PID|sort -rn -k +4|head USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND mysql 26687 0.0 5.0 993736 50904 ? Sl 7月16 16:56 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --log-error=/var/log/mysqld.log --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/lib/mysql/mysql.sock www 18489 0.0 4.7 356764 48564 ? S 8月08 0:11 php-fpm: pool www www 27745 0.0 4.5 353940 45900 ? S 8月07 0:17 php-fpm: pool www www 17313 0.0 4.4 353136 45112 ? S 8月08 0:12 php-fpm: pool www www 18486 0.0 4.3 352704 44524 ? S 8月08 0:11 php-fpm: pool www www 17312 0.0 4.3 352168 44020 ? S 8月08 0:12 php-fpm: pool www www 11171 0.0 4.3 352044 43668 ? S 8月09 0:04 php-fpm: pool www www 11168 0.0 4.2 352988 42964 ? S 8月09 0:04 php-fpm: pool www www 18488 0.0 4.1 351356 41660 ? S 8月08 0:11 php-fpm: pool www www 17310 0.0 4.1 350600 42176 ? S 8月08 0:11 php-fpm: pool www4、实时监控发往mysql服务器的sql语句。这个命令时程序员排查问题的实用命令,在客户端服务器上执行如下命令即可抓包sql语句,127.0.0.1和3306分别替换成mysql服务器的地址和端口号[root@xxxx ~]# tcpdump -s 0 -l -w - dst 127.0.0.1 and port 3306 |strings tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes5、查看服务器内存剩余情况。其中free列代表内存剩余多少。[root@xxxx ~]# free -mh total used free shared buff/cache available Mem: 991M 442M 127M 120K 420M 362M Swap: 1.0G 125M 898M6、查看磁盘空间占用概况。[root@xxxx ~]# df -h 文件系统 容量 已用 可用 已用% 挂载点 /dev/vda1 40G 4.7G 33G 13% / devtmpfs 486M 0 486M 0% /dev tmpfs 496M 0 496M 0% /dev/shm tmpfs 496M 464K 496M 1% /run tmpfs 496M 0 496M 0% /sys/fs/cgroup tmpfs 100M 0 100M 0% /run/user/07、 取两个文件的差集。得出的结果是在中存在但不在a.log中存在的行,如下:[root@xxxx ~]# cat a.log 11 22 [root@xxxx ~]# cat b.log 22 33 [root@xxxx ~]# grep -F -v -f a.log b.log | sort | uniq 338、查找某个字符串在哪些文件里存在。-r为递归查找,-n为显示字符串所在的行号,如下在当前目录下查找关键字为itboy的文件。[root@VM_0_8_centos ~]# cat f.log 111 222 333 444 itboy 555 [root@VM_0_8_centos ~]# grep -rn itboy ./* ./f.log:5:itboy9、查找指定文件在哪个目录下。“/”可以换成你想要查找的目录路径[root@VM_0_8_centos ~]# find / -name filename10、查看正在运行的进程。比如查看正在运行的php-fpm进程。[root@VM_0_8_centos ~]# ps -ef | grep -v grep | grep php-fpm nginx 19765 27832 0 18:35 ? 00:00:06 php-fpm: pool www nginx 24722 27832 0 18:56 ? 00:00:03 php-fpm: pool www root 27832 1 0 8月08 ? 00:00:06 php-fpm: master process (/usr/local/php7/etc/php-fpm.conf) nginx 30174 27832 1 19:17 ? 00:00:00 php-fpm: pool www敬请期待!持续更新中~
 0    0  287天前
hupei
435
1.相关技术解释:     1) BIOS+MBR相关:        ①BIOS:集成在电脑主板上的电脑自检系统,并且能够加载磁盘MBR上的引导程序。        ②MBR:win7之前磁盘分区的一种标准,内含引导操作系统的引导程序和磁盘分区表。        ③MBR上的引导程序:完成对磁盘上系统装载入内存的过程,即引导系统载入和启动。        ④MBR上的磁盘分区表:最多有4个主分区或者扩展分区(源于MBR限制),最多有一个扩展分区(源于操作系统限制),综上即最多有三个主分区,一个扩展分区。MBR采用32位标识块在磁盘的位置,故最多能标识2^32个块,每个块512KB,故最大支持约2TB容量。2)EFI+GPT相关:        ⑤EFI:一种基于新型主板的一种简易操作系统,可以识别.efi文件,采用C语言开发。(该操作系统完成的功能=BIOS+MBR上引导程序)        ⑥GPT:一种新的磁盘分区标准,与EFI共生,采用64位标识磁盘上的块(MBR为32位来标识),旨在弥补MBR对大容量磁盘无法识别的不足,其所能识别的磁盘最大容量为(2^32)*2TB。(GPT完成的功能=MBR上的分区表)         ⑦EFI+GPT的功能=BIOS+MBR(MBR引导程序+MBR磁盘分区表)2.EFI+GPT因何出现?        ①对开机速度的提升的渴望:BIOS+MBR启动过程繁琐,EFI+GPT启动简易。         ②增强对大容量硬盘识别:MBR支持2TB,GPT支持(2^32)*2TB。         ③统一启动程序和标准。         ④安装系统更加简易:BIOS+MBR必须依靠工具将系统的引导程序写入MBR,EFI+GPT只需系统镜像中有efi格式的安装程序即可,便可被EFI这个微型操作系统识别,运行。3.发展趋势:      由于磁盘单位价格的持续走低,大容量磁盘已经是必然的趋势,到某个时刻你必须采用EFI+GPT来识别你硬盘的全部容量。4.值得注意的点     由于,EFI+GPT的组合,只能将系统装到GPT分区的磁盘上,即只能装到GPT格式的磁盘上。故存在MBR分区转GPT分区的情况。     该过程需要格盘,我们需要备份好重要数据。5.EFI+GPT的必备条件:      ①系统镜像中需要有efi格式的文件,被用于EFI系统的识别并安装程序。      ②主板支持efi,操作系统支持efi。      ③操作系统必须安装到GPT格式的磁盘
 0    0  308天前
快速发帖高级模式
Powered by 虎佩中国
© 2012-2020 HuPei.net
您的IP:34.238.190.122,2020-06-04 07:18:24,Processed in 0.15536 second(s).
Powered by HuPei.net
免责声明:本站内容均来自网络,如有侵权请联系站长删除,一切后果概不负责!