10月 11

Reids的安装、配置和初级管理

【2011-10-11 整理编辑 simon-zzm@163.com】

一、 获取和部署

# wget http://redis.googlecode.com/files/redis-2.2.12.tar.gz

# tar zxvf redis-2.2.12.tar.gz

# cd redis-2.2.12

# make

src目录下会生成可执行文件,可以使用make install 进行安装,默认安装后放在/usr/local/bin中。也可以制定存放目录make PREFIX=/some/other/directory。可执行文件的作用

redis-server 服务器的daemon启动程序

redis-check-aof 数据修复

redis-check-dump 检查导出工具

redis-cli 命令行操作工具

redis-benchmark 性能测试工具,测试Redis在你的系统及你的配置下的读写性能

直接执行redis-server,使用默认配置控制台打印。再redis-2.2.12中有redis.conf配置文件的模板,可以将配置文件放到认可位置,建议放到/etc下,使用配置文件启动redis命令如下。修改系统内核参数

# echo vm.overcommit_memory=1 >> /etc/sysctl.conf

# sysctl vm.overcommit_memory=1

使用数字含义:

0,表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。

1,表示内核允许分配所有的物理内存,而不管当前的内存状态如何。

2,表示内核允许分配超过所有物理内存和交换空间总和的内存

启动

# redis-server /etc/redis.conf

二、配置说明

配置文件主要参数说明如下(多个#为系统默认注释的配置):

daemonize no

#默认不以守护进程的方式启动,生产环境下建议改为yes

pidfile /var/run/redis.pid

#pid文件位置

port 6379

#监听端口

bind 127.0.0.1

#监听IP地址,可用于监听指定IP

unixsocket /tmp/redis.sock

#sock文件位置

timeout 60

#超时断开时间

loglevel verbose

#日志级别debugnoticeverbosewarning

logfile stdout

#日志保存位置,默认是输出到/dev/nul,既不记录日志。

# syslog-enabled no

# 开启系统日志,默认关闭

###### syslog-ident redis

######syslog-facility local0

# 日志级别从LOCAL0-LOCAL7

databases 16

#数据库个数,登陆数据库默认dbid0,可以使用select 设置。

save 900 1

save 300 10

save 60 10000

# 持久化保持 save *(秒数)*(修改次数)保存到硬盘上。全部注释掉,则不进行持久化。

rdbcompression yes

# 持快照是否要压缩

dbfilename dump.rdb

# 快照文件名称

dir ./

#快照保存位置

######slaveof

# 如果为从库需要配置主库的IP和端口,需要注意,从机如果做数据修改是不能同步到主机的

######masterauth

# 如果主数据库有密码需要在从库上设置主库的密码

###### requirepass foobared

< p>#主数据库的密码设置,如果加密了客户端连接为./redis-cli?-a foobared

slave-serve-stale-data yes

# 当主库宕机时,备机接替主库工作

######requirepass foobared

# 设置客户端登陆访问密码

maxclients 1024

# 默认客户端链接数,如果为0 则是不限制

######maxmemory 2048000000

# 使用内存大小,如果不设置为使用所有。单位为bytes

######maxmemory-policy volatile-lru

#内存用满的清理策略(lru为最近最少使用算法):

# volatile-lru:删除过期和lru key(默认值)

# allkeys-lru : 删除lru算法的key

# volatile-random:随机删除即将过期key

# allkeys->random:随机删除

# volatile-ttl : 删除即将过期的

# noeviction : 永不过期,返回错误

######maxmemory-samples 3

# 可以用ttl这只key的生存时间,此配置为用lru检查ttl时间。个人认为应该是对ttl的排序

appendonly no

# 开启操作记录日志,每此操作都会写日志,效率比较低。但是服务器宕机重启后,服务会加载日志,提高安全性。

#### appendfilename appendonly.aof

# 日志名称

appendfsync everysec

# 写日志的规则 always 时时写,everysec美秒写一次,no为不写

no-appendfsync-on-rewrite no

#没有太懂,个人理解是因为I/O效率问题,所以使用的一种类似的增量写入的方式。

slowlog-log-slower-than 10000

slowlog-max-len 1024

#像系统日志一样,记录命令的执行时间。记录周期为毫秒级(1000000毫秒=1秒)负值表示禁用,0表示记录所有命令。记录能保存的最大行数。

vm-enabled no

#虚拟内存开关

vm-swap-file /tmp/redis.swap

# 虚拟内存swap文件的位置。不同的redis服务不能共用内存文件。不推荐使用tmp目录。

vm-max-memory 0

#虚拟内存的大小,0为不限制。

vm-page-size 32

#缓存中每页的大小,默认是32个字节

vm-pages 134217728

# 虚拟内存中可以最大的页数,虚拟文件大小为vm-page-size * vm-pages。如果是32字节的页,用134217728页,会有4G大的swap文件

vm-max-threads 4

#使用虚拟内存的最大线程数

hash-max-zipmap-entries 512

hash-max-zipmap-value 64

list-max-ziplist-entries 512

list-max-ziplist-value 64

set-max-intset-entries 512

activerehashing yes

#为一种高级的哈希算法。原理没有明白,也不做修改了。

#以下为可以引入其它位置的配置文件。

# include /path/to/local.conf

# include /path/to/other.conf

三、基本管理

  Redis的命令共分为十个部分,其中主要的六个部分(KeyStringHashListSetSortedSet)的翻译可以到http://redis.readthedocs.org/en/latest/中查看。本问只是记录部分管理命令。

1Select

切换库,select后直接跟阿拉伯数字的dbid

举例:

redis 127.0.0.1:6379> select 1


OK

2Dbsize

统计库中key的数量

举例:

redis 127.0.0.1:6379> dbsize

(integer) 1

3Flushdb

Redis还支持对某个DB数据进行清除(当然清空所有数据的操作也是支持的)

redis 127.0.0.1:6379> dbsize

(integer) 1

redis 127.0.0.1:6379> flushdb

OK

redis 127.0.0.1:6379> dbsize

(integer) 0

4slaveof

同步命令,在从端参输入主机的IP和端口,进行数据同步。在复制的开始阶段处于阻塞状态(sync_readline)服务无法对外提供服务。

5Slowlog

获得slowlog日志中最近的2条记录

redis 127.0.0.1:6379> slowlog get 2

1) 1) (integer) 6

2) (integer) 1318257654

3) (integer) 19244

4) 1) “rpush”

2) “b”

3) “z”

2) 1) (integer) 5

2) (integer) 1318256413

3) (integer) 42203

4) 1) “keys”

2) “10*”

6Save Bgsave

将所有数据遍历一遍,然后存到一个扩展名为rdb的数据文件中。Bgsave为后台运行保存

redis 127.0.0.1:6379> SAVE

OK

7CONFIG RESETSTAT

充值redis服务器的统计信息,将被重置的内容如下:

Keyspace hits

Keyspace misses

Number of commands processed

Number of connections received

Number of expired keys

8Info

查看服务当前状态和版本信息。主要关心的空间使用信息used_memory_human使用内存量,vm使用率和swap使用。

举例:

redis 127.0.0.1:6379[1]> info

redis_version:2.2.12

redis_git_sha1:00000000

redis_git_dirty:0

arch_bits:64

multiplexing_api:epoll

process_id:27525

uptime_in_seconds:3085418

uptime_in_days:35

lru_clock:1807857

used_cpu_sys:79.22

used_cpu_user:186.33

used_cpu_sys_children:8.48

used_cpu_user_children:1.53

connected_clients:1

connected_slaves:0

client_longest_output_list:0

client_biggest_input_buf:0

blocked_clients:0

used_memory:83717864

used_memory_human:79.84M

used_memory_rss:127311872

mem_fragmentation_ratio:1.52

use_tcmalloc:0

loading:0

aof_enabled:0

changes_since_last_save:0

bgsave_in_progress:0

last_save_time:1318258998

bgrewriteaof_in_progress:0

total_connections_received:132983

total_commands_processed:5728570

expired_keys:0

evicted_keys:0

keyspace_hits:3588043

keyspace_misses:2140445

hash_max_zipmap_entries:512

hash_max_zipmap_value:64

pubsub_channels:0

pubsub_patterns:0

vm_enabled:0

role:master

db0:keys=664042,expires=0

db1:keys=1,expires=0

3月 01

shell 打印拷贝进度

写了一个脚本做大量数据拷贝,但是拷贝的时间比较常,不知道当前进度如何,是否死机,于是写了一段关于拷贝百分比的输出,详细参见以下脚本。

#!/bin/bash
# ——————————————————————————-
# Filename: copy_percent.sh
# Revision: 1.0
# Date: 2011-03-01
# Author: simon-zzm
# Email: simon-zzm@163.com
# ——————————————————————————-

SOURCE=$1
TARGET=$2

/bin/cp -r “$SOURCE” “$TARGET” &

compute_percent() #
{
SOURCE_SIZE=`/usr/bin/du -s ${1}|awk ‘ ”{print $1}’`
TARGET_SIZE=`/usr/bin/du -s ${2}|awk ‘ ”{print $1}’`
let “i=(${TARGET_SIZE}*100)/${SOURCE_SIZE}”
return $i
}

compute_percent ${SOURCE} ${TARGET}
while [ ${i} -lt ‘100’ ]
do
compute_percent ${SOURCE} ${TARGET}
echo $i’%’
sleep 1
done
echo “ok”

3月 21

Nginx服务使用的脚本

[编写人:张子萌 2010]

Nginx服务器时使用的脚本.

1.在nginx日志出现错误后发送告警邮件,使用该脚本会在nginx的sbin目录下产生last_error_log,错误文件格式

为nginx默认

#!/bin/sh
##############################################
# AUTHOR: simon-zzm
# back log
# Ver : 1.0 For Production
# description:
# 2010-03-12 simon-zzm@163.com
##############################################
######set ip Email base path
IP=172.2.2.2
admin_mail=simon-zzm@163.com
base_path=/usr/local/nginx

###run
cut_error_log=`/bin/cat ${base_path}/sbin/last_error_log`
last_error_log=`/usr/bin/tail -1 ${base_path}/logs/error.log|/bin/cut -c 1-19`
if [ “$cut_error_log” != “$last_error_log” ];then
/usr/bin/tail -5 ${base_path}/logs/error.log>$base_path/sbin/mail1.txt
/bin/mail -s $IP_nginx_error_log $admin_mail<$base_path/sbin/mail1.txt
/bin/rm -rf $base_path/sbin/mail1.txt
echo $last_error_log>${base_path}/sbin/last_error_log
fi

2.nginx日志切割,每个小时切割一个日志,

#!/bin/sh

##############################################

# AUTHOR: simon-zzm

# back log

# Ver : 1.0 For Production

# description:

# 2010-03-12 simon-zzm@163.com

##############################################

###set base path、use every an hour to cut log
log_dir=”/usr/local/nginx/logs”
date_dir=`date +%Y%m%d%H`

###run
/bin/mv ${log_dir}/access.log ${log_dir}/access_${date_dir}.log
/bin/kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`

3.日志备份部分参照通用性日志备份

http://simon-zzm.blog.163.com/blog/static/88809522201021523828112/

3月 18

mysql 主从服务器数据同步

[整理:张子萌 2009-10-12]

操作系统:CentOS

数据库版本:mysql-5.1.44-linux-i686-glibc23.tar.gz

A服务器: 192.168.1.100 主服务器(master)

B服务器: 192.168.1.101 从服务器(slave)

主副服务器安装比较简单,此处只列安装顺序的命令。

详细操作可以见http://simon-zzm.blog.163.com/blog/static/88809522201028104721790/中mysql部分。

1. mysql安装

在主从服务器上做以下操作。

# groupadd -g700 mysql

# useradd -g700 -u700 mysql mysql

# tar zxvf mysql-5.1.44-linux-i686-glibc23.tar.gz

# cp mysql-5.1.44-linux-i686-glibc23 /usr/local/mysql

# cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql

# cp /usr/local/mysql/support-files/my-medium.cnf /etc/my.cnf

# chown -R mysql:mysql /usr/local/mysql

2. 配置主服务器

2.1 登录主服务器。初始化数据库,并启动

# /usr/local/mysql/scripts/mysql_install_db –user=mysql

–basedir=/usr/local/mysql –datadir=/usr/local/mysql/data

# /etc/init.d/mysql start

2.2 连接数据库,并创建所使用的库。本文为了测试创建名为testas的数据库

# /usr/local/mysql/bin/mysql -u root

mysql> create database testas;

Query OK, 1 row affected (0.03 sec)

2.3 创建从服务器同步主服务器时使用的账户。账户名为slavetest,密码为123;

Mysql>grant replication slave,reload,super on *.* To

slavetest@192.168.1.101 identified by ‘123’ ;

Mysql> flush privileges;

2.4 停止mysql数据库

# /etc/init.d/mysql stop

2.5 使用系统拷贝命令将主服务器的已经创建的数据,拷贝到备用服务器上。

# scp r /usr/local/mysql root@1192.168.1.101:/usr/local/mysql

注: 向备机传送备份数据库有两种方法。
a)备份数据直接将data目录需要备份数据库的文件夹传到备份数据中。
b)使用MySQLdump的方式来备份主数然后导入备库中(备份时加上”–master-data “参数)。
本文使用第一种方法来备,也建议使用第一种。如果是不能停机,则将主数据库进行锁库后在进行备份操作。
数据库锁定:
FLUSH TABLES WITH READ LOCK;
数据库打开:
UNLOCK TABLES;

2.6 修改主服务器的配置文件。在/etc/my.cnf文件[mysqld]后添加两个参数。第一个是

server-id=master_id,master_id的值为1到2^32-1之间的正整数,推荐使用1。第二个是

选择添加skip-name-resolve,如果开启远程访问,可以防止远程连接失败。

# vi /etc/my.cnf

修改后结果[mysqld]部分,部分截图如下:

2010年3月18日 - simon-zzm - simon个人观点

2.7 启动数据库,记录同步数据的点。

# /etc/init.d/mysql start

# /usr/local/mysql/bin/mysql -u root

mysql> show master status;

获得数据如下图:

2010年3月18日 - simon-zzm - simon个人观点

请记录file和Position的值,在配置从服务器中需要用到。

3. 开始配置从服务器

3.1 登录从服务器,修改从主服务器上所传文件的权限

# chown -R mysql:mysql /usr/local/mysql

3.2 修改配置从服务器的文件。在/etc/my.cnf文件[mysqld]后添加slave_id 的值是 1 到 2^32-1 之间的正整数,这个值一定不能与主服务器中master_id一样。推荐值为2。

# vi /etc/my.cnf

修改后结果[mysqld]部分,部分截图如下:

2010年3月18日 - simon-zzm - simon个人观点

3.3 启动从数据库

# /etc/init.d/mysql start

3.4 编辑sql(使用组服务器上记录的数据),登录数据库后运行sql。

Sql 编写如下:

CHANGE MASTER TO

MASTER_HOST=’192.168.1.100′,

MASTER_USER=’slavetest’,

MASTER_PASSWORD=’123′,

MASTER_LOG_FILE=’mysql-bin.000004′,

MASTER_LOG_POS=106 ;

如下图:

2010年3月18日 - simon-zzm - simon个人观点

3.5 启动从服务器同步服务

mysql> slave start;

4. 服务器配置完成,可以连到主服务器上,创建表、添加数据后,再看从数据库是否也有相同数据。如果数据相同,则配置成功。

注意:为了安全日常登录和操作最好不要使用root用户。不可以在从数据库中修改数据,最好将从数据库连接账号的权限修改为只读。

5. 登录主从数据库使用命令查看当前状态

5.1 登录从服务器,查看当前I/O情况

mysql> show slave statusG

Connecting to master

该线程证尝试连接到master上。

Checking master version

确定连接到master后出现的一个短暂的状态。

Registering slave on master

确定连接到master后出现的一个短暂的状态。

Requesting binlog dump

确定连接到master后出现的一个短暂的状态。该线程向master发送一个请求,告诉它要请求的二进制文件以及开始位置。

Waiting to reconnect after a failed binlog dump request

如果二进制日志转储(binary log dump)请求失败了(由于连接断开),该线程在休眠时进入这个状态,并定期重连。重连的时间间隔由

–master-connect-retry 选项来指定。

Reconnecting after a failed binlog dump request

该线程正尝试重连到master。

Waiting for master to send event

已经连接到master,正等待它发送二进制日志。如果master闲置时,这个状态可能会持续较长时间,如果它等待超过 slave_read_timeout 秒,就会发生超时。这时,它就会考虑

断开连接,然后尝试重连。

Queueing master event to the relay log

已经读取到一个事件,正把它拷贝到中继日志中以备SQL线程处理。

Waiting to reconnect after a failed master event read

读日志时发生错误(由于连接断开)。该线程在重连之前休眠 master-connect-retry 秒。

Reconnecting after a failed master event read

正尝试重连到master。当连接确定后,状态就变成 Waiting for master to send event。

Waiting for the slave SQL thread to free enough relay log space

relay_log_space_limit 的值非零,中继日志的大小总和超过这个值了。I/O线程等待SQL线程先处理中继日志然后删除它们以释放足够的空间。

Waiting for slave mutex on exit

当前线程停止了,这个时间很短。

3月 12

nginx 0.8 安装 配置

【整理人:张子萌 最近一次修改2010-12】

nginx的官方网站:http://nginx.org/

1.下载nginx源码
nginx-0.8.34.tar.gz

如果希望在Nginx中使用正则表达式使配置更灵活,需要安装PCRE。
查看是否安装pcre
# rpm -qa pcre*

如果希望在是用ssl加密部分请安装openssl。

如果希望压缩传送需要安装gzip

如果使用nginx使用的缓存,需要清理指定url需要下载并同时编译。
http://labs.frickle.com/files/ngx_cache_purge-1.0.tar.gz

推荐使用升级工具安装,升级工具使用可以参照:
http://simon-zzm.blog.163.com/blog/static/88809522201025102237958/

2. 编译安装nginx
首先创建账户,指定用户与组的id均为700
# groupadd -g 700 nginx
# useradd -g700 -u700 nginx
解压、安装nginx,对于不需要的模块可以不编译。
最后一行为清理指定url模块,可以选择性编译
# tar zxvf ngx_cache_purge-1.0.tar.gz
# tar zxvf nginx-0.8.34.tar.gz
# cd nginx-0.8.34
# ./configure –prefix=/usr/local/nginx
–user=nginx
–group=nginx
–with-pcre
–with-select_module
–with-poll_module
–with-http_stub_status_module
–with-http_ssl_module
–with-http_realip_module
–with-http_gzip_static_module
–add-module=/usr/local/src/ngx_cache_purge-1.0
# make && make install

3. nginx配置文件

主要配置文件:/usr/local/nginx/conf/nginx.conf
# 程序运行用户
user nginx nginx;
# 启动进程数
worker_processes 8;

#给每个进程分配cpu,例:将8个进程分配到8个cpu,也可以写多个,或将一个进程分配到多个cpu

worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;

# 全局错误日志和程序PID文件
error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;

pid logs/nginx.pid;

# 工作模式及连接数上限
# 工作模式有:select(标准模式),poll(标准模式),kqueue(高效模式,适用FreeBSD 4.1+, OpenBSD 2.9+, NetBSD 2.0 and MacOS X),
# poll(高效模式。适用Linux 2.6+,SuSE 8.2,Solaris 7 11/99+, HP/UX 11.22+ (eventport), IRIX 6.5.15+ 和 Tru64 UNIX 5.1A+)
events {
use poll;
worker_connections 1024;
}

# 设定http服务器,反向代理功能提供负载均衡支持
http {
#设定mime类型
include mime.types;
default_type application/octet-stream;

# 隐藏nginx版本,防止攻击
server_tokens off;
# 设定日志格式
#log_format main ‘$remote_addr – $remote_user [$time_local] “$request” ‘
# ‘$status $body_bytes_sent “$http_referer” ‘
# ‘”$http_user_agent” “$http_x_forwarded_for”‘;
#设定access log
#access_log logs/access.log main;
#linux下强大的静态文件发送功能,一定要开启
sendfile on;
tcp_nopush on;

keepalive_timeout 60;
tcp_nodelay on;

# 定义一个叫“mysvr”的记录区,总容量为 10M
# 和下面location中的limit_conn一起限制单个IP的并发连接数为10
# limit_zone只能是用在http中,limit_conn可以使用在http、sever、local中
limit_zone mysvr $binary_remote_addr 10m;

#设定负载均衡的服务器列表
upstream mysvr {
ip_hash #如果不需要可以删除直接采用轮训方法负载
#weigth参数表示权值,权值越高被分配到的几率越大
server 192.168.0.1:80 weight=5;
server 192.168.0.2:80 weight=1;
server 192.168.0.3:80 weight=6;
server 192.168.0.5:80;
server 192.168.0.6:80;

#down 表示单前的server暂时不参与负载
#weight 默认为1.weight越大,负载的权重就越大。
#max_fails :允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream 模块定义的错误
#fail_timeout:max_fails次失败后,暂停的时间。
#backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。
#ip_hash:每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题
}
# 设定缓存临时目录,临时目录要与proxy_cache_path中目录一样
proxy_temp_path /usr/local/nginx_test/proxy_temp;
# proxy_cache_path中参数如下
# levels指定该缓存空间有两层hash目录,第一层目录是1个字母,第二层为2个字母
# keys_zone为这个空间起个名字,比如 cache_one,在server模块中proxy_cache使用
# 200m 内存缓存空间大小为200MB
# inactive 1天没有被访问的内容自动清除;
# max_size使用硬盘缓存大小30G
# clean_time指定一分钟清理一次缓存。
proxy_cache_path /usr/local/nginx_test/proxy_temp/ levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=30g;

#设定虚拟主机,默认为监听80端口
server {
listen 80;
server_name 192.168.0.7 mysvr.c
om www.mysvr.com;
#charset gb2312;
#charset utf8;
#charset koi8-r;
#设定本虚拟主机的访问日志
#access_log logs/host.access.log main;

#对 “/” 启用负载均衡
location / {
proxy_pass http://mysvr;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 10m; #允许客户端请求的最大单文件字节数
client_body_buffer_size 128k; #缓冲区代理缓冲用户端请求的最大字节数
proxy_connect_timeout 90; #与后端连接超时时间
proxy_send_timeout 90; #后端服务器回传超时时间
proxy_read_timeout 90; #连成功后,后端服务器响应超时时间。
proxy_buffer_size 4k; #代理服务器保存用户头信息的缓存大小
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k; #高负荷缓村大小。大小计算方法proxy_buffers*2
proxy_temp_file_write_size 64k; #设定缓存文件大小,大于这个值经直接从upstream获得。
limit_conn mysvr 10; #每个IP只能有10个并发
limit_rate 100k; #每个并发只能有100K的速度
index index.html index.htm; #选则文件后缀解析都优先顺序
expires 30d; #客户端缓存时间 30天

}

#设定查看Nginx状态的地址
location /NginxStatus {
stub_status on;
access_log on;
auth_basic “NginxStatus