关于 三月, 2012 的文章

通过集成APR提高tomcat处理静态资源的能力

参考资料:
http://www.javafans.org/article/81

Tomcat在处理静态资源上面有一定的能力缺陷,所以通常我们会通过Apache与Tomcat集成,让Apache处理所有的静态内容来进行优化。
但其实,我们可以直接使用tomcat的本地connector来解决这个问题。
APR(Apache portable Run-time libraries,Apache可移植运行库)是Apache提供的一组通用的JNI接口,通过本地化的方法来提高应用与系统的交互,比如磁盘io,网络io等。主要提高web容器(Tomcat,Jboss等)对静态文件的处理性能,同时也可以提升SSL的处理性能。

以下是具体的安装与配置过程:
关于Tomcat与JDK的安装过程,请参考这一篇文章:http://heylinux.com/archives/621.html

1. 安装apr
# wget http://labs.renren.com/apache-mirror//apr/apr-1.4.6.tar.gz
# tar xzvf apr-1.4.6.tar.gz
# cd apr-1.4.6
# ./configure --prefix=/opt/tomcat-6.0.29/apr
# make
# make install

2. 安装apr-util
# wget http://labs.renren.com/apache-mirror//apr/apr-util-1.4.1.tar.gz
# tar xzvf apr-util-1.4.1.tar.gz
# cd apr-util-1.4.1
# ./configure --prefix=/opt/tomcat-6.0.29/apr --with-apr=/opt/tomcat-6.0.29/apr
# make
# make install

3. 安装tomcat-native-connector
# wget http://labs.renren.com/apache-mirror//tomcat/tomcat-connectors/native/1.1.23/source/tomcat-native-1.1.23-src.tar.gz
# tar xzvf tomcat-native-1.1.23-src.tar.gz
# cd tomcat-native-1.1.23-src/jni/native
# ./configure --prefix=/opt/tomcat-6.0.29/apr --with-apr=/opt/tomcat-6.0.29/apr --with-java-home=/usr/java/jdk1.6.0_21
# make
# make install

# vim /opt/tomcat-6.0.29/bin/catalina.sh
在“OS specific support.”这一行之前增加以下配置:
---
CATALINA_OPTS="$CATALINA_OPTS -Djava.library.path=/opt/tomcat-6.0.29/apr/lib"
---

如果在log中能够看到以下类似的“Http11AprProtocol”与“AjpAprProtocol”的启动信息,则代表集成apr成功。
而此时,Tomcat对静态资源的处理能力已经得到了提升。

---
INFO: Deploying web application directory examples
Mar 28, 2012 3:40:32 PM org.apache.catalina.startup.HostConfig deployDirectory
INFO: Deploying web application directory docs
Mar 28, 2012 3:40:32 PM org.apache.coyote.http11.Http11AprProtocol start
INFO: Starting Coyote HTTP/1.1 on http-8080
Mar 28, 2012 3:40:32 PM org.apache.coyote.ajp.AjpAprProtocol start
INFO: Starting Coyote AJP/1.3 on ajp-8009
Mar 28, 2012 3:40:32 PM org.apache.catalina.startup.Catalina start
INFO: Server startup in 1440 ms
---

,

No Comments

Apache与Tomcat整合实现动静分离与负载均衡的配置实践

参考资料:
http://www.ibm.com/developerworks/cn/opensource/os-lo-apache-tomcat/

通常,将Apache与Tomcat整合主要出于以下几个原因
1. 提升对静态文件的处理性能,所有静态文件均由前端的Apache响应,其它与JSP相关的请求分发给后端的Tocmat处理;
2. 利用Apache服务器来做负载均衡以及容错,前端的Apache可作为一个负载均衡器,将请求分发给后端的多台Tomcat,当某一台Tomcat宕机时,可以将其暂时移出集群;
3. 无缝的升级应用程序,在对后端的多台Tomcat进行升级部署时,将其暂时移出集群来实现平滑升级。

而关于Apache与Tomcat整合,有3种方式可以实现:
1. mod_jk
mod_jk 是通过 AJP 协议与 Tomcat 服务器进行通讯的,Tomcat 默认的 AJP Connector 的端口是 8009。JK 本身提供了一个监控以及管理的页面jkstatus,通过 jkstatus 可以监控 JK 目前的工作状态以及对到 tomcat 的连接进行设置;

2. http_proxy
这是利用 Apache 自带的 mod_proxy 模块使用代理技术来连接Tomcat。在配置之前请确保是否使用的是 2.2.x 版本的 Apache 服务器。因为 2.2.x版本对这个模块进行了重写,大大的增强了其功能和稳定性。

3. ajp_proxy
ajp_proxy 连接方式其实跟 http_proxy 方式一样,也是由 mod_proxy 所提供的功能,但是通过 AJP 协议与 Tomcat 服务器进行通讯的,这一点又与mod_jk相同。

下面是具体的配置过程:
测试环境介绍:
Cluster:192.168.203.134
Tomcat Server:192.168.203.133
Tomcat Server:192.168.203.135
注:以下所有配置过程均在Cluster上完成。

1. 安装配置Apache
# wget http://apache.etoak.com//httpd/httpd-2.2.18.tar.bz2

# tar xjvf httpd-2.2.18.tar.bz2

# cd httpd-2.2.18
# ./configure --prefix=/opt/apache2 --enable-so --enable-dav --enable-dav-fs --enable-maintainer-mode --with-included-apr --enable-rewrite --enable-ssl --enable-proxy --enable-proxy-http

# make
# make install

创建apache用户
# useradd -M apache

修改apache配置文件,让它以用户apache身份运行
# vi /opt/apache2/conf/httpd.conf
============================
User apache
Group apache
============================

2. 通过 Apache mod_jk 方式实现与Tomcat整合
# wget http://labs.mop.com/apache-mirror//tomcat/tomcat-connectors/jk/tomcat-connectors-1.2.35-src.tar.gz
# tar xzvf tomcat-connectors-1.2.35-src.tar.gz
# cd tomcat-connectors-1.2.35-src/native
# ./configure --with-apxs=/opt/apache2/bin/apxs
# make
注:不需要执行make install的过程,仅需在编译后复制mod_jk.so文件

# cp ./apache-2.0/mod_jk.so /opt/apache2/modules/

# cd /opt/apache2/conf/
阅读全文 »

,

2 Comments

Nginx源码编译安装与负载均衡配置实践

参考文档:
http://blog.s135.com/post/306/
http://wangyan.org/blog/install-nginx-from-source.html

安装与配置实践:
1. 安装pcre库,使Nginx支持正则表达式
# wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.30.tar.gz
# tar -xzvf pcre-8.30.tar.gz
注:不需要执行编译和安装过程(系统通常已经安装有较低版本的RPM包),因此仅作为编译Nginx时的引用。

2. 安装zlib库
wget http://sourceforge.net/projects/libpng/files/zlib/1.2.6/zlib-1.2.6.tar.gz/download
tar -xzvf zlib-1.2.6.tar.gz
注:不需要执行编译和安装过程(系统通常已经安装有较低版本的RPM包),因此仅作为编译Nginx时的引用。

3. 编译安装Nginx
# wget http://nginx.org/download/nginx-1.1.9.tar.gz
# tar -xzvf nginx-1.1.9.tar.gz

# mkdir -p /opt/nginx/tmp
# mkdir -p /opt/nginx/run
# mkdir -p /opt/nginx/lock

# useradd nginx

# cd nginx-1.1.9
# ./configure --prefix=/opt/nginx \
--user=nginx \
--group=nginx \
--pid-path=/opt/nginx/run/nginx.pid \
--lock-path=/opt/nginx/lock/nginx.lock \
--with-http_ssl_module \
--with-http_dav_module \
--with-http_flv_module \
--with-http_realip_module \
--with-http_gzip_static_module \
--with-http_stub_status_module \
--with-mail \
--with-mail_ssl_module \
--with-pcre=../pcre-8.30 \
--with-zlib=../zlib-1.2.6 \
--with-debug \
--http-client-body-temp-path=/opt/nginx/tmp/client \
--http-proxy-temp-path=/opt/nginx/tmp/proxy \
--http-fastcgi-temp-path=/opt/nginx/tmp/fastcgi \
--http-uwsgi-temp-path=/opt/nginx/tmp/uwsgi \
--http-scgi-temp-path=/opt/nginx/tmp/scgi

参数详解:
--prefix #nginx安装目录,默认在/usr/local/nginx
--user=nginx #运行nginx的用户
--group=nginx #运行nginx的用户组
--pid-path #pid问件位置,默认在logs目录
--lock-path #lock问件位置,默认在logs目录
--with-http_ssl_module #开启HTTP SSL模块,以支持HTTPS请求。
--with-http_dav_module #开启WebDAV扩展动作模块,可为文件和目录指定权限
--with-http_flv_module #支持对FLV文件的拖动播放
--with-http_realip_module #支持显示真实来源IP地址
--with-http_gzip_static_module #预压缩文件传前检查,防止文件被重复压缩
--with-http_stub_status_module #取得一些nginx的运行状态
--with-mail #允许POP3/IMAP4/SMTP代理模块
--with-mail_ssl_module #允许POP3/IMAP/SMTP可以使用SSL/TLS
--with-pcre=../pcre-8.11 #指定未安装的pcre路径
--with-zlib=../zlib-1.2.5 #注意是未安装的zlib路径
--with-debug #允许调试日志
--http-client-body-temp-path #客户端请求临时文件路径
--http-proxy-temp-path #设置http proxy临时文件路径
--http-fastcgi-temp-path #设置http fastcgi临时文件路径
--http-uwsgi-temp-path #设置uwsgi 临时文件路径
--http-scgi-temp-path #设置scgi 临时文件路径

# make && make install

安装完成后会看到以下信息:
阅读全文 »

1 Comment

HAProxy源码编译安装与配置实践

参考资料:
http://blog.51yip.com/server/868.html
http://18567.blog.51cto.com/8567/665375

一,什么是haproxy
HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,其处理能力比Nginx弱一些,一般适用于访问量并发在1万以下的小型集群,自带的一些健康检查,session保留等功能非常实用。

二,安装haproxy
# wget http://haproxy.1wt.eu/download/1.4/src/haproxy-1.4.20.tar.gz
# tar zxvf haproxy-1.4.20.tar.gz
# cd haproxy-1.4.20
# uname -a //查看linux内核版本
# make TARGET=linux26 PREFIX=/opt/haproxy
# make install PREFIX=/opt/haproxy

三,配置haproxy
# mkdir -p /opt/haproxy/conf
# vim /opt/haproxy/conf/haproxy.conf

global
        maxconn 5120 #限制单个进程的最大连接数
        chroot /opt/haproxy
        uid 99 #所属运行用户,默认99为nobody
        gid 99 #所属运行用户组,默认99为nobody
        daemon #让进程作为守护进程在后台运行
        quiet
        nbproc 2 #指定作为守护进程运行时的进程数,推荐设置为与CPU核心数相同
        pidfile /opt/haproxy/run/haproxy.pid

defaults
        log     global
        mode    http
        option  httplog
        option  dontlognull #不记录空连接
        log 127.0.0.1 local3 info #日志级别[err warning info debug]
        retries 3 #设置在一个服务器上链接失败后的重连次数
        option redispatch #在连接失败或断开的情况下,允许当前会话被重新分发 
        maxconn 2000 #可被发送到后端服务器的最大并发连接数 
        contimeout      5000ms #设置等待连接到服务器成功的最大时间 
        clitimeout      50000ms #设置客户端的最大超时时间
        srvtimeout      50000ms #设置服务器端的最大超时时间

listen cluster 0.0.0.0:80 #运行的端口及主机名
       mode http #使用http的7层模式
       balance roundrobin #设置服务器负载分配算法
       option httpclose
       option forwardfor
       option httpchk GET /keepalive.html #健康检测页面
       server webapp1 192.168.203.134:80 weight 1 check inter 2000 rise 2 fall 3
       server webapp2 192.168.203.135:80 weight 1 check inter 2000 rise 2 fall 3
       server webapp3 192.168.203.136:80 weight 1 check inter 2000 rise 2 fall 3
       server webapp4 192.168.203.137:80 weight 1 check inter 2000 rise 2 fall 3
       # weight - 调节服务器的负重 
       # check - 允许对该服务器进行健康检查 
       # inter - 设置连续的两次健康检查之间的时间,单位为毫秒(ms),默认值 2000(ms) 
       # rise - 指定多少次连续成功的健康检查后,即可认定该服务器处于可操作状态,默认值 2 
       # fall - 指定多少次不成功的健康检查后,认为服务器为当掉状态,默认值 3 
       # maxconn - 指定可被发送到该服务器的最大并发连接数 

listen localhost 0.0.0.0:8888 #监控页面的端口
       mode http
       transparent
       stats refresh 30s #统计页面自动刷新时间
       stats uri /haproxy-stats #监控页面的访问地址
       stats realm Haproxy \ statistic #统计页面密码框上提示文本
       stats auth haproxyadmin:haproxypass #统计页面用户名和密码设置
       stats hide-version #隐藏统计页面上HAProxy的版本信息

阅读全文 »

3 Comments

利用hotcopy与svnsync实现SVN镜像的快速搭建

背景/需求:
在我的上一篇文章中,我详细介绍了如何实现SVN主从架构的方法;
但在实际的应用环境中,却面临着另一个难题,现有的主SVN服务器上的数据量太大,超过10G以上,而svnsync却需要先初始化一个空库,然后再从0开始一直同步到相同的版本;
而主从服务器之间存在的网络状况并不理想,因此需要耗费非常多的时间且很可能出现同步中断等不稳定的情况。

方案/设计:
转换一种思路,试想MySQL的复制过程与svnsync非常相似,但是MySQL就可以通过初次导入完整库的数据,然后再指定其Position的值来实现增量同步,从而完成整个主从的搭建;
那么,我们也可以试着用这样的方式来操作svnsync,通过hotcopy将整个SVN主库完整备份下来,再压缩打包后传送到从服务器上,解开之后,修改相关的配置文件使svnsync认为从服务器上的库已经是经过了初始化并同步过的,从而实现增量同步,快速完成整个主从的搭建。

配置过程:
1. 通过hotcopy将SVN主库进行一次完整备份 - Master
注:以下操作需要在Master上进行
# cd /data/svn_repo/
# /opt/subversion/bin/svnadmin hotcopy project1 /opt/backups/project1

# cd /opt/backups/
# tar cjvf project1-master.tar.bz2 project1/

2. 将备份文件传送到从服务器上 - Master

3. 在从服务器上创建一个空库 - Slave
注:以下操作需要在Slave上进行
# cd /data/svn_repo/
# /opt/subversion/bin/svnadmin create project1

# chown -R apache:apache project1/
# cd project1/hooks/
# cp -p pre-revprop-change.tmpl pre-revprop-change
# chmod +x pre-revprop-change

# vim pre-revprop-change
删除以下部分内容:

if [ "$ACTION" = "M" -a "$PROPNAME" = "svn:log" ]; then exit 0; fi

echo "Changing revision properties other than svn:log is prohibited" >&2
exit 1

4. 在主服务器上通过svnsync初始化仓库 - Master
注:以下操作需要在Master上进行
# /opt/subversion/bin/svnsync init http://slave.heylinux.com/svn-proxy-sync/project1 file:///data/svn_repo/project1

5. 在从服务器上备份初始化过后的空库 - Slave
注:以下操作需要在Slave上进行
# cd /data/svn_repo/
# mv project1 /opt/backups/

6. 解压从主服务器过来的完整备份文件,并进行“调包”的过程 - Slave
注:以下操作需要在Slave上进行
# cd /data/svn_repo
# tar xjvf /opt/backups/project1-master.tar.bz2

替换钩子文件
# cd project1/hooks
# cp -p /opt/backups/project1/hooks/pre-revprop-change .

替换uuid
# cd ../db/
# cp -p /opt/backups/project1/db/uuid .

替换初始版本日志
# cd revprops/0/
# cp -p /opt/backups/project1/db/revprops/0/0 .

更改仓库目录属主
# chown -R apache:apache /data/svn_repo/project1/

6.复制sync-last-merged-rev(最后一次同步)版本号 - Master
注:以下操作需要在Master上进行
获取当前版本号,例如:40482
# cat /data/svn_repo/project1/db/current

将当前版本号复制到从服务器
# /opt/subversion/bin/svn propset --revprop -r0 svn:sync-last-merged-rev 40482 http://slave.heylinux.com/svn-proxy-sync/project1

执行一次同步
# /opt/subversion/bin/svnsync sync http://slave.heylinux.com/svn-proxy-sync/project1

7. 镜像搭建完成

8. 经验总结
通过上面的“调包”操作,svnsync成功的被我们“欺骗”了,可以直接在完整库的基础上利用svnsync进行增量同步了;
这样就不必傻乎乎的非得等svnsync从0开始同步到目前的版本,这种思路也可以用于今后SVN服务器Crash的情况以及修复主从同步。

贴一些报错信息方便搜索引擎定位:
svnsync: Destination HEAD (40482) is not the last merged revision (0); have you committed to the destination without using svnsync?
svnsync: Destination repository has not been initialized.
svnsync: Error setting property 'sync-lock':could not remove a property.
svnsync: DAV request failed;

No Comments

With great power comes great responsibility

近期在管理很多测试服务器,涉及到root密码的定期更新,为了避免万一密码被其他人修改(没办法,开发人员太多,管理上不如生产服务器规范),就把自己给加入到了/etc/sudoers中,以后直接通过sudo -i 然后输入自己的密码(而不是root用户的密码)就可以切换到root了,等于是开了一个小后门。

配置方法:
# vim /etc/sudoers
找到“root ALL=(ALL) ALL”这一行并复制,替换为自己的用户名如“emanuel”,然后用 :wq! 强制保存退出 即可。
---
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
emanuel ALL=(ALL) ALL
---

接着,退回到自己的用户身份,执行以下命令:
$ sudo -s

在第一次会看到以下信息:
---
We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:

#1) Respect the privacy of others.
#2) Think before you type.
#3) With great power comes great responsibility.

然后再输入一次 自己的 密码,即可切换到root用户。
[sudo] password for emanuel:

我个人感觉这段话很经典,大致意思是:
我们相信你已经从本地管理员那里了解到了一些准则,归纳起来有三点:
1.尊重他人隐私;
2.三思而后行;
3.权利越大,责任越大。

No Comments

通过Apache Write-through proxy实现SVN Master-Slave主从架构

参考资料:
http://svnbook.red-bean.com/en/1.5/svn.serverconfig.httpd.html#svn.serverconfig.httpd.extra.writethruproxy

背景/环境:
目前有一台SVN服务器供全公司使用,但由于分公司数量的增加,且处于不同的地理区域的网络中,造成了以下问题:
1.部分分公司的网络状况不佳,每次更新和提交代码的时候都非常慢;
2.SVN服务器的压力越来越大;

同时,很多分公司的领导都提出,希望能在本地建立一台总部SVN服务器的镜像,提升访问速度;

方案/设计:
通过Apache的Write-through proxy使SVN服务器实现与MySQL Master-Slave类似的一主多从的架构。
如下图所示:

安装与配置:

1.安装配置Apache与Subversion - Master&Slave
注:以下操作需要在Master与Slave上进行

首先,需要安装和集成Apache与Subversion,具体的步骤可以参考我的这篇文章:
http://heylinux.com/archives/917.html
其中 第1段 和 第3段 分别讲述了Apache与Subversion的安装与配置方法。

2.检查Apache是否加载proxy与proxy_http模块 - Master&Slave
注:以下操作需要在Master与Slave上进行

# grep proxy /opt/apache2/conf/httpd.conf
如果出现以下内容,则表明加载成功:
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so

如果没有出现,则需要通过以下方式添加:
进入Apache源码包的modules目录
# cd httpd-2.2.18/modules
# /opt/apache2/bin/apxs -c -i -a proxy/mod_proxy.c proxy/proxy_util.c
# /opt/apache2/bin/apxs -c -i -a proxy/mod_proxy_http.c

然后重启Apache使模块生效
# /opt/apache2/bin/apachectl restart

3.配置读写分离 - Slave
注:以下操作仅需要在Slave上进行

进入仓库的主目录
# cd /data/svn_repo

删除在第1步中创建的仓库
# rm -rf project1

创建新的空白仓库
# /opt/subversion/bin/svnadmin create project1

更改仓库目录的属主
# chown -R apache:apache project1/

创建pre-revprop-change钩子文件
# cd project1/hooks/
# cp -p pre-revprop-change.tmpl pre-revprop-change
# chmod +x pre-revprop-change

# vim pre-revprop-change
删除以下部分内容:

if [ "$ACTION" = "M" -a "$PROPNAME" = "svn:log" ]; then exit 0; fi

echo "Changing revision properties other than svn:log is prohibited" >&2
exit 1

更改Apache配置文件
# vim /opt/apache2/conf/extra/httpd-svn.conf

<Location /svn>
DAV svn
SVNListParentPath On
SVNParentPath /data/svn_repo
SVNMasterURI http://master.heylinux.com/svn  ##将master.heylinux.com替换为Master服务器的IP地址或域名
AuthType Basic
AuthName "Subversion Repository"
AuthUserFile /opt/subversion/conf/svn_passwdfile
AuthzSVNAccessFile /opt/subversion/conf/svn_accessfile
Require valid-user
</Location>

<Location /svn-proxy-sync>
DAV svn
SVNListParentPath On
SVNParentPath /data/svn_repo
Order deny,allow
Deny from all
Allow from 192.168.203.133  ##将192.168.203.133替换为Master服务器的IP地址
</Location>

配置详解:
首先,在>Location /svn>中加入 SVNMasterURI http://master.heylinux.com/svn 指定主SVN服务器的URL;
然后,创建一个新的>Location /svn-proxy-sync>,取消认证功能,并加入地址验证,仅允许来自Master的请求;这样,Master就可以通过 http://slave.heylinux.com/svn-proxy-sync/project1将代码同步到Slave中去,避免了直接提交到http://slave.heylinux.com/svn/project1后会产生死循环的问题;
虽然,我们平时使用的是Slave - http://slave.heylinux.com/svn/project1,但在commit的时候,代码会通过代理自动提交到Master - http://master.heylinux.com/svn/project1,然后再由Master同步到Slave中;
也就是说,我们在commit的时候,速度依然会受到与总公司Master服务器之间网络的影响,但是本着80%与20%的读写比例原理,大多数时间下,我们都是以update为主,而在执行Update动作的时候,我们的请求只会在Slave上,因此速度会很快。

4.配置镜像同步 - Master
注:以下操作仅需要在Master上进行

进入仓库的主目录
# cd /data/svn_repo

创建pre-revprop-change钩子文件
# cd project1/hooks/
# cp -p pre-revprop-change.tmpl pre-revprop-change
# chmod +x pre-revprop-change

# vim pre-revprop-change
删除以下部分内容:

if [ "$ACTION" = "M" -a "$PROPNAME" = "svn:log" ]; then exit 0; fi

echo "Changing revision properties other than svn:log is prohibited" >&2
exit 1

初始化镜像
# /opt/subversion/bin/svnsync init http://slave.heylinux.com/svn-proxy-sync/project1 file:///data/svn_repo/project1
执行后显示以下信息则表明成功:
Copied properties for revision 0.

注意:如果是绝对路径,file://后面还要加一个斜杠/,因此总共是三个斜杠,否则会出现以下错误:
svnsync: Unable to open an ra_local session to URL
svnsync: Local URL 'file://data/svn_repo/project1' contains unsupported hostname

进行初次同步
# /opt/subversion/bin/svnsync sync http://slave.heylinux.com/svn-proxy-sync/project1
执行后显示以下信息则表明成功:
Transmitting file data .........
Committed revision 1.

创建 post-commit 钩子文件
# cd /data/svn_repo/project1/hooks
# vim post-commit

#!/bin/sh
# Post-commit script to replicate newly committed revision to slaves
/opt/subversion/bin/svnsync sync http://slave.heylinux.com/svn-proxy-sync/project1 > /dev/null 2>&1

更新 pre-revprop-change 钩子文件
# vim pre-revprop-change

#!/bin/sh
# Post-revprop-change script to replicate revprop-changes to slaves

REV=${2}
/opt/subversion/bin/svnsync copy-revprops http://slave.heylinux.com/svn-proxy-sync/project1 ${REV} > /dev/null 2>&1

更改钩子文件的属主与权限
# chmod +x post-commit pre-revprop-change
# chown apache:apache post-commit pre-revprop-change

5.测试
配置完成,接下来便可以通过以下步骤检查是否搭建成功。
a. 从Slave上checkout - 从Master上checkout - 向Slave上commit - 到Master上update
b. 向Master上commit - 从Slave上udpate

如果向Slave提交的代码可以从Master上update下来,则表明Write-through proxy代理配置成功;
如果向Master提交的代码可以从Slave上update下来,则表明镜像同步配置成功;

6.其它
该文章中仅配置了一个Slave,如果在实际情况中需要配置多个Slave的话,只需要重复以上步骤并将Slave全部添加到Master的post-commit和pre-revprop-change钩子文件中即可。

,

11 Comments

MySQL 5.5.x 单机多实例配置实践

背景/需求:
在一台服务器上通过源码编译安装一个版本为5.5以上的MySQL数据库;
将所有配置文件与数据等均存放在/opt/mysql,便于今后实现快速迁移、整体备份和快速复制;
在同一个MySQL中运行两个实例,一个绑定在端口3306,另一个绑定在端口3307;
绑定在3306端口的实例,不开启binlog,数据存放在/opt/mysql/data;
绑定在3307端口的实例,开启binlog,数据存放在/opt/mysql/data2;
两个实例均采用InnoDB作为默认的存储引擎,字符编码采用UTF-8;
两个实例均采用相同的性能优化配置参数;

实践/方案:
在编译安装时,将数据库的配置文件my.cnf以及data目录等均指向到/opt/mysql目录;
通过mysqld_multi的方式来管理两个不同的实例,采用相同的配置文件共享性能优化配置参数;
在同一个配置文件中,利用[mysqld1]与[mysqld2]标签实现不同实例的差异化配置;

配置步骤:
一、编译安装MySQL
1.安装cmake
MySQL从5.5版本开始,通过./configure进行编译配置方式已经被取消,取而代之的是cmake工具。
因此,我们首先要在系统中源码编译安装cmake工具。
# wget http://www.cmake.org/files/v2.8/cmake-2.8.4.tar.gz

# tar zxvf cmake-2.8.4.tar.gz

# cd cmake-2.8.4

# ./configure
# make
# make install

2.确保以下所需系统软件包已经被安装
通过 rpm -qa | grep name 的方式验证以下软件包是否已全部安装。

gcc* gcc-c++* autoconf* automake* zlib* libxml* ncurses-devel* libgcrypt* libtool*

如果缺少相关的软件包,可通过yum -y install 的方式在线安装,或直接从系统安装光盘中找到并通过rpm -ivh 的方式安装。

3. 安装前的系统设置
建立mysql安装目录及数据存放目录
# mkdir /opt/mysql
# mkdir /opt/mysql/data

创建用户和用户组
# groupadd mysql
# useradd -g mysql mysql

赋予数据存放目录权限
# chown mysql:mysql -R /opt/mysql/data

4.开始编译安装 MySQL
通过http://www.mysql.com/downloads/mysql官方网址或国内的sohu镜像下载软件包,如目前最新的MySQL 5.5.20。
# wget http://mirrors.sohu.com/mysql/MySQL-5.5/mysql-5.5.20.tar.gz

# tar zxvf mysql-5.5.20.tar.gz

# cd mysql-5.5.20
# cmake -DCMAKE_INSTALL_PREFIX=/opt/mysql \
-DSYSCONFDIR=/opt/mysql/etc \
-DMYSQL_DATADIR=/opt/mysql/data \
-DMYSQL_TCP_PORT=3306 \
-DMYSQL_UNIX_ADDR=/tmp/mysqld.sock \
-DMYSQL_USER=mysql \
-DEXTRA_CHARSETS=all \
-DWITH_READLINE=1 \
-DWITH_SSL=system \
-DWITH_EMBEDDED_SERVER=1 \
-DENABLED_LOCAL_INFILE=1 \
-DWITH_INNOBASE_STORAGE_ENGINE=1

# make
# make install

在make与make install的时候可以看到进度百分比,感觉这一点要比configure方式要好。

二、创建支持多实例的配置文件
进入MySQL主目录
# cd /opt/mysql/

删除默认的data目录
# rm -rf data

创建需要的目录
# mkdir etc tmp run log binlogs data data2
# chown -R mysql:mysql tmp run log binlogs data data2

创建my.cnf配置文件
# vim etc/my.cnf

## This server may run 2+ separate instances
## So we use mysqld_multi to manage their services
[mysqld_multi]
mysqld = /opt/mysql/bin/mysqld_safe
mysqladmin = /opt/mysql/bin/mysqladmin
log = /opt/mysql/log/mysqld_multi.log
user = root ## Used for stopping the server via mysqladmin
#password = 

## This is the general purpose database
## The locations are default
# They are left in [mysqld] in case the server is started normally instead of by mysqld_multi
[mysqld1]
socket = /opt/mysql/run/mysqld.sock
port = 3306
pid-file = /opt/mysql/run/mysqld.pid
datadir = /opt/mysql/data
lc-messages-dir = /opt/mysql/share/english

## These support master - master replication
#auto-increment-increment = 4
#auto-increment-offset = 1  ## Since it is master 1
#log-bin = /opt/mysql/binlogs/bin-log-mysqld1
#log-bin-index = /opt/mysql/binlogs/bin-log-mysqld1.index
#binlog-do-db = ## Leave this blank if you want to control it on slave

## This is exlusively for mysqld2
## It is on 3307 with data directory /opt/mysqld/data2
[mysqld2]
socket = /opt/mysql/run/mysqld.sock2
port = 3307
pid-file = /opt/mysql/run/mysqld.pid2
datadir = /opt/mysql/data2
lc-messages-dir = /opt/mysql/share/english

## Disable DNS lookups
#skip-name-resolve

## These support master - slave replication
log-bin = /opt/mysql/binlogs/bin-log-mysqld2
log-bin-index = /opt/mysql/binlogs/bin-log-mysqld2.index
#binlog-do-db =  ## Leave this blank if you want to control it on slave

## Relay log settings
#relay-log = /opt/mysql/log/relay-log-mysqld2
#relay-log-index = /opt/mysql/log/relay-log-mysqld2.index
#relay-log-space-limit = 4G

## Slow query log settings
#log-slow-queries = /opt/mysql/log/slow-log-mysqld2
#long_query_time = 2
#log-queries-not-using-indexes

## The rest of the my.cnf is shared
## Here follows entries for some specific programs
## The MySQL server
[mysqld]
basedir = /opt/mysql
tmpdir = /opt/mysql/tmp
socket = /opt/mysql/run/mysqld.sock
port = 3306
pid-file = /opt/mysql/run/mysqld.pid
datadir = /opt/mysql/data
lc-messages-dir = /opt/mysql/share/english

skip-external-locking
key_buffer_size = 16K
max_allowed_packet = 64M
table_open_cache = 4
sort_buffer_size = 64K
read_buffer_size = 256K
read_rnd_buffer_size = 256K
net_buffer_length = 2K
thread_stack = 128K

## Increase the max connections
max_connections = 1024

## Increase the max connect errors
max_connect_errors = 10000

## Increase the connect timeout
connect_timeout = 10

## Decrease the timeout and increase the retrieves of replication
slave-net-timeout = 60
master-connect-retry = 10

## The expiration time for logs, including binlogs
expire_logs_days = 14

## Set the character as utf8
character-set-server = utf8
collation-server = utf8_unicode_ci

## This is usually only needed when setting up chained replication
#log-slave-updates

## Enable this to make replication more resilient against server crashes and restarts
## but can cause higher I/O on the server
#sync_binlog = 1

## The server id, should be unique in same network
server-id = 1

## Set this to force MySQL to use a particular engine/table-type for new tables
## This setting can still be overridden by specifying the engine explicitly
## in the CREATE TABLE statement
default-storage-engine = INNODB

## Enable Per Table Data for InnoDB to shrink ibdata1
innodb_file_per_table = 1

## Set the max size of each binlog file
max_binlog_size = 1024M

## Set the binlog format
binlog_format = ROW

## Uncomment the following if you are using InnoDB tables
#innodb_data_home_dir = /opt/mysql/data
#innodb_data_file_path = ibdata1:10M:autoextend
#innodb_log_group_home_dir = /opt/mysql/data
## You can set .._buffer_pool_size up to 50 - 80 % of RAM
## but beware of setting memory usage too high
innodb_buffer_pool_size = 16M
innodb_additional_mem_pool_size = 2M
## Set .._log_file_size to 25 % of buffer pool size
innodb_log_file_size = 5M
innodb_log_buffer_size = 8M
innodb_flush_log_at_trx_commit = 1
innodb_lock_wait_timeout = 50

[mysqldump]
quick
max_allowed_packet = 64M

[mysql]
no-auto-rehash

[myisamchk]
key_buffer_size = 8M
sort_buffer_size = 8M

[mysqlhotcopy]
interactive-timeout

[mysql.server]
user = mysql

[mysqld_safe]
log-error = /opt/mysql/log/mysqld.log
pid-file = /opt/mysql/run/mysqld.pid
open-files-limit = 8192

[client]
default-character-set = utf8

阅读全文 »

,

3 Comments