首页 文章 精选 留言 我的

精选列表

搜索[高度可定制],共10014篇文章
优秀的个人博客,低调大师

定制linux内核+Busybox+dropbear实现远程登录

简单介绍下各阶段工作流程: POST:开机后,加载BIOS信息(里面包含各硬件的相关信息) BIOS(boot sequence):选择(设备)启动项,然后读取MBR信息 Boot Loader:初始化硬件、建立内存空间映射,读取grub配置文件 Initrd:加载内核(硬件检测及初始化、挂载根文件系统)0→启动第一个进程init→该程序读出/etc/inittab、/etc/rc.d/rc.sysinit、/etc/rc.d/rc.local文件 Shell:启动/bin/login程序,进入登录界面 进入实验部分: 一、环境搭建 1、虚拟机(server1)上添加一个硬盘 2、在系统中给该磁盘进行分区 [root@localhost~]#fdisk/dev/sdb 3、格式化 [root@localhost~]#mke2fs-text4/dev/sdb1 [root@localhost~]#mke2fs-text4/dev/sdb2 [root@localhost~]#mkswap/dev/sdb3 4、挂载 [root@localhost~]#mkdir/mnt/{sysroot,boot}#创建挂载目录 [root@localhost~]#mount/dev/sdb1/mnt/boot/ [root@localhost~]#mount/dev/sdb2/mnt/sysroot/ 5、安装grub [root@localhost~]#grub-install--root-directory=/mnt/dev/sdb 6、创建linux各目录 [root@localhost~]#cd/mnt/sysroot/ [root@localhost~]#mkdir-pvetc/rc.dvar/logrootprocsyssrvbootmnttmphomedevliblib64 二、编译内核 [root@localhost~]#tarxflinux-3.13.6.tar.xz-C/usr/src/#解压 [root@localhost~]#cd/usr/src/ [root@localhostsrc]#ln-slinux-3.13.6linux#创建软链接 [root@localhostsrc]#cdlinux [root@localhostlinux]#yumgroupinstall"DevelopmentTools"-y#安装开发包组 [root@localhostlinux]#makeallnoconfig#重置配置选项 [root@localhostlinux]#makemenuconfig 如果make menuconfig时报错: 提示:缺少ncurses-devel库文件 [root@localhostlinux]#yum-yinstallncurses-devel [root@localhostlinux]#makemenuconfig#再次进行 [*]64bitkernel#64位支持 [*]gerernalsetup ()localversion-appendtokernelrelease#版本号 [*]Enableloadablemodualsupport#允许模块加载 ->Progressortypeandfeatures ProcessorFamily(Core2/newerXeon)#自行选择处理器类型 [*]Symmetricmulti-processingsupport#支持多核 ->BusOptions(PCIetc.) [*]PCIsupport#支持PCI总线 ->Filesystem [*]TheExtended4(ext)filesystem#支持ext4文件系统 ->Executablefileformats/Emulations#可执行文件系统 [*]KernelsupportforELFbinaries#支持ELF二进制程序 [*]Kernelsupportforscriptsstartingwith#!#支持脚本 [*]Networkingsupport ->Networkingoptions [*]Unixdomainsockets [*]UNIX:socketmonitoringinterface [*]TCP/IPnetworking [*]IP:multicasting#ip多播协议 [*]IP:advancedrouter#高级路由协议 [*]IP:kernellevelautoconfiguration#内核级别配置 [*]IP:DHCPsupport#DHCP服务 [*]IP:BOOTPsupport [*]IP:RARPSupport#RARP协议 [*]IP:TCPsyncookiesupport#tcp同步状态 ->DeviceDrivers ->GernalDriverOptions [*]Maintainadevtmpfsfilesystemtomountat/dev#使用devtmpfs机制挂载设备文件 [*]Automountdevtmpfsat/dev,afterthekernelmountedtherootfs#自动挂载 ->SCSIdevicesupport [*]SCSIdeveicesupport [*]SCSIdisksupport [*]FusionMPTdevicesupport#支持虚拟磁盘 [*]FusionMPTScsiHostdriversforSPI#虚拟磁盘 [*]FusionMPTmiscdevice(ioctl)driver#磁盘初始化 [*]Networkdevicesupport [*]Networkcoredriversupport#网络核心驱动 [*]Ethernetdriversupport#以太网卡驱动 [*]Inteldevices(NEW) [*]Intel(R)PRO/1000GigabitEthernetsupport [*]Intel(R)PRO/1000PCI-ExpressGigabitEthernetsupport ->InputDevicesupport [*]Mouseinterface [*]Keyboards#键盘 [*]Mice#ps/2 [*]USBsupport [*]SupportforHost-sideUSB [*]xHCIHCD(USB2.0)support [*]EHCIHCD(USB3.0)support [*]OHCIHCD(USB1.1)support [root@localhostlinux]#makebzImage-j3#只编译内核,并且使用3个线程 [root@localhostlinux]#cparch/x86_64/boot/bzImage/mnt/boot/#拷贝内核 三、安装busybox 安装busybox需要依赖glibc-static 安装glibc-static 包在DVD2中,如何没有DVD2比如我..,自己搭建网络yum源安装 root@localhost~]#wgethttp://mirrors.163.com/.help/CentOS6-Base-163.repo这是网易yum源的配置文件 [root@localhost~]#yumcleanall/#生效刚刚加载的yum仓库 [root@localhost~]#yum-yinstallglibc-static [root@localhost~]#tarxfbusybox-1.22.1.tar.bz2 [root@localhost~]#cdbusybox-1.22.1 [root@localhostbusybox-1.22.1]#makemenuconfig ->BusyboxSettings ->BuildOptions [*]BuildBusyBoxasastaticbinary(nosharedlibs) [root@localhostbusybox-1.22.1]#make&&makeinstall [root@localhostbusybox-1.22.1]#cp-a_install/*/mnt/sysroot/ 提供grub.conf文件: [root@localhost~]#vim/mnt/boot/grub/grub.conf default=0 timeout=5 titleLinux(3.13.6) root(hd0,0) kernel/bzImageroroot=/dev/sda2init=/sbin/init [root@localhost~]#sync#把内存缓冲区的数据立即写入磁盘中 测试: 添加新的虚拟机(server2) 注意选择磁盘时要选择之前创建的磁盘 添加完成后,把server1挂起或关机,然后server2开机 启动正常,但提示没有初始化文件 四、提供初始化文件(etc/fstab etc/inittabetc/rc.d/rc.sysinit) [root@localhostsysroot]#vimetc/fstab /dev/sdb1/bootext4defaults00 /dev/sdb2/ext4defaults00 /dev/sdb3swapswapdefaults00 proc/procprocdefaults00 sysfs/syssysfsdefaults00 [root@localhostsysroot]#vimetc/inittab ::sysinit:/etc/rc.d/rc.sysinit ::respawn:/sbin/getty19200tty1 ::respawn:/sbin/getty19200tty2 ::respawn:/sbin/getty19200tty3 ::respawn:/sbin/getty19200tty4 ::respawn:/sbin/getty19200tty5 ::respawn:/sbin/getty19200tty6 ::ctrlaltdel:/sbin/reboot ::shutdown:/bin/umount-a-r [root@localhostsysroot]#vimetc/rc.d/rc.sysinit #!/bin/sh # echo-e"\tWelcometo\033[36mLinux\033[0m" [-r/etc/sysconfig/network]&&./etc/sysconfig/network [-z"$HOSTNAME"-o"$HOSTNAME"=="(none)"]&&HOSTNAME=localhost /bin/hostname$HOSTNAME mount-a#基于/etc/fstab文件挂载设备 mdev-s#挂载内核所需设备文件 mount-oremount-rw/#把根挂载成可读写 ifconfiglo127.0.0.1#配置网卡信息 ifconfigeth0192.168.199.222#配置网卡信息 exportPS1="[\u@\h\w]$"#导出PS1路径 exportPATH="/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin"#修改环境变量 [root@localhostsysroot]#chmod+xetc/rc.d/rc.sysinit 提供账号和密码文件: [root@localhostsysroot]#head-1/etc/passwd>etc/passwd [root@localhostsysroot]#vimetc/passwd [root@localhostsysroot]#head-1/etc/group>etc/group [root@localhostsysroot]#head-1/etc/shadow>etc/shadow [root@localhostsysroot]#chmod400etc/shadow 提供认证库文件: [root@localhost~]#cp-d/lib64/libnss_files*/mnt/sysroot/lib64/ [root@localhost~]#cp-d/usr/lib64/libnss3.so/mnt/sysroot/usr/lib64/ [root@localhost~]#mkdir/mnt/sysroot/usr/lib64 [root@localhost~]#cp-d/usr/lib64/libnss3.so/mnt/sysroot/usr/lib64/ [root@localhost~]#cp-d/usr/lib64/libnss_files.so/mnt/sysroot/usr/lib64/ [root@localhost~]#cp/etc/nsswitch.conf/mnt/sysroot/etc/ [root@localhost~]#cp/etc/shells/mnt/sysroot/etc/ 提供主机名: [root@localhostsysroot]#mkdiretc/sysconfig [root@localhostsysroot]#vimetc/sysconfig/network HOSTNAME=biao.com [root@localhostsysroot]#sync 测试: 本地登陆成功! 五、提供ssh服务 [root@localhost~]#tarxfdropbear-2016.73.tar.bz2 [root@localhost~]#cddropbear-2016.73 [root@localhostdropbear-2016.73]#./configure 预编译时如果报如下错误: #yum-yinstallzlib-devel#安装缺少的库 #./configure#再次预编译 [root@localhostdropbear-2016.73]#makePROGRAMS="dropbeardbclientdropbearkeyscp" [root@localhostdropbear-2016.73]#makePROGRAMS="dropbeardbclientdropbearkeydropbearconvertscp"install 命令移植脚本: #!/bin/bash aimDir=/mnt/sysroot cmdInput(){ ifwhich$cmd&>/dev/null;then cmdPath=`which--skip-alias$cmd` else echo"Nosuchcommand." return5 fi } cpCmd(){ cmdDir=`dirname$cmdPath` [-d${aimDir}${cmdDir}]||mkdir-p${aimDir}${cmdDir} [-f$cmdPath]&&cp$cmdPath${aimDir}${cmdDir} } cpLib(){ forlibPathin`ldd$cmdPath|grep-o"/[^[:space:]]\{1,\}"`;do libDir=`dirname$libPath` [-d${aimDir}${libDir}]||mkdir-p${aimDir}${libDir} [-f$libPath]&&cp$libPath${aimDir}${libDir} done } echo"Youcaninput[q|Q]quit." whiletrue;do read-p"Enteracommand:"cmd if[["$cmd"=~\(|q|Q|\)]];then echo"Youchoosequit." exit0 fi cmdInput [$?-eq5]&&continue cpCmd cpLib [$?-eq0]&&echo-e"\033[36mCopysuccessful.\033[0m" Done 移植所需的命令: [root@localhost~]#bashcp.sh Youcaninput[q|Q]quit. Enteracommand:dropbear Copysuccessful. Enteracommand:dropbearkey Copysuccessful. Enteracommand:q Youchoosequit. 生成密钥: [root@localhost~]#mkdir/mnt/sysroot/etc/dropbear [root@localhost~]#dropbearkey-trsa-f/mnt/sysroot/etc/dropbear/dropbear_rsa_host_key-s2048 [root@localhost~]#dropbearkey-tdss-f/mnt/sysroot/etc/dropbear/dropbear_dss_host_key 创建pid文件存放目录: [root@localhost~]#mkdir/mnt/sysroot/var/run 挂载pts: [root@localhostsysroot]#mkdirdev/pts [root@localhostsysroot]#vimetc/fstab ........#上面省略 devpts/dev/ptsdevptsdefaults00 提供服务脚本: [root@localhostsysroot]#mkdiretc/rc.d/init.d [root@localhostsysroot]#vimetc/rc.d/init.d/dropbear #!/bin/bash # #description:dropbearsshdaemon #chkconfig:23456633 # dsskey=/etc/dropbear/dropbear_dss_host_key rsakey=/etc/dropbear/dropbear_rsa_host_key lockfile=/var/lock/subsys/dropbear pidfile=/var/run/dropbear.pid dropbear=/usr/local/sbin/dropbear dropbearkey=/usr/local/bin/dropbearkey [-r/etc/rc.d/init.d/functions]&&./etc/rc.d/init.d/functions [-r/etc/sysconfig/dropbear]&&./etc/sysconfig/dropbear keysize=1024 port=22 gendsskey(){ [-d/etc/dropbear]||mkdir/etc/dropbear echo-n"Startinggeneratethedsskey:" $dropbearkey-tdss-f$dsskey&>/dev/null RETVAL=$? if[$RETVAL-eq0];then success echo return0 else failure echo return1 fi } genrsakey(){ [-d/etc/dropbear]||mkdir/etc/dropbear echo-n"Startinggeneratethersakey:" $dropbearkey-trsa-s$keysize-f$rsakey&>/dev/null RETVAL=$? if[$RETVAL-eq0];then success echo return0 else failure echo return1 fi } start(){ [-e$dsskey]||gendsskey [-e$rsakey]||genrsakey if[-e$lockfile];then echo-n"dropbeardaemonisalreadyrunning:" success echo exit0 fi echo-n"Startingdropbear:" daemon--pidfile="$pidfile"$dropbear-p$port-d$dsskey-r$rsakey RETVAL=$? echo if[$RETVAL-eq0];then touch$lockfile return0 else rm-f$lockfile$pidfile return1 fi } stop(){ if[!-e$lockfile];then echo-n"dropbearserviceisstopped:" success echo exit1 fi echo-n"Stoppingdropbeardaemon:" killprocdropbear RETVAL=$? echo if[$RETVAL-eq0];then rm-f$lockfile$pidfile return0 else return1 fi } status(){ if[-e$lockfile];then echo"dropbearisrunning..." else echo"dropbearisstopped..." fi } usage(){ echo"Usage:dropbear{start|stop|restart|status|gendsskey|genrsakey}" } case$1in start) start;; stop) stop;; restart) stop start ;; status) status ;; gendsskey) gendsskey ;; genrsakey) genrsakey ;; *) usage ;; esac [root@localhostsysroot]#chmod+xetc/rc.d/init.d/dropbear [root@localhostsysroot]#cp/etc/rc.d/init.d/functionsetc/rc.d/init.d/ [root@localhostsysroot]#cdetc/rc.d/ [root@localhostrc.d]#ln-sinit.d/dropbeardropbear.start [root@localhostrc.d]#ln-sinit.d/dropbeardropbear.stop [root@localhostrc.d]#echo"/etc/rc.d/*.startstart">>rc.sysinit 关机脚本 [root@localhostrc.d]#vimrc.sysdown #!/bin/sh # sync#把内存缓冲区的数据立即写入磁盘中 sleep3#给系统3秒的写入时间 /etc/rc.d/*.stopstop umount-a-r Poweroff [root@localhostrc.d]vim/mnt/sysroot/etc/inittab ::shutdown:/etc/rc.d/rc.sysdown#最后一行修改成这样 测试: 服务开机启动 ssh远程登录成功: 以上实验全部完成!!!!!!!!!

优秀的个人博客,低调大师

富士通打造高度互联的共创共赢生态圈

10月27日富士通亚洲峰会召开前夕,围绕“数字化共创”峰会主题,富士通亚洲区总裁广濑敏男、富士通(中国)信息系统有限公司CEO薛卫、数字化中心统括部长秦科在富士通上海总部接受畅享网记者的采访。 富士通是一家全球年销售额达420亿美元为全球客户提供ICT服务的集团化企业,分支机构分布在180多个国家和地区,全球员工超15.5万。在中国拥有38家企业,业务范畴涉及制造业、研究开发、市场营销、运用与维护、数据中心、系统构筑、销售,全国各地共400多名员工为客户提供24小时不间断端到端服务,服务范畴涵盖产品解决方案和综合性的ICT服务。 富士通亚洲区总裁广濑敏男向记者透露,富士通支撑价值创造的核心技术就是提供互联服务,数字化共创是富士通集团事业发展的核心理念。人工智能、云平台、物联网以及信息安全作为富士通的四个支柱性产业。 富士通株式会社亚洲区总裁 广濑敏男 当下数字化浪潮不断发展,与商业、社会以及我们每个人的日常生活深度融合,中国政府发布的“十三五信息化规划”也旨在加速数字化转型。 在这个大背景下,富士通同样也需要发挥着自己的作用,为制造、金融、医疗、流通、零售等各行各业提供ICT产品、技术与服务,中国制造2025将是富士通业务发展的主要切入点,还会围绕新零售、新流通领域,为中国智慧城市的建设作出贡献。“根据中国市场的需求,将日本总部以及全球所拥有的技术和经验落地到中国,制定符合中国市场的解决方案;借鉴富士通现有的生产经验、现场管理文化、解决方案案例经验进行改造,真正实现植根中国的目标,不断砥砺前行。”富士通(中国)信息系统有限公司CEO薛卫说。 富士通(中国)信息系统有限公司 首席执行官薛卫 薛卫先生在采访环节中曾多次提到要实现产品本地化的目标,围绕如何实现本地化部署话题,富士通(中国)数字化中心统括部长秦科解答了记者心中的疑惑,在富士通技术人员的带领下,随行的记者还参观了工乐未来的实际沙盘。 富士通在今年5月于日本总部正式对外发布了智能制造解决方案及服务平台——COLMINA(工乐未来),它是一个开放平台,从价值链的角度可以实现企业从内至外的业务场景互联互通,改善生产效率,提升产业链集成度实现新业态创造。工乐未来包含三层主要业务,分别为:工乐未来数字化工厂,工乐未来Platform,包括连接技术、IOT技术、AI技术,以及工乐未来Service数据增值服务。秦科介绍,以杰克缝纫机的智能制造项目为例,富士通推行OTD优化形式,以Time to Market为核心生命线,从控制层、执行层、计划层以定量形式分析,实现企业由库存交付到能力交付的转变。 富士通(中国)信息系统有限公司 数字化中心统括部长秦科 利用人工智能、云计算、物联网、网络安全的核心技术和工乐未来开放平台,富士通将与客户、友商、合作伙伴一起积极摸索和开拓创新业务模式,共同探讨协同服务,旨在建立全球化共创共赢的生态圈。 紧随着媒体答疑会的召开,10月27日,Fujitsu WorldTour 2017 –富士通亚洲峰会于今日在上海花园饭店正式拉开帷幕,围绕“以人为本的创新:数字化共创”这一主题,富士通与客户、合作伙伴以及媒体一同分享了数字化共创的愿景与实践,共话数字化时代下的业务模式转型与创新之道。 本文出处:畅享网 本文来自云栖社区合作伙伴畅享网,了解相关信息可以关注vsharing.com网站。

优秀的个人博客,低调大师

为什么说解耦的战术,决定了架构的高度?[转]

原创2017-11-13沈剑DBAplus社群 本文根据沈剑老师在〖Gdevops 2017全球敏捷运维峰会北京站〗现场演讲内容整理而成。 (点击底部“阅读原文”获取沈剑演讲完整PPT) 讲师介绍 沈剑,架构师之路公众号作者。曾任百度高级工程师、58同城高级架构师、58同城技术委员会主席、58同城C2C技术部负责人。现任58到家技术委员会主席,高级技术总监,负责58速运研发与管理工作。本质,技术人一枚。 架构设计中,大家都不喜欢耦合,但有哪些典型的耦合是我们系统架构设计中经常出现的,又该如何优化?这里列举了6个点:IP、jar包、数据库、服务、消息、扩容。这些点,如果设计不慎,都会导致系统一些耦合,这些点基本都是大家实际遇到的痛点,今天我将跟大家分享如何用常见的方案去解除这些耦合。 一、如何找到系统中的耦合 什么是耦合?就是每每我们作为技术人,在心中骂上下游、骂兄弟部门,说这个东西跟我有什么关系?为什么我要配合来做这个事情?这里面就非常有可能是系统中存在耦合的地方。 明明我们不应该联动,但兄弟部门要做一个事情,上下游要做一个事情,我却要被动地配合来做这个事情。还有可能这个配合的范围特别特别的大,那就说明耦合非常非常的重。下面来看具体的五六个案例。 二、典型耦合与对应解耦实践 1、IP耦合 第一个案例,特别常见。原来线上有服务或者有条数据库,因为各种原因,例如磁盘硬件有故障,要换一台机器,然后运维给了我们一台机器,我们把数据库或者把服务给部署好了。部署好了IP要换,原来有个旧IP,现在有个新IP。那就有很多上游依赖我,我IP换了怎么办?就找到上游说我的IP换了,麻烦上游部门改配置重启一下,连到我新的IP上去。 不知道大家工作中会不会遇到这样的场景,这时如果你作为上游的调用方,不管你调数据库还是调服务,你心里可能就在骂他了,明明是你IP变了,为什么配合重启、配合改配置的人是我?特别是如果一个基础服务或者一个基础数据库,依赖它的人很多,那么你可能要找到这些依赖它的人,可能有A部门、B部门、C部门,所有业务都依赖你,你要全部找一遍,全部重启。所以这个因为IP配置使得上下游耦合在一起的案例,它的耦合范围其实是非常广的,我们都觉得很讨厌。 我们的希望是:你改一个IP,能不能我不动,你自己升级了,我流量就默默迁移过去,这是一个非常直观的理解上下游的耦合。 内网IP修改为内网域名,这是我们的实践,强烈的建议大家回去马上干这个事情。为什么我们IP要修改、要重启?很有可能是我们将IP写在了自己的配置文件中。如果我们把这个内网IP变为内网域名,那么我们是不是就可以不让上游配合去改配置重启呢? 假设我们现在不用IP了,用域名了。现在换了一台机器域名没变,IP指向变了。我们可以让运维统一将内网DNS切到新的机器上面去,并将旧机器的连接切断,重连后就会自动连到新机器上去了。这样的话只要运维配合就可以完成迁移,对于所有上游的调用方、服务的调用方、数据的调用方都不需要动,这是第一个案例。 我们的最佳实践是强烈建议使用内网域名来替换内网的IP,连服务、连数据库统统取走。 2、公共库耦合 第二个案例是公共库,这个公共库可能是一个跟业务相关的通用业务库,比如用户的业务、支付的业务,这些业务写在了一个jar包里,各个业务线通过这个jar包来实现相关的一些业务逻辑。所有的业务方因为这个公共库耦合了,不管你是so、dll,还是jar包代码,不同语言的公共库方式不一样,本质是上游通过这个公共库耦合在一起。 我们曾经碰到什么样的情况呢?58有招聘、房产、二手很多业务线,用户的一些操作,登录、查询信息、修改信息可能都是相通的,所以我们有一个user.jar,对所有用户的操作可能通过这个jar包去做。然后有个业务线,比如说招聘,他可能修改了用户的操作的一些代码,修改了这个jar包。修改之后,上线之前会进行测试,但招聘只会测试自己的业务,不会测试兄弟业务线的业务,导致上线的结果是,上线后兄弟业务线全挂了,于是就出现了一个很有意思的场景, A和B的业务老大在群里面说怎么业务都挂了,然后有研发兄跳出拉解释说C部门上线了,所以我们都挂了,这个解释是很难说通的。 为什么兄弟部门好好的,他上线了他没问题,而我们挂了,就是因为jar包耦合在一起,可能我们也在心里会默默地骂他们,修改代码的是你,没问题的也是你,有问题的是我,我其实什么都没动,我很委屈。多个上游因为jar包耦合在了一起,那有什么样的优化方法? 如果代码库个性很强 如果这个jar包、这个公共库的个性比较强,如果时候偏招聘的、房产的、二手的,我们的建议是把这些个性的代码拆分到各个业务线自己的jar包里面去,这样的话,你修改的那一块只影响你自己,至少不会扩大影响范围,这个需要对业务进行剖析,把个性的地方拿出来。如果长时间解决不了,我刚刚说的那种耦合如果频发,出现的次数特别多,最差的情况下我们可以copy代码,比如说拷三份,但这个不推荐。 我们的建议还是抽取其中的个性部分,把原来的一个business的jar包变成三个加包,每一块只跟一块业务相关。 如果公共库通用性很强 那如果这个库的共性比较强,我们建议通用的部分下沉独立一个service,这个service对上游提供接口,我每次测试你也要测试接口的兼容性;如果是新的业务,我们建议新增接口,这样至少不会对旧有的代码产生影响,通过service或RPC调用的方式来解除耦合。 3、数据库耦合 第三个案例应该也是大家会遇到比较多的情况,数据库的耦合。我先说一下业务场景:业务A、业务B、业务C,这里还是举例用户的业务,有些用户的数据是通用的,存在table-user里,而个性的数据我们存在个性的数据库里,比如业务A我们可能有个table-A、业务B有table-B、业务C有table-C。 假设我的业务线既要取个性的数据,又要取共性的数据,我们的代码往往这么写,个性表join个性表,UID相同,UID等于我的用户1、2、3,个性的数据和共性的数据一起抽取出来,没有任何问题。业务线B、业务线C也是这么做的。所以你会发现join语句其实导致了user的table和业务线A、B、C的table耦合到一个数据库实例里。 会导致什么问题呢?比如A业务线要上线一个功能,这个功能没有索引,全表都要扫描,数据库CPU100%,数据库实例IO性能下降,影响业务。B和C都影响。即某个业务线的数据库性能急剧下降导致所有业务都受影响。这时DBA兄弟、运维兄弟杀过来说性能不行了,我再给你两台机器,给我两个实例,你会发现没用,所有表都耦合在一个实例里,给机器也拆不开,扩不了容。 2015年我调去58到家时,当时整个58到家有一个库叫做58到家库,里面有几百个表,性能越来越低,但因为各种join又必须耦合在一个实例里,很悲惨。我们怎么做呢?垂直切分与服务化。你会发现跟jar包解耦非常相似,垂直拆分。 比如说用户的基础数据,我抽向一个用户的服务,user最基础的数据库只能够被这个服务锁访问,数据库私有是服务化的一个特点。 此时业务线原来的业务怎么样满足?原来是业务方直接一个join既取了共有的数据又取了私有的数据,此时原来的一次数据库访问变成了两次数据库访问,第一次取个性数据,第二次取共性数据,然后业务层拼装。 之前的方式和之后的方式相比,之前的方式其实业务代码可能会更简单一些,因为它是将这个业务逻辑放在了SQL语句中,但是导致数据库耦合在了一起。后面这种方式就是业务的代码会更复杂,会变成多次访问,将原来在SQL中进行的逻辑计算变成我们自己的代码的逻辑计算。此时业务有自己的库,公共有公共的库,你会发现很有可能这些库早期也在一个实例,但是性能下降时可以很容易地新增实例,把其中一个公共的库从一个实例里放到另外一个实例,甚至新增一台机器做到硬件的扩容。所以垂直切分是指业务侧自己的数据库放到自己的上去,公共的放到公共的上去,不要耦合在一个实例当中,这是一个比较典型的业务场景。 4、服务化耦合 第四个案例是服务化耦合的例子。服务化之后,如果业务代码拆分得不干净,即使你做了服务化也不能够解除耦合。这里举一个服务化解耦不彻底的案例。 上面是ABC三个业务方,底下是一个通用的服务。假如你解耦不彻底,如果你这个通用的服务里有业务侧的代码,最典型的业务侧的代码是什么样的?服务层switch case,根据调用方的类型走不通的业务逻辑代码。我们做服务化其实是想把共性的部分抽象下沉,是共性的部分会做的服务,但如果解耦不彻底,就会有传入不同biz-type执行不同逻辑这样的代码。 这会出现什么问题呢?如果新增业务需求,你会发现很有可能要改代码的是底层的服务,比如说业务1来了一个需求,他过来找到你,说我这个需求有个扩展,麻烦你这边升级一下。业务2和业务3相同,明明有需求的是业务方,为什么修改代码的是我底层呢,业务需求方很多,所有业务需求侧都是你来实现,你是忙不过来的。这时你可能在心中骂他。 这个的耦合范围相对较小,因为只有一个基础服务维护的是痛点。解决方案也很容易想到,当然是把业务个性化的case分支搬到上游去,底层只做通用的功能。业务代码上浮,这样的话上游的业务迭代速度、迭代效率会提升,每块业务有功能就会自己实现了,不需要兄弟部门去实现,没有一个沟通的过程。这是服务化不彻底的一个常见的耦合的案例。 5、消息通知耦合 第五个案例是消息通知的耦合。我猜应该也很多公司会遇到过,有一些事件,这个事件可能要让很多下游知晓,这里举一个我们曾经出现过的案例。58同城发布帖子,发布帖子的这个事件可能要周知很多方,例如有一个用户分级的服务,他发了帖之后,这个用户发帖的一些统计数据,一些信息数据可能要进行更新。还要通知离线消息反作弊的部门发布一个帖子之后,可能做一些离线的分析和处理,看有没有反作弊的嫌疑。甚至我们这个消息可能要通知业务线,比如说招聘业务线,最近做了一些营销活动,只要发招聘的帖子就给你奖积分。 帖子发布服务,这本来应该是一个非常基础的服务,它是否要承担将帖子消息同步给通知关注方的职责呢? 最早我们是怎么实现的?58同城都是服务化的架构,通过RPC告诉你发布一个帖子。所以我们的上游是帖子发布的基础服务,他会通知反作弊的部门说发了一个帖子,会通知数据统计的部门发个帖子,会通知业务线说发个帖子,这样的架构其实是因为这个通知上下游耦合在了一起。 然后我们在什么时候会偷偷地去骂这个下游呢?假设现在又新增了一个业务线,房产业务线也做营销活动,也要关注帖子发布,麻烦发布的兄弟能不能调用一下我。发布的兄弟会发现改的是发布服务的代码,他原来要调123,他现在还要调4,有人有新增的需求还要调5。发布服务的工程师很痛苦,明明有需求的是业务方,但修改代码的却是我。 就是这种因为消息上下游耦合在一起,非常常见的解耦方案是通过MQ,这个案例里的MQ以及下一个案例里的配置中心是互联网架构中两个非常常见的解耦工具。MQ能够做到上下游物理上和逻辑上都解耦,增加MQ之后,首先上游互不知道彼此的存在,它当然不会建立物理连接了,大家都与MQ建立物理连接,就是物理连接上解耦了;逻辑上也解耦了,消息发布方甚至不用知道哪些下游订阅了这个消息。新增消息的订阅方只需要找MQ就行了,上游不需要关注。所以MQ是一个非常常见的物理上解耦、逻辑上也解耦的利器。 6、下游扩容耦合 第六个案例,我相信也几乎是所有的公司都会遇到的一个案例,它和第一个案例很像,但又不一样。我们的第一个案例是说IP变化,上游调下游IP发生了变化,我们的建议是使用内网域名,而不是IP来做配置,来做上下游的连接解耦。 扩容换IP是一个场景,扩容又是第二个场景。现在有service1、service2、Web1,底层的service是个集群,随着业务、数据量、并发的增长,service要扩容了,我要新增两个节点,假设我要新增IP4、IP5,你会发现案例一的场景又出现了,你得通知所有的上游麻烦帮忙增加两个IP,增加两个内网域名,因为我扩容了。扩容的明明是下游,但需要修改配置、需要重启是上游。 我们早期的解决方案是怎么样的?这里跟大家分享分享。我们对配置采用的是配置私藏的方式。一般对于每个上游来说,都有个自己的配置文件,依赖于下游,这个配置文件会放在上游的配置文件里。service2一般有一个配置conf,这个里面写了依赖于内网配置,内网域名是123,然后这个服务在启动时可能通过配置把这个连接建立上。Web也是一样,它有一个Web1.conf,大家想想自己所服务的公司是不是这样的。它其实是一个数据的扩散,本来数据在这一份,但是你会发现这个数据扩散到不同的上游,每个人都存储一份这样的数据,我这个数据要变动时每个上游都需要变动。如果数据只存在一个地方,这一个地方变了就都变了,不用担心数据的一致性。 其实如果你能够知道上游是谁,通知你的上游去为用户改善配置重启还好,我们碰到的痛点是什么?58同城几千号人,业务几百个,那么多,我不知道谁依赖了我,如果我能知道123依赖了我,那我就告诉你就行了。现在我不知道谁依赖了我,因为你连接我,你不需要经过我的允许,你在手册上看调用方式是什么就看懂了。我们会增加IP,我怎么通知你? 刚刚说根本的原因其实是一份配置数据扩散到了多个上游,那我们能不能将这个配置数据放在一个地方不扩散,我改了这一个地方就都改了? 解决方案其实还是配置中心,配置中心的细节我在这不展开讲,网上可能也有一些公司的实践,配置后台、DB存储等。 配置中心是一个典型的逻辑上解耦、但物理上不解耦的一个架构工具。我们的所有上游依赖于下游,还要建立物理的连接。你引入配置中心之后,它不是通过私有的配置,也不是通过全局的配置文件去读取下游的IP,而是配置中心说我要访问USER service,配置中心告诉他user service的内网域名是123,service的1、2、3还是按照内网的1、2、3,物理上还是连接user service,所有的上游都按照这种方式读取下游的配置。 其实在配置中心侧,他就能够知道有哪些人连接了user service,他在配置中心的后台就可以配哪些人我设置多少的限流,然后将这个限流可以同步到调用方的客户端,当然也可以同步到服务端进行双向的保护。如果user service进行扩容,比如我要增加几个节点,我增加了4和5,那么我在配置后台说增加了4和5,后台能够知道哪些上游依赖了它,反向给后台通知,就完全不需要上游去做了。这是我今天的最后一个案例。 三、总结 解耦之后系统能够更美好一点,程序员心中能够少一点怨气,希望今天分享的主题及案例能够帮助大家解决一些工作中的实际问题,谢谢大家。 原文:https://mp.weixin.qq.com/s/6pCJFrNOk4HJYlS5qu4K4A 谋胆并重

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册