实验环境

RabbitMQ 集群

server1.example.com    IP: 10.10.10.11    Node: disk
server2.example.com    IP: 10.10.10.12    Node: disk
server3.example.com    IP: 10.10.10.13    Node: disk

RabbitMQ相关端口

 (epmd),  (Erlang distribution)
, (AMQP -- without and with TLS)
(if management plugin is enabled)
, (if STOMP is enabled)
, (if MQTT is enabled)

YUM方式

添加EPEL源

# rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

添加Erlang源

# yum install wget
# rpm -Uvh http://packages.erlang-solutions.com/erlang-solutions-1.0-1.noarch.rpm

安装RabbitMQ

# wget http://www.rabbitmq.com/releases/rabbitmq-server/v3.6.1/rabbitmq-server-3.6.1-1.noarch.rpm
# rpm --import https://www.rabbitmq.com/rabbitmq-signing-key-public.asc
# yum install rabbitmq-server-3.6.-.noarch.rpm

手动RPM方式

安装RabbitMQ

# wget http://www.rabbitmq.com/releases/erlang/erlang-18.3-1.el7.centos.x86_64.rpm
# wget http://www.rabbitmq.com/releases/rabbitmq-server/v3.6.1/rabbitmq-server-3.6.1-1.noarch.rpm
# wget https://www.rabbitmq.com/rabbitmq-signing-key-public.asc
# rpm --import rabbitmq-signing-key-public.asc
# rpm -Uvh erlang-18.3-.el7.centos.x86_64.rpm rabbitmq-server-3.6.-.noarch.rpm

注: 如果是RedHat6,erlang下载地址为 http://www.rabbitmq.com/releases/erlang/erlang-18.3-1.el6.x86_64.rpm

RabbitMQ单机配置

  • 调整可打开文件/文件描述符数目(高并发支持)

调整系统限制

# vi /etc/sysctl.conf

fs.file-max = 

使设置生效

# sysctl -p

查看系统限制

# sysctl fs.file-max

调整用户限制

# vi /etc/security/limits.conf

*              soft     nofile
* hard nofile

重启系统使之生效,检查用户限制是否生效

# ulimit -n
  • 添加/etc/hosts条目

# echo "192.168.136.201   server1" >> /etc/hosts
  • 开通防火墙上Web UI访问端口(默认:15672/tcp)

# firewall-cmd --permanent --add-port=/tcp
# firewall-cmd –-reload
  • 设置RabbitMQ服务自启动,并启动RabbbitMQ服务

# chkconfig rabbitmq-server on
# service rabbitmq-server start
  • 启用RabbitMQ监控插件

# rabbitmq-plugins enable rabbitmq_management

  • RabbitMQ用户管理

添加用户(用户名root,密码admin)

# rabbitmqctl add_user admin admin

设置用户角色(设置admin用户为管理员角色)

# rabbitmqctl set_user_tags admin administrator

设置用户权限(设置admin用户配置、写、读的权限)

# rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"

删除用户(删除guest用户)

# rabbitmqctl delete_user guest

注意:rabbitmq从3.3.0开始禁止使用guest/guest权限通过除localhost外的访问。

如果想使用guest/guest通过远程机器访问,需要在rabbitmq配置文件中(/etc/rabbitmq/rabbitmq.config)中设置loopback_users为[]。

[{rabbit, [{loopback_users, []}]}].
  • 登陆Web UI

在浏览器中打开http://10.10.10.11:15672

输入用户名、密码,登陆成功后的界面

  • 检查RabbitMQ状态

查看进程:

# ps aux | grep -v grep | grep rabbitmq-server

查看端口:

# netstat -tnlp | grep 

如果提示netstat命令没找到,请先安装net-tools

# yum install net-tools

查看RabbitMQ状态:

# rabbitmqctl status
  • RabbitMQ默认配置

# cat /usr/lib/rabbitmq/lib/rabbitmq_server-3.6.1/sbin/rabbitmq-defaults

### next line potentially updated in package install steps
SYS_PREFIX= ### next line will be updated when generating a standalone release
ERL_DIR= CLEAN_BOOT_FILE=start_clean
SASL_BOOT_FILE=start_sasl ## Set default values BOOT_MODULE="rabbit" CONFIG_FILE=${SYS_PREFIX}/etc/rabbitmq/rabbitmq
LOG_BASE=${SYS_PREFIX}/var/log/rabbitmq
MNESIA_BASE=${SYS_PREFIX}/var/lib/rabbitmq/mnesia
ENABLED_PLUGINS_FILE=${SYS_PREFIX}/etc/rabbitmq/enabled_plugins PLUGINS_DIR="${RABBITMQ_HOME}/plugins"
IO_THREAD_POOL_SIZE= CONF_ENV_FILE=${SYS_PREFIX}/etc/rabbitmq/rabbitmq-env.conf

从上面看出:

- 系统prefix是空
- 配置文件路径是 /etc/rabbitmq/rabbitmq.config    (erlang会自动加上.config后缀)
- 环境配置文件是 /etc/rabbitmq/rabbitmq-env.conf
- 日志文件目录是 /var/log/rabbitmq
- 插件文件目录是 安装目录下的plugins,这里RPM安装方式下是 /usr/lib/rabbitmq/lib/rabbitmq_server-3.6.1/plugins

RabbitMQ集群配置

集群配置在单机配置完成的基础上进行

  • 添加/etc/hosts条目

在server1、server2、server3里的/etc/hosts文件中分别添加:

10.10.10.11   server1
10.10.10.12 server2
10.10.10.13 server3
  • 设置每个节点Cookie

Rabbitmq的集群是依赖于erlang的集群来工作的,所以必须先构建起erlang的集群环境。Erlang的集群中各节点是通过一个magic cookie来实现的,这个cookie存放在 /var/lib/rabbitmq/.erlang.cookie 中,文件是400的权限。所以必须保证各节点cookie保持一致,否则节点之间就无法通信

# chmod  /var/lib/rabbitmq/.erlang.cookie
# echo -n "AZVOCZYZZBVFLBPTBXU" > /var/lib/rabbitmq/.erlang.cookie
# chmod /var/lib/rabbitmq/.erlang.cookie

建议在RabbitMQ服务启动前修改过cookie,如果RabbitMQ服务已经启动,修改cookie值后,必须重启RabbitMQ服务,这步很关键

# ps -ef | grep ^rabbitmq | awk '{print $2}' | xargs kill -
# service rabbitmq-server start
  • 开通防火墙上集群通信端口
# firewall-cmd --permanent --add-port={/tcp,/tcp}
# firewall-cmd --reload
  • 加入集群

将 server1、server2 、server3组成集群:

默认是磁盘节点,如果是内存节点的话,需要加--ram参数

在server2、server3上分别运行:

# rabbitmqctl stop_app
# rabbitmqctl join_cluster rabbit@server1
# rabbitmqctl start_app
  • 设置镜像策略
# rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all","ha-sync-mode":"automatic"}'

相关知识

rabbitmqctl (rabbitmq管理工具)
rabbitmq-plugins (rabbitmq插件管理工具)
rabbitmq-server (rabbitmq服务)

主要配置文件

1. enabled_plugins:设置允许的插件列表。

2. rabbitmq.config:设置rabbitmq运行参数,结构为hash数组格式。

3. rabbitmq-env.conf:rabbitmq环境参数配置

rabbitmq-env.conf中的每项都以RABBITMQ_为前缀,常用参数如下:

RABBITMQ_NODENAME=FZTEC- //节点名称
RABBITMQ_NODE_IP_ADDRESS=127.0.0.1 //IP地址,空串bind所有地址,指定地址bind指定网络接口
RABBITMQ_NODE_PORT= //TCP端口号,默认是5672
RABBITMQ_LOG_BASE=/data/rabbitmq/log //日志所在路径
RABBITMQ_PLUGINS_DIR=/data/rabbitmq/plugins //插件所在路径
RABBITMQ_MNESIA_BASE=/data/rabbitmq/mnesia //mnesia所在路径
rabbitmq-env.conf和rabbitmq.config默认是不存在的。
rabbitmq-env.conf需要在缺省位置手动创建一个。
rabbitmq.config需要在RABBITMQ_CONFIG_FILE指定位置手动创建一个。
  • 脚本安装RabbitMQ的脚本

创建脚本文件
# mkdir rabbitmq-script && cd rabbitmq-script
# vi rabbitmq.config
[
{rabbit,
[
{cluster_partition_handling, pause_minority}
]
}
].
 
# vi settings.conf
ERLANG_EL6_RPM=erlang-18.3-.el6.x86_64.rpm
ERLANG_EL6_RPM_URL=http://www.rabbitmq.com/releases/erlang/erlang-18.3-1.el6.x86_64.rpm ERLANG_EL7_RPM=erlang-18.3-.el7.centos.x86_64.rpm
ERLANG_EL7_RPM_URL=http://www.rabbitmq.com/releases/erlang/erlang-18.3-1.el7.centos.x86_64.rpm RABBITMQ_RPM=rabbitmq-server-3.6.-.noarch.rpm
RABBITMQ_RPM_URL=http://www.rabbitmq.com/releases/rabbitmq-server/v3.6.1/rabbitmq-server-3.6.1-1.noarch.rpm RABBITMQ_KEY=rabbitmq-signing-key-public.asc
RABBITMQ_KEY_URL=https://www.rabbitmq.com/rabbitmq-signing-key-public.asc RABBITMQ_CONFIG_FILE=rabbitmq.config ERLANG_COOKIE=AZVOCZYZZBVFLBPTBXUD RABBITMQ_HTTP_PORT=
ERL_EPMD_PORT=
RABBITMQ_DIST_PORT= ADMIN_PWD=admin

# vi install_rabbitmq.sh

#!/bin/bash
#====================================================================
# install_rabbitmq.sh
#
# Linux RabbitMQ Auto Install Script
#
# Copyright (c) , Edward Guan <edward.guan@mkcorp.com>
# All rights reserved.
# Distributed under the GNU General Public License, version 3.0.
#
# Intro: http://www.cnblogs.com/edward2013/p/5061511.html
#
#==================================================================== echo "Note: This tiny script has been hardcoded specifically for RHEL/CentOS"
echo "" if [ $(id -u) != "" ]; then
echo "Error: You must be root to run this script!"
exit
fi # defind functions
msg() {
printf '%b\n' "$1" >&
} success() {
msg "\33[32m[✔]\33[0m ${1}${2}"
} error() {
msg "\33[31m[✘]\33[0m ${1}${2}"
exit
} program_exists() {
command -v $ >/dev/null >&
} function open_rabbitmq_ports() {
if program_exists firewall-cmd; then
firewall-cmd -q --permanent \
--add-port={$RABBITMQ_HTTP_PORT/tcp,$ERL_EPMD_PORT/tcp,$RABBITMQ_DIST_PORT/tcp}
firewall-cmd -q --reload
firewall-cmd -q --query-port $RABBITMQ_HTTP_PORT/tcp || return
firewall-cmd -q --query-port $ERL_EPMD_PORT/tcp || return
firewall-cmd -q --query-port $RABBITMQ_DIST_PORT/tcp || return
fi
} function erase_rabbitmq() {
rpm -e rabbitmq-server
} function update_rabbitmq_package() {
local TMP_FILE=/tmp/.$(basename "$0").tmp
# install required package
program_exists wget || yum -y install wget >/dev/null >& # install erlang rpm
if [ ! -f "$ERLANG_RPM_PATH" ]; then
msg "WARNING: $ERLANG_RPM_PATH not found."
msg "Try to download and install from $ERLANG_RPM_URL..."
wget $ERLANG_RPM_URL -P $SCRIPT_PATH || return
fi
rpm -U $ERLANG_RPM_PATH >$TMP_FILE && success "Installed $ERLANG_RPM_PATH" || {
sed 's/^[ |\t]*//' $TMP_FILE | grep "already installed" || return
} # import rabbitmq key
if [ ! -f "$RABBITMQ_KEY_PATH" ]; then
msg "WARNING: $RABBITMQ_KEY_PATH not found."
msg "Try to download and import from $RABBITMQ_KEY_URL..."
wget $RABBITMQ_KEY_URL -P $SCRIPT_PATH || return
fi
rpm --import $RABBITMQ_KEY_PATH && success "Imported $RABBITMQ_KEY_PATH" # install rabbitmq rpm
if [ ! -f "$RABBITMQ_RPM_PATH" ]; then
msg "WARNING: $RABBITMQ_RPM_PATH not found."
msg "Try to download and install from $RABBITMQ_RPM_URL..."
wget $RABBITMQ_RPM_URL -P $SCRIPT_PATH || return
fi
rpm -U $RABBITMQ_RPM_PATH >$TMP_FILE && success "Installed $RABBITMQ_RPM_PATH" || {
sed 's/^[ |\t]*//' $TMP_FILE | grep "already installed" || return
}
} function set_rabbitmq_users() {
if program_exists rabbitmqctl; then
rabbitmqctl list_users | grep -q guest && \
rabbitmqctl delete_user guest >/dev/null && \
success "Deleted user [guest]"
rabbitmqctl list_users | grep -q admin || {
rabbitmqctl add_user admin $ADMIN_PWD >/dev/null && \
rabbitmqctl set_user_tags admin administrator >/dev/null && \
rabbitmqctl set_permissions -p / admin ".*" ".*" ".*" >/dev/null && \
success "Added user [admin]"
}
else
msg "Command not find: rabbitmqctl" && return
fi
} function set_rabbitmq_policies() {
if program_exists rabbitmqctl; then
rabbitmqctl list_policies | grep -q ha-all || {
rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all","ha-sync-mode":"automatic"}' >/dev/null && \
success "Added policy [ha-all]"
}
else
msg "Command not find: rabbitmqctl" && return
fi
} function install_rabbitmq() {
rpm -q rabbitmq-server >/dev/null && \
error "$(rpm -q rabbitmq-server) is already installed"
update_rabbitmq_package || return # enable rabbitmq plugin
rabbitmq-plugins enable rabbitmq_management >/dev/null && \
success "Enabled rabbitmq plugin [rabbitmq_management]" || return # open firewall ports
open_rabbitmq_ports && \
success "Opened rabbitmq ports [$RABBITMQ_HTTP_PORT/tcp,$ERL_EPMD_PORT/tcp,$RABBITMQ_DIST_PORT/tcp]" || \
return # deploy rabbitmq.config
RABBITMQ_CONFIG_PATH="$SCRIPT_PATH/$RABBITMQ_CONFIG_FILE"
RABBITMQ_CONFIG_LOCATION=/etc/rabbitmq/rabbitmq.config
cp $RABBITMQ_CONFIG_PATH $RABBITMQ_CONFIG_LOCATION && \
success "Copyed $RABBITMQ_CONFIG_PATH to $RABBITMQ_CONFIG_LOCATION" || return # add host entry into /etc/hosts
HOST_ENTRY=$(egrep "127.0.0.1 +$(hostname -s)" /etc/hosts)
if [ "x$HOST_ENTRY" == "x" ]; then
echo "127.0.0.1 $(hostname -s)" >> /etc/hosts && \
success "Added [127.0.0.1 $(hostname -s)] into /etc/hosts" || return
else
msg "[$HOST_ENTRY] is already added into /etc/hosts"
fi # set erlang cookie
[ "x$COOKIE" == "x" ] && COOKIE="$ERLANG_COOKIE"
ERLANG_COOKIE_PATH=/var/lib/rabbitmq/.erlang.cookie
if [ ! -f "$ERLANG_COOKIE_PATH" ]; then
msg "WARNING: $ERLANG_COOKIE_PATH is not exist, create new one"
touch $ERLANG_COOKIE_PATH || return
fi
chmod $ERLANG_COOKIE_PATH
echo -n "$COOKIE" >$ERLANG_COOKIE_PATH
chmod $ERLANG_COOKIE_PATH
chown rabbitmq:rabbitmq $ERLANG_COOKIE_PATH
if [ $(cat $ERLANG_COOKIE_PATH) = "$COOKIE" ]; then
success "Set erlang cookie value to $COOKIE"
fi
} function join_rabbitmq_cluster() {
local ret=
if [ "x$SERVER" != "x" ] && [ "$SERVER" != $(hostname -s) ]; then
if program_exists rabbitmqctl; then
rabbitmqctl stop_app >/dev/null
rabbitmqctl reset >/dev/null
if [ "$NODE" == "ram" ]; then
rabbitmqctl join_cluster --ram rabbit@$SERVER >/dev/null || let ret++
else
rabbitmqctl join_cluster rabbit@$SERVER >/dev/null || let ret++
fi
rabbitmqctl start_app >/dev/null
else
msg "Command not find: rabbitmqctl" && return
fi
if [ "$ret" -eq ]; then
success "Joined rabbit@$SERVER"
return
else
return
fi
fi
} function restart_rabbitmq() {
# kill all rabbitmq server processes
local RABBITMQ_PIDS=$(ps -ef | grep ^rabbitmq | cut -c - | tr -s "\n" " ")
if [ "x$RABBITMQ_PIDS" != "x" ]; then
kill - $RABBITMQ_PIDS && success "Killed all rabbitmq server processes"
fi
# enable and start rabbitmq server
chkconfig rabbitmq-server on
service rabbitmq-server start
} function print_usage() {
echo "Usage: $(basename "$") [OPTIONS...]"
echo ""
echo "Options"
echo " [-h|--help] Prints a short help text and exists"
echo " [-i|--install] Install rabbitmq server"
echo " [-u|--update] Update rabbitmq server"
echo " [-e|--erase] Erase (uninstall) rabbitmq server"
echo " [-c|--cookie] <cookie> Set erlang cookie"
echo " [-j|--join] <server> Join rabbitmq cluster"
echo " [-n|--node] <disc|ram> Set cluster node type"
} # read the options
TEMP=`getopt -o hiuec:j:n: --long help,install,update,erase,cookie:,join:,node: -n $(basename "$0") -- "$@"`
eval set -- "$TEMP" # extract options and their arguments into variables.
while true; do
case "$1" in
-h|--help) print_usage ; exit ;;
-i|--install) ACTION=install ; shift ;;
-u|--update) ACTION=update ; shift ;;
-e|--erase) ACTION=erase ; shift ;;
-c|--cookie) COOKIE=$ ; shift ;;
-j|--join) SERVER=$ ; shift ;;
-n|--node) NODE=$ ; shift ;;
--) shift ; break ;;
*) error "Internal error!" ;;
esac
done # get script path
SCRIPT_PATH="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" # load settings
source "$SCRIPT_PATH/settings.conf" || exit # set erlang and rabbitmq rpm & key path
case $(uname -r) in
*el7*)
ERLANG_RPM_PATH="$SCRIPT_PATH/$ERLANG_EL7_RPM";
ERLANG_RPM_URL="$ERLANG_EL7_RPM_URL" ;;
*el6*)
ERLANG_RPM_PATH="$SCRIPT_PATH/$ERLANG_EL6_RPM";
ERLANG_RPM_URL="$ERLANG_EL6_RPM_URL" ;;
*) error "Your system is not RHEL/CentOS" ;;
esac
RABBITMQ_RPM_PATH="$SCRIPT_PATH/$RABBITMQ_RPM"
RABBITMQ_KEY_PATH="$SCRIPT_PATH/$RABBITMQ_KEY" if [ "x$ACTION" == "x" ] && [ "x$SERVER" == "x" ]; then
error "$(basename "$"): missing operand\n" \
"Try '$(basename "$") --help' for more information."
fi echo "$NODE" | grep -qE "^disk$|^ram$|^$" || {
error "$(basename "$"): -n: must be disk or ram"
} # if ACTION is erase, erase rabbitmq server
if [ "$ACTION" == "erase" ]; then
erase_rabbitmq && {
msg "\nThanks for erasing rabbitmq-server."
msg "© `date +%Y` marykay company"
} || error "Failed erase rabbitmq server"
exit
fi # if ACTION is update, update rabbitmq server
if [ "$ACTION" == "update" ]; then
update_rabbitmq_package && restart_rabbitmq && {
msg "\nThanks for updating rabbitmq-server."
msg "© `date +%Y` marykay company"
} || error "Failed update rabbitmq server"
exit
fi # if ACTION is install, install rabbitmq server
if [ "$ACTION" == "install" ]; then
install_rabbitmq && restart_rabbitmq && set_rabbitmq_users && set_rabbitmq_policies && join_rabbitmq_cluster && {
msg "\nThanks for installing rabbitmq-server."
msg "© `date +%Y` marykay company"
} || error "Failed install rabbitmq server"
else
if [ "x$SERVER" != "x" ]; then
join_rabbitmq_cluster && {
msg "\nThanks for joining rabbitmq-server."
msg "© `date +%Y` marykay company"
} || error "Failed join rabbitmq server"
fi
fi

在server1,server2上分别运行脚本
# chmod +x install_rabbitmq.sh

安装RabbitMQ
# ./install_rabbitmq.sh -i

升级RabbitMQ
# ./install_rabbitmq.sh -u

卸载RabbitMQ
# ./install_rabbitmq.sh -e

加入群集,不带-n参数时,默认节点类型为dsik,-n参数后只能接ram和disk
# ./install_rabbitmq.sh -j server1 -n ram

安装RabbitMQ并加入群集
# ./install_rabbitmq.sh -ij server1

CentOS7安装RabbitMQ集群的更多相关文章

  1. CentOS7安装rabbitmq集群(二进制)

    一.RabbiMQ简介 RabbiMQ是用Erang开发的,集群非常方便,因为Erlang天生就是一门分布式语言,但其本身并不支持负载均衡. RabbiMQ模式 RabbitMQ模式大概分为以下三种: ...

  2. 集群架构和CentOS7安装RabbitMQ集群(单机版)

    1. 集群架构 1.1 四种内部元数据 队列元数据.交换器元数据.绑定元数据.vhost元数据. 单一节点中:会将数据存储到内存,同时将持久化元数据保存到硬盘. 集群中: 存储到磁盘上.内存中. 集群 ...

  3. CentOS7环境RabbitMQ集群配置管理(转载)

    CentOS7环境RabbitMQ集群配置管理(转载)   CentOS7系统内核版本:3.10.0-514.26.2.el7.x86_64 一.对应主机host地址(三台主机host文件要保持一致) ...

  4. docker-compose安装rabbitmq集群(主从集群---》镜像集群)

    docker-compose安装rabbitmq集群(主从集群--->镜像集群) yls 2020/5/11 创建docker-compose.yml 文件 version: '3' servi ...

  5. k8s中安装rabbitmq集群

    官方文档地址:https://www.rabbitmq.com/kubernetes/operator/quickstart-operator.html 要求 1.k8s版本要1.18及其以上 2.能 ...

  6. Springboot 1.5.x 集成基于Centos7的RabbitMQ集群安装及配置

    RabbitMQ简介 RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件). RabbitMQ是一套开源(MPL)的消息队列服务软件,是由LShift提供的一 ...

  7. CentOS7 搭建RabbitMQ集群 后台管理 历史消费记录查看

    简介 通过 Erlang 的分布式特性(通过 magic cookie 认证节点)进行 RabbitMQ 集群,各 RabbitMQ 服务为对等节点,即每个节点都提供服务给客户端连接,进行消息发送与接 ...

  8. kubernets安装rabbitmq集群.

    RabbitMQ集群的两种模式 1)普通模式:默认的集群模式,队列消息只存在单个节点上 2)镜像模式:队列为镜像队列,队列消息存在每个节点上 配置同步: 配置同步: 1.Ha mode 同步模式,以下 ...

  9. CentOS7 安装Hbase集群

    继续接上一章,已安装好Hadoop集群环境 http://www.cnblogs.com/dopeter/p/4612232.html 在此基础上继续安装Hbase集群 Hbase版本为1.0.1.1 ...

随机推荐

  1. Hackers' Crackdown( UVA UVA 11825状压dp)

    题意:N台电脑,现在有N种服务,现在你可以在每台电脑终止一项服务,他和他相邻的电脑都会被关闭,如果一项服务在所有电脑都没运行,该项服务成功被破坏,问最多能破坏几种服务. 分析:把n个集合分成尽量多组, ...

  2. CodeForce---Educational Codeforces Round 3 USB Flash Drives (水题)解题报告

    对于这题明显是用贪心算法来解决问题: 下面贴出笔者的代码: #include<cstdio> #include<iostream> #include<algorithm& ...

  3. 【译】 AWK教程指南 6在AWK程序中使用Shell命令

    awk程序中允许调用Shell指令,并提供管道解决awk与系统间数据传递的问题.所以awk很容易使用系统资源,读者可利用这个特点来编写某些适用的系统工具. 范例:写一个awk程序来打印出线上人数. 将 ...

  4. NOIP2012 Vigenère 密码

    1.Vigenère 密码 (vigenere.cpp/c/pas) [问题描述] 16 世纪法国外交家 Blaise de Vigenère 设计了一种多表密码加密算法——Vigenère 密码.V ...

  5. sprintf的缓冲区溢出

    sprintf的缓冲区溢出 分类: 技术2010-03-07 15:26 362人阅读 评论(0) 收藏 举报 今天,调试sector的时候遇到一个特奇怪的问题,程序会在取string的c_str() ...

  6. HW6.28

    import java.util.Scanner; public class Solution { public static void main(String[] args) { Scanner i ...

  7. C 头文件阅读理解

    __BEGIN_DECLS ..... ..... __END_DECLS 很多时候,为了使 C 代码和 C++ 代码保持互相兼容的过程调用接口,需要在 C++ 代码里加上 extern " ...

  8. SQL2008-删除时间字段重复的方法

    ID  EMAgitation_ID    YieldDateTime 1   2                              2012-02-11 10:18:54.0002   2  ...

  9. nyoj 218 Dinner

    Dinner 时间限制:100 ms  |  内存限制:65535 KB 难度:1   描述 Little A is one member of ACM team. He had just won t ...

  10. Arrays.asList的源码分析

    以前一直很奇怪为什么Arrays.asList的数组不能插入新的数据,后来看了源码发现是因为内部是一个final的数组支持起来的Arraylist,下面贴入源码与分析. 1.先看Arrays的方法 我 ...