{"id":27974861,"url":"https://github.com/notesparvvaresh/clickhouse","last_synced_at":"2025-05-08T00:28:23.581Z","repository":{"id":288396862,"uuid":"967388376","full_name":"notesparvvaresh/ClickHouse","owner":"notesparvvaresh","description":"توضیح خلاصه و جامع برای کار با clickhouse","archived":false,"fork":false,"pushed_at":"2025-04-17T08:27:26.000Z","size":5,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-04-17T23:02:57.832Z","etag":null,"topics":["clickhouse"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/notesparvvaresh.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-04-16T11:33:26.000Z","updated_at":"2025-04-17T08:30:46.000Z","dependencies_parsed_at":"2025-04-17T23:03:01.103Z","dependency_job_id":null,"html_url":"https://github.com/notesparvvaresh/ClickHouse","commit_stats":null,"previous_names":["notesparvvaresh/clickhouse"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/notesparvvaresh%2FClickHouse","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/notesparvvaresh%2FClickHouse/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/notesparvvaresh%2FClickHouse/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/notesparvvaresh%2FClickHouse/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/notesparvvaresh","download_url":"https://codeload.github.com/notesparvvaresh/ClickHouse/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252976339,"owners_count":21834569,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["clickhouse"],"created_at":"2025-05-08T00:28:21.856Z","updated_at":"2025-05-08T00:28:23.569Z","avatar_url":"https://github.com/notesparvvaresh.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\n## 🚀 آشنایی با ClickHouse و لاگ‌گیری با پایتون\n\n### 🧠 ClickHouse چیست؟\n\n**ClickHouse** یک دیتابیس ستونی (column-oriented) و متن‌باز است که توسط شرکت **Yandex** توسعه یافته. این سیستم برای تحلیل سریع داده‌های حجیم طراحی شده و در دسته دیتابیس‌های **OLAP** (تحلیلی) قرار می‌گیرد.\n\n### ✅ ویژگی‌های کلیدی:\n\n- **ذخیره‌سازی ستونی**: خواندن داده‌های بزرگ فقط از ستون‌های مورد نیاز\n- **بسیار سریع** در تحلیل‌های پیچیده روی میلیون‌ها یا میلیاردها ردیف\n- **مقیاس‌پذیری بالا**: امکان استفاده به‌صورت توزیع‌شده (Distributed)\n- **پشتیبانی از SQL**: با دستورات SQL می‌توان کوئری‌های تحلیلی اجرا کرد\n- مناسب برای کاربردهایی مثل تحلیل لاگ‌ها، مانیتورینگ، داشبوردهای real-time و…\n\n---\n\n## 🔎 معماری کلی و جزئیات فنی\n\n### 📦 ساختار داده:\n\n- داده‌ها به‌صورت ستونی ذخیره می‌شوند، نه سطری\n- باعث کاهش I/O و افزایش سرعت در تحلیل‌های آماری می‌شود\n- دارای انواع داده مختلف مانند `String`, `Int`, `Float`, `DateTime`, و `LowCardinality`\n\n### 🛠️ Storage Engine پرکاربرد:\n- `MergeTree`: رایج‌ترین و قدرتمندترین موتور ذخیره‌سازی که ایندکس و فشرده‌سازی دارد.\n- `Log`, `TinyLog`: ساده و سریع، مناسب برای تست یا بار کم\n\n---\n\n\n## 🛠️ نصب ClickHouse در لینوکس (Ubuntu/Debian)\n\n```bash\nsudo apt-key adv --keyserver keyserver.ubuntu.com --recv E0C56BD4\necho \"deb http://repo.clickhouse.com/deb/stable/ main/\" | sudo tee /etc/apt/sources.list.d/clickhouse.list\nsudo apt update\nsudo apt install clickhouse-server clickhouse-client -y\n```\n\n### 📦 شروع به کار:\n\n```bash\nsudo systemctl start clickhouse-server\nsudo systemctl enable clickhouse-server\n```\n\n### تست اتصال:\n\n```bash\nclickhouse-client\n```\n\n---\n\n## 👤 ساخت یوزر اختصاصی (مثلاً `reza`)\n\nفایل تنظیمات:\n\n```bash\nsudo nano /etc/clickhouse-server/users.xml\n```\n\nو اینو به `\u003cusers\u003e` اضافه کن:\n\n```xml\n\u003creza\u003e\n    \u003cpassword\u003e1234\u003c/password\u003e\n    \u003cnetworks\u003e\n        \u003cip\u003e::/0\u003c/ip\u003e\n    \u003c/networks\u003e\n    \u003cprofile\u003edefault\u003c/profile\u003e\n    \u003cquota\u003edefault\u003c/quota\u003e\n\u003c/reza\u003e\n```\n\n🔁 سپس ری‌استارت:\n\n```bash\nsudo systemctl restart clickhouse-server\n```\n\nو اتصال با یوزر:\n\n```bash\nclickhouse-client --user reza --password\n```\n\n---\n\n\n\n\n## 📘 ساخت جدول لاگ در ClickHouse\n\nبرای ذخیره لاگ‌ها، ابتدا باید جدولی مطابق ساختار مورد نیاز بسازیم. مثال:\n\n```sql\nCREATE TABLE logs (\n    timestamp DateTime DEFAULT now(),\n    level String,\n    message String,\n    module String,\n    function String,\n    service String\n) ENGINE = MergeTree()\nORDER BY timestamp;\n```\n\n---\n\n## 🧪 ذخیره لاگ با پایتون (روش ساده)\n\nابتدا کتابخانه‌ی اتصال را نصب می‌کنیم:\n\n```bash\npip install clickhouse_driver\n```\n\nو سپس یک تابع ساده برای ارسال لاگ به ClickHouse:\n\n```python\nfrom clickhouse_driver import Client\nfrom datetime import datetime\n\nclient = Client(host='localhost', user='reza', password='1234', database='default')\n\ndef log_to_clickhouse(level, message, module, function, service):\n    log_entry = {\n        'timestamp': datetime.now(),\n        'level': level,\n        'message': message,\n        'module': module,\n        'function': function,\n        'service': service\n    }\n\n    client.execute('INSERT INTO logs (timestamp, level, message, module, function, service) VALUES', [(\n        log_entry['timestamp'], \n        log_entry['level'], \n        log_entry['message'], \n        log_entry['module'], \n        log_entry['function'], \n        log_entry['service']\n    )])\n\nlog_to_clickhouse('INFO', 'This is a test log', 'test_moudle', 'test_function', 'my_service')\n\n```\n\n---\n\n## 🧰 استفاده از لاگر استاندارد پایتون (`logging`) + ارسال لاگ به ClickHouse\n\nبرای سیستم‌های واقعی، بهتره لاگ‌ها از طریق ماژول استاندارد `logging` مدیریت و ارسال بشن:\n\n```python\nimport logging\nfrom datetime import datetime\nfrom clickhouse_driver import Client\n\n# Connect to ClickHouse using clickhouse-driver\nclient = Client(host='localhost', user='default', password='', database='default')\n\nclass ClickHouseLogHandler(logging.Handler):\n    def __init__(self, service_name):\n        super().__init__()\n        self.service = service_name\n\n    def emit(self, record):\n        log_entry = {\n            'timestamp': datetime.fromtimestamp(record.created),\n            'level': record.levelname,\n            'message': record.getMessage(),\n            'module': record.module,\n            'function': record.funcName,\n            'service': self.service\n        }\n        try:\n            # Insert log into ClickHouse\n            client.execute('INSERT INTO logs (timestamp, level, message, module, function, service) VALUES', [\n                (\n                    log_entry['timestamp'],\n                    log_entry['level'],\n                    log_entry['message'],\n                    log_entry['module'],\n                    log_entry['function'],\n                    log_entry['service']\n                )\n            ])\n        except Exception as e:\n            print(f\"Error writing log to ClickHouse: {e}\")\n\n# Set up the logger\nlogger = logging.getLogger(\"my_logger\")\nlogger.setLevel(logging.DEBUG)\n\n# Add handler to the logger\nch_handler = ClickHouseLogHandler(service_name=\"my_python_service\")\nlogger.addHandler(ch_handler)\n\n# Test logging\nlogger.info(\"Starting the program\")\nlogger.warning(\"This is just a warning\")\nlogger.error(\"This is a test error!\")\n\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnotesparvvaresh%2Fclickhouse","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnotesparvvaresh%2Fclickhouse","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnotesparvvaresh%2Fclickhouse/lists"}