A data writing method, comprising: receiving, by a client server (101, 1200), first data; obtaining write location information of a target stripe, wherein the write location information indicates an end location of the last written data fragment in the target stripe, wherein data fragments are written sequentially in the target stripe in an append-only manner without leaving idle space between data fragments, the target stripe comprises a plurality of shards (2, 601, 602), each shard corresponds to one storage node and has a fixed size, the storage node communicates with the client server (101, 1200), and the target stripe is not full; obtaining, by the client server (101, 1200), one or more data fragments of the first data, wherein each data fragment corresponds to one shard (2, 601, 602) having idle space in the plurality of shards (2, 601, 602), and the one or more data fragments of the first data are generated based on the write location information and a size (256, 512) of a shard (2, 601, 602); and sending, by the client server (101, 1200), a write request to a storage node of a shard (2, 601, 602) corresponding to the one or more data fragments of the first data, wherein the write request is used to store the one or more data fragments of the first data into the corresponding shard, wherein the storage node comprises a parity node (1, 2) used to store a parity fragment (503, 504, 603, 604), and in addition to that the client server (101, 1200) sends the write request, the method further comprises: sending the one or more data fragments to one or more parity nodes (1, 2) for backup; and after all data shards of the target stripe are full of data fragments, instructing the one or more parity nodes (1, 2) to generate a parity fragment (503, 504, 603, 604) based on all data fragments in the target stripe that are backed up, and storing the generated parity fragment into a parity shard of the target stripe. receiving, by a client server (101, 1200), first data; obtaining write location information of a target stripe, wherein the write location information indicates an end location of the last written data fragment in the target stripe, wherein data fragments are written sequentially in the target stripe in an append-only manner without leaving idle space between data fragments, the target stripe comprises a plurality of shards (2, 601, 602), each shard corresponds to one storage node and has a fixed size, the storage node communicates with the client server (101, 1200), and the target stripe is not full; obtaining, by the client server (101, 1200), one or more data fragments of the first data, wherein each data fragment corresponds to one shard (2, 601, 602) having idle space in the plurality of shards (2, 601, 602), and the one or more data fragments of the first data are generated based on the write location information and a size (256, 512) of a shard (2, 601, 602); and sending, by the client server (101, 1200), a write request to a storage node of a shard (2, 601, 602) corresponding to the one or more data fragments of the first data, wherein the write request is used to store the one or more data fragments of the first data into the corresponding shard, wherein the storage node comprises a parity node (1, 2) used to store a parity fragment (503, 504, 603, 604), and in addition to that the client server (101, 1200) sends the write request, the method further comprises: sending the one or more data fragments to one or more parity nodes (1, 2) for backup; and after all data shards of the target stripe are full of data fragments, instructing the one or more parity nodes (1, 2) to generate a parity fragment (503, 504, 603, 604) based on all data fragments in the target stripe that are backed up, and storing the generated parity fragment into a parity shard of the target stripe. sending the one or more data fragments to one or more parity nodes (1, 2) for backup; and after all data shards of the target stripe are full of data fragments, instructing the one or more parity nodes (1, 2) to generate a parity fragment (503, 504, 603, 604) based on all data fragments in the target stripe that are backed up, and storing the generated parity fragment into a parity shard of the target stripe.