<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>haohtml&#039;s blog &#187; 集群</title>
	<atom:link href="http://blog.haohtml.com/index.php/tag/%e9%9b%86%e7%be%a4/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.haohtml.com</link>
	<description>haohtml&#039;s life and works blog</description>
	<lastBuildDate>Sat, 31 Jul 2010 10:45:51 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>mysql从服务器出现的错误:Slave_SQL_Running: No(主-从)</title>
		<link>http://blog.haohtml.com/index.php/archives/4731</link>
		<comments>http://blog.haohtml.com/index.php/archives/4731#comments</comments>
		<pubDate>Wed, 21 Jul 2010 02:40:27 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[mysql]]></category>
		<category><![CDATA[集群]]></category>
		<category><![CDATA[mysql集群]]></category>

		<guid isPermaLink="false">http://blog.haohtml.com/?p=4731</guid>
		<description><![CDATA[mysql服务器为主-从配置时,发现从MySQL Slave未和主机同步，查看Slave状态： mysql&#62; show slave statusG Slave_IO_Running: Yes Slave_SQL_Running: No Last_Errno: 1062 &#8230;. Seconds_Behind_Master:NULL 原因： 1.程序可能在slave上进行了写操作 2.也可能是slave机器重起后，事务回滚造成的. 解决办法I： 1.首先停掉Slave服务：slave stop 到主服务器上查看主机状态： 记录File和Position对应的值。 3.到slave服务器上执行手动同步： mysql&#62; show master status; +&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+ &#124; File &#124; Position &#124; Binlog_Do_DB &#124; Binlog_Ignore_DB &#124; +&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+ &#124; mysql-bin.000020 &#124; 135617781 &#124; &#124; &#124; +&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+ 1 row in set (0.00 sec) mysql&#62; change master [...]]]></description>
			<content:encoded><![CDATA[<p>mysql服务器为主-从配置时,发现从MySQL Slave未和主机同步，查看Slave状态：</p>
<blockquote><p>mysql&gt; show slave statusG<br />
Slave_IO_Running: Yes<br />
Slave_SQL_Running: No<br />
Last_Errno: 1062<br />
&#8230;.<br />
Seconds_Behind_Master:NULL</p></blockquote>
<p><strong>原因：</strong><br />
1.程序可能在slave上进行了写操作<br />
2.也可能是slave机器重起后，事务回滚造成的.<span id="more-4731"></span></p>
<p><strong>解决办法I：</strong><br />
1.首先停掉Slave服务：<strong>slave stop</strong><br />
到主服务器上查看主机状态：<br />
记录File和Position对应的值。<br />
3.到slave服务器上执行手动同步：</p>
<blockquote><p>mysql&gt; show master status;<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+<br />
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+<br />
| mysql-bin.000020 | 135617781 | | |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+<br />
1 row in set (0.00 sec)</p></blockquote>
<blockquote><p>mysql&gt; change master to<br />
&gt; master_host=&#8217;master_ip&#8217;,<br />
&gt; master_user=&#8217;user&#8217;,<br />
&gt; master_password=&#8217;pwd&#8217;,<br />
&gt; master_port=3307,<br />
&gt; master_log_file=&#8217;mysql-bin.000020&#8242;,<br />
&gt; master_log_pos=135617781;<br />
1 row in set (0.00 sec)<br />
mysql&gt; slave start;<br />
1 row in set (0.00 sec)</p></blockquote>
<p>再次查看slave状态发现：</p>
<blockquote><p>Slave_IO_Running: Yes<br />
Slave_SQL_Running: Yes<br />
&#8230;<br />
Seconds_Behind_Master: 0</p></blockquote>
<p><span style="color: #0000ff;">注:</span>这种办法可能会导致从服务器上的数据不完整,如从服务器一直出错,但主服务器日志文件一直在增加,过好长时间,再直接从主服务器上取日志位置,可能会造成错误期间的数据无法更新到从服务器中.这里建议采用下面的这种办法(将错误语句直接跳过).</p>
<p><strong>解决办法II：</strong></p>
<blockquote><p>mysql&gt; slave stop;<br />
mysql&gt; set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;<br />
mysql&gt; slave start;</p></blockquote>
<p>set GLOBAL SQL_SLAVE_SKIP_COUNTER=N,用来跳过备机的一条或N条出错的复制语句。然后重新start slave即可。</p>
<p><strong>1.问题：收到报警，从数据库在同步的过程出现问题，已停止同步。</strong><br />
分析:查看从数据库的错误日志，找到如下信息:<br />
091229 11:49:41 [ERROR] Error reading packet from server: Got packet bigger than &#8216;max_allowed_packet&#8217; bytes ( server_errno=2020)<br />
解决办法：1.增加/etc/my.cnf 中的max_allowed_packet,增加他的大小，我修改为10M,然后，重启服务器。<br />
2.为了不影响业务，直接在数据库里面，修改max_allowed_packet的大小<br />
mysql&gt;set GLOBAL max_allowed_packet=10475520; (注意不能直接写成10M)<br />
mysql&gt;change master to master_host=&#8217;192.168.1.203&#8242;,master_user=&#8217;yang&#8217;,  master_password=&#8217;yang&#8217;,  master_port=3306, master_log_file=&#8217;mysql-bin.000018&#8242;,master_log_pos=395332157;<br />
(注：master_log,master_log_pos的值要设置成停止同步的那个位置，不然会造成，数据不一致）<br />
mysql&gt;slave start;<br />
3.在同步过程中，又出现了一个错误:<br />
[ERROR] Slave: Error &#8216;Duplicate entry &#8217;18923&#8242; for key 1&#8242; on query.<br />
解决方法：1.查找主数据库对应位置的操作记录<br />
#/opt/mysql/bin/mysqlbinlog ../log/bin.000009 &#8211;start-position=100 &#8211;stop-position=110<br />
(分析binlog 日志)<br />
#在从数据库删除重复记录，然后，在change master，OK，问题解决了。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.haohtml.com/index.php/archives/4731/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>虚拟机ubuntu9.04下mysql集群的配置方法</title>
		<link>http://blog.haohtml.com/index.php/archives/4551</link>
		<comments>http://blog.haohtml.com/index.php/archives/4551#comments</comments>
		<pubDate>Fri, 09 Jul 2010 04:22:56 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[服务器类]]></category>
		<category><![CDATA[设计重构]]></category>
		<category><![CDATA[集群]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[mysql集群]]></category>
		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">http://blog.haohtml.com/?p=4551</guid>
		<description><![CDATA[介绍网络环境： 一、测试环境： Server1: ndbd 192.168.245.11 Server2: ndbd 192.168.245.12 Server3: mysqld –ndb-cluster 192.168.245.13 ndbd： 数据库节点。 mysqld –ndb-cluster： MySQL服务器节点，程序直接访问的是这台机器的IP。默认端口仍是3306。 ndbd_mgm ndbd_mgmd：管理节点。管理／查看各库节点和服务器节点的状态。 二、集群方案 1.管理节点:server3(192.168.245.13) 2.存储节点:server1(192.168.245.11),server2(192.168.245.12) 3.SQL节点:server1(192.168.245.11),server2(192.168.245.12),server3(192.168.245.13) 三、mysql安装和配置 1.安装，sudo apt-get install mysql-server 2.配置这三台服务器上配置my.cnf，这三台服务器都要配置 vim /etc/mysql/my.cnf —————————————–my.cnf开始——————————————– ubuntu@ubuntu:~$ cat /etc/mysql/my.cnf # # The MySQL database server configuration file. # # You can copy this to one of: # &#8211; “/etc/mysql/my.cnf” [...]]]></description>
			<content:encoded><![CDATA[<p><strong>介绍网络环境：</strong></p>
<p>一、测试环境：<br />
Server1: ndbd 192.168.245.11<br />
Server2: ndbd 192.168.245.12<br />
Server3: mysqld –ndb-cluster 192.168.245.13<br />
ndbd： 数据库节点。<br />
mysqld –ndb-cluster： MySQL服务器节点，程序直接访问的是这台机器的IP。默认端口仍是3306。<br />
ndbd_mgm ndbd_mgmd：管理节点。管理／查看各库节点和服务器节点的状态。</p>
<p>二、集群方案<br />
1.管理节点:server3(192.168.245.13)<br />
2.存储节点:server1(192.168.245.11),server2(192.168.245.12)<br />
3.SQL节点:server1(192.168.245.11),server2(192.168.245.12),server3(192.168.245.13)<br />
<span id="more-4551"></span><br />
三、mysql安装和配置</p>
<p>1.安装，sudo apt-get install mysql-server</p>
<p>2.配置这三台服务器上配置my.cnf，这三台服务器都要配置<br />
vim /etc/mysql/my.cnf<br />
—————————————–my.cnf开始——————————————–<br />
ubuntu@ubuntu:~$ cat /etc/mysql/my.cnf<br />
#<br />
# The MySQL database server configuration file.<br />
#<br />
# You can copy this to one of:<br />
# &#8211; “/etc/mysql/my.cnf” to set global options,<br />
# &#8211; “~/.my.cnf” to set user-specific options.<br />
#<br />
# One can use all long options that the program supports.<br />
# Run program with –help to get a list of available options and with<br />
# –print-defaults to see which it would actually understand and use.<br />
#<br />
# For explanations see<br />
# <a href="http://dev.mysql.com/doc/mysql/en/server-system-variables.html">http://dev.mysql.com/doc/mysql/en/serve &#8230; ables.html</a></p>
<p># This will be passed to all mysql clients<br />
# It has been reported that passwords should be enclosed with ticks/quotes<br />
# escpecially if they contain “#” chars…<br />
# Remember to edit /etc/mysql/debian.cnf when changing the socket location.<br />
[client]<br />
port = 3306<br />
socket = /var/run/mysqld/mysqld.sock</p>
<p># Here is entries for some specific programs<br />
# The following values assume you have at least 32M ram</p>
<p># This was formally known as [safe_mysqld]. Both versions are currently parsed.<br />
[mysqld_safe]<br />
socket = /var/run/mysqld/mysqld.sock<br />
nice = 0</p>
<p>[mysqld]<br />
#<br />
# * Basic Settings<br />
#</p>
<p>#<br />
# * IMPORTANT<br />
# If you make changes to these settings and your system uses apparmor, you may<br />
# also need to also adjust /etc/apparmor.d/usr.sbin.mysqld.<br />
#</p>
<p>user = mysql<br />
pid-file = /var/run/mysqld/mysqld.pid<br />
socket = /var/run/mysqld/mysqld.sock<br />
port = 3306<br />
basedir = /usr<br />
datadir = /var/lib/mysql<br />
tmpdir = /tmp<br />
language = /usr/share/mysql/english<br />
skip-external-locking<br />
#<br />
# Instead of skip-networking the default is now to listen only on<br />
# localhost which is more compatible and is not less secure.<br />
# bind-address = 127.0.0.1<br />
#<br />
# * Fine Tuning<br />
#<br />
key_buffer = 16M<br />
max_allowed_packet = 16M<br />
thread_stack = 128K<br />
thread_cache_size = 8<br />
#max_connections = 100<br />
#table_cache = 64<br />
#thread_concurrency = 10<br />
#<br />
# * Query Cache Configuration<br />
#<br />
query_cache_limit = 1M<br />
query_cache_size = 16M<br />
#<br />
# * Logging and Replication<br />
#<br />
# Both location gets rotated by the cronjob.<br />
# Be aware that this log type is a performance killer.<br />
#log = /var/log/mysql/mysql.log<br />
#<br />
# Error logging goes to syslog. This is a Debian improvement <img title="{L_SMILIES_SMILE}" src="http://forum.ubuntu.org.cn/images/smilies/icon_e_smile.gif" alt=":)" /><br />
#<br />
# Here you can see queries with especially long duration<br />
#log_slow_queries = /var/log/mysql/mysql-slow.log<br />
#long_query_time = 2<br />
#log-queries-not-using-indexes<br />
#<br />
# The following can be used as easy to replay backup logs or for replication.<br />
# note: if you are setting up a replication slave, see README.Debian about<br />
# other settings you may need to change.<br />
#server-id = 1<br />
#log_bin = /var/log/mysql/mysql-bin.log<br />
expire_logs_days = 10<br />
max_binlog_size = 100M<br />
#binlog_do_db = include_database_name<br />
#binlog_ignore_db = include_database_name<br />
#<br />
# * BerkeleyDB<br />
#<br />
# Using BerkeleyDB is now discouraged as its support will cease in 5.1.12.<br />
skip-bdb<br />
#<br />
# * MyISAM<br />
#<br />
# MyISAM is enabled by default with a 10MB datafile in /var/lib/mysql/.<br />
# Read the manual for more MyISAM related options. There are many!<br />
# You might want to disable MyISAM to shrink the mysqld process by circa 100MB.<br />
#skip-innodb<br />
#<br />
# * Security Features<br />
#<br />
# Read the manual, too, if you want chroot!<br />
# chroot = /var/lib/mysql/<br />
#<br />
# For generating SSL certificates I recommend the OpenSSL GUI “tinyca”.<br />
#<br />
# ssl-ca=/etc/mysql/cacert.pem<br />
# ssl-cert=/etc/mysql/server-cert.pem<br />
# ssl-key=/etc/mysql/server-key.pem</p>
<p>ndbcluster<br />
ndb-connectstring=192.168.245.13</p>
<p>[mysqldump]<br />
quick<br />
quote-names<br />
max_allowed_packet = 16M</p>
<p>[mysql]<br />
#no-auto-rehash # faster start of mysql but no tab completition</p>
<p>[isamchk]<br />
key_buffer = 16M</p>
<p>#<br />
# * NDB Cluster<br />
#<br />
# See /usr/share/doc/mysql-server-*/README.Debian for more information.<br />
#<br />
# The following configuration is read by the NDB Data Nodes (ndbd processes)<br />
# not from the NDB Management Nodes (ndb_mgmd processes).<br />
#<br />
[MYSQL_CLUSTER]</p>
<p>ndb-connectstring=192.168.245.13</p>
<p>#<br />
# * IMPORTANT: Additional settings that can override those from this file!<br />
# The files must end with ‘.cnf’, otherwise they’ll be ignored.<br />
#<br />
!includedir /etc/mysql/conf.d/</p>
<p>ubuntu@ubuntu:~$<br />
———————————my.cnf结束———————————————————</p>
<p>主要在：[mysqld]下添加：</p>
<p>ndbcluster<br />
ndb-connectstring=192.168.245.13<br />
和添加<br />
[MYSQL_CLUSTER]</p>
<p>ndb-connectstring=192.168.245.13</p>
<p>上面三台服务器都要一样</p>
<p>2.配置ndb_mgmd.cnf（192.168.245.13服务器上配置）<br />
复制/usr/share/doc/mysql-server-5.0/examples/ndb_mgmd.cnf到/etc/mysql/ndb_mgmd.cnf</p>
<p>编辑ndb_mgmd.cnf<br />
——————-开始————</p>
<p>ubuntu@ubuntu:~$ cat /etc/mysql/ndb_mgmd.cnf<br />
[NDBD DEFAULT]<br />
NoOfReplicas=2<br />
DataMemory=10MB<br />
IndexMemory=25MB<br />
MaxNoOfTables=256<br />
MaxNoOfOrderedIndexes=256<br />
MaxNoOfUniqueHashIndexes=128</p>
<p>[MYSQLD DEFAULT]</p>
<p>[NDB_MGMD DEFAULT]</p>
<p>[TCP DEFAULT]</p>
<p>[NDB_MGMD]<br />
Id=1 # the NDB Management Node (this one)<br />
HostName=192.168.245.13<br />
DataDir= /var/lib/mysql-cluster</p>
<p>[NDBD]<br />
Id=2 # the first NDB Data Node<br />
HostName=192.168.245.11<br />
DataDir= /var/lib/mysql-cluster</p>
<p>[NDBD]<br />
Id=3 # the second NDB Data Node<br />
HostName=192.168.245.12<br />
DataDir=/var/lib/mysql-cluster</p>
<p>[MYSQLD]<br />
Id=4 # the first SQL node<br />
HostName=192.168.245.13<br />
[MYSQLD]<br />
Id=5 # the first SQL node<br />
HostName=192.168.245.11<br />
[MYSQLD]<br />
Id=6 # the first SQL node<br />
HostName=192.168.245.12</p>
<p>ubuntu@ubuntu:~$</p>
<p>——————-结束————</p>
<p>先启动：<br />
13服务器：</p>
<p>sudo /etc/init.d/mysql-ndb-mgm start</p>
<p>然后启动<br />
11.12服务器</p>
<p>sudo /etc/init.d/mysql-ndb start</p>
<p>最后启动，13.11.12服务器mysql服务<br />
sudo /etc/init.d/mysql start</p>
<p>测试：<br />
13服务器上：<br />
neo@mgm:~$ ndb_mgm<br />
– NDB Cluster — Management Client –<br />
ndb_mgm&gt; show<br />
Connected to Management Server at: localhost:1186<br />
Cluster Configuration<br />
———————<br />
[ndbd(NDB)] 2 node(s)<br />
id=2 @192.168.245.11 (Version: 5.0.51, Nodegroup: 0)<br />
id=3 @192.168.245.12 (Version: 5.0.51, Nodegroup: 0, Master)</p>
<p>[ndb_mgmd(MGM)] 1 node(s)<br />
id=1 @192.168.245.13 (Version: 5.0.51)</p>
<p>[mysqld(API)] 2 node(s)<br />
id=4 @192.168.245.13 (Version: 5.0.51)<br />
id=5 @192.168.245.11 (Version: 5.0.51)<br />
id=5 @192.168.245.12 (Version: 5.0.51)</p>
<p>ndb_mgm&gt;</p>
<p>与没有使用簇的MySQL相比，在MySQL簇内操作数据的方式没有太大的区别。</p>
<p>执行这类操作时应记住三点</p>
<p>1.</p>
<p>表必须用ENGINE=NDB或ENGINE=NDBCLUSTER选项创建，或用ALTER TABLE选项更改，以使用NDB Cluster存储引擎在 Cluster内复制它们。如果使用mysqldump的输出从已有数据库导</p>
<p>入表，可在文本编辑器中打开SQL脚本，并将该选项添加到任何表创建语句，或用这类选项之一替换任何已有的ENGINE（或TYPE）选项。<br />
2.</p>
<p>另外还请记住，每个NDB表必须有一个主键。如果在创建表时用户未定义主键，NDB Cluster存储引擎将自动生成隐含的主键。（注释：该隐含 键也将占用空间，就像任何其他的表</p>
<p>索引一样。由于没有足够的内存来容纳这些自动创建的键，出现问题并不罕见）。<br />
3.</p>
<p>当你在一个节点上运行create database mydb;你去其他sql node上执行show databases;将不能看到mydb,你需要创建它，然后use mydb; show tables;你将看到同步的表。</p>
<p>SQL Node 1</p>
<p>neo@sql:~$ mysql -uroot -p<br />
Enter password:<br />
Welcome to the MySQL monitor. Commands end with ; or g.<br />
Your MySQL connection id is 7<br />
Server version: 5.0.51a-3ubuntu5.1 (Ubuntu)</p>
<p>Type ‘help;’ or ‘h’ for help. Type ‘c’ to clear the buffer.</p>
<p>mysql&gt; create database cluster;<br />
Query OK, 1 row affected (0.00 sec)</p>
<p>mysql&gt; use cluster<br />
Database changed<br />
mysql&gt; create table city( id mediumint unsigned not null auto_increment primary key, name varchar(20) not null default ” ) engine = ndbcluster default</p>
<p>charset utf8;<br />
Query OK, 0 rows affected (1.07 sec)</p>
<p>mysql&gt; insert into city values(1, ‘Shenzhen’);<br />
Query OK, 1 row affected (0.12 sec)</p>
<p>mysql&gt; insert into city values(2, ‘Guangdong’);<br />
Query OK, 1 row affected (0.00 sec)</p>
<p>SQL Node 2</p>
<p>neo@sql:~$ mysql -uroot -p<br />
Enter password:<br />
Welcome to the MySQL monitor. Commands end with ; or g.<br />
Your MySQL connection id is 7<br />
Server version: 5.0.51a-3ubuntu5.1 (Ubuntu)</p>
<p>Type ‘help;’ or ‘h’ for help. Type ‘c’ to clear the buffer.</p>
<p>mysql&gt; show databases;<br />
+——————–+<br />
| Database |<br />
+——————–+<br />
| information_schema |<br />
| example |<br />
| mydb |<br />
| mysql |<br />
| neo |<br />
+——————–+<br />
6 rows in set (0.13 sec)</p>
<p>mysql&gt; create database cluster;<br />
Query OK, 1 row affected (0.00 sec)</p>
<p>mysql&gt; show databases;<br />
+——————–+<br />
| Database |<br />
+——————–+<br />
| information_schema |<br />
| cluster |<br />
| example |<br />
| mydb |<br />
| mysql |<br />
| neo |<br />
+——————–+<br />
6 rows in set (0.13 sec)</p>
<p>mysql&gt; use cluster;<br />
Reading table information for completion of table and column names<br />
You can turn off this feature to get a quicker startup with -A</p>
<p>Database changed<br />
mysql&gt; show tables;<br />
+——————-+<br />
| Tables_in_cluster |<br />
+——————-+<br />
| city |<br />
+——————-+<br />
1 row in set (0.01 sec)</p>
<p>mysql&gt; select * from city;<br />
+—-+———–+<br />
| id | name |<br />
+—-+———–+<br />
| 1 | Shenzhen |<br />
| 2 | Guangdong |<br />
+—-+———–+<br />
2 rows in set (0.03 sec)</p>
<p>mysql&gt;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.haohtml.com/index.php/archives/4551/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQL CLUSTER 集群方案+LVS+keepalived负载均衡</title>
		<link>http://blog.haohtml.com/index.php/archives/4511</link>
		<comments>http://blog.haohtml.com/index.php/archives/4511#comments</comments>
		<pubDate>Thu, 08 Jul 2010 03:37:03 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[服务器类]]></category>
		<category><![CDATA[集群]]></category>
		<category><![CDATA[mysql集群]]></category>

		<guid isPermaLink="false">http://blog.haohtml.com/?p=4511</guid>
		<description><![CDATA[(1.双机实现高可用） 一、介绍 这篇文档旨在介绍如何安装配置基于2台服务器的MySQL集群。并且实现任意一台服务器出现问题或宕机时MySql集群依然能够继续运行。加下后续的（keepalived+lvs+mysql cluster文档），可以实现Mysql双机的高可用及负载均衡。 安装环境及软件包： vmware workstation 5.5.3 mysql-5.2.3-falcon-alpha.tar.gz gentoo 2006.1 Server1: 192.168.1.111 Server2: 192.168.1.110 二、在Server1和Server2上安装MySQL 以下步骤需要在Server1和Server2上各做一次 # mv mysql-5.2.3-falcon-alpha.tar.gz /tmp/package # cd /tmp/package # groupadd mysql # useradd -g mysql mysql # tar -zxvf mysql-5.2.3-falcon-alpha.tar.gz # rm -f mysql-5.2.3-falcon-alpha.tar.gz # mv mysql-5.2.3-falcon-alpha mysql # cd mysql # ./configure –prefix=/usr –with-extra-charsets=complex –with-plugin-ndbcluster –with-plugin-partition –with-plugin-innobase # [...]]]></description>
			<content:encoded><![CDATA[<p>(1.双机实现高可用）<br />
一、介绍<br />
这篇文档旨在介绍如何安装配置基于2台服务器的MySQL集群。并且实现任意一台服务器出现问题或宕机时MySql集群依然能够继续运行。加下后续的（keepalived+lvs+mysql cluster文档），可以实现Mysql双机的高可用及负载均衡。<br />
安装环境及软件包：<br />
vmware workstation 5.5.3<br />
mysql-5.2.3-falcon-alpha.tar.gz<br />
gentoo 2006.1<br />
Server1: 192.168.1.111<br />
Server2: 192.168.1.110<span id="more-4511"></span></p>
<p>二、在Server1和Server2上安装MySQL<br />
以下步骤需要在Server1和Server2上各做一次<br />
# mv mysql-5.2.3-falcon-alpha.tar.gz /tmp/package<br />
# cd /tmp/package<br />
# groupadd mysql<br />
# useradd -g mysql mysql<br />
# tar -zxvf mysql-5.2.3-falcon-alpha.tar.gz<br />
# rm -f mysql-5.2.3-falcon-alpha.tar.gz<br />
# mv mysql-5.2.3-falcon-alpha mysql<br />
# cd mysql<br />
# ./configure –prefix=/usr –with-extra-charsets=complex –with-plugin-ndbcluster –with-plugin-partition –with-plugin-innobase<br />
# make &amp;&amp; make install<br />
#ln -s /usr/libexec/ndbd /usr/bin<br />
#ln -s /usr/libexec/ndb_mgmd /usr/bin<br />
#ln -s /usr/libexec/ndb_cpcd /usr/bin<br />
#ln -s /usr/libexec/mysqld /usr/bin<br />
#ln -s /usr/libexec/mysqlmanager /usr/bin<br />
#mysql_install_db –user=mysql</p>
<p>三、安装并配置节点<br />
以下步骤需要在Server1和Server2上各做一次<br />
1.配置管理节点配置文件：<br />
# mkdir /var/lib/mysql-cluster<br />
# cd /var/lib/mysql-cluster<br />
# vi config.ini<br />
在config.ini中添加如下内容：<br />
[ndbd default]<br />
NoOfReplicas= 2<br />
MaxNoOfConcurrentOperations= 10000<br />
DataMemory= 80M<br />
IndexMemory= 24M<br />
TimeBetweenWatchDogCheck= 30000<br />
DataDir= /var/lib/mysql-cluster<br />
MaxNoOfOrderedIndexes= 512<br />
[ndb_mgmd default]<br />
DataDir= /var/lib/mysql-cluster<br />
[ndb_mgmd]<br />
Id=1<br />
HostName= 192.168.1.111<br />
[ndb_mgmd]<br />
Id=2<br />
HostName= 192.168.1.110<br />
[ndbd]<br />
Id= 3<br />
HostName= 192.168.1.111<br />
[ndbd]<br />
Id= 4<br />
HostName= 192.168.1.110<br />
[mysqld]<br />
[mysqld]<br />
[tcp default]<br />
PortNumber= 63132</p>
<p>2.配置通用my.cnf文件，mysqld及ndbd,ndb_mgmd均使用此文件.<br />
# vi /etc/my.cnf<br />
在my.cnf中添加如下内容：<br />
[mysqld]<br />
default-storage-engine=ndbcluster 避免在sql语句中还要加入ENGINE=NDBCLUSTER。<br />
ndbcluster<br />
ndb-connectstring=192.168.1.111,192.168.1.110<br />
[ndbd]<br />
connect-string=192.168.1.111,192.168.1.110<br />
[ndb_mgm]<br />
connect-string=192.168.1.111,192.168.1.110<br />
[ndb_mgmd]<br />
config-file=/var/lib/mysql-cluster/config.ini<br />
[mysql_cluster]<br />
ndb-connectstring= 192.168.1.111,192.168.1.110</p>
<p>保存退出后，启动管理节点Server1为：<br />
# ndb_mgmd –ndb_nodeid=1<br />
启动管理节点Server2为：<br />
# ndb_mgmd –ndb_nodeid=2</p>
<p>注:在启动时有一个警告提示<br />
Cluster configuration warning:<br />
arbitrator with id 1 and db node with id 3 on same host 192.168.1.111<br />
arbitrator with id 2 and db node with id 4 on same host 192.168.1.110<br />
Running arbitrator on the same host as a database node may<br />
cause complete cluster shutdown in case of host failure.<br />
说节点1和3，2和4的arbitrator一样，可能引起整个集群失败。（可以不用放在心上）</p>
<p>四、初始化集群<br />
在Server1中<br />
# ndbd –nodeid=3 –initial<br />
在Server2中<br />
# ndbd –nodeid=4 –iniitial<br />
注：只有在第一次启动ndbd时或者对config.ini进行改动后才需要使用–initial参数！</p>
<p>五、检查工作状态<br />
在任意一台机子上启动管理终端：<br />
# ndb_mgm<br />
键入show命令查看当前工作状态：（下面是一个状态输出示例）<br />
– NDB Cluster — Management Client –<br />
ndb_mgm&gt; show<br />
Connected to Management Server at: 192.168.1.111:1186<br />
Cluster Configuration<br />
———————<br />
[ndbd(NDB)] 2 node(s)<br />
id=3 @192.168.1.111 (Version: 5.2.3, Nodegroup: 0, Master)<br />
id=4 @192.168.1.110 (Version: 5.2.3, Nodegroup: 0)<br />
[ndb_mgmd(MGM)] 2 node(s)<br />
id=1 @192.168.1.111 (Version: 5.2.3)<br />
id=2 @192.168.1.110 (Version: 5.2.3)<br />
[mysqld(API)] 2 node(s)<br />
id=5 (not connected, accepting connect from any host)<br />
id=6 (not connected, accepting connect from any host)<br />
ndb_mgm&gt;</p>
<p>如果上面没有问题，现在开始加入mysqld(API)：<br />
注意，这篇文档对于MySQL并没有设置root密码，推荐你自己设置Server1和Server2的MySQL root密码。<br />
在Server1 中：<br />
#mysqld_safe –ndb_nodeid=5 –user=mysql &amp;<br />
在Server2 中：<br />
#mysqld_safe –ndb_nodeid=6 –user=mysql &amp;<br />
# ndb_mgm -e show<br />
信息如下：<br />
Connected to Management Server at: 192.168.1.111:1186<br />
Cluster Configuration<br />
———————<br />
[ndbd(NDB)] 2 node(s)<br />
id=3 @192.168.1.111 (Version: 5.2.3, Nodegroup: 0, Master)<br />
id=4 @192.168.1.110 (Version: 5.2.3, Nodegroup: 0)<br />
[ndb_mgmd(MGM)] 2 node(s)<br />
id=1 @192.168.1.111 (Version: 5.2.3)<br />
id=2 @192.168.1.110 (Version: 5.2.3)<br />
[mysqld(API)] 4 node(s)<br />
id=5 @192.168.1.111 (Version: 5.2.3)<br />
id=6 @192.168.1.110 (Version: 5.2.3)</p>
<p>ok，可以测试了：<br />
在Server1 中<br />
# /usr/local/mysql/bin/mysql -u root -p<br />
&gt;create database aa;<br />
&gt; use aa;<br />
&gt; CREATE TABLE ctest (i INT) ；<br />
&gt; INSERT INTO ctest () VALUES (1);<br />
&gt; SELECT * FROM ctest;<br />
应该可以看到1 row returned信息（返回数值1）。<br />
如果上述正常，则换到Server2，观察效果。如果成功，则在Server2中执行INSERT再换回到Server1观察是否工作正常。<br />
如果都没有问题，那么恭喜成功！</p>
<p>六、破坏性测试<br />
将Server1或Server2的网线拔掉（即ifconfig eth0 down)，观察另外一台集群服务器工作是否正常（可以使用SELECT查询测试）。测试完毕后，重新插入网线即可。<br />
注意：在未对集群做任何读写操作前，此测试结果无效，因为，集群初始后只在/var/lib/mysql-cluster/下建了几个空目录，还没有正常协同工作，会出现整个所有存储(ndbd)节点关闭.<br />
也可以这样测试：在Server1或Server2上：<br />
# ps aux | grep ndbd<br />
将会看到所有ndbd进程信息：<br />
root 5578 0.0 0.3 6220 1964 ? S 03:14 0:00 ndbd<br />
root 5579 0.0 20.4 492072 102828 ? R 03:14 0:04 ndbd<br />
root 23532 0.0 0.1 3680 684 pts/1 S 07:59 0:00 grep ndbd<br />
然后杀掉一个ndbd进程以达到破坏MySQL集群服务器的目的：<br />
# kill -9 5578 5579<br />
之后在另一台集群服务器上使用SELECT查询测试。并且在管理节点服务器的管理终端中执行show命令会看到被破坏的那台服务器的状态。<br />
测试完成后，只需要重新启动被破坏服务器的ndbd进程即可：<br />
# ndbd –ndb_nodeid=此存储节点的id<br />
注意！前面说过了，此时是不用加–inital参数的！<br />
至此，MySQL双机集群就配置完成了！</p>
<p>MySQL CLUSTER(集群）系列 (2.另类在线增加节点-online hotplugin)<br />
MySQL CLUSTER(集群）系列 (2.另类在线增加节点-online hotplugin)</p>
<p>一、介绍<br />
这篇文档旨在介绍如何设计MySQL集群，制做集群模板，有效规避mysql限制。（此文为二管理，四存储，八数据的模块制作）<br />
安装环境及软件包：<br />
vmware workstation 5.5.3<br />
mysql-5.2.3-falcon-alpha.tar.gz<br />
gentoo 2006.1<br />
(每机单网卡多ip)<br />
Server1: 192.168.1.111 (ndb_mgmd, id=1)<br />
Server1: 192.168.1.112 (ndbd ,id=3)<br />
server1: 192.168.1.113 (ndbd,id=4)<br />
Server2: 192.168.1.110 (ndb_mgmd,id=2)<br />
server2: 192.168.1.109 (ndbd,id=5)<br />
server2: 192.168.1.108 (ndbd,id=6)</p>
<p>二、在Server1和Server2上安装MySQL<br />
以下步骤需要在Server1和Server2上各做一次<br />
# mv mysql-5.2.3-falcon-alpha.tar.gz /tmp/package<br />
# cd /tmp/package<br />
# groupadd mysql<br />
# useradd -g mysql mysql<br />
# tar -zxvf mysql-5.2.3-falcon-alpha.tar.gz<br />
# rm -f mysql-5.2.3-falcon-alpha.tar.gz<br />
# mv mysql-5.2.3-falcon-alpha mysql<br />
# cd mysql<br />
# ./configure –prefix=/usr –with-extra-charsets=complex –with-plugin-ndbcluster –with-plugin-partition –with-plugin-innobase<br />
# make &amp;&amp; make install<br />
#ln -s /usr/libexec/ndbd /usr/bin<br />
#ln -s /usr/libexec/ndb_mgmd /usr/bin<br />
#ln -s /usr/libexec/ndb_cpcd /usr/bin<br />
#ln -s /usr/libexec/mysqld /usr/bin<br />
#ln -s /usr/libexec/mysqlmanager /usr/bin<br />
#mysql_install_db –user=mysql</p>
<p>三、安装并配置节点<br />
以下步骤需要在Server1和Server2上各做一次<br />
1.配置管理节点配置文件：<br />
# mkdir /var/lib/mysql-cluster<br />
# cd /var/lib/mysql-cluster<br />
# vi config.ini<br />
在config.ini中添加如下内容：<br />
[ndbd default]<br />
NoOfReplicas= 4 (此文有四个存储节点）<br />
MaxNoOfConcurrentOperations= 10000<br />
DataMemory= 80M<br />
IndexMemory= 24M<br />
TimeBetweenWatchDogCheck= 30000<br />
DataDir= /var/lib/mysql-cluster<br />
MaxNoOfOrderedIndexes= 512<br />
[ndb_mgmd default]<br />
DataDir= /var/lib/mysql-cluster<br />
[ndb_mgmd]<br />
Id=1<br />
HostName= 192.168.1.111<br />
[ndb_mgmd]<br />
Id=2<br />
HostName= 192.168.1.110<br />
[ndbd]<br />
Id= 3<br />
HostName= 192.168.1.112<br />
[ndbd]<br />
Id= 4<br />
HostName= 192.168.1.113<br />
[ndbd]<br />
Id= 5<br />
HostName= 192.168.1.109<br />
[ndbd]<br />
Id= 6<br />
HostName= 192.168.1.108<br />
[mysqld]<br />
[mysqld]<br />
[mysqld]<br />
[mysqld]<br />
[mysqld]<br />
[mysqld]<br />
[mysqld]<br />
[mysqld] 共八个mysqld定义<br />
[tcp default]<br />
PortNumber= 63132</p>
<p>2.配置通用my.cnf文件，mysqld及ndbd,ndb_mgmd均使用此文件.<br />
# vi /etc/my.cnf<br />
在my.cnf中添加如下内容：<br />
[mysqld]<br />
default-storage-engine=ndbcluster 避免在sql语句中还要加入ENGINE=NDBCLUSTER。<br />
ndbcluster<br />
ndb-connectstring=192.168.1.111,192.168.1.110<br />
[ndbd]<br />
connect-string=192.168.1.111,192.168.1.110<br />
[ndb_mgm]<br />
connect-string=192.168.1.111,192.168.1.110<br />
[ndb_mgmd]<br />
config-file=/var/lib/mysql-cluster/config.ini<br />
[mysql_cluster]<br />
ndb-connectstring= 192.168.1.111,192.168.1.110</p>
<p>保存退出后，启动管理节点Server1为：<br />
# ndb_mgmd –ndb_nodeid=1<br />
启动管理节点Server2为：<br />
# ndb_mgmd –ndb_nodeid=2<br />
四、初始化集群<br />
在Server1中<br />
# ndbd –bind_address=192.168.1.112 –nodeid=3 –initial<br />
#ndbd –bind_address=192.168.1.113–nodeid=4 –initial<br />
在Server2中<br />
#ndbd –bind_address=192.168.1.109 –nodeid=5 –initial<br />
#ndbd –bind_address=192.168.1.108 –nodeid=6 –initial<br />
注：只有在第一次启动ndbd时或者对config.ini进行改动后才需要使用–initial参数！</p>
<p>五、检查工作状态<br />
在任意一台机子上启动管理终端：<br />
# ndb_mgm<br />
键入show命令查看当前工作状态：（下面是一个状态输出示例）<br />
– NDB Cluster — Management Client –<br />
ndb_mgm&gt; show<br />
Connected to Management Server at: 192.168.1.111:1186<br />
Cluster Configuration<br />
———————<br />
[ndbd(NDB)] 4 node(s)<br />
id=3 @192.168.1.111 (Version: 5.2.3, Nodegroup: 0, Master)<br />
id=4 @192.168.1.110 (Version: 5.2.3, Nodegroup: 0)<br />
id=5 @192.168.1.109 (Version: 5.2.3, Nodegroup: 0)<br />
id=6 @192.168.1.108 (Version: 5.2.3, Nodegroup: 0)<br />
[ndb_mgmd(MGM)] 2 node(s)<br />
id=1 @192.168.1.111 (Version: 5.2.3)<br />
id=2 @192.168.1.110 (Version: 5.2.3)<br />
[mysqld(API)] 8 node(s)<br />
id=7 (not connected, accepting connect from any host)<br />
id=8 (not connected, accepting connect from any host)<br />
id=9 (not connected, accepting connect from any host)<br />
id=10 (not connected, accepting connect from any host)<br />
id=11 (not connected, accepting connect from any host)<br />
id=12 (not connected, accepting connect from any host)<br />
id=13 (not connected, accepting connect from any host)<br />
id=14 (not connected, accepting connect from any host)<br />
ndb_mgm&gt;</p>
<p>如果上面没有问题，现在开始加入mysqld(API)：<br />
注意，这篇文档对于MySQL并没有设置root密码，推荐你自己设置Server1和Server2的MySQL root密码。<br />
在Server1 中：<br />
#mysqld_safe –ndb_nodeid=7 –user=mysql &amp;<br />
在Server2 中：<br />
#mysqld_safe –ndb_nodeid=8 –user=mysql &amp;<br />
# ndb_mgm -e show<br />
信息如下：<br />
Connected to Management Server at: 192.168.1.111:1186<br />
Cluster Configuration<br />
———————<br />
[ndbd(NDB)] 4 node(s)<br />
id=3 @192.168.1.111 (Version: 5.2.3, Nodegroup: 0, Master)<br />
id=4 @192.168.1.110 (Version: 5.2.3, Nodegroup: 0)<br />
id=5 @192.168.1.109 (Version: 5.2.3, Nodegroup: 0)<br />
id=6 @192.168.1.108 (Version: 5.2.3, Nodegroup: 0)<br />
[ndb_mgmd(MGM)] 2 node(s)<br />
id=1 @192.168.1.111 (Version: 5.2.3)<br />
id=2 @192.168.1.110 (Version: 5.2.3)<br />
[mysqld(API)] 4 node(s)<br />
id=5 @192.168.1.111 (Version: 5.2.3)<br />
id=6 @192.168.1.110 (Version: 5.2.3)<br />
id=7 (not connected, accepting connect from any host)<br />
id=8 (not connected, accepting connect from any host)<br />
id=9 (not connected, accepting connect from any host)<br />
id=10 (not connected, accepting connect from any host)<br />
id=11 (not connected, accepting connect from any host)<br />
id=12 (not connected, accepting connect from any host)<br />
ok，可以测试了：<br />
在Server1 中<br />
# /usr/local/mysql/bin/mysql -u root -p<br />
&gt;create database aa;<br />
&gt; use aa;<br />
&gt; CREATE TABLE ctest (i INT) ；<br />
&gt; INSERT INTO ctest () VALUES (1);<br />
&gt; SELECT * FROM ctest;<br />
应该可以看到1 row returned信息（返回数值1）。<br />
如果上述正常，则换到Server2，观察效果。如果成功，则在Server2中执行INSERT再换回到Server1观察是否工作正常。<br />
如果都没有问题，那么恭喜成功！至此模板制作完成。<br />
注意：在模板制作完成的过程中，测试过程完成了对集群的初次读写，若跳过测试（跳过读写），在集群未协同工作前进行下面的操作，则进行下面的操作毫无意义。因为，集群初始后只在/var/lib/mysql-cluster/下建了几个空目录，还没有正常协同工作.</p>
<p>六、备份/var/lib/mysql-cluster/下的相应ndb_*_fs，留做以后使用。<br />
七、原理：<br />
ndbd –initial初始集群结构，在官方文档中增加节点要bakcup后restore要initial的主要是存储节点，管理节点和数据节点都可用集群restart实现.<br />
而存储节点特点是只要一个有效，则整个集群可以正常工作,因此，在模板完成后，未使用的存储节点可以当做故障节点，当启用时,存储节点可以通过其内部达到同步.<br />
缺点，在集群启动时，每个未使用存储节点默认等待启用时间为60秒，造成集群启动时间加长，可以能通过设置参数设小，不推荐。<br />
八、 实现：<br />
数据节点不用说了，管理节点两个也够用了，主要是存储节点了。<br />
根据上面的步骤搭建一台服务器，拷贝相应的ndb_*_fs到/var/lib/mysql-cluster/下，机器ip符合config.ini中的定义，好了，可以启用了，简单吧。<br />
对于现有设计，可以按官方文档增加修改节点的工作时，参考此文档，预留相应的空闲节点，为以后的工作增加便利。</p>
<p>MySQL CLUSTER(集群）系列 (3.lvs+keeplived+mysql cluster)<br />
一、介绍<br />
这篇文档旨在介绍如何结合lvs+keepalived实现mysql cluster的高可用及负载均衡。此文是在1文（双机高可用）基础上增加lvs+keepalived，稍加修改就可适合更多结点的集群.<br />
安装环境及软件包：<br />
vmware workstation 5.5.3<br />
mysql-5.2.3-falcon-alpha.tar.gz<br />
gentoo 2006.1<br />
ipvsadm-1.24.tar.gz<br />
keepalived-1.1.13.tar.gz<br />
linux-2.6.20.3.tar.bz2<br />
iproute2-2.6.15-060110.tar.gz<br />
Server1: 192.168.1.111 (ndb_mgmd, id=1)<br />
Server2: 192.168.1.110 (ndb_mgmd,id=2)</p>
<p>二~六步参见1文(双机高可用)</p>
<p>以下步骤需要在Server1和Server2上各做一次<br />
七、内核linux-2.6.20.3.tar.bz2安装<br />
# tar xvjf linux-2.6.20.3.tar.bz2 -C /usr/src<br />
#cd /usr/src/linux-2.6.20.3<br />
#zcat /proc/config.gz .config<br />
#make menuconfig<br />
选择<br />
· Network packet filtering framework (Netfilter) —&gt; 后在<br />
[ ] TCP: MD5 Signature Option support (RFC2385) (EXPERIMENTAL) 下出现<br />
IP: Virtual Server Configuration —&gt;<br />
关天netfilter内的配置及Virtual Server的配置根据自己的需要选择。<br />
选择<br />
· IP: advanced router<br />
Choose IP: FIB lookup algorithm (choose FIB_HASH if unsure) (FIB_HASH) —&gt;</p>
<p>· IP: policy routing<br />
# make all &amp;&amp; make modules_install &amp;&amp; make install<br />
#vi /boot/grub.conf 加入<br />
title=2.6.20.3<br />
kernel /vmlinuz-2.6.20.3 root=/你的根设备<br />
#reboot (以新内核启动系统)<br />
八、安装ipvsadm和keepalived<br />
#tar -zxvf ipvsadm-1.24.tar.gz -C /tmp/package<br />
# cd /tmp/package/ipvsadm-1.24<br />
# make &amp;&amp; make install<br />
#tar -zxvf keepalived-1.1.13.tar.gz -C /tmp/package<br />
#cd /tmp/package/keepalived-1.1.13<br />
#vi keepalived/vrrp/vrrp_arp.c<br />
将 26 #include 27<br />
28 /* local includes */<br />
29 #include “vrrp_arp.h”<br />
30 #include “memory.h”<br />
31 #include “utils.h”<br />
修改为<br />
26 /* local includes */<br />
27 #include “vrrp_arp.h”<br />
28 #include “memory.h”<br />
29 #include “utils.h”<br />
30#include 31<br />
就是将#include 这行移到下面.<br />
#./configure –prefix=/usr –with-kernel-dir=/usr/src/linux-2.6.20.3<br />
#make &amp;&amp; make install<br />
#vi /etc/init.d/keepalived 加入以下内容<br />
#!/sbin/runscript<br />
# Copyright 1999-2004 Gentoo Foundation<br />
# Distributed under the terms of the GNU General Public License v2<br />
# $Header: /var/cvsroot/gentoo-x86/sys-cluster/keepalived/files/init-keepalived,v 1.3 2004/07/15 00:55:17 agriffis Exp $<br />
depend() {<br />
use logger<br />
need net<br />
}<br />
checkconfig() {<br />
if [ ! -e /etc/keepalived/keepalived.conf ] ; then<br />
eerror “You need an /etc/keepalived/keepalived.conf file to run keepalived”<br />
return 1<br />
fi<br />
}<br />
start() {<br />
checkconfig || return 1<br />
ebegin “Starting Keepalived”<br />
start-stop-daemon –start –quiet –pidfile /var/run/keepalived.pid \<br />
–startas /usr/sbin/keepalived<br />
eend $?<br />
}<br />
stop() {<br />
ebegin “Stopping Keepalived”<br />
start-stop-daemon –stop –quiet –pidfile /var/run/keepalived.pid<br />
eend $?<br />
}<br />
此为gentoo的keepalived的脚本.<br />
#chmod 755 /etc/init.d/keepalived<br />
#rc-update add keepalived default<br />
#vi /etc/keepalived/keepalived.conf 加入<br />
! Configuration File for keepalived<br />
global_defs {<br />
router_id mysql_cluster<br />
}<br />
vrrp_sync_group VG1 { (此处是ha部分)<br />
group {<br />
VI_1<br />
}<br />
}<br />
vrrp_instance VI_1 {<br />
state MASTER<br />
interface eth0<br />
lvs_sync_daemon_interface eth0<br />
virtual_router_id 1 (此处server1为1,server2为2)<br />
priority 150<br />
advert_int 1<br />
authentication {<br />
auth_type PASS<br />
auth_pass mysqlcluster<br />
}<br />
virtual_ipaddress {<br />
192.168.1.120<br />
}<br />
}<br />
virtual_server 192.168.1.120 3306 { (此处定义负载均衡部分,使用DR方式)<br />
delay_loop 6<br />
lvs_sched wlc<br />
lvs_method DR<br />
persistence_timeout 60<br />
ha_suspend<br />
protocol TCP<br />
real_server 192.168.1.110 3306 {<br />
weight 1<br />
TCP_CHECK {<br />
connect_timeout 10<br />
}<br />
}<br />
real_server 192.168.1.111 3306 {<br />
weight 1<br />
TCP_CHECK {<br />
connect_timeout 10<br />
}<br />
}<br />
}<br />
九,启动<br />
#/etc/init.d/keepalived start<br />
#ip addr list (未安装iproute2 ,无此命今,可以使用emerge iproute2安装,注意emerge是gentoo的命今)<br />
出现类似下面的信息<br />
eth0: mtu 1500 qdisc pfifo_fast qlen 1000<br />
link/ether 00:0c:29:6f:f9:21 brd ff:ff:ff:ff:ff:ff<br />
inet 192.168.1.111/24 brd 192.168.1.255 scope global eth0<br />
inet 192.168.1.120/32 scope global eth0 (此行表明虚拟的ip生效了)<br />
inet6 fe80::20c:29ff:fe6f:f921/64 scope link<br />
valid_lft forever preferred_lft forever<br />
#tail /var/log/messages 可以查看更多信息.<br />
类似如下<br />
Keepalived: Starting Keepalived v1.1.13 (03/26,2007)<br />
Keepalived_healthcheckers: Using LinkWatch kernel netlink reflector…<br />
Keepalived_healthcheckers: Registering Kernel netlink reflector<br />
Keepalived_healthcheckers: Registering Kernel netlink command channel<br />
Keepalived_healthcheckers: Configuration is using : 9997 Bytes<br />
Keepalived: Starting Healthcheck child process, pid=27738<br />
Keepalived_vrrp: Using LinkWatch kernel netlink reflector…<br />
Keepalived_vrrp: Registering Kernel netlink reflector<br />
Keepalived_vrrp: Registering Kernel netlink command channel<br />
Keepalived_vrrp: Registering gratutious ARP shared channel<br />
Keepalived_vrrp: Configuration is using : 36549 Bytes<br />
Keepalived: Starting VRRP child process, pid=27740<br />
Keepalived_healthcheckers: Activating healtchecker for service [192.168.1.110:3306]<br />
Keepalived_healthcheckers: Activating healtchecker for service [192.168.1.111:3306]<br />
IPVS: sync thread started: state = MASTER, mcast_ifn = eth0, syncid = 2<br />
Keepalived_vrrp: VRRP_Instance(VI_1) Transition to MASTER STATE<br />
Keepalived_vrrp: VRRP_Instance(VI_1) Entering MASTER STATE<br />
Keepalived_vrrp: VRRP_Group(VG1) Syncing instances to MASTER state<br />
Keepalived_vrrp: Netlink: skipping nl_cmd msg…<br />
十、结束语<br />
此文档旨在从mysql cluster应用角度考虑如何更好的使用mysql及linux和相关工具.文中有不到及错误的地方敬请不吝指正。</p>
<p>原文:<a href="http://blog.86118.net/?p=692">http://blog.86118.net/?p=692</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.haohtml.com/index.php/archives/4511/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>基于LVS的集群配置</title>
		<link>http://blog.haohtml.com/index.php/archives/4502</link>
		<comments>http://blog.haohtml.com/index.php/archives/4502#comments</comments>
		<pubDate>Thu, 08 Jul 2010 02:26:22 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[服务器类]]></category>
		<category><![CDATA[集群]]></category>
		<category><![CDATA[负载均衡]]></category>
		<category><![CDATA[lvs]]></category>

		<guid isPermaLink="false">http://blog.haohtml.com/?p=4502</guid>
		<description><![CDATA[转自：http://itbbs-arch.pconline.com.cn/topic.jsp?tid=6354059 集群(Cluster) 所谓集群是指一组独立的计算机系统构成的一个松耦合的多处理器系统，它们之间通过网络实现进程间的通信。应用程序可以通过网络共享内存进行消息传送，实现分布式计算机。 负载均衡(Load Balance) 网络的负载均衡是一种动态均衡技术，通过一些工具实时地分析数据包，掌握网络中的数据流量状况，把任务合理均衡地分配出去。这种技术基于现有网络结构，提供了一种扩展服务器带宽和增加服务器吞吐量的廉价有效的方法，加强了网络数据处理能力，提高了网络的灵活性和可用性。 特点 （1）高可靠性（HA）。利用集群管理软件，当主服务器故障时，备份服务器能够自动接管主服务器的工作，并及时切换过去，以实现对用户的不间断服务。 （2）高性能计算（HP）。即充分利用集群中的每一台计算机的资源，实现复杂运算的并行处理，通常用于科学计算领域，比如基因分析、化学分析等。 （3）负载平衡。即把负载压力根据某种算法合理分配到集群中的每一台计算机上，以减轻主服务器的压力，降低对主服务器的硬件和软件要求。 LVS系统结构与特点 1. Linux Virtual Server：简称LVS。是由中国一个Linux程序员章文嵩博士发起和领导的，基于Linux系统的服务器集群解决方案，其实现目标是创建一个具有良好的扩展性、高可靠性、高性能和高可用性的体系。许多商业的集群产品，比如RedHat的Piranha、 Turbo Linux公司的Turbo Cluster等，都是基于LVS的核心代码的。 2. 体系结构：使用LVS架设的服务器集群系统从体系结构上看是透明的，最终用户只感觉到一个虚拟服务器。物理服务器之间可以通过高速的 LAN或分布在各地的WAN相连。最前端是负载均衡器，它负责将各种服务请求分发给后面的物理服务器，让整个集群表现得像一个服务于同一IP地址的虚拟服务器。 3. LVS的三种模式工作原理和优缺点：　Linux Virtual Server主要是在负载均衡器上实现的，负载均衡器是一台加了 LVS Patch的2．2．x版内核的Linux系统。LVS Patch可以通过重新编译内核的方法加入内核，也可以当作一个动态的模块插入现在的内核中。 负载均衡器可以运行在以下三种模式下： （1）Virtual Server via NAT（VS-NAT）：用地址翻译实现虚拟服务器。地址转换器有能被外界访问到的合法IP地址，它修改来自专有网络的流出包的地址。外界看起来包是来自地址转换器本身，当外界包送到转换器时，它能判断出应该将包送到内部网的哪个节点。优点是节省IP 地址，能对内部进行伪装；缺点是效率低，因为返回给请求方的流量经过转换器。 （2）Virtual Server via IP Tunneling （VS-TUN）：用IP隧道技术实现虚拟服务器。这种方式是在集群的节点不在同一个网段时可用的转发机制，是将IP包封装在其他网络流量中的方法。为了安全的考虑，应该使用隧道技术中的VPN，也可使用租用专线。集群所能提供的服务是基于TCP/IP的Web服务、Mail服务、News服务、DNS服务、Proxy服务器等等． （3）Virtual Server via Direct Routing（VS-DR）：用直接路由技术实现虚拟服务器。当参与集群的计算机和作为控制管理的计算机在同一个网段时可以用此法，控制管理的计算机接收到请求包时直接送到参与集群的节点。优点是返回给客户的流量不经过控制主机，速度快开销少。 以四台服务器为例实现负载均衡： 安装配置LVS 1. 安装前准备： （1）首先说明，LVS并不要求集群中的服务器规格划一，相反，可以根据服务器的不同配置和负载状况，调整负载分配策略，充分利用集群环境中的每一台服务器。如下表： Srv Eth0 Eth0：0 Eth1 Eth1：0 [...]]]></description>
			<content:encoded><![CDATA[<p>转自：<a href="http://itbbs-arch.pconline.com.cn/topic.jsp?tid=6354059">http://itbbs-arch.pconline.com.cn/topic.jsp?tid=6354059</a></p>
<p>集群(Cluster)<br />
所谓集群是指一组独立的计算机系统构成的一个松耦合的多处理器系统，它们之间通过网络实现进程间的通信。应用程序可以通过网络共享内存进行消息传送，实现分布式计算机。</p>
<p><strong>负载均衡(Load Balance)</strong><br />
网络的负载均衡是一种动态均衡技术，通过一些工具实时地分析数据包，掌握网络中的数据流量状况，把任务合理均衡地分配出去。这种技术基于现有网络结构，提供了一种扩展服务器带宽和增加服务器吞吐量的廉价有效的方法，加强了网络数据处理能力，提高了网络的灵活性和可用性。<span id="more-4502"></span></p>
<p><strong>特点</strong><br />
（1）高可靠性（HA）。利用集群管理软件，当主服务器故障时，备份服务器能够自动接管主服务器的工作，并及时切换过去，以实现对用户的不间断服务。<br />
（2）高性能计算（HP）。即充分利用集群中的每一台计算机的资源，实现复杂运算的并行处理，通常用于科学计算领域，比如基因分析、化学分析等。<br />
（3）负载平衡。即把负载压力根据某种算法合理分配到集群中的每一台计算机上，以减轻主服务器的压力，降低对主服务器的硬件和软件要求。</p>
<p><strong>LVS系统结构与特点</strong><br />
1. Linux Virtual Server：简称LVS。是由中国一个Linux程序员章文嵩博士发起和领导的，基于Linux系统的服务器集群解决方案，其实现目标是创建一个具有良好的扩展性、高可靠性、高性能和高可用性的体系。许多商业的集群产品，比如RedHat的Piranha、 Turbo Linux公司的Turbo Cluster等，都是基于LVS的核心代码的。<br />
2. 体系结构：使用LVS架设的服务器集群系统从体系结构上看是透明的，最终用户只感觉到一个虚拟服务器。物理服务器之间可以通过高速的 LAN或分布在各地的WAN相连。最前端是负载均衡器，它负责将各种服务请求分发给后面的物理服务器，让整个集群表现得像一个服务于同一IP地址的虚拟服务器。<br />
3. LVS的三种模式工作原理和优缺点：　Linux Virtual Server主要是在负载均衡器上实现的，负载均衡器是一台加了 LVS Patch的2．2．x版内核的Linux系统。LVS Patch可以通过重新编译内核的方法加入内核，也可以当作一个动态的模块插入现在的内核中。<br />
<strong>负载均衡器可以运行在以下三种模式下：<br />
</strong>（1）Virtual Server via NAT（VS-NAT）：用地址翻译实现虚拟服务器。地址转换器有能被外界访问到的合法IP地址，它修改来自专有网络的流出包的地址。外界看起来包是来自地址转换器本身，当外界包送到转换器时，它能判断出应该将包送到内部网的哪个节点。优点是节省IP 地址，能对内部进行伪装；缺点是效率低，因为返回给请求方的流量经过转换器。<br />
（2）Virtual Server via IP Tunneling （VS-TUN）：用IP隧道技术实现虚拟服务器。这种方式是在集群的节点不在同一个网段时可用的转发机制，是将IP包封装在其他网络流量中的方法。为了安全的考虑，应该使用隧道技术中的VPN，也可使用租用专线。集群所能提供的服务是基于TCP/IP的Web服务、Mail服务、News服务、DNS服务、Proxy服务器等等．<br />
（3）Virtual Server via Direct Routing（VS-DR）：用直接路由技术实现虚拟服务器。当参与集群的计算机和作为控制管理的计算机在同一个网段时可以用此法，控制管理的计算机接收到请求包时直接送到参与集群的节点。优点是返回给客户的流量不经过控制主机，速度快开销少。<br />
<strong>以四台服务器为例实现负载均衡：</strong></p>
<p>安装配置LVS<br />
1. 安装前准备：<br />
（1）首先说明，LVS并不要求集群中的服务器规格划一，相反，可以根据服务器的不同配置和负载状况，调整负载分配策略，充分利用集群环境中的每一台服务器。如下表：<br />
Srv Eth0 Eth0：0 Eth1 Eth1：0<br />
vs1 10.0.0.1 10.0.0.2 192.168.10.1 192.168.10.254<br />
vsbak 10.0.0.3 192.168.10.102<br />
real1 192.168.10.100<br />
real2 192.168.10.101<br />
其中，10.0.0.2是允许用户访问的IP。<br />
（2）这4台服务器中，vs1作为虚拟服务器（即负载平衡服务器），负责将用户的访问请求转发到集群内部的real1，real2，然后由real1，real2分别处理。 Client为客户端测试机器，可以为任意操作系统。<br />
（3）所有OS为redhat6.2，其中vs1 和vsbak 的核心是2.2.19， 而且patch过ipvs的包， 所有real server的Subnet mask 都是24位， vs1和vsbak 的10.0.0. 网段是24 位。<br />
2.理解LVS中的相关术语<br />
（1） ipvsadm ：ipvsadm是LVS的一个用户界面。在负载均衡器上编译、安装ipvsadm。<br />
（2） 调度算法： LVS的负载均衡器有以下几种调度规则：Round-robin，简称rr；weighted Round-robin，简称wrr；每个新的连接被轮流指派到每个物理服务器。Least-connected，简称lc；weighted Least-connected，简称wlc，每个新的连接被分配到负担最小的服务器。<br />
（3） Persistent client connection，简称pcc，（持续的客户端连接，内核2.2.10版以后才支持）。所有来自同一个IP的客户端将一直连接到同一个物理服务器。超时时间被设置为360秒。Pcc是为https和cookie服务设置的。在这处调度规则下，第一次连接后，所有以后来自相同客户端的连接（包括来自其它端口）将会发送到相同的物理服务器。但这也会带来一个问题，因为大约有25％的Internet 可能具有相同的IP地址。<br />
（4） Persistent port connection调度算法：在内核2．2．12版以后，pcc功能已从一个调度算法（你可以选择不同的调度算法：rr、wrr、lc、wlc、 pcc）演变成为了一个开关选项（你可以让rr、 wrr、lc、wlc具备pcc的属性）。在设置时，如果你没有选择调度算法时，ipvsadm将默认为wlc算法。 在Persistent port connection(ppc)算法下，连接的指派是基于端口的，例如，来自相同终端的80端口与443端口的请求，将被分配到不同的物理服务器上。不幸的是，如果你需要在的网站上采用cookies时将出问题，因为http是使用80端口，然而cookies需要使用443端口，这种方法下，很可能会出现cookies不正常的情况。<br />
（5）Load Node Feature of Linux Director：让Load balancer 也可以处理users 请求。<br />
（6）IPVS connection synchronization。<br />
（7）ARP Problem of LVS/TUN and LVS/DR：这个问题只在LVS/DR，LVS/TUN 时存在。<br />
3. 配置实例<br />
（1） 需要的软件包和包的安装：<br />
I． piranha-gui-0．4．12-2*．rpm (GUI接口cluster设定工具)；<br />
II． piranha-0．4．12-2*．rpm；<br />
III． ipchains-1．3．9-6lp*．rpm (架设NAT)。<br />
取得套件或mount到光盘，进入RPMS目录进行安装:<br />
# rpm -Uvh piranha*<br />
# rpm -Uvh ipchains*<br />
（2） real server群：<br />
真正提供服务的server(如web server)，在NAT形式下是以内部虚拟网域的形式，设定如同一般虚拟网域中Client端使用网域：192.168.10.0/24 架设方式同一般使用虚拟IP之局域网络。<br />
a. 设网卡IP<br />
real1 ：192.168.10.100/24<br />
real2 ：192.168.10.101/24<br />
b.每台server均将default gateway指向192.168.10.254。 192.168.10.254为该网域唯一对外之信道，设定在virtual server上，使该网域进出均需通过virtual server 。<br />
c.每台server均开启httpd功能供web server服务，可以在各real server上放置不同内容之网页，可由浏览器观察其对各real server读取网页的情形。<br />
d.每台server都开启rstatd、sshd、rwalld、ruser、rsh、rsync，并且从Vserver上面拿到相同的lvs.conf文件。<br />
（3） virtual server：<br />
作用在导引封包的对外主机，专职负责封包的转送，不提供服务，但因为在NAT型式下必须对进出封包进行改写，所以负担亦重。<br />
a.IP设置：<br />
对外eth0：IP：10.0.0.1 eth0：0 ：10.0.0.2<br />
对内eth1：192.168.10.1 eth1：0 ：192.168.10.254<br />
NAT形式下仅virtual server有真实IP，real server群则为透过virtual server．<br />
b.设定NAT功能<br />
# echo 1 &gt;; /proc/sys/net/ipv4/ip_forward<br />
# echo 1 &gt;; /proc/sys/net/ipv4/ip_always_defrag<br />
# ipchains -P forward MASQ<br />
c.设定piranha 进入X-window中 (也可以直接编辑/etc/lvs.cf )<br />
a).执行面板系统piranha<br />
b)．设定“整体配置”(Global Settings) 主LVS服务器主机IP：10.0.0.2， 选定网络地址翻译(预设) NAT路径名称： 192.168.10.254， NAT 路径装置： eth1：0<br />
c)．设定虚拟服务器(Virtual Servers) 添加编辑虚拟服务器部分：(Virtual Server)名称：(任意取名)；应用：http；协议： tcp；连接：80；地址：10.0..0.2；装置：eth0：0； 重入时间：180 (预设)；服务延时：10 (预设)；加载监控工具：ruptime (预设)；调度策略：Weighted least-connections；持续性：0 (预设)； 持续性屏蔽： 255.255.255.255 (预设)； 按下激活：实时服务器部分：(Real Servers)；添加编辑：名字：(任意取名)； 地址： 192.168.10.100； 权重：1 (预设) 按下激活<br />
另一架real server同上，地址：192.168.10.101。<br />
d). 控制/监控(Controls/Monitoring) 控制：piranha功能的激活与停止，上述内容设定完成后即可按开始键激活piranha．监控器：显示ipvsadm设定之routing table内容 可立即更新或定时更新。<br />
（4）备援主机的设定(HA)<br />
单一virtual server的cluster架构virtual server 负担较大，提供另一主机担任备援，可避免virtual server的故障而使对外服务工作终止；备份主机随时处于预备状态与virtual server相互侦测<br />
a.备份主机：<br />
eth0： IP 10.0.0.3<br />
eth1： IP 192.168.10.102 同样需安装piranha，ipvsadm，ipchains等套件<br />
b.开启NAT功能(同上面所述)。<br />
c.在virtual server(10.0.0.2)主机上设定。<br />
a)．执行piranha冗余度 ；<br />
b)．按下“激活冗余度”；<br />
冗余LVS服务器IP： 10.0.0.3；HEARTBEAT间隔(秒数)： 2 (预设)<br />
假定在…秒后进入DEAD状态： 5 (预设)；　HEARTBEAT连接埠： 539 (预设)<br />
c)．按下“套用”；<br />
d)．至“控制/监控”页，按下“在当前执行层添加PULSE DEAMON” ，按下“开始”；<br />
e)．在监控器按下“自动更新”，这样可由窗口中看到ipvsadm所设定的routing table，并且动态显示real server联机情形，若real server故障，该主机亦会从监视窗口中消失。<br />
d.激活备份主机之pulse daemon （执行# /etc/rc.d/init.d/pulse start）。<br />
至此，HA功能已经激活，备份主机及virtual server由pulse daemon定时相互探询，一但virtual server故障，备份主机立刻激活代替；至virtual server 正常上线后随即将工作交还virtual server。</p>
<p><strong>LVS测试<br />
</strong>经过了上面的配置步骤，现在可以测试LVS了，步骤如下：<br />
1. 分别在vs1，real1，real2上运行/etc/lvs/rc.lvs_dr。注意，real1，real2上面的/etc/lvs 目录是vs2输出的。如果您的NFS配置没有成功，也可以把vs1上/etc/lvs/rc.lvs_dr复制到real1，real2上，然后分别运行。确保real1，real2上面的apache已经启动并且允许telnet。<br />
2. 测试Telnet：从client运行telnet 10.0.0.2， 如果登录后看到如下输出就说明集群已经开始工作了：（假设以guest用户身份登录）<br />
[guest@real1 guest]$——说明已经登录到服务器real1上。<br />
再开启一个telnet窗口，登录后会发现系统提示变为：<br />
[guest@real2 guest]$——说明已经登录到服务器real2上。<br />
3. 测试http：从client运行iexplore <a href="http://10.0.0.2/">http://10.0.0.2</a><br />
因为在real1 和real2 上面的测试页不同，所以登录几次之后，显示出的页面也会有所不同，这样说明real server 已经在正常工作了。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.haohtml.com/index.php/archives/4502/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CAP理论与分布式数据库</title>
		<link>http://blog.haohtml.com/index.php/archives/4473</link>
		<comments>http://blog.haohtml.com/index.php/archives/4473#comments</comments>
		<pubDate>Wed, 07 Jul 2010 11:27:26 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[mysql]]></category>
		<category><![CDATA[集群]]></category>

		<guid isPermaLink="false">http://blog.haohtml.com/?p=4473</guid>
		<description><![CDATA[根据CAP理论，一致性(C)，可用性(A)，分区容错性(P)，三者不可兼得，必须有所取舍。而传统数据库保 证了强一致性(ACID模型)和高可用性，所以要想实现一个分布式数据库集群非常困难，这也解释了为什么数据库的扩展能力十分有限。而近年来不断发展壮大 的NoSQL运动，就是通过牺牲强一致性，采用BASE模型，用最终一致性的思想来设计分布式系统，从而使得系统可以达到很高的可用性和扩展性。 但是，对于CAP理论也有一些不同的声音，数据库大师Michael Stonebraker就撰文《Errors in Database Systems, Eventual Consistency, and the CAP Theorem》，表 示为了P而牺牲C是不可取的。事实上，数据库系统最大的优势就对一致性的保证，如果我们放弃了一致性，也许NoSQL比数据库更有优势。那么，有没有可能 实现一套分布式数据库集群，即保证可用性和一致性，又可以提供很好的扩展能力呢？回答是：有的。 目前，有很多分布式 数据库的产品，但是绝大部分是面向DSS类型的应用，因为相比较OLTP应用，DSS应用更容易做到分布式扩展。Michael Stonebraker提到了一种新型的数据库VoltDB，它的定义是Next-Generation SQL Database for Fast-Scaling OLTP Applications。虽然产品还没有问世，但是从技术资料上来看，它有几个特点： 1.采用Share nothing架构，将物理服务器划分为以CPU core为单位的Virtual node，采用Sharding技术，将数据自动分布到不同的Virtual node，最大限度的利用机器的计算资源； 2.采用内存数据访问技术，类似于内存数据库(In-memory database)，区别于传统的数据库(Disk-based database)，消除了传统数据库内存管理的开销，而且响应速度非常快； 3.每个Virtual node上的操作是自治的，利用队列技术将并发访问变为串行访问，消除了传统数据库串行控制的开销(比如Latch和Lock)； 4.数据同步写多个副本，不存在单点故障，而且消除了传统数据库需要记录redo log的开销。 VoltDB与传统数据库的对比，可以看到VoltDB即支持传统数据库的ACID模型，又提供了类似NoSQL产品很高的扩展能力。 这个产品，让我想到了MySQL cluster，同样是shared-nothing架构，NDB存储引擎也要求将数据存放在内存中，数据根据PK被分布到多个不同的节点上，同一份数据 可以保存多个副本，防止单点故障。 MySQL cluster目前的主要问题是性能不佳，但是我认为MySQL cluster的架构是分布式数据库未来的趋势，Oracle收购MySQL后，很多人对MySQL的前途表示担忧，而我作为一个用户，除了可能会收费这 件事以外，我一点也不担心MySQL的前景，反而有所期待，因为在数据库领域没有任何一个公司比Oracle更懂数据库，而Oracle也正在大力发展 MySQL cluster，MySQL cluster一定会成为分布式数据库领域内最好的解决方案之一。 来源:http://www.hellodba.net/2010/05/voltdb_mysql_cluster.html]]></description>
			<content:encoded><![CDATA[<p>根据CAP理论，一致性(C)，可用性(A)，分区容错性(P)，三者不可兼得，必须有所取舍。而传统数据库保  证了强一致性(ACID模型)和高可用性，所以要想实现一个分布式数据库集群非常困难，这也解释了为什么数据库的扩展能力十分有限。而近年来不断发展壮大  的NoSQL运动，就是通过牺牲强一致性，采用BASE模型，用最终一致性的思想来设计分布式系统，从而使得系统可以达到很高的可用性和扩展性。</p>
<p>但是，对于CAP理论也有一些不同的声音，数据库大师Michael Stonebraker就撰文《<a href="http://cacm.acm.org/blogs/blog-cacm/83396-errors-in-database-systems-eventual-consistency-and-the-cap-theorem/fulltext">Errors   in Database Systems, Eventual Consistency, and the CAP  Theorem</a>》，表 示为了P而牺牲C是不可取的。事实上，数据库系统最大的优势就对一致性的保证，如果我们放弃了一致性，也许NoSQL比数据库更有优势。那么，有没有可能 实现一套分布式数据库集群，即保证可用性和一致性，又可以提供很好的扩展能力呢？回答是：有的。</p>
<p>目前，有很多分布式  数据库的产品，但是绝大部分是面向DSS类型的应用，因为相比较OLTP应用，DSS应用更容易做到分布式扩展。Michael   Stonebraker提到了一种新型的数据库VoltDB，它的定义是Next-Generation SQL Database for   Fast-Scaling OLTP Applications。虽然产品还没有问世，但是从技术资料上来看，它有几个特点：<span id="more-4473"></span></p>
<p>1.采用Share  nothing架构，将物理服务器划分为以CPU core为单位的Virtual   node，采用Sharding技术，将数据自动分布到不同的Virtual  node，最大限度的利用机器的计算资源；</p>
<p>2.采用内存数据访问技术，类似于内存数据库(In-memory  database)，区别于传统的数据库(Disk-based   database)，消除了传统数据库内存管理的开销，而且响应速度非常快；</p>
<p>3.每个Virtual   node上的操作是自治的，利用队列技术将并发访问变为串行访问，消除了传统数据库串行控制的开销(比如Latch和Lock)；</p>
<p>4.数据同步写多个副本，不存在单点故障，而且消除了传统数据库需要记录redo log的开销。</p>
<p><a href="http://blog.haohtml.com/wp-content/uploads/2010/07/VoltDB.jpg"><img class="alignnone size-full wp-image-4475" title="VoltDB" src="http://blog.haohtml.com/wp-content/uploads/2010/07/VoltDB.jpg" alt="" width="752" height="515" /></a></p>
<p>VoltDB与传统数据库的对比，可以看到VoltDB即支持传统数据库的ACID模型，又提供了类似NoSQL产品很高的扩展能力。</p>
<p><a href="http://blog.haohtml.com/wp-content/uploads/2010/07/VoltDB2.jpg"><img class="alignnone size-full wp-image-4476" title="VoltDB2" src="http://blog.haohtml.com/wp-content/uploads/2010/07/VoltDB2.jpg" alt="" width="751" height="425" /></a></p>
<p>这个产品，让我想到了MySQL  cluster，同样是shared-nothing架构，NDB存储引擎也要求将数据存放在内存中，数据根据PK被分布到多个不同的节点上，同一份数据 可以保存多个副本，防止单点故障。</p>
<p><a href="http://blog.haohtml.com/wp-content/uploads/2010/07/MySQL_Cluster.jpg"><img class="alignnone size-full wp-image-4477" title="MySQL_Cluster" src="http://blog.haohtml.com/wp-content/uploads/2010/07/MySQL_Cluster.jpg" alt="" width="583" height="372" /></a></p>
<p>MySQL cluster目前的主要问题是性能不佳，但是我认为MySQL  cluster的架构是分布式数据库未来的趋势，Oracle收购MySQL后，很多人对MySQL的前途表示担忧，而我作为一个用户，除了可能会收费这 件事以外，我一点也不担心MySQL的前景，反而有所期待，因为在数据库领域没有任何一个公司比Oracle更懂数据库，而Oracle也正在大力发展 MySQL cluster，MySQL cluster一定会成为分布式数据库领域内最好的解决方案之一。</p>
<p>来源:<a href="http://www.hellodba.net/2010/05/voltdb_mysql_cluster.html" target="_blank">http://www.hellodba.net/2010/05/voltdb_mysql_cluster.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.haohtml.com/index.php/archives/4473/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>高并发高流量网站架构</title>
		<link>http://blog.haohtml.com/index.php/archives/4469</link>
		<comments>http://blog.haohtml.com/index.php/archives/4469#comments</comments>
		<pubDate>Wed, 07 Jul 2010 09:44:38 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[服务器类]]></category>
		<category><![CDATA[集群]]></category>

		<guid isPermaLink="false">http://blog.haohtml.com/?p=4469</guid>
		<description><![CDATA[Web2.0的兴起，掀起了互联网新一轮的网络创业大潮。以用户为导向的新网站建设概念，细分了网站功能和用户群，不仅成功的造就了一大批新生的网站，也 极大的方便了上网的人们。但Web2.0以用户为导向的理念，使得新生的网站有了新的特点——高并发，高流量，数据量大，逻辑复杂等，对网站建设也提出了 新的要求。 本文围绕高并发高流量的网站架构设计问题，主要研究讨论了以下内容： 首先在整个网络的高度讨论了使用镜像网站，CDN内容分发网络等技术对负载均衡带来的便利及各自的优缺点比较。然后在局域网层次对第四层交换技术，包括硬 件解决方案F5和软件解决方案LVS，进行了简单的讨论。接下来在单服务器层次，本文着重讨论了单台服务器的Socket优化，硬盘级缓存技术，内存级缓 存技术，CPU与IO平衡技术（即以运算为主的程序与以数据读写为主的程序搭配部署），读写分离技术等。在应用层，本文介绍了一些大型网站常用的技术，以 及选择使用该技术的理由。最后，在架构的高度讨论了网站扩容，容错等问题。 本文以理论与实践相结合的形式，结合作者实际工作中得到的经验，具有较广泛的适用性。 1 引言 1.1 互联网的发展 最近十年间，互联网已经从一个单纯的用于科研的，用来传递静态文档的美国内部网络，发展成了一个应用于各行各业的，传送着海量多媒体及动态信息的 全球网络。从规模上看，互联网在主机数、带宽、上网人数等方面几乎一直保持着指数增长的趋势，2006年7月，互联网上共有主机439，286，364 台，WWW 站点数量达到 96，854，877个 ［1］。全球上网人口在2004 年达到 7 亿 2900万 ［2］，中国的上网人数在 2006 年 12 月达到了约 1亿3700 万［3］。另一方面，互联网所传递的内容也发生了巨大的变化，早期互联网以静态、文本的公共信息为主要内容，而目前的互联网则传递着大量的动态、多媒体及 人性化的信息，人们不仅可以通过 互联网阅读到动态生成的信息，而且可以通过它使用电子商务、即时通信、网上游戏等交互性很强的服务。因此，可以说互联网已经不再仅仅是一个信息共享网络， 而已经成为了一个无所不在的交互式服务的平台。 1.2 互联网网站建设的新趋势 互联网不断扩大的规模，日益增长的用户群，以及web2.0［4］的兴起，对互联网网站建设提出了新的要求: 高性能和高可扩展性。2000 年 5 月，访问量排名世界第一（统计数据来源［5］）的Yahoo ［6］声称其日页浏览数达到 6 亿 2500 万，即每秒约 30，000 次HTTP 请求(按每个页面浏览平均产生 4 次请求计算) 。这样大规模的访问量对服务的性能提出了非常高的要求。更为重要的是，互联网受众的广泛性，使得成功的互联网服务的访问量增长潜力和速度非常大，因此服务 系统必须具有非常好的可扩展性，以应付将来可能的服务增长。 支持高度并发的访问。高度并发的访问对服务的存储与并发能力提出了很高的要求，当前主流的超标量和超流水线处理器能处理的并发请求数是有限的，因 为随着并发数的上升，进程调度的开销会很快上升。互联网广域网的本质决定了其访问的延迟时间较长，因此一个请求完成时间也较长，按从请求产生到页面下载完 成 [...]]]></description>
			<content:encoded><![CDATA[<p>Web2.0的兴起，掀起了互联网新一轮的网络创业大潮。以用户为导向的新网站建设概念，细分了网站功能和用户群，不仅成功的造就了一大批新生的网站，也 极大的方便了上网的人们。但Web2.0以用户为导向的理念，使得新生的网站有了新的特点——高并发，高流量，数据量大，逻辑复杂等，对网站建设也提出了 新的要求。</p>
<p>本文围绕高并发高流量的网站架构设计问题，主要研究讨论了以下内容：</p>
<p>首先在整个网络的高度讨论了使用镜像网站，CDN内容分发网络等技术对负载均衡带来的便利及各自的优缺点比较。然后在局域网层次对第四层交换技术，包括硬 件解决方案F5和软件解决方案LVS，进行了简单的讨论。接下来在单服务器层次，本文着重讨论了单台服务器的Socket优化，硬盘级缓存技术，内存级缓 存技术，CPU与IO平衡技术（即以运算为主的程序与以数据读写为主的程序搭配部署），读写分离技术等。在应用层，本文介绍了一些大型网站常用的技术，以 及选择使用该技术的理由。最后，在架构的高度讨论了网站扩容，容错等问题。 <span id="more-4469"></span></p>
<p>本文以理论与实践相结合的形式，结合作者实际工作中得到的经验，具有较广泛的适用性。</p>
<p>1 引言</p>
<p>1.1 互联网的发展<br />
最近十年间，互联网已经从一个单纯的用于科研的，用来传递静态文档的美国内部网络，发展成了一个应用于各行各业的，传送着海量多媒体及动态信息的 全球网络。从规模上看，互联网在主机数、带宽、上网人数等方面几乎一直保持着指数增长的趋势，2006年7月，互联网上共有主机439，286，364 台，WWW 站点数量达到 96，854，877个 ［1］。全球上网人口在2004 年达到 7 亿 2900万 ［2］，中国的上网人数在 2006  年 12 月达到了约 1亿3700  万［3］。另一方面，互联网所传递的内容也发生了巨大的变化，早期互联网以静态、文本的公共信息为主要内容，而目前的互联网则传递着大量的动态、多媒体及 人性化的信息，人们不仅可以通过  互联网阅读到动态生成的信息，而且可以通过它使用电子商务、即时通信、网上游戏等交互性很强的服务。因此，可以说互联网已经不再仅仅是一个信息共享网络， 而已经成为了一个无所不在的交互式服务的平台。</p>
<p>1.2 互联网网站建设的新趋势</p>
<p>互联网不断扩大的规模，日益增长的用户群，以及web2.0［4］的兴起，对互联网网站建设提出了新的要求:</p>
<p>高性能和高可扩展性。2000 年 5 月，访问量排名世界第一（统计数据来源［5］）的Yahoo ［6］声称其日页浏览数达到 6 亿  2500 万，即每秒约 30，000 次HTTP 请求(按每个页面浏览平均产生 4 次请求计算)  。这样大规模的访问量对服务的性能提出了非常高的要求。更为重要的是，互联网受众的广泛性，使得成功的互联网服务的访问量增长潜力和速度非常大，因此服务 系统必须具有非常好的可扩展性，以应付将来可能的服务增长。</p>
<p>支持高度并发的访问。高度并发的访问对服务的存储与并发能力提出了很高的要求，当前主流的超标量和超流水线处理器能处理的并发请求数是有限的，因 为随着并发数的上升，进程调度的开销会很快上升。互联网广域网的本质决定了其访问的延迟时间较长，因此一个请求完成时间也较长，按从请求产生到页面下载完 成 3 秒计算， Yahoo 在 2000 年 5 月时平均有 90，000  个并发请求。而且对于较复杂的服务，服务器往往要维护用户会话的信息，例如一个互联网网站如果每天有 100 万次用户会话，每次  20分钟的话，那平均同时就会有约 14000 个并发会话。</p>
<p>高可用性。互联网服务的全球性决定了其每天 24  小时都会有用户访问，因此任何服务的停止都会对用户造成影响。而对于电子商务等应用，暂时的服务中止则意味着客户的永久失去及大量的经济损失，例如  ebay.com［7］1999 年 6 月的一次 22小时的网站不可访问，对此网站的 380万用户的忠诚度造成巨大影响，使得 Ebay  公司不得不支付了近500万美元用于补偿客户的损失，而该公司的市值同期下降了 40 亿美元［8］。因此，关键互联网应用的可用性要求非常高。</p>
<p>1.3 新浪播客的简介</p>
<p>以YouTube［9］为代表的微视频分享网站近来方兴未艾，仅2006年一年，国内就出现近百家仿YouTube的微视频分享网站［10］，试 图复制YouTube的成功模式。此类网站可以说是Web2.0概念下的代表网站，具有Web2.0网站所有典型特征：高并发，高流量，数据量大，逻辑复 杂，用户分散等等。新浪［11］作为国内最大的门户网站，在2005年成功运作新浪博客的基础上，于2006年底推出了新浪播客服务。新浪播客作为国内门 户网站中第一个微视频分享服务的网站，依靠新浪网站及新浪博客的巨大人气资源，在推出后不到半年的时间内，取得了巨大的成功：同类网站中上传视频数量第 一、流量增长最快、用户数最多［12］，所有这些成绩的取得的背后，是巨大的硬件投入，良好的架构支撑和灵活的应用层软件设计。</p>
<p>本文是作者在新浪爱问搜索部门实习及参与新浪播客开发的经验和教训的回顾，是作者对一般高并发高流量网站架构的总结和抽象。<br />
2.1 镜像网站技术</p>
<p>镜像网站是指将一个完全相同的站点放到几个服务器上，分别有自己的URL，这些服务器上的网站互相称为镜像网站［13］。镜像网站和主站并没有太 大差别，或者可以视为主站的拷贝。镜像网站的好处是：如果不能对主站作正常访问（如服务器故障，网络故障或者网速太慢等），仍能通过镜像服务器获得服务。 不便之处是：更新网站内容的时候，需要同时更新多个服务器；需要用户记忆超过一个网址，或需要用户选择访问多个镜像网站中的一个，而用户选择的，不一定是 最优的。在用户选择的过程中，缺乏必要的可控性。</p>
<p>在互联网发展的初期，互联网上的网站内容很少，而且大都是静态内容，更新频率底。但因为服务器运算能力低，带宽小，网速慢，热门网站的访问压力还 是很大。镜像网站技术在这种情况下作为一种有效解决方案，被广泛采用。随着互联网的发展，越来越多的网站使用服务器端脚本动态生成内容，同步更新越来越困 难，对可控性要求越来越高，镜像技术因为不能满足这类网站的需要，渐渐的淡出了人们的视线。但有一些大型的软件下载站，因为符合镜像网站的条件——下载的 内容是静态的，更新频率较低，对带宽，速度要求又比较高，如国外的SourceForge  （http://www.SourceForge.net，著名开源软件托管网站），Fedora（http: //fedoraproject.org，RedHat赞助的Linux发行版），国内的华军软件园（http: //www.onlinedown.net），天空软件站（http://www.skycn.com）等，还在使用这项技术（图1）。</p>
<p><img title="点击查看原始大小图片" src="http://dl.javaeye.com/upload/attachment/146217/d072d292-609c-3cae-a530-d33d1f58af20.jpg" alt="" width="700" height="286" /><br />
图1 上图：天空软件站首页的镜像选择页面</p>
<p>下图：SourceForge下载时的镜像选择页面</p>
<p><img src="http://dl.javaeye.com/upload/attachment/146219/76c73e92-f71c-3dcb-be7a-73925701f962.jpg" alt="" /></p>
<p>在网站建设的过程中，可以根据实际情况，将静态内容作一些镜像，以加快访问速度，提升用户体验。</p>
<p>2.2 CDN内容分发网络</p>
<p>CDN的全称是Content Delivery  Network，即内容分发网络。其目的是通过在现有的互联网中增加一层新的网络架构，将网站的内容发布到最接近用户的网络“边缘”，使用户可以就近取得 所需的内容，分散服务器的压力，解决互联网拥挤的状况，提高用户访问网站的响应速度。从而解决由于网络带宽小、用户访问量大、网点分布不均等原因所造成的 用户访问网站响应速度慢的问题［14］。</p>
<p>CDN与镜像网站技术的不同之处在于网站代替用户去选择最优的内容服务器，增强了可控制性。CDN其实是夹在网页浏览者和被访问的服务器中间的一层镜像或 者说缓存，浏览者访问时点击的还是服务器原来的URL地址，但是看到的内容其实是对浏览者来说最优的一台镜像服务器上的页面缓存内容。这是通过调整服务器 的域名解析来实现的。使用CDN技术的域名解析服务器需要维护一个镜像服务器列表和一份来访IP到镜像服务器的对应表。当一个用户的请求到来的时候，根据 用户的IP，查询对应表，得到最优的镜像服务器的IP地址，返回给用户。这里的最优，需要综合考虑服务器的处理能力，带宽，离访问者的距离远近等因素。当 某个地方的镜像网站流量过大，带宽消耗过快，或者出现服务器，网络等故障的时候，可以很方便的设置将用户的访问转到另外一个地方（图2）。这样就增强了可 控制性。</p>
<p><img src="http://dl.javaeye.com/upload/attachment/146220/5d890523-62e6-3d59-b0b9-d37f7c79a32a.jpg" alt="" /></p>
<p>图2 CDN原理示意图</p>
<p>CDN网络加速技术也有它的局限性。首先，因为内容更新的时候，需要同步更新多台镜像服务器，所以它也只适用于内容更新不太频繁，或者对实时性要 求不是很高的网站；其次，DNS解析有缓存，当某一个镜像网站的访问需要转移时，主DNS服务器更改了IP解析结果，但各地的DNS服务器缓存更新会滞后 一段时间，这段时间内用户的访问仍然会指向该服务器，可控制性依然有不足。</p>
<p>目前，国内访问量较高的大型网站如新浪、网易等的资讯频道，均使用CDN网络加速技术（图3），虽然网站的访问量巨大，但无论在什么地方访问，速 度都会很快。但论坛，邮箱等更新频繁，实时性要求高的频道，则不适合使用这种技术。</p>
<p><img src="http://dl.javaeye.com/upload/attachment/146223/9d82832c-2da6-3353-b203-bd8ded264f7c.jpg" alt="" /></p>
<p>图3 新浪网使用ChinaCache CDN服务。</p>
<p>ChinaCache的服务节点全球超过130个，</p>
<p>其中中国节点超过80个，</p>
<p>覆盖全国主要6大网络的主要省份［15］。</p>
<p>2.3 应用层分布式设计<br />
新浪播客为了获得CDN网络加速的优点，又必须避免CDN的不足，在应用层软件设计上，采取了一个替代的办法。新浪播客提供了一个供播放器查询视 频文件地址的接口。当用户打开视频播放页面的时候，播放器首先连接查询接口，通过接口获得视频文件所在的最优的镜像服务器地址，然后再到该服务器去下载视 频文件。这样，用一次额外的查询获得了全部的控制性，而这次查询的通讯流量非常小，几乎可以忽略不计。CDN中由域名解析获得的灵活性也保留了下来：由接 口程序维护镜像网站列表及来访IP到镜像网站的对应表即可。镜像网站中不需要镜像所有的内容，而是只镜像更新速度较慢的视频文件。这是完全可以承受的。</p>
<p>2.4 网络层架构小结<br />
从整个互联网络的高度来看网站架构，努力的方向是明确的：让用户就近取得内容，但又要在速度和可控制性之间作一个平衡。对于更新比较频繁内容，由 于难以保持镜像网站之间的同步，则需要使用其他的辅助技术。<br />
3 交换层架构</p>
<p>3.1 第四层交换简介<br />
按照OSI［16］七层模型，第四层是传输层。传输层负责端到端通信，在IP协议栈中是TCP和UDP所在的协议层。TCP和UDP数据包中包含 端口号（port  number），它们可以唯一区分每个数据包所属的协议和应用程序。接收端计算机的操作系统根据端口号确定所收到的IP包类型，并把它交给合适的高层程 序。IP地址和端口号的组合通常称作“插口（Socket）”。</p>
<p>第四层交换的一个简单定义是：它是一种传输功能，它决定传输不仅仅依据MAC地址(第二层网桥)或源/目标IP地址(第三层路由)，而且依据IP 地址与TCP/UDP (第四层)  应用端口号的组合（Socket）［17］。第四层交换功能就像是虚拟IP，指向实际的服务器。它传输的数据支持多种协议，有HTTP、FTP、NFS、 Telnet等。</p>
<p>以HTTP协议为例，在第四层交换中为每个服务器组设立一个虚拟IP（Virtue  IP，VIP），每组服务器支持某一个或几个域名。在域名服务器（DNS）中存储服务器组的VIP，而不是某一台服务器的真实地址。</p>
<p>当用户请求页面时，一个带有目标服务器组的VIP连接请求发送给第四层交换机。第四层交换机使用某种选择策略，在组中选取最优的服务器，将数据包 中的目标VIP地址用实际服务器的IP地址取代，并将连接请求传给该服务器。第四层交换一般都实现了会话保持功能，即同一会话的所有的包由第四层交换机进 行映射后，在用户和同一服务器间进行传输［18］。</p>
<p>第四层交换按实现分类，分为硬件实现和软件实现。</p>
<p>3.2 硬件实现<br />
第四层交换的硬件实现一般都由专业的硬件厂商作为商业解决方案提供。常见的有  Alteon［19］，F5［20］等。这些产品非常昂贵，但是能够提供非常优秀的性能和很灵活的管理能力。Yahoo中国当初接近2000台服务器使用 了三四台Alteon就搞定了［21］。鉴于条件关系，这里不展开讨论。</p>
<p>3.3 软件实现<br />
第四层交换也可以通过软件实现，不过性能比专业硬件稍差，但是满足一定量的压力还是可以达到的，而且软件实现配置起来更灵活。  软件四层交换常用的有Linux上的LVS（Linux Virtual Server），它提供了基于心跳（heart  beat）的实时灾难应对解决方案，提高了系统的鲁棒性，同时提供了灵活的VIP配置和管理功能，可以同时满足多种应用需求［22］。<br />
4 服务器优化</p>
<p>4.1 服务器整体性能考虑<br />
对于价值昂贵的服务器来说，怎样配置才能发挥它的最大功效，又不至于影响正常的服务，这是在设计网站架构的时候必须要考虑的。常见的影响服务器的 处理速度的因素有：网络连接，硬盘读写，内存空间，CPU速度。如果服务器的某一个部件满负荷运转仍然低于需要，而其他部件仍有能力剩余，我们将之称为性 能瓶颈。服务器想要发挥最大的功效，关键的是消除瓶颈，让所有的部件都被充分的利用起来。</p>
<p>4.2 Socket优化<br />
以标准的 GNU/Linux 为例。GNU/Linux  发行版试图对各种部署情况都进行优化，这意味着对具体服务器的执行环境来说，标准的发行版可能并不是最优化的［23］。GNU/Linux  提供了很多可调节的内核参数，可以使用这些参数为服务器进行动态配置，包括影响 Socket 性能的一些重要的选项。这些选项包含在 /proc  虚拟文件系统中。这个文件系统中的每个文件都表示一个或多个参数，它们可以通过 cat 工具进行读取，或使用 echo  命令进行修改。这里仅列出一些影响TCP/IP 栈性能的可调节内核参数［24］：</p>
<p>/proc/sys/net/ipv4/tcp_window_scaling “1”（1表示启用该选项，0表示关闭，下同） 启用  RFC［25］ 1323［26］ 定义的 window scaling；要支持超过 64KB 的窗口，必须启用该值。</p>
<p>/proc/sys/net/ipv4/tcp_sack “1”启用有选择的应答（Selective  Acknowledgment），通过有选择地应答乱序接收到的报文来提高性能（这样可以让发送者只发送丢失的报文段）；对于广域网通信来说，这个选项应 该启用，但是这也会增加对 CPU 的占用。</p>
<p>/proc/sys/net/ipv4/tcp_timestamps “1” 以一种比重发超时更精确的方法（参阅 RFC  1323）来启用对 RTT 的计算；为了实现更好的性能应该启用这个选项。</p>
<p>/proc/sys/net/ipv4/tcp_mem “24576 32768 49152” 确定 TCP  栈应该如何反映内存使用；每个值的单位都是内存页（通常是  4KB）。第一个值是内存使用的下限。第二个值是内存压力模式开始对缓冲区使用应用压力的上限。第三个值是内存上限。超过这个上限时可以将报文丢弃，从而 减少对内存的使用。</p>
<p>/proc/sys/net/ipv4/tcp_wmem “4096 16384 131072” 为自动调优定义每个 socket  使用的内存。第一个值是为 socket 的发送缓冲区分配的最少字节数。第二个值是默认值（该值会被 wmem_default  覆盖），缓冲区在系统负载不重的情况下可以增长到这个值。第三个值是发送缓冲区空间的最大字节数（该值会被 wmem_max 覆盖）。</p>
<p>/proc/sys/net/ipv4/tcp_westwood “1”  启用发送者端的拥塞控制算法，它可以维护对吞吐量的评估，并试图对带宽的整体利用情况进行优化；对于 WAN 通信来说应该启用这个选项。</p>
<p>与其他调优努力一样，最好的方法实际上就是不断进行实验。具体应用程序的行为、处理器的速度以及可用内存的多少都会影响到这些参数对性能作用的效 果。在某些情况中，一些认为有益的操作可能恰恰是有害的（反之亦然）。因此，需要逐一试验各个选项，然后检查每个选项的结果，最后得出最适合具体机器的一 套参数。</p>
<p>如果重启了 GNU/Linux 系统，设置的内核参数都会恢复成默认值。为了将所设置的值作为这些参数的默认值，可以使用  /etc/rc.local 文件，在系统每次启动时自动将这些参数配置成所需要的值。</p>
<p>在检测每个选项的更改带来的效果的时候，GNU/Linux上有一些非常强大的工具可以使用：</p>
<p>ping 这是用于检查主机的可用性的最常用的工具，也可以用于计算网络带宽延时。</p>
<p>traceroute 打印连接到特定网络主机所经过的一系列路由器和网关的路径（路由），从而确定每个 hop 之间的延时。</p>
<p>netstat 确定有关网络子系统、协议和连接的各种统计信息。</p>
<p>tcpdump 显示一个或多个连接的协议级的报文跟踪信息，其中包括时间信息，可以使用这些信息来研究不同协议的报文时间。</p>
<p>Ethereal 以一个易于使用的图形化界面提供 tcpump （报文跟踪）的信息，支持报文过滤功能。</p>
<p>iperf 测量 TCP 和 UDP 的网络性能；测量最大带宽，并汇报延时和数据报的丢失情况。</p>
<p>4.3 硬盘级缓存<br />
硬盘级别的缓存是指将需要动态生成的内容暂时缓存在硬盘上，在一个可接受的延迟时间范围内，同样的请求不再动态生成，以达到节约系统资源，提高网 站承受能力的目的。Linux环境下硬盘级缓存一般使用Squid［27］。</p>
<p>Squid是一个高性能的代理缓存服务器。和一般的代理缓存软件不同，Squid用一个单独的、非模块化的、I/O驱动的进程来处理所有的客户端 请求。它接受来自客户端对目标对象的请求并适当地处理这些请求。比如说，用户通过浏览器想下载（即浏览）一个web页面，浏览器请求Squid为它取得这 个页面。Squid随之连接到页面所在的原始服务器并向服务器发出取得该页面的请求。取得页面后，Squid再将页面返回给用户端浏览器，并且同时在 Squid本地缓存目录里保存一份副本。当下一次有用户需要同一页面时，Squid可以简单地从缓存中读取它的副本，直接返回给用户，而不用再次请求原始 服务器。当前的Squid可以处理HTTP， FTP， GOPHER， SSL和WAIS等协议。</p>
<p>Squid默认通过检测HTTP协议头的Expires和  Cache-Control字段来决定缓存的时间。在实际应用中，可以显式的在服务器端脚本中输出HTTP头，也可以通过配置apache的  mod_expires模块，让apache自动的给每一个网页加上过期时间。对于静态内容，如图片，视频文件，供下载的软件等，还可以针对文件类型（扩 展名），用 Squid 的 refresh_pattern 来指定缓存时间。</p>
<p>Squid 运行的时候，默认会在硬盘上建两层hash目录，用来存储缓存的Object。它还会在内存中建立一个Hash  Table，用来记录硬盘中Object分布的情况。如果Squid配置成为一个Squid集群中的一个的话，它还会建立一个 Digest  Table(摘要表)，用来存储其它 Squid  上的Object摘要。当用户端想要的资料本地硬盘上没有时，可以很快的知道应该去集群中的哪一台机器获得。在硬盘空间快要达到配置限额的时候，可以配置 使用某种策略（默认使用LRU：Least Recently Used-最近最少用）删除一些Object，从而腾出空间［28］［29］。</p>
<p>集群中的Squid Server 之间可以有两种关系：第一种关系是：Child 和 Parent。当 Child Squid  Server 没有资料时，会直接向 Parent Squid Server 要资料，然后一直等，直到 Parent 给它资料为止。  第二种关系是：Sibling 和 Sibling。当 Squid Server 没有资料时，会先向 Sibling 的 Squid Server  要资料，如果 Sibling 没资料，就跳过它向 Parent 要或直接上原始网站去拿。</p>
<p>默认配置的Squid，没有经过任何优化的时候，一般可以达到 50%  的命中率［30］（图4）。如果需要，还可以通过参数优化，拆分业务，优化文件系统等办法，使得Squid达到 90% 以上的缓存命中率。  Squid处理TCP连接消耗的服务器资源比真正的HTTP服务器要小的多，当Squid分担了大部分连接，网站的承压能力就大大增强了。</p>
<p><img src="http://dl.javaeye.com/upload/attachment/146225/c6d4f6d8-d3be-3a74-8264-cae935826196.jpg" alt="" /></p>
<p>4 某网站使用MRTG工具检测到的Squid命中率</p>
<p>蓝线表示Squid的流量，绿色部分表示Apache流量</p>
<p>4.4 内存级缓存<br />
内存级别的缓存是指将需要动态生成的内容暂时缓存在内存里，在一个可接受的延迟时间范围内，同样的请求不再动态生成，而是直接从内存中读取。 Linux环境下内存级缓存Memcached［31］是一个不错的选择。</p>
<p>Memcached是danga.com（运营Live  Journal［32］的技术团队）开发的一套非常优秀的分布式内存对象缓存系统，用于在动态系统中减少数据库负载，提升性能。和 Squid  的前端缓存加速不同，它是通过基于内存的对象缓存来减少数据库查询的方式改善网站的性能，而其中最吸引人的一个特性就是支持分布式部署；也就是说可以在一 群机器上建立一堆 Memcached  服务，每个服务可以根据具体服务器的硬件配置使用不同大小的内存块，这样，理论上可以建立一个无限大的基于内存的缓存系统。</p>
<p>Memcached 是以守护程序方式运行于一个或多个服务器中，随时接受客户端的连接操作，客户端可以由各种语言编写，目前已知的客户端  API 包括 Perl/PHP/Python/Ruby/Java/C#/C 等等[附录1]。客户端首先与 Memcached  服务建立连接，然后存取对象。每个被存取的对象都有一个唯一的标识符 key，存取操作均通过这个 key 进行，保存的时候还可以设置有效期。保存在  Memcached 中的对象实际上是放置在内存中的，而不是在硬盘上。Memcached  进程运行之后，会预申请一块较大的内存空间，自己进行管理，用完之后再申请一块，而不是每次需要的时候去向操作系统申请。Memcached将对象保存在 一个巨大的Hash表中，它还使用NewHash算法来管理Hash表，从而获得进一步的性能提升。所以当分配给Memcached的内存足够大的时 候，Memcached的时间消耗基本上只是网络Socket连接了［33］。</p>
<p>Memcached也有它的不足。首先它的数据是保存在内存当中的，一旦服务进程重启（进程意外被关掉，机器重启等），数据会全部丢失。其次 Memcached以root权限运行，而且Memcached本身没有任何权限管理和认证功能，安全性不足。第一条是Memcached作为内存缓存服 务使用无法避免的，当然，如果内存中的数据需要保存，可以采取更改Memcached的源代码，增加定期写入硬盘的功能。对于第二条，我们可以将 Memcached服务绑定在内网IP上，通过Linux防火墙进行防护。</p>
<p>4.5 CPU与IO均衡<br />
在一个网站提供的所有功能中，有的功能可能需要消耗大量的服务器端IO资源，像下载，视频播放等，而有的功能则可能需要消耗大量的服务器CPU资 源，像视频格式转换，LOG统计等。在一个服务器集群中，当我们发现某些机器上CPU和  IO的利用率相差很大的时候，例如CPU负载很高而IO负责很低，我们可以考虑将该服务器上的某些耗CPU资源的进程换成耗IO的进程，以达到均衡的目 的。均衡每一台机器的CPU和IO消耗，不仅可以获得更充分的服务器资源利用，而且还能够支持暂时的过载，遇到突发事件，访问流量剧增的时候，实现得体的 性能下降(Graceful performance degradation)［34］，而不是立即崩溃。</p>
<p>4.6 读写分离<br />
如果网站的硬盘读写性能是整个网站性能提升的一个瓶颈的话，可以考虑将硬盘的读，写功能分开，分别进行优化。在专门用来写的硬盘上，我们可以在 Linux下使用软件RAID-0（磁盘冗余阵列0级）［35］。RAID-0在获得硬盘IO提升的同时，也会增加整个文件系统的故障率——它等于 RAID中所有驱动器的故障率之和。如果需要保持或提高硬盘的容错能力，就需要实现软件RAID-1，4或  5，它们能在某一个（甚至几个）磁盘驱动器故障之后仍然保持整个文件系统的正常运行［36］，但文件读写效率不如RAID-0。而专门用来读的硬盘，则不 用如此麻烦，可以使用普通的服务器硬盘，以降低开销。</p>
<p>一般的文件系统，会综合考虑各种大小和格式的文件的读，写效率，因而对特定的文件读或写的效率不是最优。如果有必要，可以通过选择文件系统，以及 修改文件系统的配置参数来达到对特定文件的读或写的效率最大化。比如说，如果文件系统中需要存储大量的小文件，则可以使用  ReiserFS［37］来替代Linux操作系统默认的ext3系统，因为ReiserFS是基于平衡树的文件系统结构，尤其对于大量文件的巨型文件系 统，搜索速度要比使用局部的二分查找法的ext3快。  ReiserFS里的目录是完全动态分配的，因此不存在ext3中常见的无法回收巨型目录占用的磁盘空间的情况。ReiserFS里小文件（&lt;  4K）可以直接存储进树，小文件读取和写入的速度更快，树内节点是按字节对齐的，多个小文件可共享同一个硬盘块，节约大量空间。ext3使用固定大小的块 分配策略，也就是说，不到4K的小文件也要占据4K的空间，导致的空间浪费比较严重［38］。但ReiserFS对很多Linux内核支持的不是很好，包 括2.4.3、2.4.9 甚至相对较新的  2.4.16，如果网站想要使用它，就必须要安装与它配合的较好的2.4.18内核——一般管理员都不是很乐意使用太新的内核，因为在它上面运行的软件， 都还没有经过大量的实践测试，也许有一些小的bug还没有被发现，但对于服务器来说，再小的bug也是不能接受的。ReiserFS还是一个较为年轻的， 发展迅速的文件系统，它相对于ext3来说有一个很大的缺陷就是，每次ReiserFS文件系统升级的时候，必须完全重新格式化整个磁盘分区。所以在选择 使用的时候，需要权衡取舍［39］。<br />
5 应用程序层优化</p>
<p>5.1 网站服务器程序的选择<br />
经统计［40］，当前互联网上有超过50%的网站主机使用Apache［41］服务器程序。  Apache是开源界的首选Web服务器，因为它的强大和可靠，而且适用于绝大部分的应用场合。但是它的强大有时候却显得笨重，配置文件复杂得让人望而生 畏，高并发情况下效率不太高。而轻量级的Web服务器Lighttpd［42］却是后起之秀，基于单进程多路复用技术，其静态文件的响应能力远高于  Apache。  Lighttpd对PHP的支持也很好，还可以通过Fastcgi方式支持其他的语言，比如Python等。虽然Lighttpd是轻量级的服务器，功能 上不能跟Apache比，某些复杂应用无法胜任，但即使是大部分内容动态生成的网站，仍免不了会有一些静态元素，比如图片、JS脚本、CSS等等，可以考 虑将Lighttpd放在Squid的前面，构成  Lighttpd-&gt;Squid-&gt;Apache的一条处理链，Lighttpd在最前面，专门处理静态内容的请求，把动态内容请求通过  Proxy模块转发给Squid，如果Squid中有该请求的内容且没有过期，则直接返回给Lighttpd。新请求或者过期的页面请求交由Apache   中的脚本程序来处理。经过Lighttpd和Squid的两级过滤，Apache需要处理的请求大大减少，减少了Web应用程序的压力。同时这样的构架， 便于把不同的处理分散到多台计算机上进行，由Lighttpd在前面统一分发。</p>
<p>在这种架构下，每一级都是可以进行单独优化的，比如Lighttpd可以采用异步IO方式，Squid可以启用内存来缓存，Apache可以启用 MPM（Multi -Processing Modules，多道处理模块）等，并且每一级都可以使用多台机器来均衡负载，伸缩性好。</p>
<p>著名视频分享网站YouTube就是选择使用Lighttpd作为网站的前台服务器程序。</p>
<p>5.2 数据库选择<br />
MySQL［43］是一个快速的、多线程、多用户和健壮的SQL数据库服务器，支持关键任务、重负载系统的使用，是最受欢迎的开源数据库管理系 统，是Linux下网站开发的首选。它由MySQL AB开发、发布和提供支持。</p>
<p>MySQL数据库能为网站提供：</p>
<p>高性能。MySQL支持海量，快速的数据库存储和读取。还可以通过使用64位处理器来获取额外的一些性能，因为MySQL在内部里很多时候都使用 64位的整数处理。</p>
<p>易用性。MySQL的核心是一个小而快速的数据库。它的快速连接，快速存取和安全可靠的特性使MySQL非常适合在互联网站上使用。</p>
<p>开放性。MySQL提供多种后台存储引擎的选择，如MyISAM， Heap， InnoDB，Berkeley  Db等。缺省格式为MyISAM。 MyISAM 存储引擎与磁盘兼容的非常好［44］。</p>
<p>支持企业级应用。MySQL有一个用于记录数据改变的二进制日志。因为它是二进制的，这一日志能够快速地将数据的更改从一台机器复制 （replication）到另一台机器上。即使服务器崩溃，这一二进制日志也能够保持完整。这一特性通常被用来搭建数据库集群，以支持更大的流量访问要 求［30］（图5）。</p>
<p><img src="http://dl.javaeye.com/upload/attachment/146227/690bd6db-939f-35b7-a1ab-31a5b9997e63.jpg" alt="" /></p>
<p>图</p>
<p>5 MySQL主辅库模式集群示意</p>
<p>MySQL也有一些它自身的缺陷，如缺乏图形界面，缺乏存储过程，  还不支持触发器，参照完整性，子查询和数据表视图等，但这些功能都在开发者的TO-DO列表当中。这就是开源的力量：你永远可以期待更好。</p>
<p>国外的Yahoo!，国内的新浪，搜狐等很多大型商业网站都使用MySQL  作为后台数据库。对于一般的网站系统，无论从成本还是性能上考虑，MySQL应该是最佳的选择。</p>
<p>5.3 服务器端脚本解析器的选择<br />
目前最常见的服务器端脚本有三种：ASP(Active Server Pages)，JSP(Java Server Pages)，PHP  (Hypertext Preprocessor)［45］［46］。</p>
<p>ASP全名Active Server  Pages，以及它的升级ASP.NET，是微软公司出品的一个WEB服务器端的开发环境，利用它可以产生和运行动态的、交互的、高性能的WEB服务应用 程序。ASP采用脚本语言VBScript（C#）作为自己的开发语言。 但因为只能运行在Windows环境下，这里我们不讨论它。</p>
<p>PHP是一种跨平台的服务器端的嵌入式脚本语言。它大量地借用C，Java和Perl语言的语法，并耦合PHP自己的特性，使WEB开发者能够快 速地写出动态生成页面。它支持目前绝大多数数据库。PHP也是开源的，它的发行遵从GPL开源协议，你可以从  PHP官方站点(http://www.php.net)自由下载到它的二进制安装文件及全部的源代码。如果在Linux平台上与MySQL搭配使 用，PHP是最佳的选择。</p>
<p>JSP是Sun公司推出的新一代站点开发语言，是Java语言除Java应用程序和Java  Applet之外的第三个应用。Jsp可以在Serverlet和JavaBean的支持下，完成功能强大的站点程序。作为采用Java技术家族的一部 分，以及Java  2（企业版体系结构）的一个组成部分，JSP技术拥有Java技术带来的所有优点，包括优秀的跨平台性，高度可重用的组件设计，健壮性和安全性等，能够支 持高度复杂的基于Web的应用。</p>
<p>除了这三种常见的脚本之外，在Linux下我们其实还有很多其他的选择：Python（Google使用），Perl等，如果作为CGI调用，那 么可选择范围就更广了。使用这些不太常见的脚本语言的好处是，它们对于某些特殊的应用有别的脚本所不具有的优势；不好的地方是，这些脚本语言在国内使用的 人比较少，当碰到技术上的问题的时候，能找到的资料也较少。</p>
<p>5.4 可配置性<br />
在大型网站开发过程中，不管使用什么技术，网站的可配置性是必须的。在网站的后期运营过程中，肯定会有很多的需求变更。如果每一次的需求变更都会 导致修改源代码，那么，这个网站的开发可以说是失败的。</p>
<p>首先，也是最重要的一点，功能和展示必须分开。PHP和JSP都支持模板技术，如PHP的  Smarty，Phplib，JSP的JSTL（JSP Standard Tag  Library）等。核心功能使用脚本语言编写，前台展示使用带特殊标签的HTML，不仅加快了开发速度，而且方便以后的维护和升级［47］。</p>
<p>其次，对于前台模板，一般还需要将页面的头，尾单独提取出来，页面的主体部分也按模块或者功能拆分。对CSS，JS等辅助性的代码，也建议以单独 的文件形式存放。这样不仅方便管理，修改，而且还可以在用户访问的时候进行缓存，减少网络流量，减轻服务器压力。</p>
<p>再次，对于核心功能脚本，必须将与服务器相关的配置内容，如数据库连接配置，脚本头文件路径等，与代码分离开。尤其当网站使用集群技术，CDN加 速等技术的时候，每一台服务器上的配置可能都会不一样。如果不使用配置文件，则需要同时维护几份不同的代码，很容易出错。</p>
<p>最后，应该尽量做到修改配置文件后能实时生效，避免修改配置文件之后需要重启服务程序的情况。</p>
<p>5.5 封装和中间层思想<br />
在功能块层次，如果使用JSP，基于纯面向对象语言Java的面向对象思想，类似数据库连接，会话管理等基本功能都已经封装成类了。如果使用 PHP，则需要在脚本代码中显式的封装，将每一个功能块封装成一个函数，一个文件或者一个类。</p>
<p>在更高的层次，可以将网站分为表示层，逻辑层，持久层，分别进行封装，做到当某一层架构发生变化时，不会影响到其他层。比如新浪播客在一次升级的 时候，将持久层的数据库由原来的集中式改为分布式架构，因为封装了数据库连接及所有操作[附录2]，做到了不修改任何上层代码，平稳的实现了过渡。近来流 行的MVC架构，将整个网站拆分成Model（模型/逻辑）、View（视图/界面）、Controller（控制/流程）三个部分，而且有很多优秀的代 码框架可供选择使用， 像JSP的Structs，Spring，PHP的php.MVC， Studs  等。使用现成的代码框架，可以使网站开发事半功倍。<br />
6 扩容、容错处理</p>
<p>6.1 扩容<br />
一个大型网站，在设计架构的时候，必须考虑到以后可能的容量扩充。新浪播客在设计时充分地考虑了这一点。对于视频分享类网站来说，视频存储空间消 耗是巨大的。新浪播客在主存储服务器上，采用配置文件形式指定每一个存储盘柜上存储的视频文件的ID范围。当前台服务器需要读取一个视频的时候，首先通过 询问主存储服务器上的接口获得该视频所在的盘柜及目录地址，然后再去该盘柜读取实际的视频文件。这样如果需要增加存储用的盘柜，只需要修改配置文件即可， 前台程序丝毫不受影响。</p>
<p>新浪播客采用MySQL数据库集群，在逻辑层封装了所有的数据库连接及操作。当数据库存储架构发生改变的时候，如增加一台主库，将某些数据表独立 成库，增加读取数据用的从库等，都只需要修改封装了的数据库操作类，上层代码不用修改。</p>
<p>新浪播客的前台页面服务器使用F5公司的硬件第四层交换机，网通，电信分别导向不同的虚拟IP，每一个虚拟IP后面又有多个服务器提供服务。当访 问流量增大的时候，可以很方便往虚拟IP后面增加服务器，分担压力。</p>
<p>6.2 容错<br />
对于商业性网站来说，可用性是非常重要的。7*24的访问要求网站具有很强的容错能力。错误包括网络错误，服务器错误以及应用程序错误。</p>
<p>2006年12月27日台湾东部外海发生里氏7.6级地震，造成途径台湾海峡的多条海底电缆中断，导致许多国外网站，像MSN， NBA，  Yahoo！（英文主站）等国内无法访问，但也有例外，以Google为代表的在国内建设有分布式数据节点的很多网站却仍然可以访问。虽然说地震造成断网 是不可抗原因，但如果在这种情况下网站仍然可以访问，无疑能给网站用户留下深刻的印象。这件事情给大型商业网站留下的教训是：网站需要在用户主要分布区域 保持数据存在，以防止可能的网络故障。</p>
<p>对于服务器错误，一般采取冗余设计的方法来避免。对于存储服务器（主要是负责写入的服务器），可以使用RAID（冗余磁盘阵列）；对于数据库（主 要是负责写入的主库），可以采用双主库设计［30］；对于提供服务的前台，则可以使用第四层交换的集群，由多台服务器同时提供服务，不仅分担了流量压力， 同时还可以互相作为备份。</p>
<p>在应用层程序中，也要考虑“用户友好”的出错设计。典型例子如HTTP 404  出错页面，程序内部错误处理，错误返回提示等，尽可能的做到人性化。<br />
7 总结及展望</p>
<p>7.1 总结<br />
<img title="点击查看原始大小图片" src="http://dl.javaeye.com/upload/attachment/146228/bfe6e513-f751-31de-9501-6484302c7ebd.jpg" alt="" width="700" height="485" /></p>
<p>对于一个高并发高流量的网站来说，任何一个环节的瓶颈都会造成网站性能的下降，影响用户体验，进而造成巨大的经济损失。在全互联网层面，应该使用 分布式设计，缩短网站与用户的网络距离，减少主干网上的流量，以及防止在网络意外情况下网站无法访问的问题。在局域网层面，应该使用服务器集群，一方面可 以支撑更大的访问量，另一方面也作为冗余备份，防止服务器故障导致的网站无法访问。在单服务器层面，应该配置操作系统，文件系统及应用层软件，均衡各种资 源的消耗，消除系统性能瓶颈，充分发挥服务器的潜能。在应用层，可以通过各种缓存来提升程序的效率，减少服务器资源消耗（图6）。另外，还需要合理设计应 用层程序，为以后的需求变更，扩容做好准备。</p>
<p>图6 典型高并发高流量网站的架构</p>
<p>在每一个层次，都需要考虑容错的问题，严格消除单点故障，做到无论应用层程序错误，服务器软件错误，服务器硬件错误，还是网络错误，都不影响网站 服务。</p>
<p>7.2展望<br />
当前Linux环境下有著名的LAMP（Linux＋Apache＋MySQL＋PHP/PERL/PYTHON）网站建设方案，但只是针对一般 的中小网站而言。对于高并发高流量的大型商业网站，还没有一个完整的，性价比高的解决方案。除去服务器，硬盘，带宽等硬件投资外，还需要花费大量的预算和 时间精力在软件解决方案上。</p>
<p>随着互联网的持续发展，Web2.0的兴起，在可以预见的未来里，互联网的用户持续增多，提供用户参与的网站不断增加，用户参与的内容日益增长， 越来越多的网站的并发量，访问量会达到一个新的高度，这就会促使越来越多的个人，公司以及研究机构来关注高并发高流量的网站架构问题。就像Web1.0成 就了无数中小网站，成就了LAMP一样，Web2.0注定也会成就一个新的，高效的，成本较低的解决方案。这个方案应该包括透明的第三方CDN网络加速服 务，价格低廉的第四层甚至更高层网络交换设备，优化了网络性能的操作系统，优化了读写性能，分布式，高可靠的文件系统，揉合了内存，硬盘等各个级别缓存的 HTTP服务器，更为高效的服务器端脚本解析器，以及封装了大部分细节的应用层设计框架。</p>
<p>技术的进步永无止境。我们期待互联网更为美好的明天。</p>
<p>来源:<a href="http://javahead.javaeye.com/blog/468524" target="_blank">http://javahead.javaeye.com/blog/468524</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.haohtml.com/index.php/archives/4469/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>IPVS&#8212;LVS On FreeBSD的安装,配置</title>
		<link>http://blog.haohtml.com/index.php/archives/4180</link>
		<comments>http://blog.haohtml.com/index.php/archives/4180#comments</comments>
		<pubDate>Tue, 29 Jun 2010 12:55:14 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[服务器类]]></category>
		<category><![CDATA[集群]]></category>
		<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[lvs]]></category>

		<guid isPermaLink="false">http://blog.haohtml.com/?p=4180</guid>
		<description><![CDATA[虽然LVS很早就出来了.不过近日听朋友提起,觉得比较有意思,就看了一下,顺便装来玩一下.因为是看文档操作的,过程有点闷. 但幸庆的是,终于是配置成功了. 测试环境: VMWare 4.5.2 Load-Balancer : FreeBSD 6.1 (IPVS-0.4.0_2) Real Server-01 : FreeBSD 6.1 (Apache 2, ModPerl 2, Mysql 5 Client) Real Server-02 : FreeBSD 6.1 (Apache 2, ModPerl 2, Mysql 5 Client) 过程: freebsd-lb#cd /usr/ports/net/ipvs/ freebsd-lb#make install clean 上面的过程会出现错误,于是我将ipvs-0.4.0_2.tar.gz拷贝到/tmp目录下. freebsd-lb#cp /usr/ports/distfiles/ipvs-0.4.0_2.tar.gz /tmp/ 再解压 freebsd-lb#tar -vzxf ipvs-0.4.0_2.tar.gz 这样只是巧合不用再到指定地方下载ipvs-0.4.0_2.tar.gz这个包哈. 按照官方文档,正确过程应该是对内核打补丁,再重新编译后安装IPVS的. 下面就按照官方文档所说的过程操作吧,不过我把其中一些错误给修正了. 1. Patch the FreeBSD [...]]]></description>
			<content:encoded><![CDATA[<p>虽然LVS很早就出来了.不过近日听朋友提起,觉得比较有意思,就看了一下,顺便装来玩一下.因为是看文档操作的,过程有点闷.<br />
但幸庆的是,终于是配置成功了.<br />
测试环境:<br />
VMWare 4.5.2<br />
Load-Balancer : FreeBSD 6.1 (IPVS-0.4.0_2)<br />
Real Server-01 : FreeBSD 6.1 (Apache 2, ModPerl 2, Mysql 5 Client)<br />
Real Server-02 : FreeBSD 6.1 (Apache 2, ModPerl 2, Mysql 5 Client)<span id="more-4180"></span></p>
<p>过程:<br />
freebsd-lb#cd /usr/ports/net/ipvs/<br />
freebsd-lb#make install clean<br />
上面的过程会出现错误,于是我将ipvs-0.4.0_2.tar.gz拷贝到/tmp目录下.<br />
freebsd-lb#cp /usr/ports/distfiles/ipvs-0.4.0_2.tar.gz /tmp/<br />
再解压<br />
freebsd-lb#tar -vzxf ipvs-0.4.0_2.tar.gz<br />
这样只是巧合不用再到指定地方下载ipvs-0.4.0_2.tar.gz这个包哈.<br />
按照官方文档,正确过程应该是对内核打补丁,再重新编译后安装IPVS的.<br />
下面就按照官方文档所说的过程操作吧,不过我把其中一些错误给修正了.<br />
1. Patch the FreeBSD kernel:<br />
freebsd-lb#cd /tmp/ipvs-0.4.0_2<br />
freebsd-lb#cp patch/OS-RELEASE/* /usr/src<br />
OS-RELEASE对应你的系统版本号,其中有5.3-RELEASE,5.4-RELEASE,6.0-RELEASE,7.0-CURRENT<br />
我找不到6.1-RELEASE对应的目录,所以用了6.0的,后来证明6.0与6.1的patch在uipc_socket.c.path有点不一样.稍后再说.<br />
进入源代码目录,打补丁:<br />
freebsd-lb#cd /usr/src<br />
freebsd-lb#patch -p0 &lt; uipc_socket.c.patch<br />
freebsd-lb#patch -p0 &lt; ip_input.c.patch<br />
freebsd-lb#patch -p0 &lt; socketvar.h.patch<br />
freebsd-lb#patch -p0 &lt; sys_conf_options.patch<br />
因为6.1的uipc_socket.c与6.0的uipc_socket.c文件不一样,所以补丁没全部打上,我们要手动修改uipc_socket.c.patch<br />
freebsd-lb#vi sys/kern/uipc_socket.c<br />
找到#include &#8220;opt_compat.h&#8221;这一行,在下面加上#include &#8220;opt_nfsockopt.h&#8221;<br />
另外,6.0的目录下没有sys_i386_conf_GENERIC.patch文件,所以要在内核里加上options NF_SOCKOPT<br />
#nf_sockopt<br />
API这一项.或者直接使用5.3-RELEASE下的sys_i386_conf_GENERIC.patch文件.不过我用另一个文件名,所以我手动修改这个内核文件.<br />
下面就可以重新编译内核了.<br />
2. Rebuilding FreeBSD kernel:<br />
freebsd-lb#cd /usr/src/sys/arch/conf<br />
arch要用i386/ia64这些替换,我就用的是i386.<br />
安全起见,将旧的内核存为新的一份,编译新内核.<br />
freebsd-lb#cp GENERIC MYKERNEL<br />
freebsd-lb#config MYKERNEL<br />
freebsd-lb#cd ../compile/MYKERNEL<br />
freebsd-lb#make depend<br />
freebsd-lb#make<br />
freebsd-lb#make install<br />
3. Compile ipvs module:<br />
freebsd-lb#cd /tmp/ipvs-0.4.0_2/ipvs<br />
freebsd-lb#make<br />
freebsd-lb#make install<br />
freebsd-lb#cd ipvsadm<br />
freebsd-lb#mkdir -p -m 777 /man/man8<br />
freebsd-lb#make<br />
freebsd-lb#make install<br />
4. Compile ipvs scheduler module:<br />
freebsd-lb#cd ../schedulers<br />
freebsd-lb#cd SCHEDULER-NAME<br />
SCHEDULER-NAME要用指定的名称替换,我选择用rr算法,所以我是cd rr<br />
freebsd-lb#make<br />
freebsd-lb#make install<br />
5. Reboot with new kernel:<br />
freebsd-lb#reboot</p>
<p>执行下面指令设置VIP（十分重要）<br />
freebsd-server01#ifconfig lo0 alias 192.168.72.122 netmask 0xffffffff -arp up<br />
freebsd-server02#ifconfig lo0 alias 192.168.72.122 netmask 0xffffffff -arp up</p>
<p>启动ipvs步骤:<br />
我使用的是LVS/DR:<br />
1. freebsd-lb#kldload /boot/kernel/ipvs.ko<br />
2. freebsd-lb#kldload /boot/kernel/ip_vs_rr.ko<br />
3. freebsd-lb#ipvsadm -A -t 192.168.72.122:80 -s rr<br />
4. freebsd-lb#ipvsadm -a -t 192.168.72.122:80 -r 192.168.72.125:80 -g<br />
5. freebsd-lb#ipvsadm -a -t 192.168.72.122:80 -r 192.168.72.126:80 -g</p>
<p>停止ipvs步骤:<br />
1. freebsd-lb#ipvsadm -C<br />
2. freebsd-lb#kldunload ip_vs_rr<br />
3. freebsd-lb#kldunload ipvs</p>
<p>更新请查看：<a href="http://www.freebsdsoftware.org/net/ipvs.html">http://www.freebsdsoftware.org/net/ipvs.html</a><br />
本文来自各大博客，版权归原作者所有！<br />
引用源博文网址：<a href="http://beckheng.itpub.net/post/7469/194160">http://beckheng.itpub.net/post/7469/194160</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.haohtml.com/index.php/archives/4180/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>图解”How MySQL Replication Works”</title>
		<link>http://blog.haohtml.com/index.php/archives/4148</link>
		<comments>http://blog.haohtml.com/index.php/archives/4148#comments</comments>
		<pubDate>Sun, 27 Jun 2010 10:27:17 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[mysql]]></category>
		<category><![CDATA[集群]]></category>

		<guid isPermaLink="false">http://blog.haohtml.com/?p=4148</guid>
		<description><![CDATA[在使用MySQL的应用中，如果你的MySQL Server压力逐渐增大，在应用层优化已经到了一定瓶颈时，那么你应该首先考虑MySQL Replication。本文将利用图示的方式简单的描述出MySQL Replication是如何工作的。 如何同步 主库将所有的更新操作，写入二进制日志。 从库运行”IO线程”（Slave IO Thread）读取主库的二进制日志。 从库运行”SQL线程”（Slave SQL Thread）执行IO线程（Slave IO Thread）读取的日志中的SQL,从而保持和主库的一致。 如何分配请求 目前，这部分需要在应用层实现。 执行更新SQL(UPDATE，INSERT，DELETE)时，请求主库。 执行查询SQL(SELECT)时，请求从库。 所以，当你的应用(Application)SELECT请求所占的比率越大，那么Relication就会越有效。]]></description>
			<content:encoded><![CDATA[<div>
<p><a href="http://blog.haohtml.com/wp-content/uploads/2010/06/3455232156_dc09e11b22_o.jpg"><img class="alignnone size-full wp-image-4149" title="3455232156_dc09e11b22_o" src="http://blog.haohtml.com/wp-content/uploads/2010/06/3455232156_dc09e11b22_o.jpg" alt="" width="616" height="610" /></a><br />
<a title="replication by orczhou, on Flickr" href="http://www.flickr.com/photos/26825745@N06/3455232156/"><br />
</a></p>
<p>在使用MySQL的应用中，如果你的MySQL  Server压力逐渐增大，在应用层优化已经到了一定瓶颈时，那么你应该首先考虑<a href="http://dev.mysql.com/doc/refman/5.0/en/replication.html" target="_blank">MySQL Replication</a>。本文将利用图示的方式简单的描述出MySQL  Replication是如何工作的。<span id="more-4148"></span></p>
<p><strong>如何同步</strong></p>
<ol>
<li>主库将所有的更新操作，写入二进制日志。</li>
<li>从库运行”IO线程”（Slave IO Thread）读取主库的二进制日志。</li>
<li>从库运行”SQL线程”（Slave SQL Thread）执行IO线程（Slave IO  Thread）读取的日志中的SQL,从而保持和主库的一致。</li>
</ol>
<p><strong>如何分配请求</strong></p>
<ol>
<li>目前，这部分需要在应用层实现。</li>
<li>执行更新SQL(UPDATE，INSERT，DELETE)时，请求主库。</li>
<li>执行查询SQL(SELECT)时，请求从库。</li>
</ol>
<p>所以，当你的应用(Application)SELECT请求所占的比率越大，那么Relication就会越有效。</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.haohtml.com/index.php/archives/4148/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQL 集群在Server1与Server2上如何安装MySQL</title>
		<link>http://blog.haohtml.com/index.php/archives/3951</link>
		<comments>http://blog.haohtml.com/index.php/archives/3951#comments</comments>
		<pubDate>Fri, 25 Jun 2010 13:36:45 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[mysql]]></category>
		<category><![CDATA[设计重构]]></category>
		<category><![CDATA[集群]]></category>

		<guid isPermaLink="false">http://blog.haohtml.com/?p=3951</guid>
		<description><![CDATA[我们今天主要向大家介绍的是MySQL 集群，其中包括对MySQL 集群的概念介绍，以及如何在Server1与Server2上正确对MySQL进行安装 ，还有对安装与配置管理节点服务器(Server3)的正确操作 ，配置集群服务器并启动MySQL 。 一、介绍 这篇文档旨在介绍如何安装配置基于2台服务器的MySQL集群。并且实现任意一台服务器出现问题或宕机时MySQL依然能够继续运行。 注意！ 虽然这是基于2台服务器的MySQL集群，但也必须有额外的第三台服务器作为管理节点，但这台服务器可以在集群启动完成后关闭。同时需要注意的是并 不推荐在集群启动完成后关闭作为管理节点的服务器。尽管理论上可以建立基于只有2台服务器的MySQL集群，但是这样的架构，一旦一台服务器宕机之后集群 就无法继续正常工作了，这样也就失去了集群的意义了。出于这个原因，就需要有第三台服务器作为管理节点运行。 另外，可能很多朋友都没有3台服务器的实际环境，可以考虑在VMWare或其他虚拟机中进行实验。 下面假设这3台服务的情况： Server1: MySQL1.vmtest.net 192.168.0.1 Server2: MySQL2.vmtest.net 192.168.0.2 Server3: MySQL3.vmtest.net 192.168.0.3 Servers1和Server2作为实际配置MySQL集群的服务器。对于作为管理节点的Server3则要求较低，只需对Server3的系统 进行很小的调整并且无需安装MySQL，Server3可以使用一台配置较低的计算机并且可以在Server3同时运行其他服务。 二、在Server1和Server2上安装MySQL 从 注意：必须是max版本的MySQL，Standard版本不支持集群部署！ 以下步骤需要在Server1和Server2上各做一次 # mv MySQL-max-4.1.9-pc-linux-gnu-i686.tar.gz /usr/local/ # cd /usr/local/ # groupadd MySQL # useradd -g MySQL MySQL # tar -zxvf MySQL-max-4.1.9-pc-linux-gnu-i686.tar.gz # rm -f MySQL-max-4.1.9-pc-linux-gnu-i686.tar.gz # mv MySQL-max-4.1.9-pc-linux-gnu-i686 MySQL # cd MySQL # scripts/MySQL_install_db --user=MySQL # chown -R root . # chown -R MySQL data # chgrp -R MySQL . # cp support-files/MySQL.server /etc/rc.d/init.d/MySQLd # chmod x /etc/rc.d/init.d/MySQLd # chkconfig --add MySQLd 此时不要启动MySQL！ 三、安装并配置管理节点服务器(Server3) 作为管理节点服务器，Server3需要ndb_mgm和ndb_mgmd两个文件： # mkdir /usr/src/MySQL-mgm # cd /usr/src/MySQL-mgm # tar -zxvf MySQL-max-4.1.9-pc-linux-gnu-i686.tar.gz # rm MySQL-max-4.1.9-pc-linux-gnu-i686.tar.gz # cd MySQL-max-4.1.9-pc-linux-gnu-i686 # mv bin/ndb_mgm . # mv bin/ndb_mgmd . # chmod x ndb_mg* [...]]]></description>
			<content:encoded><![CDATA[<p>我们今天主要向大家介绍的是MySQL 集群，其中包括对MySQL 集群的概念介绍，以及如何在Server1与Server2上正确对MySQL进行安装  ，还有对安装与配置管理节点服务器(Server3)的正确操作 ，配置集群服务器并启动MySQL 。</p>
<p><strong>一、介绍 </strong></p>
<p>这篇文档旨在介绍如何安装配置基于2台服务器的MySQL集群。并且实现任意一台服务器出现问题或宕机时MySQL依然能够继续运行。</p>
<p>注意！</p>
<p>虽然这是基于2台服务器的MySQL集群，但也必须有额外的第三台服务器作为管理节点，但这台服务器可以在集群启动完成后关闭。同时需要注意的是并 不推荐在集群启动完成后关闭作为管理节点的服务器。尽管理论上可以建立基于只有2台服务器的MySQL集群，但是这样的架构，一旦一台服务器宕机之后集群 就无法继续正常工作了，这样也就失去了集群的意义了。出于这个原因，就需要有第三台服务器作为管理节点运行。<span id="more-3951"></span></p>
<p>另外，可能很多朋友都没有3台服务器的实际环境，可以考虑在VMWare或其他虚拟机中进行实验。</p>
<p>下面假设这3台服务的情况：</p>
<p>Server1: MySQL1.vmtest.net 192.168.0.1</p>
<p>Server2: MySQL2.vmtest.net 192.168.0.2</p>
<p>Server3: MySQL3.vmtest.net 192.168.0.3</p>
<p>Servers1和Server2作为实际配置MySQL集群的服务器。对于作为管理节点的Server3则要求较低，只需对Server3的系统 进行很小的调整并且无需安装MySQL，Server3可以使用一台配置较低的计算机并且可以在Server3同时运行其他服务。</p>
<p><strong>二、在Server1和Server2上安装MySQL </strong></p>
<p>从</p>
<p>注意：必须是max版本的MySQL，Standard版本不支持集群部署！</p>
<p>以下步骤需要在Server1和Server2上各做一次</p>
<pre>
<ol>
<li># mv MySQL-max-4.1.9-pc-linux-gnu-i686.tar.gz /usr/local/</li>
<li># cd /usr/local/</li>
<li># groupadd MySQL</li>
<li># useradd -g MySQL MySQL</li>
<li># tar -zxvf MySQL-max-4.1.9-pc-linux-gnu-i686.tar.gz</li>
<li># rm -f MySQL-max-4.1.9-pc-linux-gnu-i686.tar.gz</li>
<li># mv MySQL-max-4.1.9-pc-linux-gnu-i686 MySQL</li>
<li># cd MySQL</li>
<li># scripts/MySQL_install_db --user=MySQL</li>
<li># chown -R root .</li>
<li># chown -R MySQL data</li>
<li># chgrp -R MySQL .</li>
<li># cp support-files/MySQL.server /etc/rc.d/init.d/MySQLd</li>
<li># chmod x /etc/rc.d/init.d/MySQLd</li>
<li># chkconfig --add MySQLd</li>
</ol>
</pre>
<p>此时不要启动MySQL！</p>
<p><strong>三、安装并配置管理节点服务器(Server3) </strong></p>
<p>作为管理节点服务器，Server3需要ndb_mgm和ndb_mgmd两个文件：</p>
<pre>
<ol>
<li># mkdir /usr/src/MySQL-mgm</li>
<li># cd /usr/src/MySQL-mgm</li>
<li># tar -zxvf MySQL-max-4.1.9-pc-linux-gnu-i686.tar.gz</li>
<li># rm MySQL-max-4.1.9-pc-linux-gnu-i686.tar.gz</li>
<li># cd MySQL-max-4.1.9-pc-linux-gnu-i686</li>
<li># mv bin/ndb_mgm .</li>
<li># mv bin/ndb_mgmd .</li>
<li># chmod x ndb_mg*</li>
<li># mv ndb_mg* /usr/bin/</li>
<li># cd</li>
<li># rm -rf /usr/src/MySQL-mgm</li>
</ol>
</pre>
<p>现在开始为这台管理节点服务器建立配置文件：</p>
<pre>
<ol>
<li># mkdir /var/lib/MySQL-cluster</li>
<li># cd /var/lib/MySQL-cluster</li>
<li># vi config.ini</li>
</ol>
</pre>
<p>在config.ini中添加如下内容：</p>
<pre>
<ol>
<li>[NDBD DEFAULT]</li>
<li>NoOfReplicas=2</li>
<li>[MySQLD DEFAULT]</li>
<li>[NDB_MGMD DEFAULT]</li>
<li>[TCP DEFAULT]</li>
<li># Managment Server</li>
<li>[NDB_MGMD]</li>
</ol>
</pre>
<p>HostName=192.168.0.3 #管理节点服务器Server3的IP地址</p>
<p># Storage Engines</p>
<p>[NDBD]</p>
<p>HostName=192.168.0.1 #MySQL集群Server1的IP地址</p>
<p>DataDir= /var/lib/MySQL-cluster</p>
<p>[NDBD]</p>
<p>HostName=192.168.0.2 #MySQL集群Server2的IP地址</p>
<p>DataDir=/var/lib/MySQL-cluster</p>
<p># 以下2个[MySQLD]可以填写Server1和Server2的主机名。</p>
<p># 但为了能够更快的更换集群中的服务器，推荐留空，否则更换服务器后必须对这个配置进行更改。</p>
<p>[MySQLD]</p>
<p>[MySQLD]</p>
<p>保存退出后，启动管理节点服务器Server3：</p>
<p># ndb_mgmd</p>
<p>启动管理节点后应该注意，这只是管理节点服务，并不是管理终端。因而你看不到任何关于启动后的输出信息。</p>
<p><strong>四、配置集群服务器并启动MySQL </strong></p>
<p>在Server1和Server2中都需要进行如下改动：</p>
<p># vi /etc/my.cnf</p>
<p>[MySQLd]</p>
<p>ndbcluster</p>
<p>ndb-connectstring=192.168.0.3 #Server3的IP地址</p>
<p>[MySQL_cluster]</p>
<p>ndb-connectstring=192.168.0.3 #Server3的IP地址</p>
<p>保存退出后，建立数据目录并启动MySQL：</p>
<pre>
<ol>
<li># mkdir /var/lib/MySQL-cluster</li>
<li># cd /var/lib/MySQL-cluster</li>
<li># /usr/local/MySQL/bin/ndbd --initial</li>
<li># /etc/rc.d/init.d/MySQLd start</li>
</ol>
</pre>
<p>可以把/usr/local/MySQL/bin/ndbd加到/etc/rc.local中实现开机启动。</p>
<p>注意：只有在第一次启动ndbd时或者对Server3的config.ini进行改动后才需要使用&#8211;initial参数！</p>
<p>以上的相关内容就是对MySQL 集群的部分内容介绍，望你能有所收获。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.haohtml.com/index.php/archives/3951/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mysql 集群简介和配置</title>
		<link>http://blog.haohtml.com/index.php/archives/3948</link>
		<comments>http://blog.haohtml.com/index.php/archives/3948#comments</comments>
		<pubDate>Fri, 25 Jun 2010 13:35:31 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[mysql]]></category>
		<category><![CDATA[设计重构]]></category>
		<category><![CDATA[集群]]></category>

		<guid isPermaLink="false">http://blog.haohtml.com/?p=3948</guid>
		<description><![CDATA[1．  先了解一下你是否应该用 mysql 集群。 减少数据中心结点压力和大数据量处理，采用把 mysql 分布，一个或多个 application 对应一个 mysql 数据库。把几个 mysql 数据库公用的数据做出共享数据，例如购物车，用户对象等等，存在数据结点里面。 其他不共享的数据还维持在各自分布的 mysql 数据库本身中。 2．  集群 Mysql 中名称概念 .( 如上图 ) 1 ） Sql 结点（ SQL node&#8211; 上图对应为 mysqld ） : 分布式数据库。包括自身数据和查询中心结点数据 . 2 ）数据结点 (Data node &#8212; ndbd): 集群共享数据 ( 内存中 ). 3 ）管理服务器 (Management Server – ndb_mgmd): 集群管理 SQL node,Data node. [...]]]></description>
			<content:encoded><![CDATA[<p>1．   				 				先了解一下你是否应该用 				mysql 				集群。</p>
<p>减少数据中心结点压力和大数据量处理，采用把 				mysql 				分布，一个或多个 				application  				对应一个 				mysql 				数据库。把几个 				mysql 				数据库公用的数据做出共享数据，例如购物车，用户对象等等，存在数据结点里面。 其他不共享的数据还维持在各自分布的 				mysql 				数据库本身中。</p>
<p><a href="http://blog.haohtml.com/wp-content/uploads/2010/06/cluster-components-1.png"><img class="alignnone size-full wp-image-3949" title="cluster-components-1" src="http://blog.haohtml.com/wp-content/uploads/2010/06/cluster-components-1.png" alt="" width="583" height="372" /></a></p>
<p><span id="more-3948"></span>2．   				 				集群 				Mysql 				中名称概念 				.( 				如上图 				)</p>
<p>1 				） 				Sql 				结点（ 				SQL node&#8211; 				上图对应为 				mysqld 				） 				: 				分布式数据库。包括自身数据和查询中心结点数据 				.</p>
<p>2 				）数据结点 				(Data node &#8212; ndbd): 				集群共享数据 				( 				内存中 				).</p>
<p>3 				）管理服务器 				(Management Server – ndb_mgmd):  				集群管理 				SQL node,Data node.</p>
<p>3 				．配置</p>
<p>mysql-max  				版本，当然现在 				mysql 				集群系统 				windonws 				平台上面不被支持 				.</p>
<p>安装 				mysql 				就不多说了，网上一打堆，简明扼要。</p>
<p>A:192.168.1.251 – Data node  				和 				 						Management Server.</p>
<p>B:192.168.1.254 – SQL node.</p>
<p>当然，你也可以让一个机器同时为 				 3 				者。</p>
<p>A,B my.inf  				加上：</p>
<p>[MYSQLD]</p>
<p>ndbcluster                       # run NDB engine</p>
<p>ndb-connectstring=192.168.1.251  # location of MGM node</p>
<p># Options for ndbd process:</p>
<p>[MYSQL_CLUSTER]</p>
<p>ndb-connectstring=192.168.1.251  # location of MGM node</p>
<p>A: /var/lib/mysql-cluster/config.ini</p>
<p>[NDBD DEFAULT]</p>
<p>NoOfReplicas=1    #  Number of replicas</p>
<p>DataMemory=80M    #  How much memory to allocate for data storage</p>
<p>IndexMemory=18M   # How  much memory to allocate for index storage</p>
<p># For DataMemory and  IndexMemory, we have used the</p>
<p># default values. Since  the &#8220;world&#8221; database takes up</p>
<p># only about 500KB, this  should be more than enough for</p>
<p># this example Cluster  setup.</p>
<p># TCP/IP options:</p>
<p>[TCP DEFAULT]</p>
<p>portnumber=2202   #  This the default; however, you can use any</p>
<p># port that is free for all the hosts in  cluster</p>
<p># Note: It is recommended  beginning with MySQL 5.0 that</p>
<p># you do not specify the  portnumber at all and simply allow</p>
<p># the default value to be  used instead</p>
<p># Management process options:</p>
<p>[NDB_MGMD]</p>
<p>hostname=192.168.1.251            # Hostname or IP address of MGM node</p>
<p>datadir=/var/lib/mysql-cluster  # Directory for MGM node logfiles</p>
<p># Options for data node &#8220;A&#8221;:</p>
<p>[NDBD]</p>
<p># (one  [NDBD] section per data node)</p>
<p>hostname=192.168.1.251            # Hostname or IP address</p>
<p>datadir=/usr/local/mysql/data    # Directory for this data node&#8217;s datafiles</p>
<p># SQL node options:</p>
<p>[MYSQLD]</p>
<p>hostname=192.168.1.254</p>
<p>#[MYSQLD] # 				这个相当于 				192.168.1.251</p>
<p>4.         				 				启动测试</p>
<p>·           				 				 						在管理服务器上面(这里是<code>192.168.1.251</code>):</p>
<pre>
						·                

						shell&gt; <code><strong>ndb_mgmd -f /var/lib/mysql-cluster/config.ini</strong></code>
</pre>
<p>·           				 				 						在数据结点服务器上面(依然是<code>192.168.1.251</code> and more):</p>
<pre>
						·                

						shell&gt; <code><strong>ndbd </strong>--initial (</code>
						<code>
								第一次时加 --initial 参数)
						</code>
</pre>
<p>·           				 				 						SQL 						结点服务器上面(<code>192.168.1.254</code>):</p>
<pre>
						·                

						shell&gt; <code><strong>mysqld &amp;</strong></code>
</pre>
<p>在 				251 				上面察看</p>
<p>./ndb_mgm</p>
<p>&#8211; NDB Cluster &#8212; Management Client &#8211;</p>
<p>ndb_mgm&gt; show</p>
<p>Connected to Management Server at:  192.168.1.251:1186</p>
<p>Cluster Configuration</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</p>
<p>[ndbd(NDB)]     1  node(s)</p>
<p>id=2    @192.168.1.251  (Version: 5.0.22,  Nodegroup: 0, Master)</p>
<p>[ndb_mgmd(MGM)] 1 node(s)</p>
<p>id=1    @192.168.1.251  (Version: 5.0.22)</p>
<p>[mysqld(API)]   1  node(s)</p>
<p>id=3    @192.168.1.254  (Version: 5.0.22)</p>
<p>ok</p>
<p>关闭集群：</p>
<p>shell&gt;  				<code> <strong> ndb_mgm -e shutdown </strong> </code></p>
<p><code> <strong> </strong> </code></p>
<p><code> <strong> </strong> </code></p>
<p><code> 5 </code> <code> ．基本的集群说明 </code></p>
<p><code> 1 </code> <code> ）在mysql 集群 中.当table引擎为NDBCLUSTER时 才做集群，其他非NDBCLUSTER表和一般mysql数 据库表一样，不会共享数据. NDBCLUSTER 表数据存储在Data  node服务器<strong>内存中</strong>，Data Node可以为1台或多台服务器，它们之间存放共享数据。Data Node服务器 可以分组数据copy。 </code></p>
<p><code> 例如：2,3,4,5 为四台Data Node服务器ID. 2,3为组0。  4，5为组1。  2，3维持数据相同， 4，5维持数据相同。 组0和 组1维持数据不同。 </code></p>
<p><code> 2 </code> <code> ） sql node 服 务器中，非NDBCLUSTER数据存在本身数据库中，table引 擎为NDBCLUSTER时，数据存储在Data Node 中。 当查询NDBCLUSTER表时，它会从Data node集 群中提起数据. </code></p>
<p><code> 3)Manager server </code></p>
<p><code> </code> <code> 管理SQl node 和Data node 状态。 </code></p>
<p><code> </code></p>
<p><code> </code></p>
<p><code> 6 </code> <code> 深入了解 </code> <code> </code></p>
<p>http://dev.mysql.com/doc/refman/5.0/en/ndbcluster.html</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.haohtml.com/index.php/archives/3948/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
