<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های Pouya Doostdar</title>
        <link>https://virgool.io/feed/@PouyaDoostdar</link>
        <description>عاشق برنامه نویسی و مهندسی DevOps. تقریبا 8 ساله که برنامه نویسی میکنم و حدود 2 سال هم هست که به حوزه زیر ساخت و DevOps شدیدا علاقه مند شدم :)</description>
        <language>fa</language>
        <pubDate>2026-06-16 14:29:19</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/2109512/avatar/AwMvxY.png?height=120&amp;width=120</url>
            <title>Pouya Doostdar</title>
            <link>https://virgool.io/@PouyaDoostdar</link>
        </image>

                    <item>
                <title>ردیس: نصب و راه اندازی Redis (Cluster) بخش 3</title>
                <link>https://virgool.io/@PouyaDoostdar/%D8%B1%D8%A7%D9%87-%D8%A7%D9%86%D8%AF%D8%A7%D8%B2%DB%8C-redis-cluster-%D8%A8%D8%AE%D8%B4-3-redis-cluster-yj9jeimmwfls</link>
                <description>Redis In Kuberدر دو بخش قبلی (بخش1 و بخش2) با چگونگی مدیریت کلاستر توسط ردیس اشنایی پیدا کردیم و در بخش 2 15 نود ردیس با تنظیمات کلاسترینگ فعال ایجاد کردیم.در این پست میخواهیم 15 نود بالا اومده را با استفاده از Redis Cluster کلاستر بندی کنیم. با اجرای کد زیر، ردیس کلاستر فانکشنالیتی های Slot Spray , node affinity را اجرا میکند.
for x in $(seq 0 14); do
  REDIS_NODES=&amp;quot$REDIS_NODES {sts_name}-$x.{service_name}.{namespace}:6379&amp;quot
done
kubectl exec -it redis-cluster-0 -- redis-cli --no-auth-warning -a پسورد  --cluster create --cluster-replicas 4 ${REDIS_NODES}قبل از اجرا این کد باید کلید واژه های زیر را با مقادیر خودتون جایگزین کنید:{sts_name}: نام statefulset{service_name}: نام سرویس{namespace}: نام namespaceبعد از اجرای فانکشنالیتی های اولیه لیست نود ها و همراه با مشخصات تکمیلی مانند نوع نود رنج اسلات های نود ایپی نود و ... به شما نشان داده خواهد شد که نیاز به تایید شما دارد.پس از تایید معماری کلاستر ایجاد شده، Redis cluster فانکشنالیتی های sharding و clustering وmeeting را اجرا خواهد کرد.پس از اتمام کار Redis Cluster شما میتوانید با استفاده از کد زیر وارد cli ردیس شده و کامنت های خود را بر روی دیتابیس اجرا کنید.kubectl exec -it redis-cluster-0 -- redis-cli --no-auth-warning -a پسورد  با استفاده از کد زیر میتوانید موفق بودن کلاسترینگ را بررسی کنید:kubectl exec -it redis-cluster-0 -- redis-cli --no-auth-warning -a پسورد  cluster infoو میتوانید با کد زیر نود های کلاستر را بررسی کنید:kubectl exec -it redis-cluster-0 -- redis-cli --no-auth-warning -a پسورد  cluster nodes</description>
                <category>Pouya Doostdar</category>
                <author>Pouya Doostdar</author>
                <pubDate>Sat, 25 Feb 2023 11:45:26 +0330</pubDate>
            </item>
                    <item>
                <title>ردیس: نصب و راه اندازی Redis (Cluster) بخش 2 (کوبر)</title>
                <link>https://virgool.io/@PouyaDoostdar/%D8%B1%D8%A7%D9%87-%D8%A7%D9%86%D8%AF%D8%A7%D8%B2%DB%8C-redis-cluster-%D8%A8%D8%AE%D8%B4-2-%DA%A9%D9%88%D8%A8%D8%B1-bg21hqaepauo</link>
                <description>Redis in kuberتو این پست قراره مراحل راه‌اندازی کلاستری ردیس روی کوبرنتیز رو آموزش بدیم. پس ما با این پیشفرض که شما با کوبرنتیز آشنایی کافی دارید پیش میرویم.قبل از هر چیزی معماری که مد نظرمونه، اینه که کلاستر ردیس بر روی 3 ماشین مجازی با 3 نود مستر و با 4 نود اسلیو به ازای هر مستر با پخش هر ماشین 1 مستر و 4 اسلیو و اسلیوهای هر مستر بر روی تمامی ماشین ها وجود داشته باشد. پس برای مثال نود هایی داخل هر نود به این شکل باشد:ماشین 1: مستر 1- اسلیو مستر 1-اسلیو مستر 1-اسلیو مستر 2-اسلیو مستر 3ماشین 2: مستر 2- اسلیو مستر 1-اسلیو مستر 2-اسلیو مستر 2-اسلیو مستر 3ماشین 3: مستر 3- اسلیو مستر 1-اسلیو مستر 2-اسلیو مستر 3-اسلیو مستر 3برای این کار ما ابتدا باید 15 اینستنس ردیس بر روی تمامی نود ها ایجاد کنیم یعنی هر ماشین مجازی 5 نود ردیس را شامل شود.پس برای این کار ابتدا namespace به نام redis میسازیم:#file: ns.yml
apiVersion: v1
kind: Namespace
metadata:
  name: redisسپس با کد زیر فایل yml را بر روی کلاستر اعمال میکنیم:kubectl apply -f ns.ymlاما برای ارتباط با ردیس و ارتباط ردیس باهم دیگر ما به یک سرویس نیاز داریم. پس سرویس زیر رو خواهیم داشت:#file: svc.yml
apiVersion: v1
kind: Service
metadata:
  name: redis-cluster
  namespace: redis
spec:
  ports:
  - port: 6379
    targetPort: 6379
    name: client
  selector:
    app: redis-cluster سپس با کد زیر فایل yml را بر روی کلاستر اعمال میکنیم:kubectl apply -f svc.ymlبا اعمال این فایل یک سرویس با نام redis-cluster بر روی namespace ردیس با هدف ارتباط پاد هایی با نام redis-cluster ساخته خواهد شد که  پورت 6379 را برامون اکسپوز کنه.قبل از اجرای instance های ردیس ما نیاز داریم تا تنظیماتی را ایجاد کنیم. برای این کار ما از ConfigMap کوبر استفاده میکنیم تا تنظیمات مورد نیاز بر روی تمام instance ها اجرا شوند:#file: cm.yml
apiVersion: v1
kind: ConfigMap
metadata:
  name: redis-cluster
  namespace: redis
data:
  update-node.sh: |
    #!/bin/sh
    REDIS_NODES=&amp;quot/data/nodes.conf&amp;quot
    sed -i -e &amp;quot/myself/ s/[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}/${POD_IP}/&amp;quot ${REDIS_NODES}
    exec &amp;quot$@&amp;quot
  redis.conf: |
    cluster-enabled yes
    cluster-require-full-coverage no
    cluster-node-timeout 15000
    cluster-config-file /data/nodes.conf
    cluster-migration-barrier 1
    appendonly no
    protected-mode no
    requirepass پسورد
    tcp-keepalive 0
    save 1800 1
    save 86400 1بعد از اجرای این فایل یک ConfigMap با دو فایل براتون ایجاد میشه که توضیحات هر فایل رو میدیم:فایل update-node.shدر کوبر زمانی که یکی از اینستنس های شما به هر دلیلی ریستارت شود یا از بین برود موقعی که دوباره اجرا شود یک ایپی جدیدی دریافت خواهد کرد و دیگر با ایپی قبلی در کلاستر شناخته نخواهد شد. با استفاده از این فایل قبل از این که اینستنس ردیس دوباره اجرا شود ایپی جدید خودش را داخل فایل /data/nodes.conf اپدیت خواهد کرد. این فایل تمام اطلاعات کلاستر را ذخیره میکند.فایل redis.conf:در این فایل تمام تنظیمات مورد نیاز کلاستر نوشته میشود برای این که به صورت دیفالت کلاستر ردیس شما با پسورد لاگین شود جایی که کلمه &quot;پسورد&quot; نوشته شده باید پسورد خودتون رو وارد کنید.داکیومنتیشن کامل تنظیمات را داخل سایت ردیس میتوانید بخوانید.تمام تنظیمات و سرویس های مورد نیاز ساخته شد.اما در مقاله Redis Persisting Data خواندیم، برای این که اطلاعات ما پایدار بماند نیاز داریم تا دیتا های ما داخل هارد دیسک هاستمون پرسیست شود. ما میتوانیم pv و pvc ثابت بسازیم و داخل این ها دیتا هامون رو ذخیره کنیم. اما مشکلی که وجود داره اینه که ما بر روی یک هاست 5 اینستنس ردیس اجرا میکنیم که در این شرایط یک ادرس از هاست به 5 نود mount خواهد شد. که این اتفاق باعث میشود فقط یک اینستنس ردیس اجرا شود و باقی اینستنس ها با ارور مواجه شوند. پس ما نیاز داریم تا instance های مختلف را بر روی ادرس های تصادفی mount کنیم. به صورت پیشفرض کوبر هیچ StorageClass برای این کار وجود ندارد. ما نیاز داریم تا یک StorageClass و یک سرویسی که بتواند ادرس تصادفی ایجاد کند برای این کار از سرویس rancher local path استفاده خواهیم کرد. برای نصب این سرویس، کد زیر را اجرا کنید:kubectl apply -f https://raw.githubusercontent.com/rancher/local-path-provisioner/v0.0.23/deploy/local-path-storage.yamlسپس نوبت ایجاد 15 پاد اینستنس ردیس رسید برای این کار statefulset زیر رو خواهیم داشت:#file: sts.yml
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: redis-cluster
  namespace: redis
spec:
  serviceName: redis-cluster
  replicas: 15
  persistentVolumeClaimRetentionPolicy:
    whenDeleted: Retain
    whenScaled: Retain
  volumeClaimTemplates:
  - metadata:
      name: redis-data-pvc
    spec:
      accessModes:
      - ReadWriteOnce
      storageClassName: local-path
      resources:
        requests:
          storage: 20Gi
  selector:
    matchLabels:
      app: redis-cluster
  template:
    metadata:
      labels:
        app: redis-cluster
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: kubernetes.io/hostname
                operator: In
                values:
                - redis1
                - redis2
                - redis3
      containers:
      - name: redis
        image: redis:latest
        ports:
        - containerPort: 6379
        command: [&amp;quot/conf/update-node.sh&amp;quot, &amp;quotredis-server&amp;quot, &amp;quot/conf/redis.conf&amp;quot]
        env:
        - name: POD_IP
          valueFrom:
            fieldRef:
              fieldPath: status.podIP
        volumeMounts:
        - name: conf
          mountPath: /conf
          readOnly: false
        - name: redis-data-pvc
          mountPath: /data
          readOnly: false
      volumes:
      - name: conf
        configMap:
          name: redis-cluster
          defaultMode: 0755با اعمال این فایل یک sts با نام redis-cluster بر روی namespace ردیس ساخته خواهد شد. که این sts بر روی سرور های redis1 , redis2 , redis3 پاد هایی که شامل کانتینر redis هست و pvc , pv های مورد نیاز را خواهد ساخت.در مقاله راه اندازی Redis (Cluster) بخش 1 ( آشنایی) ما گفتیم که در حالت کلاستر ، ردیس جوابی که در ارتباط اولیه بهمون میده دستور MOVE به یک نود با ایپی که فقط داخل شبکه کوبر در دسترس هست میده. پس ما نیاز داریم که یک سرویسی این دستورات MOVE را داخل کوبر اجرا کرده و جواب نهایی را بهمون برگرداند که به اصطلاح به این سرویس proxy گفته میشود. ما از سرویس predixy برای این منظور استفاده خواهیم کرد. پس قبل از اجرای اینستنس های ردیس پروکسی سرور را راه اندازی میکنیم.#file: predixy.yml
apiVersion: v1
kind: ConfigMap
metadata:
  name: redis-proxy
data:
  auth.conf: |
    Authority {
      Auth {
          Mode write
      }
      Auth &amp;quotپسورد&amp;quot {
          Mode admin
      }
    }
  latency.conf: |
    LatencyMonitor all {
      Commands {
        + all
        - blpop
        - brpop
        - brpoplpush
      }
      TimeSpan {
        + 100
        + 200
        + 300
        + 400
        + 500
        + 600
        + 700
        + 800
        + 900
        + 1000
        + 1200
        + 1400
        + 1600
        + 1700
        + 1800
        + 2000
        + 2500
        + 3000
        + 3500
        + 4000
        + 4500
        + 5000
        + 6000
        + 7000
        + 8000
        + 9000
        + 10000
      }
    }

    LatencyMonitor get {
      Commands {
        + get
      }
      TimeSpan {
        + 100
        + 200
        + 300
        + 400
        + 500
        + 600
        + 700
        + 800
        + 900
        + 1000
      }
    }

    LatencyMonitor set {
      Commands {
        + set
        + setnx
        + setex
      }
      TimeSpan {
        + 100
        + 200
        + 300
        + 400
        + 500
        + 600
        + 700
        + 800
        + 900
        + 1000
      }
    }
    LatencyMonitor blist {
      Commands {
        + blpop
        + brpop
        + brpoplpush
      }
      TimeSpan {
        + 1000
        + 2000
        + 3000
        + 4000
        + 5000
        + 6000
        + 7000
        + 8000
        + 9000
        + 10000
        + 20000
        + 30000
        + 40000
        + 50000
        + 60000
        + 70000
        + 80000
        + 90000
        + 100000
      }
    }
  predixy.conf: |
    Name PredixyExample
    Bind 0.0.0.0:6379
    WorkerThreads 5
    ClientTimeout 300
    LogVerbSample 0
    LogDebugSample 1
    LogInfoSample 10000
    LogNoticeSample 1
    LogWarnSample 1
    LogErrorSample 1
    Include auth.conf
    Include try.conf
    Include latency.conf
  try.conf: |
    ClusterServerPool {
      MasterReadPriority 100
      StaticSlaveReadPriority 50
      DynamicSlaveReadPriority 50
      RefreshInterval 1
      ServerTimeout 1
      ServerFailureLimit 10
      ServerRetryTimeout 1
      Password پسورد
      KeepAlive 60
      Servers {
          + redis-cluster-0.redis-cluster:6379
          + redis-cluster-1.redis-cluster:6379
          + redis-cluster-2.redis-cluster:6379
          + redis-cluster-3.redis-cluster:6379
          + redis-cluster-4.redis-cluster:6379
          + redis-cluster-5.redis-cluster:6379
          + redis-cluster-6.redis-cluster:6379
          + redis-cluster-7.redis-cluster:6379
          + redis-cluster-8.redis-cluster:6379
          + redis-cluster-9.redis-cluster:6379
          + redis-cluster-10.redis-cluster:6379
          + redis-cluster-11.redis-cluster:6379
          + redis-cluster-12.redis-cluster:6379
          + redis-cluster-13.redis-cluster:6379
          + redis-cluster-14.redis-cluster:6379
      }
    }---
#StatefulSet
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: redis-proxy
spec:
  serviceName: redis-proxy
  selector:
    matchLabels:
      app: redis-proxy
  replicas: 3
  template:
    metadata:
      labels:
        app: redis-proxy
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: kubernetes.io/hostnam
                operator: In
                values:
                - redis1
                - redis2
                - redis3
      imagePullSecrets:
      - name: iranlms-key
      containers:
      - name: redis
        image: joyieldInc/predixy:latest
        ports:
        - containerPort: 6379
        volumeMounts:
        - name: conf
          mountPath: /predixy/conf
          readOnly: false
      volumes:
      - name: conf
        configMap:
          name: redis-proxy
          defaultMode: 0755
---
apiVersion: v1
kind: Service
metadata:
  name: redis-proxy
spec:
  externalIPs:
  - 10.212.183.22
  - 10.212.183.23
  - 10.212.183.24
  ports:
  - port: 6379
    targetPort: 6379
    name: client
  selector:
    app: redis-proxyقبل از اجرا کردن این فایل، کلمات &quot;پسورد&quot; را با پسوردی که برای نود های سرویس ردیس‌تون زدید جاگذاری کنید. سپس با زدن کد زیر این فایل را اعمال کنید:kubectl apply -f  predixy.ymlمرسی که این پست رو خوندید، امیدوارم مفید باشه براتون. خوشحال میشم فیدبک هاتون رو داشته باشم :)</description>
                <category>Pouya Doostdar</category>
                <author>Pouya Doostdar</author>
                <pubDate>Wed, 22 Feb 2023 18:07:29 +0330</pubDate>
            </item>
                    <item>
                <title>ردیس: نصب و راه اندازی Redis (Cluster) بخش 1</title>
                <link>https://virgool.io/@PouyaDoostdar/introduction-redis-cluster-kfdkmcai4vd1</link>
                <description>Redis in Kuber غول مرحله اخر سرویس Redis بخش کلاسترینگ است که توی این سری پست قراره کلی نکات را پوشش بدیم.پست های قبلی پیشنیاز این پست است. پس قبل از این که به خواندن ادامه دهید، پست های زیر را بخوانید:سرویس Redis چیست؟طریقه استفاده از سرویس RedisRedis Persisting Dataراه اندازی Redis (Standalone)خوب در مقالات قبلی برخی مباحث پوشش داده شد که با توجه به آن توضیحات، میریم برای پیاده سازی و مفاهیم کلاسترینگ در ردیس.تعاریف:تعریف کلاسترینگ:به اتصال چندین Node ردیس به شکلی که بتواند ذخیره و واکشی اطلاعات را به صورت مساوی بین Node ها پخش کند تا بار پردازشی و سایر منابع مساوی مصرف کنند کلاسترینگ ردیس میگیم. که از دو نوع Master و Slave تشکلی میشود.تعریف Master:در بخش طریقه کارکرد ردیس دیدیم که دیتا ها با چه الگوریتمی بین اسلات های مختلف پخش میشوند. در شاردینگ ردیس هر اسلات به یک master اختصاص داده میشود. بنابراین میتوانیم master را اینگونه تعریف کنیم:&quot;هر Node که وظیفه مدیریت اسلات ها را داشته باشد را master میگوییم&quot;اما ممکن است یک node از نوع master باشد ولی هیچ اسلاتی را مدیریت نکند و در این صورت آن master هیچ وقت هیچ اطلاعاتی را شامل نخواهد بود و هیچ وقت هیچ کویری را پاسخگو نخواهد بود ( دلیل این اتفاق در ادامه متوجه خواهیم شد). پس تعریف دقیقتر میتواند این باشد: &quot;Node های master دسترسی ایجاد، تغییر و حذف اطلاعات از کلاستر را دارند و میتوانند بخشی از اسلات های کلاستر را مدیریت کنند.&quot;تعریف Slave:هر Slave Node وظیفه دارد تا به یک master وصل شود و تمام اطلاعات داخل master را بر روی دیتابیس خودش دوباره نویسی (Replication) کند. نود های Slave نمیتواند شامل اسلاتی غیر از اسلات های master اش باشد و همچنین Slave Node ها دسترسی تغییر ، حذف و یا ایجاد رکورد در کلاستر را ندارند و تنها میتوانند اطلاعات master خود را درون خود ذخیره سازی کنند تا زمانی که یک درخواستی مبنی بر واکشی اطلاعاتی که شامل اسلات های اون نود هست داده شد جواب مناسب را برگرداند. پس تعریف دقیقتر میتواند این باشد: &quot;Node های Slave اجازه ذخیره ، تغییر و یا حذف رکورد را ندارند اما میتوانند مقادیری را که master اش شامل میشود را خوانده و برگرداند.&quot;تعریف Sharding:به فرایند اختصاص دادن slot ها به Node های master شاردینگ گفته میشود.تعریف Meeting:مرحله ای از کلاسترینگ که اتصال اولیه نود ها برای انتقال اطلاعات کلاستر است را Meeting گفته میشود.تعریف Bus Port:بعد از اجرای نود های ردیس در حالت clustering یک پورتی به عنوان busport باز میشود.اگر پورت خود ردیس 6379 باشد. همین پورت به اضافه 10000 میشود یعنی busport این نود 16379 است. این پورتی هست که نود های کلاستر بر روی این پورت باهم در ارتباط هستند و تغییرات و تنظیمات جدید کلاستر را به یکدیگر اطلاع میدهند.روش کارکرد Redis در حالت Clustering:در پست های قبلی دیدیم که ردیس به صورت Standalone با چه الگوریتم هایی کار میکرد. در حالت Clustering تمام آن شرایط بر قرار است. اما مفاهیم جدید تری برای تکمیل شرایط اضافه شده. ما قبلا دیدیم که Redis برای این که بفهمد یک کلید در کدام اسلات ذخیره میشود از الگوریتم CRC16 استفاده میکرد. و در تعاریف بالا توضیح دادیم که هر master شامل یک سری از اسلات ها میباشد. پس!!!خیلی مهم: اگر ما کلاستری با سه master بر روی پلتفرم کوبرنتیز با این معماری بالا اورده باشیم :master 1 شامل اسلات های 0 تا 5460 با ایپی پاد 10.244.1.98master 2 شامل اسلات های 5461 تا 10922 با ایپی پاد 10.244.2.105master 3 شامل اسلات های 10923 تا 16383 با ایپی پاد 10.244.3.223اگر بخواهیم یک کیلیدی را داخل master 1 ذخیره کنیم که بر اساس خروجی CRC16 شماره اسلات 10000 انتخاب شده باشد. master 1 به شما جواب MOVE همراه با ایپی پاد master 2 و شماره اسلات را برمیگرداند. پس ارتباط شما از بیرون کلاستر کوبر در حالت کلاستر ردیس امکان پذیر نخواهد بود، به دلیل این که ادرس ایپی برگردانده شده ایپی داخلی کلاستر کوبر خواهد بود. برای این که بتوانید ارتباط بیرون از کلاستر کوبر را با داخل کوبر برقرار کنید نیاز به یک پراکسی خواهید داشت که داخل کلاستر کوبر مستقر شود. (در ادامه توضیحات کاملتری داده خواهد شد)روش های کلاسترینگ ردیس:دستی (Manual):نکته:توصیه میشود برای آموزش و تست حداقل یک بار با این روش پیش بروید.(پست جدایی برای این روش مینویسم)در این روش کلاسترینگ شما باید ابتدا Node های ردیس را با cluster-enable: true اجرا کنید، سپس یک به یک به کلاستر اضافه کنید.اضافه کردن Node جدید به یک کلاستر شامل مراحل زیر است:1- اضافه کردن نود جدید2- اتصال نود Slave به Master (درصورتی که نود جدید از نوع Slave باشد)3- انتقال بخشی از اسلات ها به نود Master (درصورتی که نود جدید از نوع Master باشد)4- Meeting با نود جدید برای انتقال اطلاعات جدیدردیس کلاستر (‌Redis Cluster):ردیس کلاستر، ابزاری برای کلاستر بندی نود های ردیس است. این ابزار امکاناتی مانند node affinity و اختصاص اسلات ها به master و ... دارد.در این روش شما نیاز نیست مراحل را به صورت دستی انجام دهید. کافی است لیست ایپی ادرس نود ها را به این ابزار بدید تا این ابزار معماری بهینه مورد نیاز برای کلاستر شما را پیشنهاد دهد. در صورتی که کلاستر شما بر روی کوبر مستقر شود این ابزار تلاش میکند که نود های Slave شما بر روی نود های کلاستر کوبر پخش شود. مثلا اگر master 1 بر روی نود کوبر 1 باشد تلاش میکند تا حداقل یکی از Slave های مربوط به master 1 را بر روی نود کوبر 2 مستقر کند. بعد از پیاده سازی معماری کلاستر بر روی تمامی نود ها به صورت اتوماتیک MEETING انجام میدهد.در پست های بعدی پیاده‌سازی هر دو روش توضیح داده خواهد شد.</description>
                <category>Pouya Doostdar</category>
                <author>Pouya Doostdar</author>
                <pubDate>Mon, 20 Feb 2023 16:52:39 +0330</pubDate>
            </item>
                    <item>
                <title>ردیس: Redis Persisting Data</title>
                <link>https://virgool.io/@PouyaDoostdar/redis-persisting-data-st9naithg4rt</link>
                <description>در سری پست های قبلی درباره راه اندازی ردیس و طریقه کار کرد ردیس و طریقه استفاده از ردیس را توضیح دادیم. پس ما یک Redis Standalone داریم که میدونیم چطوری داره کار میکنه و همچنین بلدیم باهاش کار کنیم. اما مشکلی که وجود داره اینه که ما گفتیم Redis یه دیتابیس In-memory هست پس اگر تحت هر شرایطی اگر Instance Redis ما متوقف شود، چون اطلاعات ما در Ram ذخیره شده از بین خواهد رفت!راهکار چیست؟در ردیس امکانی به اسم Redis persisting data داریم، این فیچر دیتا هایی که داخل رم وجود دارند را بر روی هارد دیسک نیز ذخیره میکند. ( دیسک به عنوان حافظه ذخیره ساز کاری استفاده نمیشود) به این شکل که همه دیتا هایی که داخل رم وجود دارند را به دو روش داخل دیسک ذخیره میکند.روش اول RDB:در این روش دیتا های شما به صورت دامپ شده در یک فایل ذخیره میشود. برای مثال اگر شما داخل دیتابیس کلید test را با value مقدار دهی کرده باشید، داخل فایل فقط و فقط کلید و ولیو شما رو ذخیره خواهد کرد. برای این که واضح تر متوجه شویم مثال زیر را ببینید:فرض بگیریم ما کلید و مقدار زیر را ست کردیم:SET visitors 1000حالا میخواهیم مقدار کلید visitors را با استفاده از increment بیشتر کنیم:INCR visitorsخوب بعد از اجرای این کد عددی که برای visitors باید باشه عدد 1001 هست که میتوانید با استفاده از عملگر GET مقدار را بررسی کنید.با توجه به توضیحاتی که دادیم، محتوای فایلی که از ردیس خروجی داده خواهد شد به شکل زیر است:visitors: 1001یعنی فقط و فقط کلید و ولیو برای ما ذخیره سازی میشود.در این روش ما یک TPS تنظیم خواهیم کرد که ردیس از دیتابیس ما بک اپ بگیرد. برای مثال اگر در 1 دقیقه 1000 رکورد تغییر کرد دیتابیس را داخل هارد ذخیره کند و یا اگر در 1 ثانیه 10 رکورد تغییر کرد دیتابیس را داخل هارد ذخیره کن، بنابراین در این روش ممکن هست در زمان وقوع disaster دیتا های شما Lost شوند.طریقه disaster recovery در این روش به صورت اتوماتیک، زمانی که instance Redis دوباره اجرا شود فایل را خوانده و کلید و مقادیر را دوباره داخل رم مینویسد.روش دوم AOF:در این روش عملکرد ذخیره سازی کاملا متفاوت تر از روش قبلی هست. در این روش کلید و مقدار داخل هارد ذخیره سازی نمیشود بلکه تمام کویری هایی که باعث ایجاد تغییر یک کلید میشود را در لحظه داخل هارد ذخیره سازی میکند. مثال زیر را در نظر بگیرید:SET visitors 1000
INCR visitorsخوب بعد از اجرای این دو دستور (هر دو دستور باعث ایجاد تغییر در دیتابیس میشود) چه اتفاقی میفتد؟در لحظه اجرای خط اول دستور شما داخل فایل Append میشود. و هم چنین در لحظه ورود خط دوم هم همچنین.پس بعد از اجرای این دو دستور، محتوای فایلی که از ردیس خروجی داده خواهد شد به شکل زیر است:*3
$3
SET
$5
visitors
$5
1000
*2
$4
INCR
$7
visitorsدر این روش تمام اطلاعات شما در زمانی که کویری وارد کنید داخل هارد ذخیره سازی میشود. پس هیچ کدام از رکورد های شما قرار نیست از دست برود. طریقه disaster recovery در این روش به صورت اتوماتیک، زمانی که instance Redis دوباره اجرا شود فایل را خوانده و تمام کویری هایی که از اول راه اندازی سرویس تا الان وارد کردید را دوباره داخل دیتابیس اجرا میکند.در صورت استفاده از این روش، با توجه به این که تمام کویری های تغییر دیتای شما داخل هارد نوشته میشوند، ممکن اس عملگر های SET ،PUT ،DEL و باقی عملگرهایی که بر روی دیتا تغییرات انجام میدهند و همچنین سرعت بازیابی اطلاعات کند باشد.</description>
                <category>Pouya Doostdar</category>
                <author>Pouya Doostdar</author>
                <pubDate>Wed, 15 Feb 2023 12:34:06 +0330</pubDate>
            </item>
                    <item>
                <title>ردیس: چیست و چرا باید از Redis استفاده کنیم؟</title>
                <link>https://virgool.io/@PouyaDoostdar/%D8%B3%D8%B1%D9%88%DB%8C%D8%B3-redis-%DA%86%DB%8C%D8%B3%D8%AA-cogbsiaycyzf</link>
                <description>برای محصولی لازم بود یک دیتابیسی استفاده کنیم که بتواند 600K ریکویست بر ثانیه را پاسخگو باشد، بر اساس تجربه تصمیم گرفتیم که از سرویس Redis استفاده کنیم. خیلی درگیر شدیم با Redis و هرچقدر که جلو میرفتیم مشکلات و مفاهیم جدید تری برخورد میکردیم. که باعث شد تجربیات خوبی توی این زمینه کسب کنیم.یکم با خودم فکر کردم و به این نتیجه رسیدم که چرا این تجربیات و مشاهدات رو با بقیه به اشتراک نزارم. و اینگونه شد که تصمیم گرفتم این سری از پست ها رو براتون بنویسم. ( این پست تجربیات و مشاهدات شخصی است)داستان Redisبرای این که بتوانیم دقیق تر درک کنیم که Redis چیه بهتره از عمق مطالب شروع کنیم به یادگیری. پس بریم ببینیم که Redis چیکار میکنه:سرویس Redis یک دیتابیس Key/Value In-Memory هست به این معنی که بهش اطلاعات با یک شناسه میدیم و میگیم که این اطلاعات برای این شناسه باشه و Redis این شناسه و اطلاعات رو یه جایی از رم ذخیره میکنه برامون. و هر موقع خواستیم شناسه رو بهش میدیم و ازش اطلاعات که ذخیره کرده بودیم رو میگیریم.سرویس Redis چطوری کار میکنه؟قبل از این که بفهمیم چطوری کار میکنه لطفا مقاله طریقه استفاده از ردیس را بخوانید.( منتظر میمونم تا بخونید و برگردید? )خوب حالا که متوجه شدیم چطور میتوانیم از ردیس استفاده کنیم. بریم ببینیم ردیس چطوری کار میکنه.تصور کنید شما یک شناسه و اطلاعاتی را برای ردیس ارسال کردید. ردیس اطلاعات شما را داخل یک انتضاعی به نام اسلات ذخیره سازی میکند. به صورت پیشفرض Redis اطلاعات شما را بین 16384 اسلات بر اساس الگوریتم زیر پخش خواهد کرد:HASH_SLOT = CRC16(key) mod 16384این الگوریتم با استفاده از CRC16/XMODEM برای کلید شما ، یک عددی را تولید میکند و 14 بیت از 16 بیت خروجی داده شده توسط این الگوریتم را برداشته و باقیمانده تقسیم اون عدد به تعداد کل اسلات ها (16384) را گرفته و اطلاعات شما را داخل آن اسلات ذخیره میکند. این الگوریتم باعث میشود که اطلاعات شما تقریبا به صورت یکسانی داخل اسلات ها پخش شوند. یعنی اگر اسلات 1 شامل 50 کلید هست اسلات های دیگر هم به احتمال خیلی زیاد 45 تا 55 کلید را شامل میشوند. الگوریتم CRC16 همیشه یک عدد یکسانی را برای کلید شما تولید خواهد کرد و زمانی که شما به اطلاعات یک کلید نیاز داشته باشید با دادن کلید به این الگوریتم میتوانید آدرس اسلاتی که اطلاعات مربوط به آن کلید را شامل میشود را دریافت کنید. نمونه ای از پیاده سازی این الگوریتم داخل ردیس را توی این لینک میتوانید ببینید لینک .( شما میتوانید برای محاسبه آدرس اسلات الگوریتم های شخصی سازی شده بنویسید(قابلیت تنظیم دارد)).از این الگوریتم میتوانیم متوجه بشیم که ادرس اسلاتی که اطلاعات شما رو ذخیره میکنه به شناسه وابسته است پس همیشه یک کیلد داخل یک اسلاتی از ردیس ذخیره خواهد شد.برای مثال اگر شما داخل ردیس یک کلید به نام test تعریف کردید با هر اطلاعاتی، داخل اسلات 6918 ذخیره خواهد شد. برای تست این مسئله میتوانید کد زیر را اجرا کنید:x.x.x.x:yyyy&gt; SET test test2
x.x.x.x:yyyy&gt; CLUSTER KEYSLOT testعددی که دریافت میکنید 6918 خواهد بود.و یا کد زیر را اجرا کنید:x.x.x.x:yyyy&gt; SET somekey test
x.x.x.x:yyyy&gt; CLUSTER KEYSLOT somekeyعددی که دریافت میکنید 11058 خواهد بود.میتوانیم نتیجه بگیریم که کلید های test و somekey و هر کلید دیگری در همه سرویس های ردیس داخل اسلات های مشخصی ذخیره خواهد شد.نکته (مهم): در صورتی که از دستور HSET استفاده بکنید تمام اطلاعات شما بر اساس کلید پخش خواهد شد. نه بر اساس فیلد مثال زیر را ببینید:x.x.x.x:yyyy&gt; HSET hsettest field 1
x.x.x.x:yyyy&gt; CLUSTER KEYSLOT hsettestدر این صورت عدد 7198 را دریافت خواهید کرد. پس در نتیجه هیچ وقت از HSET های خیلی بزرگ استفاده نکنید تا پخش اطلاعات شما بر روی اسلات ها به درستی انجام شوند.مزایایی دیتابیس های In-Memoryدیتابیس های In-Memory به صورت General مزایایی دارند که در ادامه میاریم:1- مشکل هایی Infrastructure که موقع استفاده از دیتابیس هایی On-Disk  میتونیم بهش بر بخوریم رو توی In-Memory دیتابیس ها مشاهده نمیکنیم. و یا خیلی کمتر دیده میشه. ( مثلا: پر شدن io هارد ، وابستگی پرفرمنس دیتابیس به سرعت کارکرد هارد یا بار پردازشی بالا و ... )2- در دیتابیس های In-Memory با توجه به استفاده از Ram به عنوان ذخیره‌ساز کاری و بالا بودن سرعت کاری ( کلاک) دیتا ها سریع ترین زمان ممکن ذخیره و برگردونده میشن.3- دیتابیس های  In-Memory برای پیدا کردن مکان اطلاعات معمولا از الگوریتم های هش تیبل استفاده میکنند که تقریبا پیچیدگی زمانی شبیه به O(1) رو میبینید.مزایای دیتابیس Redisدیتابیس Redis امکانات جالبی نسبت به بقیه دیتابیس های  In-Memory بهمون ارایه میده که در ادامه میاریم:1- ردیس اجازه ذخیره سازی داده هایی به حجم 512 مگابایت ( کلید همراه با مقدار) را برای شما میده.2- ردیس به شما اجازه میده تا دیتا هاتون روو به صورت مپ ذخیره کنید. کد زیر رو ببینید:java:
Map&lt;String, String&gt; user = new HashMap&lt;&gt;();
user.put(&amp;quotusername&amp;quot, &amp;quotjohn123&amp;quot);
user.put(&amp;quotfirstName&amp;quot, &amp;quotJohn&amp;quot);
// use Jedis client
jedis.hmset(&amp;quotuser:john123&amp;quot, user);
// منبع کد DZone3- ردیس به شما امکان تکرار داده های ذخیره شده در Node های مختلف رو ارایه میده.( Replication )4- ردیس تقریبا برای تمام زبان های برنامه نویسی و تمام پلتفرم ها کلاینت ها و کتابخانه های کاملی ارایه داده.5- این سرویس به شما امکان ایجاد چنل Pub/Sub میدهد ( کاربردی مانند Message Broker)6- ردیس سرویس سبکی بوده منابع زیادی مصرف نمیکند.(بسته به ساختار داده شما میتواند متفاوت باشد)7- ردیس میتواند از transactions پشتیبانی کند. (اجرای همزمان چند دستور)8- ردیس به شما این امکان را میدهد که الگوریتم های شخصی سازی شده برای پخش داده های شما بر روی اسلات ها بنویسید.9- کلاسترینگ بسیار کامل ولی پیچیده ای برای شما ارایه میده.10- ابزار های کاملی برای تست و ترابلشوتینگ و بهینه سازی ارایه داده.</description>
                <category>Pouya Doostdar</category>
                <author>Pouya Doostdar</author>
                <pubDate>Thu, 09 Feb 2023 17:02:56 +0330</pubDate>
            </item>
                    <item>
                <title>ردیس: طریقه استفاده از Redis</title>
                <link>https://virgool.io/@PouyaDoostdar/%D8%B7%D8%B1%DB%8C%D9%82%D9%87-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-%D8%B3%D8%B1%D9%88%DB%8C%D8%B3-redis-by2436gz1yb9</link>
                <description>Redis Serviceدر این مقاله ما در با پیشفرض این که یک سرویسRedis ( Cluster or Standalone ) دسترسی داریم و فقط میخواهیم که از این سرویس استفاده کنیم.( برای تنظیم و راه اندازی ردیس این مقاله را بخوانید )Redis برای ارتباط با کلاینت ها از کانکشن TCP  و پروتوکل RESP استفاده میکند که در ادامه به عنوان یک روش ارتباطی معرفی میکنیم. با استفاده از سه روش زیر میتوان به سرویس Redis متصل شد. ( با توجه به نوع کارکرد ، زبان برنامه نویسی و پلفترم یکی از روش های زیر را انتخاب کنید):استفاده از CLI نرمافزار redis-cli، نرمافزاری هست که کامیونیتی Redis به صورت رسمی برای انجام عملیات مدیریتی و انواع روش های عملیات ذخیره و حذف و خواندن ارایه داده.این نرمافزار تحت c نوشته شده و روی اکثر پلتفرم ها ( لینوکس ، ویندوز، مک ) قابلیت اجرا دارد. این نرمافزار همراه با سرویس Redis روی سیستم شما نصب خواهد شد.( میتوانید از این لینک دانلود کنید). از این روش معمولا برای تنظیم و مدیریت سرویس Redis استفاده میشود (ما در مقالات معمولا از این روش برای ارتباط و تنظیمات سرویس Redis استفاده خواهیم کرد).با استفاده از کامند زیر میتوانید به سرویس Redis متصل شوید:redis-cli -h 127.0.0.1 -p 6379 --user default -a password -cدر این کامند همه مقادیر وارد شده مقادیر پیشفرض هستند و اگر شما هر کدام از این مقادیر را وارد نکنید به صورت پیشفرض این مقادیر قرار میگیرند. اما برای وصل شدن به کلاستر نوع ردیس لازم هست تا با فلگ -c وصل بشید. تا از کامند های MOVE پشتیبانی کند.( اطلاعات بیشتر در مقاله کلاسترینگ ردیس ) در صورتی که سرویس ردیس شما در خارج از سیستم لوکال شماست و با پورت متفاوتی در حال استفاده هست میتوانید این مقادیر را به صورت دستی وارد کنید. مثلا اگر کلاستر ردیس من بر روی ایپی x.x.x.x و روی پورت yyyy در حال اجرا باشد و لازم باشد که با یوزر test با پسورد golam وصل بشم باید کامند من به شکل زیر باشد:redis-cli -h x.x.x.x -p yyyy --user test -a golam -cبعد از اتصال به سرویس ردیس یک کامند لاین جدید شبیه به شکل زیر برای شما دردسترس خواهد بود که میتوانید عملیات لازم را بر روی سرویس تان انجام بدید.x.x.x.x:yyyy&gt;برای ایجاد رکورد جدید از کامند زیر میتوانید استفاده بکنید:x.x.x.x:yyyy&gt; set key valueمقدار key همان شناسه ای هست که شما توسط آن به value دسترسی خواهید داشتمقدار value اطلاعاتی هست که شما با استفاده از key به آن دسترسی خواهید داشتبرای خواندن مقدار ذخیره شده میتوانید از کامند زیر استفاده بکنید:x.x.x.x:yyyy&gt; get keyبعد از اجرای این دستوری value ذخیره شده در کامند قبلی به شما نشان داده خواهد شدبرای حذف اطلاعات هم از کامند زیر میتوانید استفاده بکنید:x.x.x.x:yyyy&gt; del keyبا استفاده از redis-cli میتوانید مدیریتی کاملی بر روی سرویس Redis داشته باشید ، که با هر کامند در مقالات مختلف اشنا خواهیم شد.استفاده از کتابخانه ها:کامیونیتی ردیس تقریبا برای همه زبان های برنامه نویسی رایج ، کتابخانه ارایه داده. شما میتوانید با توجه به زبان برنامه نویسی مورد استفاده از کتابخانه های مخصوص آن زبان استفاده بکنید که در این لینک لیست کتابخانه های ارایه شده را میتوانید ببینید.استفاده از پروتکل RESP:استفاده از این پروتوکل پیجیدگی های خواص خود را دارد و اگر روش های قبلی جوابگوی نیاز شما نبود میتوانید از این پروتوکل استفاده کنید(توصیه میشند در حد توان از روش های قبلی استفاده کنید).با استفاده از این پروتکل شما میتوانید بدون استفاده از کتابخانه ها و تمام کلاینت های اماده نوشته شده به صورت مستقیم و با استفاده از یک کانکشن TCP از سرویس Redis استفاده کنید. توضیحات کامل درباره استفاده از پروتکل RESP در این لینک .</description>
                <category>Pouya Doostdar</category>
                <author>Pouya Doostdar</author>
                <pubDate>Tue, 07 Feb 2023 03:46:55 +0330</pubDate>
            </item>
            </channel>
</rss>