Rootop 服务器运维与web架构

2014-05-06
发表者 Venus
暂无评论

Linux/Centos内核参数详解

#使用sysrq组合键是了解系统目前运行情况,为安全起见设为0关闭
kernel.sysrq = 0
#控制core文件的文件名是否添加pid作为扩展
kernel.core_uses_pid = 1
#每个消息队列的大小(单位:字节)限制
kernel.msgmnb = 65536
#整个系统最大消息队列数量限制
kernel.msgmax = 65536
#单个共享内存段的大小(单位:字节)限制,
kernel.shmmax = 2147483648
#所有内存大小(单位:页,1页 = 4Kb),本机内存4GB
kernel.shmall = 1048576
#为TCP socket预留用于发送缓冲的内存默认值(单位:字节)
net.core.wmem_default = 2097152
#为TCP socket预留用于发送缓冲的内存最大值(单位:字节)
net.core.wmem_max = 8388608
#为TCP socket预留用于接收缓冲的内存默认值(单位:字节)
net.core.rmem_default = 2097152
#为TCP socket预留用于接收缓冲的内存最大值(单位:字节)
net.core.rmem_max = 8388608
#每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目
net.core.netdev_max_backlog = 4096
#listen(函数)的默认参数,挂起请求的最大数量限制
net.core.somaxconn = 51200
#启用源路由核查功能
net.ipv4.conf.default.rp_filter = 1
#禁用所有IP源路由
net.ipv4.conf.default.accept_source_route = 0
#禁用包过滤功能
net.ipv4.ip_forward = 0
#对外连接端口范围
net.ipv4.ip_local_port_range = 2048 65000
#设定保持在FIN-WAIT-2状态的时间
net.ipv4.tcp_fin_timeout = 15
#表示当keepalive起用的时候,TCP发送keepalive消息的频度(单位:秒)
net.ipv4.tcp_keepalive_time = 30
#系统中最多有多少个TCP套接字不被关联到任何一个用户文件句柄上。这个限制仅仅是为了防止简单的DoS攻击,不能过分依靠它或者人为地减小这个值,更应该增加这个值(如果增加了内存之后)
net.ipv4.tcp_max_orphans = 3276800
#记 录的那些尚未收到客户端确认信息的连接请求的最大值。
net.ipv4.tcp_max_syn_backlog = 32768
#表示系统同时保持TIME_WAIT套接字的最大数量
net.ipv4.tcp_max_tw_buckets = 6000
#1st低于此值,TCP没有内存压力,2nd进入内存压力阶段,3rdTCP拒绝分配socket(单位:内存页)
net.ipv4.tcp_mem = 262144 786432 1048576
#最大socket读buffer(单位:字节)
net.ipv4.tcp_rmem_max = 1048576
#最大socket写buffer(单位:字节)
net.ipv4.tcp_wmem_max = 1048576
#TCP读buffer
net.ipv4.tcp_rmem = 4096 131072 1048576
#TCP写buffer
net.ipv4.tcp_wmem = 4096 131072 1048576
#开启有选择的应答
net.ipv4.tcp_sack = 1
#定义SYN重试次数
net.ipv4.tcp_syn_retries = 3
net.ipv4.tcp_synack_retries = 3
#开启SYN COOKIES功能
net.ipv4.tcp_syncookies = 1
#关闭时间戳功能
net.ipv4.tcp_timestamps = 0
#开启TCP连接复用功能,允许将time_wait sockets重新用于新的TCP连接(主要针对time_wait连接)
net.ipv4.tcp_tw_reuse = 1
#开启TCP连接中time_wait sockets的快速回收
net.ipv4.tcp_tw_recycle = 1
#支持更大的TCP窗口. 如果TCP窗口最大超过65535(64K), 必须设置该数值为1
net.ipv4.tcp_window_scaling = 1

2014-05-04
发表者 Venus
暂无评论

在WindowsServer2008R2中做iSCSI存储服务器

Windows Storage Server 2008是Windows Server 2008系列中的存储服务器版本,
是企业级的文件服务器平台,支持多Administrator文件存储相关的优化特性、副本管理,以及iSCSI功能。
简单来说,就是可以在普通的服务器上,安装上WSS2008,可以作为iSCSI存储服务器来说。而在以前,存储服务器的硬件、软件成本都比较昂贵,有了WSS2008,构建低成本、易于管理的存储服务器成为可能。

首先下载:Windows_Storage_Server_2008_R2.iso
在微软官网没找到下载地址,从百度网盘找到个资源,不确定安全性是否可靠。
可以直接在百度搜索 Windows_Storage_Server_2008_R2.iso 找到下载地址。

下载:iscsiTarget
版本: 3.3.16567 #目前微软官方最新
下载地址:http://download.microsoft.com/download/2/F/1/2F110B9C-6CB0-45F1-971B-4BA37395D820/iscsiTargetqfe6.exe

这个Windows_Storage_Server_2008_R2 看资料说是在server 2008 R2上打的补丁,然后系统版本就变为storage server 2008 R2 。
我这里系统为Server 2008 R2 enterprise ,在此基于安装storage server。
挂载下载的镜像或直接解压,打开文件夹下的Windows Storage Server 2008 R2目录,直接双击Windows6.1-KB982050-x64-EnterpriseBranding.MSU安装。
然后查看系统版本就变为storage server。下载iscsiTarget,解压,到x64目录下安装iscsitarget_public.msi即可。
安装过程为英文,完成后,从 管理工具 中找到 Microsoft iSCSI Software Target 运行后就是中文了。
安装过程中提示下载补丁,补丁已经包含在iso镜像中。直接点击确定即可。

从 管理工具 中找到 Microsoft iSCSI Software Target 开始配置iscsi存储服务器:

在iSCSI目标上“右键”,选择“创建iscsi目标”

点击“下一步”

iSCSI目标名称及描述可以自定义为自己的。

设置发起程序标示符,这里我是提供给内网的客户端使用,所以用客户端的ip来设定标识。也可以用发起端的名称。

创建虚拟磁盘

下一步

指定虚拟磁盘文件路径,这里我是测试用,只有一个分区,所以放到了c盘,实际环境中放到单独的一个分区中,而且服务器最好是做raid保护。

设定大小,这里给了10G。

描述可自行修改,继续下一步,完成。

回到windows客户端,我这里全部为win7系统,从 管理工具 找到 iSCSI 发起程序,在“目标”选项卡中,目标,写入服务器ip地址,点击快速连接。

点击“完成”即可。到磁盘管理中可以看到。

提示需要初始化磁盘,然后格式化即可。

扩展虚拟磁盘:

如果说客户端磁盘不够用的,可以在Microsoft iSCSI Software Target中扩大虚拟磁盘容量。

选择“设备”找到客户端所使用的虚拟磁盘,右键,扩展虚拟磁盘,根据提示,设置扩大多少容量。比如我这里再给10G。根据提示,完成。

磁盘管理-右键-刷新,可以看到新添加的10G磁盘。

可以通过“扩展卷”,将新分配的10G磁盘扩展到已有的分区中。根据提示操作即可。这样虚拟磁盘扩容完成。

快照功能:

在“设备”-虚拟磁盘-右键-创建快照。

在“快照”-活动快照,中可以看到创建的快照。

现在在iscsi目标中的iscsi-01中删除虚拟磁盘1。右键,选择“从iscsi目标删除虚拟磁盘”。

从活动快照,虚拟磁盘1,右键,回滚到快照。

然后从iscsi目标中,选择“向iscsi目标添加现有虚拟磁盘”。即可。

这里我在快照之前在磁盘中创建了一个文件夹test,一个文本文档test.txt,快照之后创建了一个test2.txt,回滚快照,发现test2没有了,说明快照生效。

2014-05-02
发表者 Venus
暂无评论

centos6.5下yum安装mariadb

从https://downloads.mariadb.org/mariadb/repositories/找到你的系统版本
并且可以选择数据库版本。
一般平常用的版本,rhel5/6、centos5/6
我这里选择MariaDB5.5,以下是centos6.5_x64的yum仓库信息:
# MariaDB 5.5 CentOS repository list - created 2014-05-02 10:28 UTC
# http://mariadb.org/mariadb/repositories/
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/5.5/centos6-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

保存为MariaDB.repo放到/etc/yum.repos.d/下。
安装:
[root@centos-6.5-x64 ~]#yum install -y MariaDB-server MariaDB-client
[root@centos-6.5-x64 ~]#service mysql start #是mysql不是mysqld
[root@centos-6.5-x64 ~]#lsof -i:3306
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
mysqld 4347 mysql 14u IPv4 17716 0t0 TCP *:mysql (LISTEN)
其它操作跟mysql一样。

修改MariaDB数据库编码:
MariaDB [(none)]> show variables like "chara%";
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.12 sec)

先看下配置文件:
[root@centos-6.5-x64 ~]#cat /etc/my.cnf | grep -v "^$" | grep -v "#"
[client-server]
!includedir /etc/my.cnf.d
发现从/etc/my.cnf.d配置目录下加载所有文件。
[root@centos-6.5-x64 ~]#vi /etc/my.cnf.d/server.cnf
在[mysqld]段添加
character_set_server = utf8

以前是default-character-set现在在MariaDB不同于mysql。
重启mysql服务。
MariaDB [(none)]> show variables like "chara%";
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.28 sec)

2014-04-30
发表者 Venus
暂无评论

memcached+magent代理

之前说过通过repcached解决单点故障,还有一种方法是通过”代理”实现。这就是magent。
个人理解magent类似mysql proxy 。

最新版本        :http://code.google.com/p/memagent/
当前最新版本:http://memagent.googlecode.com/files/magent-0.6.tar.gz

系统信息:
memcached_s1      centos6.5_x64 ip:192.168.0.75
memcached_s2      centos6.5_x64 ip:192.168.0.76
memcached_bak   centos6.5_x64 ip:192.168.0.82
magent_proxy       centos6.5_x64 ip:192.168.0.77
selinux关闭,iptables关闭
memcached_s1、memcached_s2、memcached_bak配置安装memcached,过程略。
安装可参考:https://www.rootop.org/pages/1656.html

在magent_proxy上安装magent:

[root@localhost ~]# wget -c http://memagent.googlecode.com/files/magent-0.6.tar.gz
[root@localhost ~]# tar zxvf magent-0.6.tar.gz
[root@localhost ~]# mkdir magent
[root@localhost ~]# tar zxvf magent-0.6.tar.gz -C magent
[root@localhost ~]# cd magent

[root@localhost magent]# make
gcc -Wall -g -O2 -I/usr/local/include -m64 -c -o magent.o magent.c
magent.c: 在函数‘writev_list’中:
magent.c:729: 错误:‘SSIZE_MAX’未声明(在此函数内第一次使用)
magent.c:729: 错误:(即使在一个函数内多次出现,每个未声明的标识符在其
magent.c:729: 错误:所在的函数内也只报告一次。)
make: *** [magent.o] 错误 1
在make时得到一个报错,解决方法:
修改 ketama.h 文件,在头部加入3行

#ifndef SSIZE_MAX
#define SSIZE_MAX 32767
#endif

继续make,又得到一个错误:
gcc: /usr/lib64/libm.a:没有那个文件或目录
解决方法:
[root@localhost magent]# yum install -y glibc-devel
[root@localhost magent]# cp /usr/lib64/libm.so /usr/lib64/libm.a

继续make,又得到一个错误:
(.text+0x439): undefined reference to `clock_gettime’
/usr/lib64/libevent.a(event.o): In function `event_base_new’:
(.text+0x6fa): undefined reference to `clock_gettime’
collect2: ld 返回 1
make: *** [magent] 错误 1

解决方法:
编辑Makefile

CFLAGS = -Wall -g -O2 -I/usr/local/include $(M64)
修改为
CFLAGS = -lrt -Wall -g -O2 -I/usr/local/include $(M64)

继续make
[root@localhost magent]# make
gcc -lrt -Wall -g -O2 -I/usr/local/include -m64 -o magent magent.o ketama.o /usr/lib64/libevent.a /usr/lib64/libm.a
[root@localhost magent]# ll
总用量 336
-rw-rw-r–. 1 500 502 12822 4月 10 2010 ketama.c
-rw-rw-r–. 1 500 502 388 4月 30 09:26 ketama.h
-rw-r–r–. 1 root root 23616 4月 30 09:28 ketama.o
-rwxr-xr-x. 1 root root 121684 4月 30 09:35 magent
-rw-rw-r–. 1 500 502 54813 4月 15 2010 magent.c
-rw-r–r–. 1 root root 111544 4月 30 09:28 magent.o
-rw-rw-r–. 1 500 502 506 4月 30 09:35 Makefile
[root@localhost magent]# cp magent /usr/bin/
终于完成(至于这么多问题,是代码bug么)。

在三台memcached中启动memcached服务:
在magent中启动服务:
先看一下参数
[root@localhost ~]# magent
please provide -s “ip:port” argument

memcached agent v0.6 Build-Date: Apr 30 2014 09:28:13
Usage:
-h this message
-u uid
-g gid
-p port, default is 11211. (0 to disable tcp support)
-s ip:port, set memcached server ip and port
-b ip:port, set backup memcached server ip and port
-l ip, local bind ip address, default is 0.0.0.0
-n number, set max connections, default is 4096
-D don’t go to background
-k use ketama key allocation algorithm
-f file, unix socket path to listen on. default is off
-i number, set max keep alive connections for one memcached server, default is 20
-v verbose

[root@localhost ~]# magent -u root -n 65535 -p 11211 -s 192.168.0.75:11211 -s 192.168.0.76:11211 -b 192.168.0.82:11211
[root@localhost ~]# lsof -i:11211
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
magent 1832 root 3u IPv4 15131 0t0 TCP *:memcache (LISTEN)

测试:
连接magent,插入数据,根据算法数据会分别插入到s1、s2,全部写入到bak中,当s1和s2宕机时,数据从bak中查询。
C:\Users\Administrator>telnet 192.168.0.77 11211
stats
memcached agent v0.6
matrix 1 -> 192.168.0.75:11211, pool size 0
matrix 2 -> 192.168.0.76:11211, pool size 0
END
get key1
END
set key1 0 0 5
aaaaa
STORED
set key2 0 0 5
bbbbb
STORED

在s1上取数据(只能取一个):
get key2
VALUE key2 0 5
bbbbb
END
在s2上取数据(只能取一个):
get key1
VALUE key1 0 5
aaaaa
END

在bak上取数据(会取出所有):
get key1
VALUE key1 0 5
aaaaa
END
get key2
VALUE key2 0 5
bbbbb
END

在magent取数据(会取出所有):
get key1
VALUE key1 0 5
aaaaa
END
get key2
VALUE key2 0 5
bbbbb
END

2014-04-30
发表者 Venus
暂无评论

memcached+repcached复制解决单点故障

用memcached做session共享或其它服务时会存在memcached的单点故障,如果memcached宕机,那么整个系统用户无法登陆(session)。
基于这种情况,采用repcached做memcached的主从冗余。

repcached实现了memcached复制的功能,它是一个单master单slave的方案,但master/slave都是可读写的,而且可以相互同步,如果master坏掉slave侦测到连接断了,它会自动listen而成为master;而如果slave坏掉,master也会侦测到连接断,它就会重新listen等待新的slave加入。

repcached最新下载地址:http://sourceforge.net/projects/repcached/files/repcached
有两种方式,一种通过打补丁形式,另一种直接安装融合版的memcached。这里选择第二种。
http://jaist.dl.sourceforge.net/project/repcached/repcached/2.2.1-1.2.8/memcached-1.2.8-repcached-2.2.1.tar.gz

系统信息:
memcached-master redhat5.5_x64 ip:192.168.1.20
memcached-slave    redhat5.5_x64 ip:192.168.1.21

先安装libevent:

[root@localhost ~]# wget -c https://github.com/downloads/libevent/libevent/libevent-2.0.21-stable.tar.gz --no-check-certificate
[root@localhost ~]# tar zxvf libevent-2.0.21-stable.tar.gz
[root@localhost ~]# cd libevent-2.0.21-stable
[root@localhost libevent-2.0.21-stable]# ./configure --prefix=/usr/
[root@localhost libevent-2.0.21-stable]# make && make install

安装memcached-repcached

[root@localhost ~]# wget -c http://jaist.dl.sourceforge.net/project/repcached/repcached/2.2.1-1.2.8/memcached-1.2.8-repcached-2.2.1.tar.gz
[root@localhost ~]# tar zxvf memcached-1.2.8-repcached-2.2.1.tar.gz
[root@localhost ~]# cd memcached-1.2.8-repcached-2.2.1
[root@localhost memcached-1.2.8-repcached-2.2.1]# ./configure --prefix=/usr/local/memcached --enable-replication

下一步在make的时候得到一个错误:
make[2]: Entering directory `/root/memcached-1.2.8-repcached-2.2.1′
gcc -DHAVE_CONFIG_H -I. -DNDEBUG -g -O2 -MT memcached-memcached.o -MD -MP -MF .deps/memcached-memcached.Tpo -c -o memcached-memcached.o `test -f ‘memcached.c’ || echo ‘./’`memcached.c
memcached.c: In function ‘add_iov’:
memcached.c:697: 错误:‘IOV_MAX’ 未声明 (在此函数内第一次使用)
memcached.c:697: 错误:(即使在一个函数内多次出现,每个未声明的标识符在其
memcached.c:697: 错误:所在的函数内只报告一次。)
make[2]: *** [memcached-memcached.o] 错误 1
make[2]: Leaving directory `/root/memcached-1.2.8-repcached-2.2.1′
make[1]: *** [all-recursive] 错误 1
make[1]: Leaving directory `/root/memcached-1.2.8-repcached-2.2.1′
make: *** [all] 错误 2

解决方法:
[root@localhost memcached-1.2.8-repcached-2.2.1]# vi memcached.c

#ifdef HAVE_MALLOC_H
/* OpenBSD has a malloc.h, but warns to use stdlib.h instead */
#ifndef __OpenBSD__
#include <malloc.h>
#endif
#endif
修改为:
/* FreeBSD 4.x doesn't have IOV_MAX exposed. */
#ifndef IOV_MAX
# define IOV_MAX 1024
#endif

继续make:
[root@localhost memcached-1.2.8-repcached-2.2.1]# make && make install

在另一个机器中安装同上。过程略。

这里提示一下,默认memcached单个进程只支持到2G内存,需要更大内存支持的话,需要打开64位支持,编译的时候加参数:

--enable-64bit

启动master:
[root@localhost ~]# /usr/local/memcached/bin/memcached -v -u root -d -x 192.168.1.21
#192.168.1.21,与slave同步地址

启动slave:
[root@localhost ~]# /usr/local/memcached/bin/memcached -v -u root -d -x 192.168.1.20
#-x设置从哪个IP上进行同步 -X 指定数据同步的端口
memcached默认服务端口是11211,默认同步监听端口是11212

测试:
在master创建数据
C:\Users\Administrator>telnet 192.168.0.20 11211 #登陆master创建key1数据
get key1
END
set key1 0 0 2
aa
STORED
quit

遗失对主机的连接。

C:\Users\Administrator>telnet 192.168.0.21 11211 #登陆slave查看是否同步过来key1数据
get key1
VALUE key1 0 2
aa
END
quit

遗失对主机的连接。

在slave创建数据
C:\Users\Administrator>telnet 192.168.0.21 11211 #登陆slave创建key2数据
get key2
END
set key2 0 0 3
bb
STORED
quit

遗失对主机的连接。

C:\Users\Administrator>telnet 192.168.0.20 11211 #登陆master查看是否同步过来key2数据
VALUE key2 0 2
bb
END
quit

遗失对主机的连接。

然后配置上keepalived就可以作为高可用了。
这里注意在使用了keepalived时,启动memcached的时候不要加-l参数指定监听地址,否则keepalived无法监听VIP的地址。

本文适用于oper搭建环境测试,对于开发者来说没有什么作用。dever勿喷···