- Algorithm。主要是为了编程训练和学习。每周至少做一个 leetcode 的算法题(先从Easy开始,然后再Medium,最后才Hard)。进行编程训练,如果不训练你看再多的算法书,你依然不会做算法题,看完书后,你需要训练。关于做Leetcode的的优势,你可以看一下我在coolshell上的文章 Leetcode 编程训练 - 酷 壳 - CoolShell(一个小时以内);
- Review:主要是为了学习英文,如果你的英文不行,你基本上无缘技术高手。所以,需要你阅读并点评至少一篇英文技术文章,我个人最喜欢去的地方是 Medium(需要×××,其他的可以社区的官方文档以及论文学习)以及各个公司的技术blog,如Netflix的(30min);
- Tip:主要是为了总结和归纳你在是常工作中所遇到的知识点。学习至少一个技术技巧。你在工作中遇到的问题,踩过的坑,学习的点滴知识(也可以学习【极客时间】上的实用课程);
- Share:主要是为了建立你的影响力,能够输出价值观。分享一篇有观点和思考的技术文章,也可以是技术总结的文章。
只有你开始自己思考,开始自己总结和归纳,开始找人交流讨论,开始践行,并开始对外输出,你才会掌握到真正的学习能力
所以,学习不是努力读更多的书,盲目追求阅读的速度和数量,这会让人产生低层次的勤奋和成长的感觉,这只是在使蛮力。要思辨,要践行,要总结和归纳,否则,你只是在机械地重复某件事(记忆知识),而不会有质的成长的。
重点是如何才能让自己拥有举一反三的能力,在这方面,耗子叔对自己训练如下:
- 对于一个场景,制造出各种不同的问题或难题;
- 对于一个问题,努力寻找尽可能多的解,并比较这些解的优劣;
- 对于一个解,努力寻找各种不同的测试案例,以图让其健壮。
举一反三的能力,可以分解为:
联想能力:这种能力的锻炼需要你平时就在不停地思考同一个事物的不同的用法,或是联想与之有关的别的事物。对于软件开发和技术学习也一样;
抽象能力:抽象能力是举一反三的基本技能。平时你解决问题的时候,如果你能对这个问题进行抽象,你就可以获得更多的表现形式。
抽象能力需要找到解决问题的通用模型,比如数学就是对现实世界的一种抽象。只要我们能把现实世界的各种问题建立成数据模型(如,建立各种维度的向量),
我们就可以用数学来求解,这也是机器学习的本质;
自省能力:所谓自省能力就是自己找自己的难看。当你得到一个解的时候,要站在自己的对立面来找这个解的漏洞。有点像左右手互博。这种自己和自己辩论的
能力又叫思辨能力。将自己分裂成正反方,左右方,甚至多方,站在不同的立场上来和自己辩论,从而做到不漏过一个 case,从而获得完整全面的问题分析能力。
如果要获得这三种能力,除了你要很喜欢思考和找其它人来辩论或讨论以外,还要看你自己是否真的善于思考,是否有好奇心,是否喜欢打破沙锅问到底,是否
喜欢关注细节,做事是否认真,是否严谨……
1、Algorithm
编写一个 SQL 查询,满足条件:无论 person 是否有地址信息,都需要基于上述两表提供 person 的以下信息:
表1: Person
------------- ---------
| 列名 | 类型 |
------------- ---------
| PersonId | int |
| FirstName | varchar |
| LastName | varchar |
------------- ---------
PersonId 是上表主键
表2: Address
------------- ---------
| 列名 | 类型 |
------------- ---------
| AddressId | int |
| PersonId | int |
| City | varchar |
| State | varchar |
------------- ---------
AddressId 是上表主键
select FirstName,LastName,City,State from Person left join Address on Person.PersonId=Address.PersonId
主要考察SQL关联查询的相关知识,一般的关联查询可以使用select子句等实现,使用表关联条理更加的清晰,主要分为
内连接(inner join),
左连接(left join) 左连接是把左边的表的元组全部选出来
右连接(right join) 右连接就是把右边表的数据全部取出,不管左边的表是否有匹配的数据:
全连接(full join)把左右两个表的数据都取出来,不管是否匹配: 笛卡尔积
题目中:无论 person 是否有地址信息 表示无论表2有没有数据都将其输出所以要采用left join
2、Review
https://www.percona.com/community-blog/2019/05/06/percona-live-presents-first-ever-tidb-track/
3、Tip/Techni (shell grep、awk、sed)相关技巧
之前一次线故障,误将生产环境服务器塞进下架队列中,而整个下架流程为了避免后期IP地址冲突,会将网卡配置文件中的ONBOOT=yes改为ONBOOT=no,后期陆续出现机器重启后不能启动的问题,需要批量检查。以及修复。写了一点简单的脚本。
#!/bin/bash
#检查虚拟机网卡配置文件ONBOOT状态
result=`cat /etc/sysconfig/network-scripts/ifcfg-eth0 |grep ONBOOT |awk -F= '{ print $2 }'`
ip=`ip a | grep 'scope global' | grep br | egrep -v ':|192.168.122|192.168.0.' | sed -r 's/.*inet (.*)\/.*/\1/' | egrep -v '0.1$'|uniq | head -n 1`
echo "$ip----$result"
相关的修复:
sed -i "s/ONBOOT=no/ONBOOT=yes/g" /etc/sysconfig/network-scripts/ifcfg-eth0
4、Share 关于高可用容灾的一些思考
两地三中⼼心 vs 异地多活
不同的业务需要不同的SLA,高可用架构,普通的OA系统和线上支付系统的高可用性架构、SLA肯定是不一样的,OA系统故障,大不了内部员工短期不能访问而已,只要数据不丢失,就没有什么大问题,而线上支付之类的业务系统故障,对企业来说就是严重生产环境故障或者事故,根据不同的故障情况,要承担不同的损失。
什么是两地三中心?
两地是指同城、异地,三中心是指生产中心、同城容灾中心、异地容灾中心。结合近年国内出现的大范围自然灾害,以同城双中心加异地灾备中心的“两地三中心”的灾备模式也随之出现,这一方案兼具高可用性和灾难备份的能力。同城双中心是指在同城或邻近城市建立两个可独立承担关键系统运行的数据中心,双中心具备基本等同的业务处理能力并通过高速链路实时同步数据,日常情况下可同时分担业务及管理系统的运行,并可切换运行;灾难情况下可在基本不丢失数据的情况下进行灾备应急切换,保持业务连续运行。与异地灾备模式相比较,同城双中心具有投资成本低、建设速度快、运维管理相对简单、可靠性更高等优点。异地灾备中心是指在异地的城市建立一个备份的灾备中心,用于双中心的数据备份,当双中心出现自然灾害等原因而发生故障时,异地灾备中心可以用备份数据进行业务的恢复
什么是异地多活:
所谓 “ 双活 ” 或 “ 多 活 ” 数据中心,区别于 传统 数据中心 和 灾备中心的模式,前者多个或两个数据中心都处于运行当中, 运行相同的应用,具备同样的数据,能够提供跨中心业务负载均衡运行能力,实现持续的应用可用性和灾难备份能力,所以称为 “双活 ” 和 “ 多 活 ” ;后者是 生产 数据中心投入运行, 灾备 数据中心处在不工作状态,只有当灾难发生时,生产数据中心瘫痪,灾备中心才启动。
目前的公司是采用上海 杭州双机房实现的异地双活,2个机房之间通过跨城市专线互联,平时两个机房都对外提供服务,当单一机房故障时,可以快速切换到另一机房,实现快速止损。
经常遇到的问题:
1、网络问题 专线被挖断,导致双机房数据同步延迟
2、部分应用处于非双活状态,只有上海机房存在或者杭州机房存在,还有部分应用只能单活,2个数据中心只能有一个提供正常服务
3、遇到故障时,通过DNS切换太慢,导致部分客户受影响时间较长