• zabbix--3.0--3


     
    使用JMX监控jvm
     
    vim /usr/local/tomcat/bin/catalina.sh
    添加如下内容
    CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote
      -Dcom.sun.management.jmxremote.port=8888
      -Dcom.sun.management.jmxremote.ssl=false
      -Dcom.sun.management.jmxremote.authenticate=false
      -Djava.rmi.server.hostname=192.168.58.12"
    

    重启tomcat,查看监听情况
     
    [root@linux-node2 src]# killall java
    [root@linux-node2 src]# killall java
    java: no process found
    [root@linux-node2 src]# /usr/local/tomcat/bin/startup.sh 
    Using CATALINA_BASE:   /usr/local/tomcat
    Using CATALINA_HOME:   /usr/local/tomcat
    Using CATALINA_TMPDIR: /usr/local/tomcat/temp
    Using JRE_HOME:        /usr
    Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
    Tomcat started.
    
    看到8888端口已经起来了
    [root@linux-node2 src]# netstat -lntp 
    Active Internet connections (only servers)
    Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
    tcp        0      0 0.0.0.0:10050           0.0.0.0:*               LISTEN      6938/zabbix_agentd  
    tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      1/systemd           
    tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1160/sshd           
    tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1251/master         
    tcp6       0      0 :::10050                :::*                    LISTEN      6938/zabbix_agentd  
    tcp6       0      0 127.0.0.1:8005          :::*                    LISTEN      8522/java           
    tcp6       0      0 :::56614                :::*                    LISTEN      8522/java           
    tcp6       0      0 :::8009                 :::*                    LISTEN      8522/java           
    tcp6       0      0 :::111                  :::*                    LISTEN      1/systemd           
    tcp6       0      0 :::8080                 :::*                    LISTEN      8522/java           
    tcp6       0      0 :::22                   :::*                    LISTEN      1160/sshd           
    tcp6       0      0 :::8888                 :::*                    LISTEN      8522/java           
    tcp6       0      0 :::57945                :::*                    LISTEN      8522/java           
    tcp6       0      0 ::1:25                  :::*                    LISTEN      1251/master         
    [root@linux-node2 src]# 
    

      

     
    在电脑的jdk的bin目录下,找到jconsole
     
     
     
     
     
     
     
     
     
     
    点击update
     
    JMX的key可以在server上使用zabbix-get获取下
     
     
    [root@linux-node1 ~]# zabbix_get -s 192.168.58.12 -k  jmx["java.lang:type=GarbageCollector,name=Copy",CollectionCount]
    ZBX_NOTSUPPORTED: Unsupported item key.
    [root@linux-node1 ~]# 
    

      

     
    不知道为什么,开启debug看看
    debug是4
    [root@linux-node2 src]# vim /etc/zabbix/zabbix_agentd.conf
    这里需要改成4
     
    重启agent
    systemctl restart zabbix-agent.service
     
    看agent日志
    tail -f /var/log/zabbix/zabbix_agentd.log
    显示的并没太多有用信息
     先放这里
     
     
     
     
     
    zabbix监控Nginx
    监控过程如下

    1、开启Nginx监控
    2、编写脚本来进行数据采集
    3、设置用户自定义参数
    4、重启zabbix-agent
    5、添加item
    6、创建图形
    7、创建触发器
    8、创建模板

     
     
    下载这个脚本
    它不仅可以监控nginx,还可以监控memcached,redis,http状态
     
    tcp链接比较多的情况下,ss命令比netstat快
     脚本里面的命令
    [root@linux-node2 src]# ss -ant | awk 'NR>1 {++s[$1]} END {for(k in s) print k,s[k]}'
    LISTEN 14
    ESTAB 4
    TIME-WAIT 30
    [root@linux-node2 src]# 
    

    因为上面只显示当前的有数据的,所以下面多了个判断,没数据的项都显示0
    把这个函数的第一个参数复制给tcp_stat
    这个函数的第一个参数根据下面main里看到,是这个脚本的第二个参数
     
    考虑到一个机器可能起多个nginx,所以加个端口参数区分
    memcached的脚本这里的$1 和$2 分别是脚本的$2 和 $3
    nc其实是net cat
     
     
    修改zabbix-agent配置文件,让其包含.conf文件
    [root@linux-node1 ~]# vim /etc/zabbix/zabbix_agentd.conf
    
    原本下面文件包含这个目录下的所有文件,改一下,改成*.conf
     
     
    这样的话,sh脚本也可以放这个目录下了,然后不会被误认为配置文件而加载
    [root@linux-node1 ~]# cd /etc/zabbix/zabbix_agentd.d/
    [root@linux-node1 zabbix_agentd.d]# ls
    nginx.conf  userparameter_mysql.conf
    [root@linux-node1 zabbix_agentd.d]# rz -E
    rz waiting to receive.
    [root@linux-node1 zabbix_agentd.d]# ls
    nginx.conf  userparameter_mysql.conf  zabbix_linux_plugin.sh
    [root@linux-node1 zabbix_agentd.d]# chmod +x zabbix_linux_plugin.sh 
    [root@linux-node1 zabbix_agentd.d]# ls
    nginx.conf  userparameter_mysql.conf  zabbix_linux_plugin.sh
    [root@linux-node1 zabbix_agentd.d]# 
    
    改成下划线,对应监控脚本内容
    [root@linux-node1 ~]# vim /usr/local/nginx/conf/nginx.conf
    [root@linux-node1 ~]# /usr/local/nginx/sbin/nginx -s reload
    [root@linux-node1 ~]# 
    
    因为脚本里写的就是下划线,要对应上
    这里也可以更改,因为agent和nginx在一台机器上

    [root@linux-node1 ~]# /usr/local/nginx/sbin/nginx -s reload
    [root@linux-node1 ~]# 
    
    通过命令简单获取成功
    [root@linux-node1 zabbix_agentd.d]# ./zabbix_linux_plugin.sh nginx_status 8080 active
    1
    [root@linux-node1 zabbix_agentd.d]# 
    
    新建自定义key文件,调用这个脚本
    [root@linux-node1 zabbix_agentd.d]# cp nginx.conf linux.conf
    [root@linux-node1 zabbix_agentd.d]# vim linux.conf 
    [root@linux-node1 zabbix_agentd.d]# cat linux.conf 
    UserParameter=linux_status[*],/etc/zabbix/zabbix_agentd.d/zabbix_linux_plugin.sh "$1" "$2" "$3"
    [root@linux-node1 zabbix_agentd.d]# 
    
    重启agent
    [root@linux-node1 zabbix_agentd.d]# systemctl restart zabbix-agent.service 
    [root@linux-node1 zabbix_agentd.d]# 
    
    这个脚本支持传参
    [root@linux-node1 ~]# zabbix_get -s 192.168.58.11 -k linux_status[nginx_status,8080,active]
    1
    [root@linux-node1 ~]# 
    
    zabbix_get成功,这样可以添加到web上了
    配置---模板---创建模板

    add之后,在模板里找到它,然后点进去,看到items等
    创建item
     
    更新间隔,30秒太频繁了,可以改成60秒一次,顺便创建一个叫Nginx Status的application
     
    点击add,添加成功
     
    点进去,克隆它
     
    把这几个都加上去

     
     
    依次,克隆加进去
     
    心得。我觉得可以把一些重要的模板克隆了,防止误操作,在模板上改东西
     
    加图形
     
     
    items选这4个就行了
     
     
     
    给linux-node1加这个模板
    可以导出这个模板给别人
     
    导出的模板需要自己改名,导出来默认都是同一个名字
     
     
     
    graph有数据了
     
     
     监控tcp的11种状态
     
     
    tcp 11种状态的模板
     
     
     
    node1加这个模板
     
    node2也加此模板
     
    它用的还是上面nginx那个脚本
    zabbix用户要能执行它,真正执行它的时候是zabbix执行
    [root@linux-node1 zabbix_agentd.d]# pwd
    /etc/zabbix/zabbix_agentd.d
    [root@linux-node1 zabbix_agentd.d]# ll
    total 16
    -rw-r--r-- 1 root root   96 Mar 26 15:22 linux.conf
    -rw-r--r-- 1 root root  117 Mar 19 20:37 nginx.conf
    -rw-r--r-- 1 root root 1531 Mar  2 23:49 userparameter_mysql.conf
    -rwxr-xr-x 1 root root 2776 Jun 18  2016 zabbix_linux_plugin.sh
    [root@linux-node1 zabbix_agentd.d]# 
    

      

     
     
    练习怎么加触发器
    先给nginx监控加触发器
     
    这里大于1,出于测试目的

    找到刚才创建的Nginx status
    打开页面,模拟问题。让连接数大于1
    自动发送了邮件告警
     

    邮件配置对的话,肯定能收到告警
    这里还看到了一个告警,Too many processes on linux-node2
    系统自带的触发器,阈值太低,修改下模板里的items里的阀值

    默认5分钟的平均值大于300就告警,改成600
     
    改成600
     
     
     
     
    Zabbix告警通知

    自定义告警脚本:
    1、放在 /usr/lib/zabbix/alertscripts
    2、需要支持3个参数,1 收件人,2 主题, 3内容
    3、执行权限
    4、web界面添加
    5、修改actions

     
    短信通道,阿里大鱼,一条0.045左右
     
    它有http的api。很方便
    curl -X POST 'http://gw.api.taobao.com/router/rest' 
    -H 'Content-Type:application/x-www-form-urlencoded;charset=utf-8' 
    -d 'app_key=12129701' 
    -d 'format=json' 
    -d 'method=alibaba.aliqin.fc.sms.num.send' 
    -d 'partner_id=apidoc' 
    -d 'sign=DB9F439ACCF950E94514CDF0BF24DFB8' 
    -d 'sign_method=hmac' 
    -d 'timestamp=2017-03-26+16%3A25%3A33' 
    -d 'v=2.0' 
    -d 'extend=123456' 
    -d 'rec_num=13000000000' 
    -d 'sms_free_sign_name=%E9%98%BF%E9%87%8C%E5%A4%A7%E4%BA%8E' 
    -d 'sms_param=%7B%5C%22code%5C%22%3A%5C%221234%5C%22%2C%5C%22product%5C%22%3A%5C%22alidayu%5C%22%7D' 
    -d 'sms_template_code=SMS_585014' 
    -d 'sms_type=normal'
    

      

     
    亿美软通短信平台比较古老了。现在很少用
    模拟下自己写的脚本发告警流程
    脚本放在下面目录下/usr/lib/zabbix/alertscripts
     
    [root@linux-node1 ~]# cd /usr/lib/zabbix/alertscripts
    [root@linux-node1 alertscripts]# ls
    [root@linux-node1 alertscripts]# vim sms.sh
    [root@linux-node1 alertscripts]# chmod +x sms.sh 
    [root@linux-node1 alertscripts]# cat sms.sh 
    #!/bin/bash
    ALERT_TO=$1
    ALERT_TITLE=$2
    ALERT_BODY=$3
    
    echo $ALERT_TO >> /tmp/sms.log
    echo $ALERT_TITLE >> /tmp/sms.log
    echo $ALERT_BODY >> /tmp/sms.log
    [root@linux-node1 alertscripts]# 
    

      

     
    创建新的告警介质
    脚本需要加参数,从脚本里取,用大括号括起来,这3个参数分别是$1,$2,$3
     
     
     
     
    改action
     
     
    用户这里
     
     
    触发报警
     
     
     
     
    模拟发送成功,实际自己写的脚本就该这么个架构
    [root@linux-node1 tmp]# tail -5 /tmp/sms.log 
    xxxx38@qq.com
    PROBLEM: Nginx Active > 1
     Original ev* (*UNKNOWN*:*UNKNOWN*): *UNKNOWN*tus[nginx_status,8080,active]): 3
    [root@linux-node1 tmp]# 
    

      

     
     
     
    Zabbix监控MySQL
    zabbix自带监控mysql的脚本,真正生产喜欢用的是percona的脚本
    percona也有自己的mysql,在某些方面它比官方的性能更好
    下面链接
     
     
     
    最早是由cacti改的,由于zabbix太火了。没支持zabbix的不行了,就要被淘汰。
    它使用php脚本连接mysql
    要监控mysql的话,agent端必须安装php和phpmysql
     
     
     
     
     
    yum install http://www.percona.com/downloads/percona-release/redhat/0.1-4/percona-release-0.1-4.noarch.rpm  -y
    
    [root@linux-node1 ~]# yum install percona-zabbix-templates php php-mysql -y
    Loaded plugins: fastestmirror
    Loading mirror speeds from cached hostfile
     * base: mirrors.aliyun.com
     * epel: mirror01.idc.hinet.net
     * extras: mirrors.aliyun.com
     * updates: mirrors.aliyun.com
    Package percona-zabbix-templates-1.1.7-2.noarch already installed and latest version
    Package php-5.4.16-42.el7.x86_64 already installed and latest version
    Package php-mysql-5.4.16-42.el7.x86_64 already installed and latest version
    Nothing to do
    [root@linux-node1 ~]# 
    

      

     

    相关知识点
    1、php脚本用来采集数据
    2、shell调用这个php
    3、zabbix配置文件
    4、zabbix模板文件

     
    拷贝模板配置文件到zabbix配置文件目录下
    [root@linux-node1 ~]# rpm -ql percona-zabbix-templates
    /var/lib/zabbix/percona
    /var/lib/zabbix/percona/scripts
    /var/lib/zabbix/percona/scripts/get_mysql_stats_wrapper.sh
    /var/lib/zabbix/percona/scripts/ss_get_mysql_stats.php
    /var/lib/zabbix/percona/templates
    /var/lib/zabbix/percona/templates/userparameter_percona_mysql.conf
    /var/lib/zabbix/percona/templates/zabbix_agent_template_percona_mysql_server_ht_2.0.9-sver1.1.7.xml
    [root@linux-node1 ~]# cp /var/lib/zabbix/percona/templates/userparameter_percona_mysql.conf /etc/zabbix/zabbix_agentd.d/
    [root@linux-node1 ~]# 
    

      

     
    查看
    [root@linux-node1 ~]# cd /etc/zabbix/zabbix_agentd.d/
    [root@linux-node1 zabbix_agentd.d]# ls
    linux.conf  userparameter_mysql.conf          zabbix_linux_plugin.sh
    nginx.conf  userparameter_percona_mysql.conf
    [root@linux-node1 zabbix_agentd.d]# 
    

      

    重启zabbix-agent
    [root@linux-node1 scripts]# systemctl restart zabbix-agent.service 
    [root@linux-node1 scripts]# 
    

      

     
    这个shell脚本是调用php脚本
    这个配置文件需要拷贝到agent下面
    这个模板文件用于导出zabbix server
     
    percona自带的模板不能用。
     
     
    查看此配置文件,都是一些自定义的key,key的值通过脚本获取
    [root@linux-node1 zabbix_agentd.d]# tail -10 userparameter_percona_mysql.conf 
    UserParameter=MySQL.log-writes,/var/lib/zabbix/percona/scripts/get_mysql_stats_wrapper.sh hg
    UserParameter=MySQL.Query-time-count-04,/var/lib/zabbix/percona/scripts/get_mysql_stats_wrapper.sh op
    UserParameter=MySQL.Query-time-count-05,/var/lib/zabbix/percona/scripts/get_mysql_stats_wrapper.sh oq
    UserParameter=MySQL.Query-time-count-06,/var/lib/zabbix/percona/scripts/get_mysql_stats_wrapper.sh or
    UserParameter=MySQL.Query-time-count-07,/var/lib/zabbix/percona/scripts/get_mysql_stats_wrapper.sh os
    UserParameter=MySQL.Query-time-count-08,/var/lib/zabbix/percona/scripts/get_mysql_stats_wrapper.sh ot
    UserParameter=MySQL.Query-time-count-09,/var/lib/zabbix/percona/scripts/get_mysql_stats_wrapper.sh ou
    UserParameter=MySQL.Open-files,/var/lib/zabbix/percona/scripts/get_mysql_stats_wrapper.sh ij
    UserParameter=MySQL.State-closing-tables,/var/lib/zabbix/percona/scripts/get_mysql_stats_wrapper.sh lq
    UserParameter=MySQL.running-slave,/var/lib/zabbix/percona/scripts/get_mysql_stats_wrapper.sh running-slave
    [root@linux-node1 zabbix_agentd.d]# 
    

      

     
    通过下面脚本获取key的value
     
    [root@linux-node1 zabbix_agentd.d]# cd /var/lib/zabbix/percona/scripts
    [root@linux-node1 scripts]# ls
    get_mysql_stats_wrapper.sh  ss_get_mysql_stats.php
    [root@linux-node1 scripts]# 
    

      

    创建连接mysql的配置文件,由于root密码是空。所以这里也写的空
    [root@linux-node1 scripts]# cat ss_get_mysql_stats.php.cnf 
    <?php
    $mysql_user = 'root';
    $mysql_pass = '';
    [root@linux-node1 scripts]# 
    [root@linux-node1 scripts]# mysql
    Welcome to the MariaDB monitor.  Commands end with ; or g.
    Your MariaDB connection id is 9629
    Server version: 5.5.52-MariaDB MariaDB Server
    
    Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others.
    
    Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.
    
    MariaDB [(none)]> exit
    Bye
    [root@linux-node1 scripts]# 
    

      

     
    测试下此目录下脚本执行是否正常
    [root@linux-node1 scripts]# /var/lib/zabbix/percona/scripts/get_mysql_stats_wrapper.sh gg
    0
    [root@linux-node1 scripts]# 
    

      

    注意此脚本默认配置。如果不符合需要更改。这里由于mysql是yum安装的,环境变量没问题,另外授权登录也是localhost
    [root@linux-node1 scripts]# ll get_mysql_stats_wrapper.sh 
    -rwxr-xr-x 1 root root 1251 Dec 10 02:22 get_mysql_stats_wrapper.sh
    [root@linux-node1 scripts]# 
    

      

    这是监控脚本默认的地方,一些东西需要改,比如mysql全路径
    默认是localhost权限
     
    给node1添加模板
     
    脚本没问题,加入监控监控没问题
    脚本调用了php
    [root@linux-node1 scripts]# ./get_mysql_stats_wrapper.sh gm
    1
    [root@linux-node1 scripts]# 
    

      

     
     
     
    Zabbix-Web监控
     
    现在zabbix-get报错,因为原先是root权限执行的脚本,它会在tmp目录下生成下面文件。
    [root@linux-node1 scripts]# zabbix_get -s 192.168.58.11 -k MySQL.max-connections
    rm: cannot remove ‘/tmp/localhost-mysql_cacti_stats.txt’: Operation not permitted
    151
    [root@linux-node1 scripts]# 
    

      

    重新授权下
    [root@linux-node1 scripts]# ll /tmp/localhost-mysql_cacti_stats.txt 
    -rw-r--r-- 1 root root 1406 Mar 26 22:15 /tmp/localhost-mysql_cacti_stats.txt
    [root@linux-node1 scripts]# chown zabbix.zabbix /tmp/localhost-mysql_cacti_stats.txt
    [root@linux-node1 scripts]# ll /tmp/localhost-mysql_cacti_stats.txt 
    -rw-r--r-- 1 zabbix zabbix 1406 Mar 26 22:15 /tmp/localhost-mysql_cacti_stats.txt
    [root@linux-node1 scripts]# zabbix_get -s 192.168.58.11 -k MySQL.max-connections
    151
    [root@linux-node1 scripts]# 
    

      

     
     
     
    [root@linux-node1 ~]# curl --head http://192.168.58.12:8080/
    HTTP/1.1 200 OK
    Server: Apache-Coyote/1.1
    Content-Type: text/html;charset=UTF-8
    Transfer-Encoding: chunked
    Date: Sun, 26 Mar 2017 15:14:17 GMT
    
    [root@linux-node1 ~]# 
    

      

     
     
     
     
    它不依赖于agent,是server自己的
    创建一个web场景
     
     
     
    agent这里你可以选择一个浏览器
    以前也有浏览器,但是没3.0这么全
    默认使用agent了
     
    步骤这里
     
     
    add
    add之后
     
     
     
    认证相关
     
    认证不配置,点击add即可
     
     
     
    add之后
    系统默认没加触发器
     
     
     
    monitor---web看到如下
     
     
    这个step的里面下面的作用是,从它会默认从监控的页面里找匹配的字符串,匹配到了它返回OK
    假如你不想仅仅看状态的话,
    假如你还想看页面关键字
     
     
    开始手动加触发器,所以最好写个模板
     
     
    添加表达式
     
     
     
     
     
     
     
     
    停止tomcat主动触发告警,测试
     
    [root@linux-node2 ~]# /usr/local/tomcat/bin/shutdown.sh 
    Using CATALINA_BASE:   /usr/local/tomcat
    Using CATALINA_HOME:   /usr/local/tomcat
    Using CATALINA_TMPDIR: /usr/local/tomcat/temp
    Using JRE_HOME:        /usr
    Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
    [root@linux-node2 ~]# lsof -i:8080
    [root@linux-node2 ~]# 
    

      


    服务器时间不对,导致报警没显示
     
     
     
    [root@linux-node1 ~]# date
    Mon Mar 27 08:45:34 CST 2017
    [root@linux-node1 ~]# systemctl restart ntpd
    [root@linux-node1 ~]# date
    Mon Mar 27 08:45:46 CST 2017
    [root@linux-node1 ~]# date
    Mon Mar 27 08:45:47 CST 2017
    [root@linux-node1 ~]# date
    Mon Mar 27 08:45:48 CST 2017
    [root@linux-node1 ~]# date
    Wed Mar 29 23:10:17 CST 2017
    [root@linux-node1 ~]# 
    

      

     
     
    时间对了之后,再次刷新就显示了
     
    发送告警也OK
     
     
    这是现网用的action告警信息。删了很多
    保证70个字符以内
     
     
    状态:{TRIGGER.STATUS}
    主机: ({HOST.NAME1}
    监控项:{ITEM.KEY1}):{ITEM.VALUE1}
     
     
     
     
    模拟故障测试方法2,模拟404故障
    [root@linux-node2 webapps]# mv ROOT ROOT2
    [root@linux-node2 webapps]# ls
    docs  examples  host-manager  manager  ROOT2
    [root@linux-node2 webapps]# mv ROOT2 ROOT
    [root@linux-node2 webapps]# 
    

      

     
    告警很快下面这里告警比上面关闭tomcat导致端口不可达的告警快很多。模拟404这种发现问题立马告警
     
     
    [root@linux-node1 ~]# tail -f /tmp/sms.log 
     Original ev* (*UNKNOWN*:*UNKNOWN*): *UNKNOWN*e=Runtime",Uptime]): 00:00:09
    525031638@qq.com
    PROBLEM: linux-node2 is not reachable
     Original ev* (*UNKNOWN*:*UNKNOWN*): *UNKNOWN*e=Runtime",Uptime]): 00:00:25
    525031638@qq.com
    状态:OK
     监控项:jmx["java.lang:type=Runtime",Uptime]):00:00:5
    525031638@qq.com
    状态:PROBLEM
     监控项:web.test.rspcode[tomcat web monitor,tomcat index]):40
    

      

     
     
    关于web监控的密码验证,可以post过去用户名和密码
     
     
     
     
     
    打印机没纸都可以监控,通过snmp
     
     
     
     
    Zabbix监控模式
     
    怎么看zabbix server能不能抗住,看队列就行了,看看item更新超时时间
     
     
     

    为什么使用主动模式
    1、监控主机多,性能跟不上,延迟大
    2、多机房,防火墙

    Zabbix轻松解决。Nagios不太好解决
    针对Agent来说
    1、被动模式
    2、主动模式,active

    当监控主机超过300+,建议使用主动模式

     
     
    改成主动模式,这里改成需要0
     
     
    如果你不设置主机名,它会根据item获取
    日志模式设置的地方。
    [root@linux-node2 webapps]# systemctl restart zabbix-agent.service 
    [root@linux-node2 webapps]# 
    

      

    网页制作主动监控模式模板

     
     
     
     
     
     
     
     link的模板去掉。link主动监控的模板
     
     
     
     
     
     
     

    add之后

     
     
     
     
     
     

    这里都变成active的了

     
     
     
     
     更改items为主动模式
     
     
     
     
     
     
     
     
     
     key的类型都变成active的了
     
     
     修改node2的模板为主动模式模板
     
     
     
     
     它的状态
     
     
     
     数据获取成功
     
  • 相关阅读:
    string类的方法
    引用
    面向对象之多态性(基类引用可以指向子类)
    SQL Server、Oracle数据库排序空值null问题解决办法(转)
    远程计算机已结束连接解决方法
    GUID自增ID表关联比较
    第四种行转列
    SQL简体转繁体互换(常用汉字词组)
    CSS基本布局16例
    Dojo Javascript 编程规范
  • 原文地址:https://www.cnblogs.com/nmap/p/6648697.html
Copyright © 2020-2023  润新知