๋ฐ์ดํ„ฐ ์ค‘์‹ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ค๊ณ„ 10์žฅ

์ผ๊ด„ ์ฒ˜๋ฆฌ

December 15, 2024

L-Day-00

์ค€๋น„!

December 14, 2024

mpsc refactoring review ๐Ÿฆ€

#[tokio::main] async fn main() { // 1. ํ•„์š”ํ•œ ์„ค์ •, ๋ฐ์ดํ„ฐ ๋“ฑ์„ ์„ธํŒ…ํ•จ. let state = StateManager::new(); let config_handler = ConfigHandler::new(state.get_db(), state.get_config(), state.get_replication_config()); config_handler.load_config().await; config_handler.configure_db().await; config_handler.configure_replication().await; let port = config_handler.get_port().await; let listener = TcpListener::bind(format!("127.0.0.1:{}", port)).await.unwrap(); println!("Listening on port {}", port); loop { match listener.accept().await { // 2. ์ŠคํŠธ๋ฆผ์„ ๋”ฐ์„œ, ์ŠคํŠธ๋ฆผ์„ handle_client๋กœ ์ „๋‹ฌ Ok((stream, _)) => { let db = state.get_db(); let config = state.get_config(); let replication_config = state.get_replication_config(); task::spawn(async move { // 3....

November 28, 2024

๋‚œ๊ฐœ๋ฐœ๋œ ๋ ˆ๋””์Šค๋ฅผ ์ด๋ฒคํŠธ ๋ฃจํ”„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฆฌํŒฉํ† ๋งํ•˜๊ธฐ ๐Ÿฅถ

Prerequisite ๋‚ด๊ฐ€ ์ง๋ฉดํ•œ ๋ฌธ์ œ๋Š” ์•„๋ž˜์˜ ๋ฌธ์„œ์— ์žˆ๋‹ค. ๐Ÿ‘‰ [[Redis-Stream-Issue]] ์•„์ฃผ ๊ฐ„๋‹จํ•˜๊ฒŒ ์š”์•ฝํ•˜์ž๋ฉด, ๊ฐ ์Šค๋ ˆ๋“œ๊ฐ€ ์ŠคํŠธ๋ฆผ์„ ๋ฌผ๊ณ ๋‹ค๋‹ˆ๋ฉด์„œ ํƒœ์Šคํฌ๊ฐ€ ์ฒ˜๋ฆฌ๋˜๊ณ , ๋ฆฌ์†Œ์Šค๋“ค์„ lock์œผ๋กœ ๊ด€๋ฆฌํ•œ๋‹ค. ์ง€๊ธˆ๊นŒ์ง€๋Š” ๊ทธ๋‚˜๋งˆ ๊ดœ์ฐฎ์•˜๋Š”๋ฐ, ๋ ˆํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์“ฐ๊ธฐ ์ „ํŒŒ๋ฅผ ์ƒ๊ฐํ•ด๋ดค์„ ๋•Œ, ๋‹ค์ˆ˜์˜ ์Šฌ๋ ˆ์ด๋ธŒ ์ŠคํŠธ๋ฆผ์„ ๋ฝ์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๊ตฌ์กฐ์—์„œ๋Š” ๊ฐ„๋‹จํ•œ ์“ฐ๊ธฐ ์š”์ฒญ์—์„œ๋„ ์Šฌ๋ ˆ์ด๋ธŒ๋“ค์˜ ์ŠคํŠธ๋ฆผ์„ ์‚ฌ์šฉํ•˜๋Š” ์“ฐ๊ธฐ ๋ฝ ๋•Œ๋ฌธ์— ์ง€๋‚˜์นœ ๋ณ‘๋ชฉ์ด ๋ฐœ์ƒํ•œ ๊ตฌ์กฐ๋ผ๋Š” ๊ฒƒ์ด๋‹ค. ์›์กฐ ๋ ˆ๋””์Šค๋Š” ์‹ฑ๊ธ€์Šค๋ ˆ๋“œ์™€ ์ด๋ฒคํŠธ๋ฃจํ”„๋กœ ๊ตฌํ˜„๋œ๋‹ค. ๊ณผ์ •์—์„œ ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์—†์„๊นŒ ํ•˜๋‹ค๊ฐ€ ์ฐพ๊ฒŒ๋œ๊ฑด mpsc์ด๊ณ  mpsc์— ๋Œ€ํ•œ ๊ฐ„๋‹จํ•œ ์กฐ์‚ฌ๋ฅผ ์•„๋ž˜์˜ ๋ฌธ์„œ์— ์ •๋ฆฌํ–ˆ๋‹ค. ๐Ÿ‘‰ [[rust-mpsc]]...

November 26, 2024

๋Ÿฌ์ŠคํŠธ์˜ mpsc ๐Ÿค”

mpsc๋ž€? Rust์˜ mpsc ์ฑ„๋„์€ โ€œ์—ฌ๋Ÿฌ ์ƒ์‚ฐ์ž (Multiple Producer)โ€œ์™€ โ€œํ•˜๋‚˜์˜ ์†Œ๋น„์ž (Single Consumer)โ€œ๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด๊ณ  ์ฒ˜๋ฆฌ ํ•  ์ˆ˜ ์žˆ๋Š” ๋น„๋™๊ธฐ ๋„๊ตฌ์ด๋‹ค. ์•„์ด๋””์–ด๋„ ์•„์ด๋””์–ด์ง€๋งŒ, ๊ธฐ๋ณธ์ ์œผ๋กœ ์„ค๊ณ„์™€ ๋™์ž‘์ด Rust์˜ ์†Œ์œ ๊ถŒ๊ณผ ๋™์‹œ์„ฑ ๋ชจ๋ธ์— ๊ธฐ๋ฐ˜์„ ๋‘๊ณ  ์žˆ๋‹ค. ๊ธฐ๋ณธ์ ์ธ ์‚ฌ์šฉ ๋ฐฉ์‹์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค. mpsc::channel tx (์ƒ์‚ฐ์ž), rx(์†Œ๋น„์ž) ๋ฅผ ๋ฐ˜ํ™˜๋ฐ›๋Š”๋‹ค. use tokio::sync::mpsc; #[tokio::main] async fn main() { // ์ฑ„๋„ ์ƒ์„ฑ (๋ฒ„ํผ ํฌ๊ธฐ: 32) let (tx, mut rx) = mpsc::channel(32); // ์ƒ์‚ฐ์ž (Producer) tokio::spawn(async move { for i in 1....

November 26, 2024

Lock๊ณผ Stream์„ ์–ด๋–ป๊ฒŒ ์ ‘๊ทผ ํ•  ๊ฒƒ์ธ๊ฐ€..

์‚ฐ๋„˜์–ด ์‚ฐ..

November 24, 2024

๋ ˆ๋””์Šค HandShake์ค‘ ์ด์Šˆ ์ฒ˜๋ฆฌํ•˜๊ธฐ๐Ÿ˜ฌ

๋ ˆ๋””์Šค ๋ ˆํ”Œ๋ฆฌ์นด๋ฅผ ๋“ฑ๋กํ•˜๋Š” ๊ณผ์ • ์ค‘ replconf, psync๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์ค‘ ๋ฐœ์ƒํ•œ ๋ฌธ์ œ.

November 23, 2024

๋ฐ์ดํ„ฐ ์ค‘์‹ฌ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ค๊ณ„ 7์žฅ

07์žฅ ํŠธ๋žœ์žญ์…˜ ์–ด๋–ค ์ €์ž๋“ค์€ 2๋‹จ๊ณ„ ์ปค๋ฐ‹์—์„œ ์œ ๋ฐœ๋˜๋Š” ์„ฑ๋Šฅ์ด๋‚˜ ๊ฐ€์šฉ์„ฑ ๋ฌธ์ œ ๋•Œ๋ฌธ์— ์ƒ๊ธฐ๋Š” ๋น„์šฉ์ด ๋„ˆ๋ฌด ์ปค์„œ ์ด๋ฅผ ์ง€์›ํ•  ์ˆ˜ ์—†๋‹ค๊ณ  ์ฃผ์žฅํ–ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ํ•ญ์ƒ ํŠธ๋žœ์žญ์…˜ ์—†์ด ์ฝ”๋”ฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ํŠธ๋žœ์žญ์…˜์„ ๊ณผ์šฉํ•ด์„œ ๋ณ‘๋ชฉ์ง€์ ์ด ์ƒ๊ธฐ๋Š” ์„ฑ๋Šฅ ๋ฌธ์ œ๋ฅผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์ฒ˜๋ฆฌํ•˜๋Š”๊ฒŒ ๋‚ซ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค. ๋ƒ‰ํ˜นํ•œ ํ˜„์‹ค ์„ธ๊ณ„์—์„œ ๋ฐ์ดํ„ฐ ์‹œ์Šคํ…œ์€ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์†Œํ”„ํŠธ์›จ์–ด๋‚˜ ํ•˜๋“œ์›จ์–ด๋Š” ์–ธ์ œ๋ผ๋„ ์‹คํŒจํ•  ์ˆ˜ ์žˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์–ธ์ œ๋ผ๋„ ์ฃฝ์„ ์ˆ˜ ์žˆ๋”ฐ. ๋„คํŠธ์›Œํฌ๊ฐ€ ๋Š๊ธฐ๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์—ฐ๊ฒฐ์ด ๊ฐ‘์ž๊ธฐ ๋Š๊ธฐ๊ฑฐ๋‚˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋…ธ๋“œ ์‚ฌ์ด์˜ ํ†ต์‹ ์ด ์•ˆ๋  ์ˆ˜ ์žˆ๋‹ค....

November 16, 2024

๋ฐ์ดํ„ฐ ์ค‘์‹ฌ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ค๊ณ„ 6์žฅ

ํŒŒํ‹ฐ์…”๋‹ ๋ฐ์ดํ„ฐ์…‹์ด ๋งค์šฐ ํฌ๊ฑฐ๋‚˜ ์งˆ์˜ ์ฒ˜๋ฆฌ๋Ÿ‰์ด ๋งค์šฐ ๋†’๋‹ค๋ฉด ๋ณต์ œ๋งŒ์œผ๋กœ๋Š” ๋ถ€์กฑํ•˜๊ณ , ๋ฐ์ดํ„ฐ๋ฅผ ํŒŒํ‹ฐ์…˜์œผ๋กœ ์ชผ๊ฐค ํ•„์š”๊ฐ€ ์žˆ๋‹ค. ์ด ์ž‘์—…์„ ์ƒค๋”ฉ์ด๋ผ๊ณ  ํ•œ๋‹ค. ๋ฐ์ดํ„ฐ๋ฅผ ํŒŒํ‹ฐ์…”๋‹ ํ•˜๋Š” ์ฃผ๋œ ์ด์œ ๋Š” ํ™•์žฅ์„ฑ์ด๋‹ค. ํŒŒํ‹ฐ์…”๋‹๊ณผ ๋ณต์ œ ํŒŒํ‹ฐ์…”๋‹์„ ํ•ด๋„, ํŒŒํ‹ฐ์…˜ ๋œ ๋‹จ์œ„๋ฅผ ๊ธฐ์ค€์œผ๋กœ๋Š” ๋ณต์ œ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•œ ๋…ธ๋“œ์— ์—ฌ๋Ÿฌ ํŒŒํ‹ฐ์…˜์„ ๋ณต์ œ ํ•  ์ˆ˜๋„ ์žˆ์–ด์„œ, ๋…ธ๋“œ ํ•˜๋‚˜์— ํŠน์ • ํŒŒํ‹ฐ์…˜์˜ ๋ฆฌ๋”์™€ ๋‚˜๋จธ์ง€ ํŒŒํ‹ฐ์…˜์˜ ๋ณต์ œ๋ฅผ ๊ฐ€์ง€๋Š”์‹์œผ๋กœ ๊ต์ฐจํ•ด ๋‘๊ธฐ๋„ ํ•œ๋‹ค. ํ‚ค-๊ฐ’ ๋ฐ์ดํ„ฐ ํŒŒํ‹ฐ์…”๋‹ ํŒŒํ‹ฐ์…”๋‹์˜ ๋ชฉ์ ์€ ๋ฐ์ดํ„ฐ์™€ ์งˆ์˜ ๋ถ€ํ•˜๋ฅผ ๋ถ„์‚ฐ์‹œํ‚ค๋Š” ๊ฒƒ์ด๋‹ค. ์ด๊ฒƒ์ด ๋‹ฌ์„ฑ๋˜์ง€ ์•Š์•˜์„ ๋•Œ ์ ๋ ธ๋‹ค(skewed) ๋ผ๊ณ  ํ•œ๋‹ค....

November 9, 2024

Rust-Redis-D4 Code ๐Ÿฅธ use crate::protocol_constants::{MAGIC_NUMBER, OPCODE_EOF, OPCODE_META, OPCODE_START_DB}; use crate::{Config, Db, ValueEntry}; use byteorder::{LittleEndian, ReadBytesExt}; use crc::{Crc, CRC_64_ECMA_182}; use std::fs::File; use std::io::{self, BufReader, Read, Seek, SeekFrom}; fn bytes_to_hex(bytes: &[u8]) -> String { bytes.iter().map(|b| format!("{:02X}", b)).collect::<Vec<String>>().join(" ") } fn read_length_or_integer<R: Read>(reader: &mut R, first_byte: u8) -> io::Result<usize> { match first_byte >> 6 { 0b00 => Ok((first_byte & 0x3F) as usize), 0b01 => { let second_byte = reader.read_u8()?; Ok((((first_byte & 0x3F) as usize) << 8) | (second_byte as usize)) } 0b10 => reader....

November 7, 2024