一、vrrp协议简介

VRRP(Virtual Router Redundancy Protocol)协议是用于实现路由器冗余的协议。

VRRP协议将两台或多台路由器设备虚拟成一个设备,对外提供虚拟路由器IP(一个或多个),而在路由器组内部,如果实际拥有这个对外IP的路由器如果工作正常的话就是MASTER,或者是通过算法选举产生,MASTER实现针对虚拟路由器IP的各种网络功能,如ARP请求,ICMP,以及数据的转发等;其他设备不拥有该IP,状态是BACKUP,除了接收MASTER的VRRP状态通告信息外,不执行对外的网络功能。当主机失效时,BACKUP将接管原先MASTER的网络功能。

配置VRRP协议时需要配置每个路由器的虚拟路由器ID(VRID)和优先权值,使用VRID将路由器进行分组,具有相同VRID值的路由器为同一个组,VRID是一个0~255的正整数;同一组中的路由器通过使用优先权值来选举MASTER,优先权大者为MASTER,优先权也是一个0~255的正整数。

VRRP协议使用多播数据来传输VRRP数据,VRRP数据使用特殊的虚拟源MAC地址发送数据而不是自身网卡的MAC地址,VRRP运行时只有MASTER路由器定时发送VRRP通告信息,表示MASTER工作正常以及虚拟路由器IP(组),BACKUP只接收VRRP数据,不发送数据,如果一定时间内没有接收到MASTER的通告信息,各BACKUP将宣告自己成为MASTER,发送通告信息,重新进行MASTER选举状态。

VRRP的工作过程为:

(1) 虚拟路由器中的路由器根据优先级选举出Master。Master 路由器通过发送免费ARP 报文,将自己的虚拟MAC 地址通知给与它连接的设备或者主机,从而承担报文转发任务;

(2) Master 路由器周期性发送VRRP 报文,以公布其配置信息(优先级等)和工作状况;

(3) 如果Master 路由器出现故障,虚拟路由器中的Backup 路由器将根据优先级重新选举新的Master;

(4) 虚拟路由器状态切换时,Master 路由器由一台设备切换为另外一台设备,新的Master 路由器只是简单地发送一个携带虚拟路由器的MAC 地址和虚拟IP地址信息的免费ARP 报文,这样就可以更新与它连接的主机或设备中的ARP 相关信息。网络中的主机感知不到Master 路由器已经切换为另外一台设备。

(5) Backup 路由器的优先级高于Master 路由器时,由Backup 路由器的工作方式(抢占方式和非抢占方式)决定是否重新选举Master。

二、keepalived简介

1、上面介绍了VRRP,而keepalived是什么呢,说白了keepalived就是实现VRRP协议的软件。它可以检测web服务器的工作状态,如果该服务器出现故障被检测到,将其剔除服务器群中,直至正常工作后,keepalive会自动检测到并加入到服务器群里面。实现主备服务器发生故障时ip瞬时无缝交接。它是LVS集群节点健康检测的一个用户空间守护进程,也是LVS的引导故障转移模块(director failover)。Keepalived守护进程可以检查LVS池的状态。如果LVS服务器池当中的某一个服务器宕机了。keepalived会通过一 个setsockopt呼叫通知内核将这个节点从LVS拓扑图中移除。

2、keepalived的架构:

keepalived也是模块化设计,不同模块复杂不同的功能,其组件包括:

core:是keepalived的核心,复杂主进程的启动和维护,全局配置文件的加载解析等

check:负责healthchecker(健康检查),包括了各种健康检查方式,以及对应的配置的解析包括LVS的配置解析

vrrp:VRRPD子进程,VRRPD子进程就是来实现VRRP协议的

libipfwc:iptables(ipchains)库,配置LVS会用到

libipvs*:配置LVS会用到

由图可知,两个子进程都被系统WatchDog看管,两个子进程各自复杂自己的事,checker子进程复杂检查各自服务器的健康程度,例如HTTP,LVS等等,如果checker子进程检查到MASTER上服务不可用了,就会通知本机上的兄弟VRRP子进程,让他删除通告,并且去掉虚拟IP,转换为BACKUP状态,并且会自动在ipvs内核添加相应的集群调度规则,所以说keepalived与lvs是天生搭配的。

三、keepalived的安装以及配置

在centos6.4以前的系统其安装程序在epel源,6.4以后已被收入base源,所以我们可以直接使用yum来进行安装。

查看keepalived的信息

  1. [root@localhost ~]# yum info keepalived
  2. Loaded plugins: fastestmirror, security
  3. Loading mirror speeds from cached hostfile
  4. base | 4.0 kB : ...
  5. Available Packages
  6. Name : keepalived
  7. Arch : x86_64
  8. Version : 1.2.
  9. Release : .el6_6
  10. Size : k
  11. Repo : base
  12. Summary : Load balancer and high availability service
  13. URL : http://www.keepalived.org/
  14. License : GPLv2+
  15. Description : Keepalived provides simple and robust facilities for load balancing
  16. : and high availability. The load balancing framework relies on the
  17. : well-known and widely used Linux Virtual Server (IPVS) kernel module
  18. : providing layer- (transport layer) load balancing. Keepalived
  19. : implements a set of checkers to dynamically and adaptively maintain
  20. : and manage a load balanced server pool according their health.
  21. : Keepalived also implements the Virtual Router Redundancy Protocol
  22. : (VRRPv2) to achieve high availability with director failover.
  1.  

安装完成后,其主要的配置文件

程序环境:

配置文件:/etc/keepalived/keepalived.conf

主程序:/usr/sbin/keepalived

其中keepalivd的配置文件是keepalived.conf,其可以分为三个部分:

全局配置(Global Configuration)

VRRP配置

LVS配置

1、全局定义(global definition)配置范例:

  1. ! Configuration File for keepalived #注释内容
  2. global_defs { #表示keepalived在发生诸如切换操作时需要发送email通知,以及email发送给哪些邮件地址,邮件地址可以多个,每行一个
  3. notification_email {
  4. acassen@firewall.loc
  5. failover@firewall.loc
  6. sysadmin@firewall.loc
  7. }
  8. notification_email_from Alexandre.Cassen@firewall.loc #表示发送通知邮件时邮件源地址是谁
  9. smtp_server 192.168.200.1 #表示发送email时使用的smtp服务器地址
  10. smtp_connect_timeout #连接smtp连接超时时间
  11. router_id LVS_DEVEL #机器标识,相当于主机名
  12. }

2、VRRP配置实例:

  1. vrrp_instance VI_1 { #VI_1表示这个VRRP的虚拟路由器的名字
  2. state MASTER #状态值
  3. interface eth0 #监听的端口
  4. virtual_router_id #VRID,这个必须与备节点是一样
  5. priority #优先级
  6. advert_int #检测间隔
  7. authentication { #认证
  8. auth_type PASS #帐号
  9. auth_pass #密码
  10. }
  11. virtual_ipaddress { #需要虚拟的IP地址,可以是多个
  12. 192.168.200.16
  13. 192.168.200.17
  14. 192.168.200.18
  15. }
  16. }
  1.  

3、lvs配置实例说明:

  1. virtual_server 192.168.200.100 { # 设置VIP的IP和端口信息
  2. delay_loop #检测间隔时间
  3. lb_algo rr #调度算法
  4. lb_kind NAT #lvs类型
  5. nat_mask 255.255.255.0 #NAT类型的网关掩码,其他类型不需要此项
  6. persistence_timeout #持久连接时间
  7. protocol TCP #TCP协议
  8. real_server 192.168.201.100 { #RIP的IP和端口
  9. weight #权重
  10. url {
  11. path /mrtg/ #健康检查,这里是对web服务的检测,有两种方法,一种是指定页面的hash值。一个是页面的状态码,这里是hash值
  12. digest 9b3a0c85a887a256d6939da88aabd8cd #hash值
  13. }
  14. connect_timeout #失败时连接的时间
  15. nb_get_retry #失败时检测的次数
  16. delay_before_retry #每次失败等多少秒再进行检查
  17. }
  18. }
  19. }
  1.  

其实配置就是这么简单,下面来实验来测试验证效果,在配置HA Cluster时需要注意的事项:

(1)各主机之间的时间必须一致

(2)确保集群服务不受iptables和selinux的影响

(3)各节点之间可通过

1、单实例(没用启用LVS)

(1)设置配置(master主机):

  1. [root@localhost keepalived]# cat keepalived.conf
  2. ! Configuration File for keepalived
  3. global_defs {
  4. notification_email {
  5. root@localhost
  6. }
  7. notification_email_from Alexandre.Cassen@firewall.loc
  8. smtp_server 127.0.0.1
  9. smtp_connect_timeout
  10. router_id test1
  11. vrrp_mcast_group4 224.0.24.122
  12. }
  13. vrrp_instance VI_1 {
  14. state MASTER
  15. interface eth0
  16. virtual_router_id
  17. priority
  18. advert_int
  19. authentication {
  20. auth_type PASS
  21. auth_pass
  22. }
  23. virtual_ipaddress {
  24. 192.168.200.16/ dev eth0 label eth0:
  25. }
  26. }
  1.  

(2)同时把该配置文件拷贝至BACKUP的主机上,但是要修改三个地方:router_id,state,priority

BACKUP主机的配置:

  1. [root@php ~]# cat /etc/keepalived/keepalived.conf
  2. ! Configuration File for keepalived
  3. global_defs {
  4. notification_email {
  5. root@localhost
  6. }
  7. notification_email_from Alexandre.Cassen@firewall.loc
  8. smtp_server 127.0.0.1
  9. smtp_connect_timeout
  10. router_id test2
  11. vrrp_mcast_group4 224.0.24.122
  12. }
  13. vrrp_instance VI_1 {
  14. state BACKUP
  15. interface eth1
  16. virtual_router_id
  17. priority
  18. advert_int
  19. authentication {
  20. auth_type PASS
  21. auth_pass
  22. }
  23. virtual_ipaddress {
  24. 192.168.200.16/ dev eth1 label eth1:
  25. }
  26. }
  1.  

(3)启动主机服务,IP已经设置在MASTER上,同时查看日志信息,可以清晰的看到MASTER在不断发送免费arp报文

  1. [root@localhost keepalived]# ifconfig
  2. eth0 Link encap:Ethernet HWaddr :0C::DA:A5:4C
  3. inet addr:10.1.252.36 Bcast:10.1.255.255 Mask:255.255.0.0
  4. inet6 addr: fe80::20c:29ff:feda:a54c/ Scope:Link
  5. UP BROADCAST RUNNING MULTICAST MTU: Metric:
  6. RX packets: errors: dropped: overruns: frame:
  7. TX packets: errors: dropped: overruns: carrier:
  8. collisions: txqueuelen:
  9. RX bytes: (1.5 MiB) TX bytes: (180.4 KiB)
  10. eth0: Link encap:Ethernet HWaddr :0C::DA:A5:4C
  11. inet addr:192.168.200.16 Bcast:0.0.0.0 Mask:255.255.255.0
  12. UP BROADCAST RUNNING MULTICAST MTU: Metric:
  13. lo Link encap:Local Loopback
  14. inet addr:127.0.0.1 Mask:255.0.0.0
  15. inet6 addr: ::/ Scope:Host
  16. UP LOOPBACK RUNNING MTU: Metric:
  17. RX packets: errors: dropped: overruns: frame:
  18. TX packets: errors: dropped: overruns: carrier:
  19. collisions: txqueuelen:
  20. RX bytes: (202.0 b) TX bytes: (202.0 b)
  21. [root@localhost keepalived]# tail /var/log/messages
  22. Oct :: localhost Keepalived_healthcheckers[]: Opening file '/etc/keepalived/keepalived.conf'.
  23. Oct :: localhost Keepalived_healthcheckers[]: Configuration is using : Bytes
  24. Oct :: localhost Keepalived_healthcheckers[]: Using LinkWatch kernel netlink reflector...
  25. Oct :: localhost Keepalived_vrrp[]: VRRP_Instance(VI_1) Transition to MASTER STATE
  26. Oct :: localhost Keepalived_vrrp[]: VRRP_Instance(VI_1) Received lower prio advert, forcing new election
  27. Oct :: localhost Keepalived_vrrp[]: VRRP_Instance(VI_1) Entering MASTER STATE
  28. Oct :: localhost Keepalived_vrrp[]: VRRP_Instance(VI_1) setting protocol VIPs.
  29. Oct :: localhost Keepalived_vrrp[]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.200.16
  30. Oct :: localhost Keepalived_healthcheckers[]: Netlink reflector reports IP 192.168.200.16 added
  31. Oct :: localhost Keepalived_vrrp[]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.200.16
  1.  

(4)停掉MATER主机keepalived服务,查看BACKUP主机,IP已经接管,说明keepalived已经正常工作了:

MATER:

  1. [root@localhost keepalived]# service keepalived stop
  2. Stopping keepalived: [ OK ]
  3. BACKUP
  4. [root@php ~]# ifconfig
  5. eth1 Link encap:Ethernet HWaddr :0C::DE::7F
  6. inet addr:10.1.249.30 Bcast:10.1.255.255 Mask:255.255.0.0
  7. inet6 addr: fe80::20c:29ff:fede:837f/ Scope:Link
  8. UP BROADCAST RUNNING MULTICAST MTU: Metric:
  9. RX packets: errors: dropped: overruns: frame:
  10. TX packets: errors: dropped: overruns: carrier:
  11. collisions: txqueuelen:
  12. RX bytes: (1.6 MiB) TX bytes: (147.0 KiB)
  13. eth1: Link encap:Ethernet HWaddr :0C::DE::7F
  14. inet addr:192.168.200.16 Bcast:0.0.0.0 Mask:255.255.255.0
  15. UP BROADCAST RUNNING MULTICAST MTU: Metric:
  16. lo Link encap:Local Loopback
  17. inet addr:127.0.0.1 Mask:255.0.0.0
  18. inet6 addr: ::/ Scope:Host
  19. UP LOOPBACK RUNNING MTU: Metric:
  20. RX packets: errors: dropped: overruns: frame:
  21. TX packets: errors: dropped: overruns: carrier:
  22. collisions: txqueuelen:
  23. RX bytes: (252.0 b) TX bytes: (252.0 b)
  24. [root@php ~]# !tai
  25. tail /var/log/messages
  26. Nov :: php Keepalived_vrrp[]: VRRP_Instance(VI_1) Received higher prio advert
  27. Nov :: php Keepalived_vrrp[]: VRRP_Instance(VI_1) Entering BACKUP STATE
  28. Nov :: php Keepalived_vrrp[]: VRRP_Instance(VI_1) removing protocol VIPs.
  29. Nov :: php Keepalived_healthcheckers[]: Netlink reflector reports IP 192.168.200.16 removed
  30. Nov :: php Keepalived_vrrp[]: VRRP_Instance(VI_1) Transition to MASTER STATE
  31. Nov :: php Keepalived_vrrp[]: VRRP_Instance(VI_1) Entering MASTER STATE
  32. Nov :: php Keepalived_vrrp[]: VRRP_Instance(VI_1) setting protocol VIPs.
  33. Nov :: php Keepalived_vrrp[]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth1 for 192.168.200.16
  34. Nov :: php Keepalived_healthcheckers[]: Netlink reflector reports IP 192.168.200.16 added
  35. Nov :: php Keepalived_vrrp[]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth1 for 192.168.200.16
  1.  

(5)单实例的配置就是这么简单的实现了,当然也可以不同主配置的邮件通知功能,而是使用自定义的邮件通知的shell脚本

在instance中添加自定义的邮件通知的shell脚本路径实例:

  1. vrrp_instance VI_1 {
  2. state BACKUP
  3. interface eth1
  4. virtual_router_id
  5. priority
  6. advert_int
  7. notify_master "/etc/keepalived/notify.sh master"
  8. notify_backup "/etc/keepalived/notify.sh backup"
  9. notify_fault "/etc/keepalived/notify.sh fault"
  10. authentication {
  11. auth_type PASS
  12. auth_pass
  13. }
  14. virtual_ipaddress {
  15. 192.168.200.16/ dev eth1 label eth1:
  16. }
  17. }
  18. notify.sh脚本内容如下:
  19. #!/bin/bash
  20. #
  21. contact='root@localhost'
  22. notify() {
  23. mailsubject="$(hostname) to be $1, vip floating"
  24. mailbody="$(date +'%F %T'): vrrp transition, $(hostname) changed to be $1"
  25. echo "$mailbody" | mail -s "$mailsubject" $contact
  26. }
  27. case $ in
  28. master)
  29. notify master
  30. ;;
  31. backup)
  32. notify backup
  33. ;;
  34. fault)
  35. notify fault
  36. ;;
  37. *)
  38. echo "Usage: $(basename $0) {master|backup|fault}"
  39. exit
  40. ;;
  41. esac
  1.  

双实例或多实例的配置过程大同小异,这里就不再进行演示

(6)我们知道lvs不支持都后端的调度主机进行状态检查,而keepalived弥补了这个缺陷,并且还支持传输层和应用层的检测:

  1. real_server <IPADDR> <PORT>
  2. {
  3. weight <INT>
  4. notify_up <STRING>|<QUOTED-STRING>
  5. notify_down <STRING>|<QUOTED-STRING>
  6. HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK { ... }:定义当前主机的健康状态检测方法;
  7. }
  8. HTTP_GET|SSL_GET {
  9. url {
  10. path <URL_PATH>:定义要监控的URL
  11. status_code <INT>:判断上述检测机制为健康状态的响应码;
  12. digest <STRING>:判断上述检测机制为健康状态的响应的内容的校验码;
  13. }
  14. nb_get_retry <INT>:重试次数;
  15. delay_before_retry <INT>:重试之前的延迟时长;
  16. connect_ip <IP ADDRESS>:向当前RS的哪个IP地址发起健康状态检测请求
  17. connect_port <PORT>:向当前RS的哪个PORT发起健康状态检测请求
  18. bindto <IP ADDRESS>:发出健康状态检测请求时使用的源地址;
  19. bind_port <PORT>:发出健康状态检测请求时使用的源端口;
  20. connect_timeout <INTEGER>:连接请求的超时时长;
  21. }
  22. TCP_CHECK {
  23. connect_ip <IP ADDRESS>:向当前RS的哪个IP地址发起健康状态检测请求
  24. connect_port <PORT>:向当前RS的哪个PORT发起健康状态检测请求
  25. bindto <IP ADDRESS>:发出健康状态检测请求时使用的源地址;
  26. bind_port <PORT>:发出健康状态检测请求时使用的源端口;
  27. connect_timeout <INTEGER>:连接请求的超时时长;
  28. }
  1.  

(7)此外keepalived还支持调用外部分辅助脚本,完成资源监控,并根据监控的结果状态来实现优先动态调整;

用法:

  1. vrrp_script:定义一个资源监控脚本;
  2.  
  3. vrrp_script <STRING> {
  4.  
  5. script ""
  6.  
  7. interval INT
  8.  
  9. weight -INT
  10.  
  11. }
  12.  
  13. track_script:调用定义的资源监控脚本;
  14.  
  15. track_script {
  16.  
  17. SCRIPT_NAME
  18.  
  19. }
  20.  
  21. 示例:
  22.  
  23. ! Configuration File for keepalived
  24. global_defs {
  25. notification_email {
  26. root@localhost
  27. }
  28. notification_email_from keepalived@localhost
  29. smtp_server 127.0.0.1
  30. smtp_connect_timeout
  31. router_id node1
  32. vrrp_mcast_group4 224.0.100.18
  33. }
  34. vrrp_script chk_down { #如果/etc/keepalived/down文件存在,优先级-
  35. script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0"
  36. interval
  37. weight -
  38. }
  39. vrrp_script chk_httpd {#如果httpd服务进程失效,优先级-
  40. script "killall -0 httpd && exit 0 || exit 1"
  41. interval
  42. weight -
  43. }
  44. vrrp_instance VI_1 {
  45. state MASTER
  46. interface eno16777736
  47. virtual_router_id
  48. priority
  49. advert_int
  50. authentication {
  51. auth_type PASS
  52. auth_pass
  53. }
  54. virtual_ipaddress {
  55. 172.16.100.71/ dev eno16777736
  56. }
  57. track_script { #调用脚本
  58. chk_down
  59. chk_httpd
  60. }
  61. notify_master "/etc/keepalived/notify.sh master"
  62. notify_backup "/etc/keepalived/notify.sh backup"
  63. notify_fault "/etc/keepalived/notify.sh fault"
  64. }

keepalived的原理以及配置使用详解的更多相关文章

  1. Android辅助功能原理与基本使用详解-AccessibilityService

    辅助功能原理与基本使用详解 本文主要介绍辅助功能的使用 辅助功能基本原理 辅助功能基本配置和框架搭建 辅助功能实战解析 辅助功能基本原理   辅助功能(AccessibilityService)其实是 ...

  2. Linux LVM逻辑卷配置过程详解(创建,增加,减少,删除,卸载)

    Linux LVM逻辑卷配置过程详解 许多Linux使用者安装操作系统时都会遇到这样的困境:如何精确评估和分配各个硬盘分区的容量,如果当初评估不准确,一旦系统分区不够用时可能不得不备份.删除相关数据, ...

  3. Vue实例初始化的选项配置对象详解

    Vue实例初始化的选项配置对象详解 1. Vue实例的的data对象 介绍 Vue的实例的数据对象data 我们已经用了很多了,数据绑定离不开data里面的数据.也是Vue的核心属性. 它是Vue绑定 ...

  4. [转帖]keepalived工作原理和配置、使用

    keepalived工作原理和配置.使用 https://www.iteye.com/blog/aoyouzi-2288124 keepalived是什么 keepalived是集群管理中保证集群高可 ...

  5. ASP.NET Core的配置(2):配置模型详解

    在上面一章我们以实例演示的方式介绍了几种读取配置的几种方式,其中涉及到三个重要的对象,它们分别是承载结构化配置信息的Configuration,提供原始配置源数据的ConfigurationProvi ...

  6. mha配置参数详解

    mha配置参数详解: 参数名字 是否必须 参数作用域 默认值 示例 hostname Yes Local Only - hostname=mysql_server1, hostname=192.168 ...

  7. Cocos2d-x win7 + vs2010 配置图文详解

    Cocos2d-x win7 + vs2010 配置图文详解 下载最新版的cocos2d-x.打开浏览器,输入cocos2d-x.org,然后选择Download,本教程写作时最新版本为cocos2d ...

  8. CentOS7下Firewall防火墙配置用法详解

    官方文档地址: https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/Security_Guide ...

  9. Python安装、配置图文详解(转载)

    Python安装.配置图文详解 目录: 一. Python简介 二. 安装python 1. 在windows下安装 2. 在Linux下安装 三. 在windows下配置python集成开发环境(I ...

随机推荐

  1. OAuth2.0标准类库汇总

    转载官网: https://oauth.net/code/ https://www.w3cschool.cn/oauth2/5ghz1jab.html 服务端类库 .NET .NET DotNetOp ...

  2. 使用openbabel进行小分子底物构象搜索

    使用open babel产生小分子多重构象的方法有两种: 1. 使用遗传算法(Genetic algorithm)进行构象搜索,属于系统式搜索最低能量构象的方法 obabel -L conformer ...

  3. iOS UI基础-9.0 UITableView基础

    在iOS中,要实现表格数据展示,最常用的做法就是使用UITableView.UITableView继承自UIScrollView,因此支持垂直滚动,而且性能极佳. UITableView有两种样式: ...

  4. JAVA编程思想学习笔记4-chap10-12-斗之气4段

    1.内部类:Iterator 2..this生成对外部类的引用 3..new:通过外部类对象创建内部类对象 package com.chengjie; public class TestInnerCl ...

  5. 用int还是用Integer?

    昨天例行code review时大家有讨论到int和Integer的比较和使用. 这里做个整理,发表一下个人的看法.   [int和Integer的区别] int是java提供的8种原始类型之一,ja ...

  6. 笔记 : win8系统中的VM虚拟机的Ubuntu搭建samba服务

    1. 环境准备 (此处使用root超级管理员帐户,执行命令时不用加sudo, 普通帐户需要前面加sudo):  (1)安装好Ubutun虚拟系统后,Ubuntu 的软件源配置文件是 /etc/apt/ ...

  7. 点击地面时,若鼠标点击的偶数次使得Cube向点击点移动,并且点击奇数次Cube变色

    using System.Collections; using System.Collections.Generic; using UnityEngine; public class ray10 : ...

  8. C# 去重处理字符大小写

    本文展示了如何对集合去重并且处理大小写

  9. 配置hdfs之后发现9000端口未被监听[玄学]

    1. 按照apache的官网的文档配置hdfs 2. 在 core-site.xml 中配置了 fs.defaultFS 的值为 hdfs://0.0.0.0:9000 3. 执行 start-dfs ...

  10. linux设置时间显示格式和系统版本

    [修改显示日期格式] vim /etc/bashrc alias ll='ls -l --time-style="+%Y-%m-%d %H:%M:%S"' alias date=' ...