Particionamento é mais um termo genérico para dividir dados entre tabelas ou bancos de dados. Sharding é um tipo específico de particionamento, parte do que é chamado de particionamento horizontal.
Aqui você replica o esquema em (normalmente) várias instâncias ou servidores, usando algum tipo de lógica ou identificador para saber em qual instância ou servidor procurar os dados. Um identificador desse tipo geralmente é chamado de "Chave de fragmentação".
Uma lógica comum, sem chave, é usar o alfabeto para dividir os dados. A-D é a instância 1, E-G é a instância 2 etc. Os dados do cliente são bem adequados para isso, mas serão um pouco deturpados em tamanho nas instâncias se o particionamento não levar em conta que algumas letras são mais comuns do que outras.
Outra técnica comum é usar um sistema ou lógica de sincronização de chaves que garanta chaves exclusivas nas instâncias.
Um exemplo bem conhecido que você pode estudar é como o Instagram resolveu seu particionamento nos primeiros dias (veja o link abaixo). Eles começaram particionados em poucos servidores, usando o Postgres para dividir os dados desde o início. Acredito que foram vários milhares de fragmentos lógicos nesses poucos fragmentos físicos. Leia o incrível artigo de 2012 aqui:Instagram Engineering - Sharding &IDs
Veja aqui também:http://www.quora. com/Qual é a diferença entre fragmentação e partição