关于 九月, 2012 的文章

MongoDB主从复制与副本集群实践

参考资料:
http://www.cnblogs.com/huangxincheng/archive/2012/03/04/2379755.html
http://blog.sina.com.cn/s/blog_a34f10a4010113df.html

一、部署主从复制

1、主服务器和从服务器必须开启安全认证:--auth
2、主服务器和从服务器的admin数据库中必须有全局用户。
3、主服务器的local数据库和从服务器的local数据均有名为repl且密码相同的用户名。

主服务器设置:
dongguo@mongodb:~$ mongo

MongoDB shell version: 2.2.0
connecting to: test
> use admin
switched to db admin
> db.addUser('rootm','rootm')
{
	"user" : "rootm",
	"readOnly" : false,
	"pwd" : "aa6526e3b7cbcecc18b2bd822f7c3547",
	"_id" : ObjectId("50659e14d2fe6be605337c18")
}
> db.addUser('repl','repl')
{
	"user" : "repl",
	"readOnly" : false,
	"pwd" : "c9f242649c23670ff94c4ca00ea06fe7",
	"_id" : ObjectId("5065a85eccf77b17681365b7")
}
> use cloud
switched to db cloud
> db.addUser('repl','repl')
{
	"_id" : ObjectId("5065a7cbb70f43c4d157e8ec"),
	"user" : "repl",
	"readOnly" : false,
	"pwd" : "c9f242649c23670ff94c4ca00ea06fe7"
}
> use local
switched to db local
> db.addUser('repl','repl')
{
	"user" : "repl",
	"readOnly" : false,
	"pwd" : "c9f242649c23670ff94c4ca00ea06fe7",
	"_id" : ObjectId("50659e2cd2fe6be605337c19")
}
> exit
bye

dongguo@mongodb:~$ sudo /etc/init.d/mongod stop

dongguo@mongodb:~$ sudo vim /opt/mongodb/etc/mongod.conf
修改如下设置:

master = true
auth = true

阅读全文 »

,

No Comments

安装配置RockMongo图形化管理工具

安装配置RockMongo图形化管理工具

$ sudo apt-get install apache2 php5 php5-dev dh-make-php

$ wget http://rock-php.googlecode.com/files/rockmongo-v1.1.2.zip
$ unzip rockmongo-v1.1.2.zip

$ sudo mv rockmongo /var/www/
$ sudo chown -R www-data:www-data /var/www/

$ sudo pecl install -f mongo 2.2.0

配置php.ini:
$ sudo vim /etc/php5/apache2/php.ini
extension_dir = "/usr/lib/php5/20090626"
extension = "mongo.so"

$ sudo /etc/init.d/apache2 restart

访问:http://10.6.1.145/rockmongo/
默认的账号与密码:admin/admin
登陆后如下图所示:

阅读全文 »

,

No Comments

安装配置MongoDB

参考资料:
http://blog.izhoufeng.com/posts/205.html

1. Mongodb介绍
1.1 MongoDB (名称来自”humongous”) 是一个可扩展的,高性能,开源,模式自由,面向文档的数据库,使用C++编写;以下是MongoDB特点:
1.1.1 面向集合的存储:适合存储对象及JSON形式的数据。
1.1.2 动态查询:Mongo支持丰富的查询表达式。查询指令使用JSON形式的标记,可轻易查询文档中内嵌的对象及数组。
1.1.3 完整的索引支持:包括文档内嵌对象及数组。Mongo的查询优化器会分析查询表达式,并生成一个高效的查询计划。
1.1.4 查询监视:Mongo包含一个监视工具用于分析数据库操作的性能。
1.1.5 复制及自动故障转移:Mongo数据库支持服务器之间的数据复制,支持主-从模式及服务器之间的相互复制。复制的主要目标是提供冗余及自动故障转移。
1.1.6 高效的传统存储方式:支持二进制数据及大型对象(如照片或图片)。
1.1.7 自动分片以支持云级别的伸缩性:自动分片功能支持水平的数据库集群,可动态添加额外的机器。

1.2 MongoDB的主要目标是在键/值存储方式(提供了高性能和高度伸缩性)以及传统的RDBMS系统(丰富的功能)架起一座桥梁,集两者的优势于一身。根据官方网站的描述,Mongo适合用于以下场景:
1.2.1 网站数据:Mongo非常适合实时的插入,更新与查询,并具备网站实时数据存储所需的复制及高度伸缩性。
1.2.2 缓存:由于性能很高,Mongo也适合作为信息基础设施的缓存层。在系统重启之后,由Mongo搭建的持久化缓存层可以避免下层的数据源过载。
1.2.3 大尺寸,低价值的数据:使用传统的关系型数据库存储一些数据时可能会比较昂贵,在此之前,很多时候程序员往往会选择传统的文件进行存储。
1.2.4 高伸缩性的场景:Mongo非常适合由数十或数百台服务器组成的数据库。Mongo的路线图中已经包含对MapReduce引擎的内置支持。
1.2.5 用于对象及JSON数据的存储:Mongo的BSON数据格式非常适合文档化格式的存储及查询。

1.3 自然,MongoDB的使用也会有一些限制,例如它不适合:
1.3.1 高度事务性的系统:例如银行或会计系统。传统的关系型数据库更适用于需要大量原子性复杂事务的应用程序。
1.3.2 传统的商业智能应用:针对特定问题的BI数据库会对产生高度优化的查询方式,数据仓库可能是更合适的选择。
1.3.3 需要SQL的问题。

2. Mongodb安装部署
2.1 建立数据目录和日志目录
$ sudo mkdir -p /opt/mongodb/data
$ sudo mkdir -p /opt/mongodb/log
$ sudo mkdir -p /opt/mongodb/etc
$ sudo mkdir -p /opt/mongodb/run

2.2 下载压缩包
$ wget http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-2.2.0.tgz

2.3 解压缩文件后不用安装
$ tar xzvf mongodb-linux-x86_64-2.2.0.tgz
$ sudo mv mongodb-linux-x86_64-2.2.0/bin /opt/mongodb/

2.4 查看命令help
$ /opt/mongodb/bin/mongod --help
以下是部分参数的解释:
阅读全文 »

2 Comments

通过Keepalived实现Redis Failover自动故障切换功能[实践分享]

参考资料:
http://patrick-tang.blogspot.com/2012/06/redis-keepalived-failover-system.html
http://deidara.blog.51cto.com/400447/302402

背景介绍:
目前,Redis还没有一个类似于MySQL Proxy或Oracle RAC的官方HA方案。
Redis作者有一个名为Redis Sentinel的计划(http://redis.io/topics/sentinel),据称将会有监控,报警和自动故障转移三大功能,非常不错。
但可惜的是短期内恐怕还不能开发完成。

因此,如何在出现故障时自动转移是一个需要解决的问题。

通过对网上一些资料的搜索,有建议采用HAProxy或Keepalived来实现的,事实上如果是做Failover而非负载均衡的话,Keepalived的效率肯定是超过HAProxy的,所以我决定采用Keepalived的方案。

环境介绍:
Master: 10.6.1.143
Slave: 10.6.1.144
Virtural IP Address (VIP): 10.6.1.200

设计思路:
当 Master 与 Slave 均运作正常时, Master负责服务,Slave负责Standby;
当 Master 挂掉,Slave 正常时, Slave接管服务,同时关闭主从复制功能;
当 Master 恢复正常,则从Slave同步数据,同步数据之后关闭主从复制功能,恢复Master身份,于此同时Slave等待Master同步数据完成之后,恢复Slave身份。
然后依次循环。

需要注意的是,这样做需要在Master与Slave上都开启本地化策略,否则在互相自动切换的过程中,未开启本地化的一方会将另一方的数据清空,造成数据完全丢失。

下面,是具体的实施步骤:

在Master和Slave上安装Keepalived
$ sudo apt-get install keepalived

修改Master和Slave的/etc/hosts文件
$ sudo vim /etc/hosts

127.0.0.1	localhost
10.6.1.143	redis
10.6.1.144	redis-slave

默认安装完成keepalived之后是没有配置文件的,因此我们需要手动创建:

首先,在Master上创建如下配置文件:
$ sudo vim /etc/keepalived/keepalived.conf

vrrp_script chk_redis { 
                script "/etc/keepalived/scripts/redis_check.sh"   ###监控脚本 
                interval 2                                        ###监控时间 
} 
vrrp_instance VI_1 { 
        state MASTER                            ###设置为MASTER
        interface eth0                          ###监控网卡    
        virtual_router_id 51
        priority 101                            ###权重值
        authentication { 
                     auth_type PASS             ###加密 
                     auth_pass redis            ###密码 
        } 
        track_script { 
                chk_redis                       ###执行上面定义的chk_redis
        } 
        virtual_ipaddress { 
             10.6.1.200                         ###VIP 
        }
        notify_master /etc/keepalived/scripts/redis_master.sh
        notify_backup /etc/keepalived/scripts/redis_backup.sh
        notify_fault  /etc/keepalived/scripts/redis_fault.sh
        notify_stop   /etc/keepalived/scripts/redis_stop.sh 
} 

然后,在Slave上创建如下配置文件:
$ sudo vim /etc/keepalived/keepalived.conf

vrrp_script chk_redis { 
                script "/etc/keepalived/scripts/redis_check.sh"   ###监控脚本 
                interval 2                                        ###监控时间 
} 
vrrp_instance VI_1 { 
        state BACKUP                                ###设置为BACKUP 
        interface eth0                              ###监控网卡
        virtual_router_id 51 
        priority 100                                ###比MASTRE权重值低 
        authentication { 
                     auth_type PASS 
                     auth_pass redis                ###密码与MASTRE相同
        } 
        track_script { 
                chk_redis                       ###执行上面定义的chk_redis
        } 
        virtual_ipaddress { 
             10.6.1.200                         ###VIP 
        } 
        notify_master /etc/keepalived/scripts/redis_master.sh
        notify_backup /etc/keepalived/scripts/redis_backup.sh
        notify_fault  /etc/keepalived/scripts/redis_fault.sh
        notify_stop   /etc/keepalived/scripts/redis_stop.sh 
}

阅读全文 »

, ,

34 Comments

在Ubuntu上安装phpRedisAdmin图形化管理工具

参考文章:http://hkjacob.iteye.com/blog/1610348

phpRedisAdmin类似于phpMyAdmin一样,不过是针对Redis开发的,实现一个WEB界面的可视化管理。
适合于初学的时候来用一用,线上的话建议不使用,一方面没必要,另一方面因为Redis中一般都是存储海量数据,phpRedisAdmin在加载这些数据的时候还会耗费大量的资源,得不偿失。

安装Apache与PHP环境
$ sudo apt-get install apache2 php5 php5-dev

安装phpRedis模块
$ wget --no-check-certificate http://github.com/owlient/phpredis/tarball/master -O phpredis.tar.gz
$ tar zxvf phpredis.tar.gz
$ cd owlient-phpredis-90ecd17
$ phpize
$ ./configure
$ make
$ sudo make install

将显示如下信息:
Libraries have been installed in:
/home/dongguo/owlient-phpredis-90ecd17/modules

配置php.ini:
$ sudo vim /etc/php5/apache2/php.ini
extension_dir = "/usr/lib64/php5/20090626"
extension=redis.so

下载phpredisadmin

打开网站 https://github.com/ErikDubbelboer/phpRedisAdmin/downloads
点击按钮 “Download as tar.gz” 下载
下载完成后解压软件包
$ tar xzvf ErikDubbelboer-phpRedisAdmin-2a08ac9.tar.gz

解压后移到html目录下
$ sudo mv ErikDubbelboer-phpRedisAdmin-2a08ac9 /var/www/phpRedisAdmin
$ sudo chown -R www-data:www-data /var/www/phpRedisAdmin/

打开网站https://github.com/nrk/predis/downloads
点击按钮 “Download as tar.gz” 下载
下载完成后解压软件包
$ tar xzvf nrk-predis-v0.7.3-5-g5859578.tar.gz
$ sudo mv nrk-predis-5859578/* /var/www/phpRedisAdmin/predis/
$ sudo chown -R www-data:www-data /var/www/phpRedisAdmin/

$ sudo /etc/init.d/apache2 start

输入http://10.6.1.141/phpRedisAdmin/即可访问

如下图所示:

No Comments

Redis持久化实践及灾难恢复模拟

参考资料:
Redis Persistence http://redis.io/topics/persistence
Google Groups https://groups.google.com/forum/?fromgroups=#!forum/redis-db

一、对Redis持久化的探讨与理解

目前Redis持久化的方式有两种: RDB 和 AOF

首先,我们应该明确持久化的数据有什么用,答案是用于重启后的数据恢复。
Redis是一个内存数据库,无论是RDB还是AOF,都只是其保证数据恢复的措施。
所以Redis在利用RDB和AOF进行恢复的时候,都会读取RDB或AOF文件,重新加载到内存中。

RDB就是Snapshot快照存储,是默认的持久化方式。
可理解为半持久化模式,即按照一定的策略周期性的将数据保存到磁盘。
对应产生的数据文件为dump.rdb,通过配置文件中的save参数来定义快照的周期。
下面是默认的快照设置:

save 900 1    #当有一条Keys数据被改变时,900秒刷新到Disk一次
save 300 10   #当有10条Keys数据被改变时,300秒刷新到Disk一次
save 60 10000 #当有10000条Keys数据被改变时,60秒刷新到Disk一次

Redis的RDB文件不会坏掉,因为其写操作是在一个新进程中进行的。
当生成一个新的RDB文件时,Redis生成的子进程会先将数据写到一个临时文件中,然后通过原子性rename系统调用将临时文件重命名为RDB文件。
这样在任何时候出现故障,Redis的RDB文件都总是可用的。

同时,Redis的RDB文件也是Redis主从同步内部实现中的一环。
第一次Slave向Master同步的实现是:
Slave向Master发出同步请求,Master先dump出rdb文件,然后将rdb文件全量传输给slave,然后Master把缓存的命令转发给Slave,初次同步完成。
第二次以及以后的同步实现是:
Master将变量的快照直接实时依次发送给各个Slave。
但不管什么原因导致Slave和Master断开重连都会重复以上两个步骤的过程。
Redis的主从复制是建立在内存快照的持久化基础上的,只要有Slave就一定会有内存快照发生。
阅读全文 »

7 Comments

内存优化之Redis数据结构的设计优化实践[原创分享]

参考资料:
http://www.mysqlops.com/2011/09/06/redis-kv-design.html
http://blog.nosqlfan.com/html/3379.html

通过对文章《节约内存:Instagram的Redis实践》的阅读之后,感觉受益不少。
在文章中,Instagram 通过对数据结构的设计优化,使内存从之前的21GB逐步降低到15GB,5GB最后到达了3GB,效果非常显著。

因此自己打算在测试环境中模拟其思路,通过实践加深理解并得出一些真实的数据。

首先,需要生成一些数据,为了方便理解,我从本地CloudStack中的vm_instance表中取了一些数据。
下面我们来看一个关系型数据库的设计:

mysql> select id,instance_name,private_ip_address,uuid,created from vm_instance;
+----+---------------+--------------------+--------------------------------------+---------------------+
| id | instance_name | private_ip_address | uuid                                 | created             |
+----+---------------+--------------------+--------------------------------------+---------------------+
|  1 | s-1-VM        | 10.6.59.6          | 8c252255-82b8-4934-830e-0573cc9e0a1c | 2012-05-27 04:06:54 |
|  2 | v-2-VM        | 10.6.88.209        | 1aae6ab9-73cb-46e3-aafb-985f6a143a08 | 2012-05-27 04:06:54 |
|  4 | r-4-VM        | 169.254.1.42       | 5520f0e9-4c5a-4599-be5c-0ea74b59d6dd | 2012-05-27 10:45:42 |
|  5 | i-2-5-VM      | 10.6.8.55          | 2191b464-58be-423d-9863-ce9c0397fc67 | 2012-05-27 11:10:06 |
|  6 | i-2-6-VM      | 10.6.8.56          | c5be506a-aaae-475a-beb7-e6af2a33c8d3 | 2012-05-28 02:07:55 |

下面我们采用Redis作为数据库,首先需要将关系型数据转化为Key/Value数据。
可采用如下的方式来实现:
Key --> 表名:主键值:列名
Value --> 列值

使用冒号作为分隔符,目前算是一个不成文的规矩。例如工具php-admin for redis就是默认以冒号分割的。
下面我以前五行数据为例,数据转化的命令如下:
阅读全文 »

1 Comment

一次Hadoop服务器进程挂掉的原因分析

今天早上,收到Zabbix的报警,hadoop-new-5的三个进程datanode,tasktracker和hbase都挂掉了。
于是登陆到该服务器,首先Copy log,然后启动服务。
接着对log进行查看,发现三个进程都是在服务器时间18:47分左右挂掉的,而log文件中都是在没有关联的ERROR与WARN的情况下突然中止的。
因此在log中并未找到原因,于是查看Zabbix中服务器的资源情况统计,发现内存比较吃紧,最低的时候Free memory不足18M,不过目前其它几个Hadoop服务器的内存情况也基本一致。

于是查看系统日志,发现了对应的线索。
# dmesg | grep java

由于JVM的Out of memory 导致了操作系统执行kill指令杀掉了所有Java进程。
===========

[8288555.635268] Out of memory: kill process 1533 (java) score 207630 or a child
[8288555.635288] Killed process 1533 (java) vsz:830520kB, anon-rss:318624kB, file-rss:4632kB
[8288555.889317] Killed process 14847 (java) vsz:1763768kB, anon-rss:565000kB, file-rss:4644kB
[8288555.924976] Killed process 15014 (java) vsz:1368968kB, anon-rss:123004kB, file-rss:4668kB
[8288556.044819] Out of memory: kill process 15301 (java) score 8269 or a child
[8288556.044833] Killed process 15301 (java) vsz:1455372kB, anon-rss:1115116kB, file-rss:4368kB
==========
于是,考虑是否能够通过JVM调优来做一些优化,目前服务器上总共有5个这样的java进程,每个进程仅设置了heap size,未作GC方面的调优。
# ps aux | grep java
java -Dproc_tasktracker -Xmx1000m -Dhadoop.log.dir=/usr/lib/hadoop-0.20/logs ... r org.apache.hadoop.mapred.TaskTracker

过去我有过与Redhat公司负责JBoss支持的工程师的网上直接交流(购买了RHN服务),得到过一些针对GC优化的建议,效果显著。
但在我查看了目前Hadoop服务器的CPU之后,感到有些无奈,目前的Hadoop服务器是单核CPU,而GC优化的核心思想是利用多核的特征实现并行GC。
因此在现有的服务器硬件条件上难以做好JVM的相关调优。
# cat /proc/cpuinfo
===========
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 44
model name : Intel(R) Xeon(R) CPU E5645 @ 2.40GHz

因此,针对目前的服务器情况,应该在适当的时候考虑将服务器升级到多核CPU版本,和增加更多的内存了。

, ,

No Comments

Redis的编译安装与配置

参考资料:
http://heyheymymy.net/python/install-redis-in-ubuntu-10-04
http://www.cnblogs.com/hb_cattle/archive/2011/10/22/2220907.html

Redis是一种高级key-value数据库。它跟memcached类似,不过数据可以持久化,而且支持的数据类型很丰富。有字符串,链表,集合和有序集合。支持在服务器端计算集合的并,交和补集(difference)等,还支持多种排序功能。所以Redis也可以被看成是一个数据结构服务器。
Redis的所有数据都是保存在内存中,然后不定期的通过异步方式保存到磁盘上(这称为“半持久化模式”);也可以把每一次数据变化都写入到一个append only file(aof)里面(这称为“全持久化模式”)。

1. 安装Redis Server
安装系统所需软件包
$ sudo apt-get install python-setuptools python-dev build-essential python-pip libcurl4-openssl-dev

安装libunwind库
$ wget http://download.savannah.gnu.org/releases/libunwind/libunwind-0.99-alpha.tar.gz
$ tar zxvf libunwind-0.99-alpha.tar.gz
$ cd libunwind-0.99-alpha/
$ CFLAGS=-fPIC ./configure
$ make CFLAGS=-fPIC
$ sudo make CFLAGS=-fPIC install

安装google-preftools
$ wget http://google-perftools.googlecode.com/files/google-perftools-1.8.1.tar.gz
$ tar zxvf google-perftools-1.8.1.tar.gz
$ cd google-perftools-1.8.1/
$ ./configure --disable-cpu-profiler --disable-heap-profiler --disable-heap-checker --disable-debugalloc --enable-minimal
$ sudo make && make install
$ sudo echo "/usr/local/lib" > /etc/ld.so.conf.d/usr_local_lib.conf
$ sudo /sbin/ldconfig

$ wget http://redis.googlecode.com/files/redis-2.4.17.tar.gz
$ tar xzf redis-2.4.17.tar.gz
$ cd redis-2.4.17
$ sudo mkdir -p /opt/redis
$ sudo make PREFIX=/opt/redis USE_TCMALLOC=yes install

$ sudo lsof -n | grep tcmalloc
redis-ser 31590 elton mem REG 8,3 1155539 4856411 /usr/local/lib/libtcmalloc_minimal.so.0.2.1

$ tree /opt/redis
/opt/redis
├── bin
├── redis-benchmark #性能测试工具,测试Redis在你的系统及你的配置下的读写性
├── redis-check-aof #更新日志检查
├── redis-check-dump #用于本地数据库检查
├── redis-cli #命令行操作工具
└── redis-server #Redis服务器的daemon启动程序

2. 创建服务管理脚本
$ sudo vim /etc/init.d/redis

#!/bin/sh

PATH="/opt/redis/bin:$PATH"
EXEC="/opt/redis/bin/redis-server"
CLIEXEC="/opt/redis/bin/redis-cli"
PIDFILE="/opt/redis/run/redis_6379.pid"
CONF="/opt/redis/etc/redis_6379.conf"
REDISPORT="6379"

case "$1" in
    start)
        if [ -f $$PIDFILE ]
        then
                echo "$PIDFILE exists, process is already running or crashed."
        else
                echo "Starting Redis server..."
                $EXEC $CONF
        fi
        ;;
    stop)
        if [ ! -f $PIDFILE ]
        then
                echo "$PIDFILE does not exist, process is not running."
        else
                PID=$(cat $PIDFILE)
                echo "Stopping ..."
                $CLIEXEC -p $REDISPORT shutdown
                while [ -x /proc/${PID} ]
                do
                    echo "Waiting for Redis to shutdown ..."
                    sleep 1
                done
                echo "Redis stopped."
        fi
        ;;
    *)    
        echo "Usage: $0 {start|stop}" >&2
        exit 1
        ;;
esac

3. 创建与修改配置文件
阅读全文 »

3 Comments

如何将Zabbix从1.8.x升级到2.0.x

最近在研究Zabbix的过程中,逐渐的喜欢上了这个工具,感觉集成的非常棒,完全可以替代Nagios+Cacti的组合。
今天下发布一篇关于Zabbix升级的文档,后面会根据自身的经验,图文并茂撰写一篇Zabbix从入门到熟悉的文章供大家参考。

本文参考资料:
http://www.zabbix.com/documentation/2.0/manual/installation/upgrade_notes
http://www.zabbix.com/documentation/2.0/manual/installation/upgrade?s[]=upgrade

文档内容应公司要求全部用英文来撰写了,不过相信大家阅读起来应该没有什么问题的。

Upgraded Zabbix from 1.8.2 to 2.0.2.

1. Stop Zabbix server
$ su - zabbix
$ sudo /etc/init.d/zabbix_server stop

2. Back up the existing Zabbix database
$ mkdir -p /home/zabbix/zabbix_upgrade/backup
$ cd /home/zabbix/zabbix_upgrade/backup
$ mysqldump -uroot -p123456 zabbix > zabbix.backup.sql

3. Back up configuration files, PHP files and zabbix binaries
$ cp -rp /etc/zabbix .
$ cp -rp /home/zabbix/public_html .
$ cp -rp /etc/init.d/zabbix-* .
$ cp -rp /usr/sbin/zabbix* .
$ cp -rp /usr/bin/zabbix* .

4. Install new server binaries
Download zabbix-2.0.2.tar.gz from website.
$ cd /home/zabbix/zabbix_upgrade/
$ tar xzvf zabbix-2.0.2.tar.gz
$ cd zabbix-2.0.2
$ ./configure --prefix=/usr --with-mysql --with-net-snmp --with-libcurl --enable-server --enable-agent
$ make
$ sudo make install
$ sudo zabbix_server --help
Zabbix server v2.0.2 (revision 29214) ...
阅读全文 »

1 Comment