How We Made GitHub Fast
We expose three primary protocols to end users of GitHub: HTTP, SSH, and Git. When browsing the site with your favorite browser, you’re using HTTP. When you clone, pull, or push to a private URL like git@github.com:mojombo/jekyll.git you’re doing so via SSH. When you clone or pull from a public repository via a URL like
Tracing an SSH Request
http://githubengineering.com/rearchitecting-github-pages/
using simple components that we understand and avoiding prematurely solving problems that aren't yet problems.
We use DRBD to sync Pages site data between the two machines in each pair. DRBD lets us synchronously replicate all filesystem changes from the active machine to the standby machine, ensuring that the standby machine is always up to date and ready to take over from the active at a moment's notice — say for example if the active machine crashes or we need to take it down for maintenance.
Distributed Replicated Block Device
Local -> Networked -> Net-Shard -> GitRPC
Automate Everything
Be stable ==> deploy constantly
http://www.infoq.com/presentations/github-evolution
http://www.zhihu.com/question/20056542
可以看到 github 主要是依赖于整个流程的优化,比如 cache 和 load-balancer。他们应该是还没有开发自己的文件系统的需要。
而且虽然管理了很多文件,但是通过 git 进行的操作 (主要是 git clone 和 git push),并不是一个个文件来的,没有大量频繁的文件存取。而通过网站的访问,估计 cache 会很起作用。
http://schacon.github.io/gitbook/7_transfer_protocols.html
Video:
http://www.infoq.com/presentations/GitHub-Pages-Riak-Webmachine
We expose three primary protocols to end users of GitHub: HTTP, SSH, and Git. When browsing the site with your favorite browser, you’re using HTTP. When you clone, pull, or push to a private URL like git@github.com:mojombo/jekyll.git you’re doing so via SSH. When you clone or pull from a public repository via a URL like
git://github.com/mojombo/jekyll.git
you’re using the Git protocol.Tracing an SSH Request
If you run a command like git clone tom@frost:mojombo/bert, what Git is doing behind the scenes is SSHing to
frost
, authenticating as the tom
user, and then remotely executing git upload-pack mojombo/bert
. Now your client can talk to that process on the remote server by simply reading and writing over the SSH connection. Neat, huh?
Of course, allowing arbitrary execution of commands is unsafe, so SSH includes the ability to restrict what commands can be executed. In a very simple case, you can restrict execution togit-shell which is included with Git. All this script does is check the command that you’re trying to execute and ensure that it’s one of
git upload-pack
, git receive-pack
, or git upload-archive
. If it is indeed one of those, it uses exec to replace the current process with that new process. After that, it’s as if you had just executed that command directly.
First, your Git client initiates an SSH session. The connection comes down off the internet and hits our load balancer.
From there, the connection is sent to one of the frontends where SSHD accepts it. We have patched our SSH daemon to perform public key lookups from our MySQL database. Your key identifies your GitHub user and this information is sent along with the original command and arguments to our proprietary script called Gerve (Git sERVE). Think of Gerve as a super smart version of
git-shell
.
Gerve verifies that your user has access to the repository specified in the arguments. If you are the owner of the repository, no database lookups need to be performed, otherwise several SQLqueries are made to determine permissions.
Once access has been verified, Gerve uses Chimney to look up the route for the owner of the repository. The goal now is to execute your original command on the proper file server and hook your local machine up to that process. What better way to do this than with another remote SSH execution!
I know it sounds crazy but it works great. Gerve simply uses
exec(3)
to replace itself with a call tossh git@<route> <command> <arg>. After this call, your client is hooked up to a process on a frontend machine which is, in turn, hooked up to a process on a file server.using simple components that we understand and avoiding prematurely solving problems that aren't yet problems.
If the router experiences any error during a query, it'll retry the query a number of times, reconnecting to a different read replica each time. We also use ngx_lua'sshared memory zones to cache routing lookups on the pages-fe node for 30 seconds to reduce load on our MySQL infrastructure and also allow us to tolerate blips a little better.
Since we're querying read replicas, we can tolerate downtime or failovers of the MySQL master. This means that existing Pages will remain online even during database maintenance windows where we have to take the rest of the site down.
We also have Fastly sitting in front of GitHub Pages caching all 200 responses. This helps minimise the availability impact of a total Pages router outage. Even in this worst case scenario, cached Pages sites are still online and unaffected.
Fileserver tierWe use DRBD to sync Pages site data between the two machines in each pair. DRBD lets us synchronously replicate all filesystem changes from the active machine to the standby machine, ensuring that the standby machine is always up to date and ready to take over from the active at a moment's notice — say for example if the active machine crashes or we need to take it down for maintenance.
Distributed Replicated Block Device
DRBD® software is a distributed replicated storage system for the Linux platform. It is implemented as several userspace management applications and some shell scripts and is normally used on high availability (HA) computer clusters.
DRBD layers logical block devices (conventionally named /dev/drbdX, where X is the device minor number) over existing local block devices on participating cluster nodes. Writes to the primary node are transferred to the lower-level block device and simultaneously propagated to the secondary node. The secondary node then transfers data to its corresponding lower-level block device. All read I/O is performed locally.
Should the primary node fail, a cluster management process promotes the secondary node to a primary state. This transition may require a subsequent verification of the integrity of the file system stacked on top of DRBD, by way of a filesystem check or a journal replay. When the failed ex-primary node returns, the system may (or may not) raise it to primary level again, after device data resynchronization. DRBD's synchronization algorithm is efficient in the sense that only those blocks that were changed during the outage must be resynchronized, rather than the device in its entirety.
In RAID, the redundancy exists in a layer transparent to the storage-using application. While there are two storage devices, there is only one instance of the application and the application is not aware of multiple copies. When the application reads, the RAID layer chooses the storage device to read. When a storage device fails, the RAID layer chooses to read the other, without the application instance knowing of the failure.
In contrast, with DRBD there are two instances of the application, and each can read only from one of the two storage devices. Should one storage device fail, the application instance tied to that device can no longer read the data. Consequently, in that case that application instance shuts down and the other application instance, tied to the surviving copy of the data, takes over.
Conversely, in RAID, if the single application instance fails, the information on the two storage devices is effectively unusable, but in DRBD, the other application instance can take over.
http://zachholman.com/talk/how-to-build-a-github/Local -> Networked -> Net-Shard -> GitRPC
Automate Everything
Be stable ==> deploy constantly
http://www.infoq.com/presentations/github-evolution
http://www.zhihu.com/question/20056542
可以看到 github 主要是依赖于整个流程的优化,比如 cache 和 load-balancer。他们应该是还没有开发自己的文件系统的需要。
而且虽然管理了很多文件,但是通过 git 进行的操作 (主要是 git clone 和 git push),并不是一个个文件来的,没有大量频繁的文件存取。而通过网站的访问,估计 cache 会很起作用。
http://schacon.github.io/gitbook/7_transfer_protocols.html
Video:
http://www.infoq.com/presentations/GitHub-Pages-Riak-Webmachine