Score:0

จะย้ายฐานข้อมูล ejabberd จากแบ็กเอนด์ SQL ไปยัง Mnesia ได้อย่างไร

ธง za

มีการกระทำที่รองรับค่อนข้างมากในการย้ายจาก Mnesia ไปยัง SQL ซึ่งเป็นคำสั่งพิเศษ ejabberdctl ส่งออก2sql (ในเวอร์ชั่นเก่าจะเรียกว่า ส่งออก2odbc). การตั้งค่าบางอย่างอาจจำเป็นต้องใช้เนื่องจาก Mnesia จำกัดไว้ที่ 2GiB และ blah blah blah

ในกรณีของฉันไม่จำเป็นต้องมีฐานข้อมูลภายนอก มีผู้ใช้ที่ใช้งานอยู่ประมาณ 10-15 รายและไม่เกิน 30 รายจากผู้ใช้ทั้งหมด และขนาดของการส่งออกจากฐานข้อมูล SQL อยู่ที่ประมาณ 200 kB

ในอดีตมีคนทำสิ่งนั้นส่งออกฐานข้อมูลไปยัง SQL (โดยเฉพาะ MySQL) ฉันจะคืนค่าการเปลี่ยนแปลงนั้นได้อย่างไร

สามารถ export_piefxis ช่วยฉันอย่างใด มันทำอะไร?


อัพเดท 1. หลังจากการสำรวจ ฉันพบว่ามีเพียงสองโมดูลเท่านั้นที่มีข้อมูลบางส่วนในฐานข้อมูล SQL: mod_roster และ mod_vcard. ดังนั้นจำเป็นต้องแปลงเท่านั้น มีวิธีแปลงข้อมูลภายนอกและโหลดเป็น ejabberd หรือไม่ ฉันหมายความว่ามี ejabberdctl dump_tableแต่อีกครั้งไม่มีคำสั่งย้อนกลับ

อีกด้วย, export_piefxis ดูเหมือนจะไม่ช่วย มันแค่ส่งออกเนื้อหาเป็นศูนย์ ในขณะที่มีข้อมูลอยู่ในฐานข้อมูล และมันถูกดึงข้อมูลเมื่อฉันเชื่อมต่อกับเช่น ไคลเอนต์อินสแตนซ์ใหม่

อัปเดต 2. ซอฟต์แวร์: คอนเทนเนอร์ Debian 11.2 LXC ทำงานบนโฮสต์ Proxmox VE 6.4-1 Ejabberd 21.01-2 ติดตั้งด้วย ฉลาด จาก repo Debian มาตรฐาน

ฐานข้อมูลถูกย้ายจาก Ejabberd เก่าประมาณเวอร์ชัน 2.1 ซึ่งทำงานบน Gentoo และอัปเดตล่าสุดในปี 2558ฉันไม่มีเครื่องนั้นตามดุลยพินิจของฉันอีกต่อไป การโยกย้ายฐานข้อมูล Mnesia ดำเนินการดังนี้:

#เครื่องเก่า
การสำรองข้อมูล ejabberdctl /tmp/[email protected] 
ejabberdctl mnesia_change_nodename ejabberd@localhost ejabberd@jabber2 \
           /tmp/[email protected] /tmp/[email protected]
# บนเครื่องใหม่ (เริ่มต้นด้วยฐานข้อมูลที่ว่างเปล่า)
ejabberdctl install_fallback /tmp/[email protected]
ejabberdctl หยุด
ejabberdctl เริ่มต้น

การกำหนดค่าในเครื่องใหม่อ้างอิงฐานข้อมูล MySQL เดียวกันสำหรับ mod_roster และ mod_vcard.

ejabberd.yml:

ระดับล็อก: ข้อมูล

log_rotate_count: 0

เจ้าภาพ:
  - "example.org"

host_config:
  "rterm.ru":
    sql_type: mysql
    sql_server: "เซิร์ฟเวอร์ฐานข้อมูล"
    sql_database: "ejabberd"
    sql_username: "ejabberd"
    sql_password: "รหัสผ่าน"
    auth_method: [ภายนอก]

ไฟล์ใบรับรอง:
  - "/etc/ejabberd/ejabberd.pem"

จุดสุดยอด:
  อัตโนมัติ: เท็จ

กำหนด_มาโคร:
  'TLS_CIPHERS': "สูง:!aNULL:!eNULL:!3DES:@STRENGTH"
  'TLS_OPTIONS':
    - "no_sslv3"
    - "no_tlsv1"
    - "no_tlsv1_1"
    - "cipher_server_preference"
    - "no_compression"


c2s_ciphers: 'TLS_CIPHERS'
s2s_ciphers: 'TLS_CIPHERS'
c2s_protocol_options: 'TLS_OPTIONS'
s2s_protocol_options: 'TLS_OPTIONS'

ฟัง:
  -
    พอร์ต: 5222
    ไอพี: "::"
    โมดูล: ejabberd_c2s
    max_stanza_size: 262144
    เชปเปอร์: c2s_shaper
    การเข้าถึง: c2s
    starttls_required: จริง
    protocol_options: 'TLS_OPTIONS'
  -
    พอร์ต: 5223
    ไอพี: "::"
    โมดูล: ejabberd_c2s
    max_stanza_size: 262144
    เชปเปอร์: c2s_shaper
    การเข้าถึง: c2s
    tls: จริง
    protocol_options: 'TLS_OPTIONS'
  -
    พอร์ต: 5269
    ไอพี: "::"
    โมดูล: ejabberd_s2s_in
    max_stanza_size: 524288
  -
    พอร์ต: 5443
    ไอพี: "::"
    โมดูล: ejabberd_http
    tls: จริง
    protocol_options: 'TLS_OPTIONS'
    request_handlers:
      /admin: ejabberd_web_admin
      /api: mod_http_api
      /bosh: mod_bosh
      /อัพโหลด: mod_http_upload
      /ws: ejabberd_http_ws
  -
    พอร์ต: 5280
    ไอพี: "::"
    โมดูล: ejabberd_http
    tls: เท็จ
    request_handlers:
# สิ่งนี้ทำงานหลังพร็อกซี HTTP ย้อนกลับด้วย Let's Encrypt ซึ่งเป็นคอนเทนเนอร์เพื่อนบ้านในโฮสต์เดียวกัน ดังนั้นจึงปลอดภัย
      /admin: ejabberd_web_admin
      /bosh: mod_bosh
      /อัพโหลด: mod_http_upload
  -
    พอร์ต: 1883
    ไอพี: "::"
    โมดูล: mod_mqtt
    ค้าง: 1,000

auth_method: [ภายนอก]
extauth_program: "/etc/ejabberd/auth_mysql.py"
extauth_pool_size: 5

ปิดการใช้งาน_sasl_กลไก:
  - "X-OAUTH2"

s2s_use_starttls: จำเป็น

บัญชี:
  ผู้ดูแลระบบ:
    ผู้ใช้:
       - "[email protected]"

  ท้องถิ่น:
    user_regexp: ""
  ย้อนกลับ:
    ไอพี:
      - 127.0.0.0/8
      - ::1/128

access_rules:
  ท้องถิ่น:
    อนุญาต: ท้องถิ่น
  ซีทูเอส:
    ปฏิเสธ: ถูกบล็อก
    อนุญาต: ทั้งหมด
  ประกาศ:
    อนุญาต: ผู้ดูแลระบบ
  กำหนดค่า:
    อนุญาต: ผู้ดูแลระบบ
  muc_create:
    อนุญาต: ท้องถิ่น
  pubsub_createโหนด:
    อนุญาต: ท้องถิ่น
  trust_network:
    อนุญาต: ย้อนกลับ

api_permissions:
  "คำสั่งคอนโซล":
    จาก:
      - ejabberd_ctl
    ใคร: ทั้งหมด
    อะไร: "*"
  "การเข้าถึงของผู้ดูแลระบบ":
    ใคร:
      เข้าไป:
        อนุญาต:
          - acl: ย้อนกลับ
          - บัญชี: ผู้ดูแลระบบ
      คำสาบาน:
        ขอบเขต: "ejabberd:admin"
        เข้าไป:
          อนุญาต:
            - acl: ย้อนกลับ
            - บัญชี: ผู้ดูแลระบบ
    อะไร:
      - "*"
      - "!หยุด"
      - "!เริ่ม"
  "คำสั่งสาธารณะ":
    ใคร:
      ไอพี: 127.0.0.1/8
    อะไร:
      - สถานะ
      -connected_users_number

รูปร่าง:
  ปกติ:
    อัตรา: 3000
    ระเบิดขนาด: 20,000
  รวดเร็ว: 200,000

shaper_rules:
  max_user_sessions: 10
  max_user_offline_messages:
    5000:แอดมิน
    100: ทั้งหมด
  c2s_shaper:
    ไม่มี: ผู้ดูแลระบบ
    ปกติ: ทั้งหมด
  s2s_shaper: รวดเร็ว

โมดูล:
  mod_adhoc: {}
  mod_admin_extra: {}
  mod_announce:
    การเข้าถึง: ประกาศ
  mod_avatar: {}
  mod_blocking: {}
  mod_bosh: {}
  mod_caps: {}
  mod_carboncopy: {}
  mod_client_state: {}
  mod_configure: {}
  mod_disco: {}
  mod_fail2ban: {}
  mod_http_api: {}
  mod_http_upload:
    put_url: https://@HOST@:5443/upload
    custom_headers:
      "การควบคุมการเข้าถึงอนุญาตแหล่งกำเนิด": "https://@HOST@"
      "การเข้าถึง-การควบคุม-อนุญาต-วิธีการ": "GET,HEAD,PUT,OPTIONS"
      "Access-Control-Allow-Headers": "ประเภทเนื้อหา"
  mod_last: {}
  mod_mqtt: {}
  mod_muc:
    เข้าไป:
      - อนุญาต
    access_admin:
      - อนุญาต: ผู้ดูแลระบบ
    access_create: muc_create
    access_persistent: muc_create
    access_mam:
      - อนุญาต
    default_room_options:
      ม๊า: จริงค่ะ
  mod_muc_admin: {}
  mod_ออฟไลน์:
    access_max_user_messages: max_user_offline_messages
  mod_ping: {}
  mod_pres_counter:
    นับ: 5
    ช่วงเวลา: 60
  mod_privacy: {}
  mod_private: {}
  mod_proxy65:
    การเข้าถึง: ท้องถิ่น
    max_connections: 5
  mod_pubsub:
    access_createnode: pubsub_createnode
    ปลั๊กอิน:
      - แบน
      - ห้าวหาญ
    force_node_config:
      "eu.siacs.conversations.axolotl.*":
        access_model: เปิด
      ที่เก็บข้อมูล: ที่คั่นหน้า:
        access_model: รายการที่อนุญาต
  mod_push: {}
  mod_push_keepalive: {}
  mod_roster:
    db_type:sql# นี่คือสิ่งที่ฉันต้องการกำจัด
    เวอร์ชัน: จริง
  mod_s2s_dialback: {}
  mod_shared_roster: {}
  mod_sic: {}
  mod_stream_mgmt:
    resend_on_timeout: if_ออฟไลน์
  mod_stun_disco: {}
  mod_vcard:
    db_type: sql # และนี่
    ค้นหา: เท็จ
  mod_vcard_xupdate: {}
  mod_version: {}
Score:0
ธง ru

export_piefxis ช่วยฉันได้ไหม มันทำอะไร?

ใช่ นั่นควรเป็นคำสั่งที่ทำสิ่งที่คุณต้องการ: เรียกใช้เมื่อยังคงใช้ที่เก็บข้อมูล SQL เมื่อคุณมีเนื้อหาในไฟล์ XML แล้ว ให้กำหนดค่า ejabberd เพื่อใช้ Mnesia และนำเข้าไฟล์เหล่านั้น

นอกจากนี้ export_piefxis ดูเหมือนจะไม่ช่วยอะไร

มันล้มเหลว? หรือเพียงแค่ส่งออกเนื้อหาเป็นศูนย์

Nikita Kipriyanov avatar
za flag
ฉันลองใหม่ มันส่งออกเนื้อหาเป็นศูนย์ (สองไฟล์ หนึ่งไฟล์ 180 ไบต์และอีกไฟล์หนึ่งคือ 132 â อันหลังคือข้อมูลโฮสต์ของฉัน) ในขณะที่เชื่อมต่อกับ jabber กับไคลเอนต์ใหม่ ฉันสามารถดูข้อมูลบัญชีรายชื่อและ vcard ที่ดึงมาจากฐานข้อมูล sql
Badlop avatar
ru flag
ฉันติดตั้ง ejabberd จาก git, กำหนดค่าให้ใช้ MySQL สำหรับการตรวจสอบสิทธิ์และที่เก็บข้อมูลเริ่มต้น, ลงทะเบียนบัญชี, เพิ่มผู้ติดต่อและแก้ไข vcard จากนั้นส่งออก และ xml ที่สองมีรายละเอียดผู้ใช้: ......
Badlop avatar
ru flag
อัปเดตคำถามเดิมของคุณโดยระบุรายละเอียดว่าเวอร์ชัน ejabberd กำลังทำงานอย่างไร มีการติดตั้งอย่างไร ไฟล์การกำหนดค่า (แสดงความคิดเห็นในรายละเอียดส่วนตัว)
Nikita Kipriyanov avatar
za flag
ฉันเพิ่มรายละเอียดทั้งหมดที่คุณต้องการแล้ว
Score:0
ธง ru

ตกลง มีคุณลักษณะที่เข้ากันไม่ได้: คุณกำลังขอรายละเอียดเกี่ยวกับบัญชีที่ลงทะเบียนกับ ejabberd แต่ ejabberd ไม่ทราบว่ามีบัญชีอะไรบ้าง

คุณได้ ejabberd กำหนดค่าให้ใช้ ออกซึ่งหมายความว่า ejabberd ใช้สคริปต์นั้นเพื่อ ตรวจสอบว่ามีบัญชีอยู่หรือไม่ หรือไม่... แต่สคริปต์นั้นไม่เคยรายงานรายชื่อบัญชีที่ลงทะเบียน

นี่เป็นปัญหาเมื่อคุณต้องการทราบรายชื่อบัญชีที่ลงทะเบียน:

  • ส่งออกบัญชีที่มีอยู่โดยใช้ export_piefxis
  • ดูรายการบัญชีใน ejabberd WebAdmin

เรื่องนี้ถูกรายงานใน https://github.com/processone/ejabberd/issues/3705

ทางออกหนึ่งคือการเปิดใช้งานตัวเลือก auth_use_cache เพื่อให้ความพยายามในการเข้าสู่ระบบแต่ละครั้งให้คำใบ้ที่ ejabberd จัดเก็บ รอสองสามวันหรือหลายสัปดาห์ และหลังจากนั้นเมื่อคุณขอรายการ "บัญชีที่ลงทะเบียน" ejabberd จะอ่านแคชการตรวจสอบสิทธิ์นั้นและใช้งาน

ปัญหาคือคุณจะต้องรอให้บัญชีที่ลงทะเบียนทั้งหมดเข้าสู่ระบบและปล่อยให้ข้อมูลแคชนั้นอยู่ใน ejabberd...

ข่าวดี: มีวิธีที่คุณสามารถเติมแคชรับรองความถูกต้องด้วยบัญชี:

  1. รับรายการบัญชีที่ลงทะเบียนด้วยตนเองไม่ทางใดก็ทางหนึ่ง

  2. เปิดใช้งาน auth_use_cache ใน ejabberd และรีสตาร์ท

  3. เรียกใช้คำสั่งนี้สำหรับทุกบัญชีที่คุณต้องการส่งออก สิ่งนี้จะทำให้แน่ใจว่ามีการรัน extauth สำหรับบัญชีนั้น และแคช auth จะเก็บคำใบ้นี้ไว้:

    ejabberdctl check_account user123 localhost

  4. เพื่อความอยากรู้อยากเห็น คุณสามารถดูรายชื่อบัญชีที่ลงทะเบียนได้ (อันที่จริง เป็นเพียงรายชื่อบัญชีที่แคชตรวจสอบสิทธิ์เท่านั้น...)

    ejabberdctl register_users localhost ผู้ดูแลระบบ ผู้ใช้123

  5. ตอนนี้คุณสามารถเรียกใช้ export_piefxis ได้แล้ว

  6. ข้อควรจำ: ข้อมูลแคชการตรวจสอบสิทธิ์นั้นจะถูกลบเมื่อ ejabberd หยุดทำงาน

  7. เมื่อส่งออกแล้ว คุณสามารถย้อนกลับการกำหนดค่าได้

Nikita Kipriyanov avatar
za flag
นั่นเป็นคำอธิบายที่สมเหตุสมผล ขอบคุณสำหรับคำแนะนำเกี่ยวกับวิธีดำเนินการ ฉันจะลองดู!

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา