PDA

View Full Version : چگونه چند سرور رو sync کنم



hmm
یک شنبه 30 مرداد 1384, 08:04 صبح
سلام
تو محل کارمون یه سرور مرکزی داریم که تمام اطلاعات روی اون سروره
در تمام مناطق استان هم یه شعبه داریم که هرکدام روی بخشی از این اطلاعات کارمیکنن
یعنی هیچ بخشی اطلاعات بخش دیگه رو نمیبینه و نمیتونه تغییر بده
حال میخواهم روشی رو بفرمایید (ساده و بدون هزینه زیاد) که تمام اطلاعات تغییر یافته از تمام سرورهای شعبات در پایان روز به سرور اصلی منتقل بشه
میدونم اولین راه حل شما replication است ولی از چه نوعی
آیا میشه از تغییرات دیتابیس در هر شعبه log تهیه کرد و فایل اون رو توسط تلفن فرستاد و دستی رو سرور مرکزی اعمال کرد؟
از هر راهکار مناسب دیگه هم استقبال میشه!!!:)

AminSobati
یک شنبه 30 مرداد 1384, 22:47 عصر
Merge یا Transactional هر دو خوب هستند. اگرچه Merge به خاطر Triggerهایی که میسازه شاید کمی Overhead بیشتر داشته باشه، اما انعطاف پذیرترین حالت هستش.
Replication با ارسال فایل امکان پذیر نیست و حتما باید ارتباط برقرار باشه

hmm
دوشنبه 31 مرداد 1384, 07:13 صبح
با تشکر آقای ثباتی

من شرکتی رو دیدم که پایان روز از تغییرات دیتابیس خودشون log تهیه میکنن و ایمیل میکنند
طرف مقابل هم این فایل را روی دیتابیس اصلی اعمال میکنه (ظاهرا این یه فایل تکسته که دستورات sql درونش قرار داره)
آیا اونها برای اینکار از امکانات sqlserver دارن اسفاده میکنن یا اینکه یه نوع برنامه نوشتن؟

AminSobati
دوشنبه 31 مرداد 1384, 09:56 صبح
امکانی که SQL Server میده این هست که بوسیله Profiler فعالیت تمام کاربرها رو Capture کنین و نتیجه رو در قالب یک فایل بفرستین. حالا دریافت کننده میتونه این فایل رو در Profiler باز و اجرا کنه. ولی این قبیل کارها مستعد اشکال و ناهماهنگی هستند. فرض کنین یک رکورد در سرور اصلی حذف میشه، ولی در یک شعبه Update میشه. حالا وقتی این شعبه Log خودش رو ارسال میکنه، در سرور اصلی چیزی برای Update شدن وجود نداره..
ولی در سناریوی های خاص که میدونین تغییرات فقط در یک سمت اتفاق میافته (و البته با رعایت شرایط دیگه) میشه از این روش استفاده کرد

hmm
دوشنبه 31 مرداد 1384, 13:22 عصر
در این مورد خاص هم فقط دیتا در سمت شعبات تغییر میکنه و لازم نیست دیتایی از سایر شعبات و یا مرکز به شعبه دیگه ای رد و بدل بشه فقط تغییرات از سمت شعبات به سمت سرور مرکزی است

آیا راهی بجز profiler وجود نداره
آیا از transation log برای این مورد نمیشه استفاده کرد
آیا از filegrouping نمیشه استفاده کرد مثلا برای هر شعبه ای در سرور اصلی یه filegroup تشکیل بدیم مسئله حل نمیشه
آیا اگه برای هر شعبه ای یه دیتابیس در مرکز بسازیم و همه transation diffrent log ها رو بفرستند و در مرکز روی دیتابیس مربوطه restore بشه کار تمومه یا نه (در این قسمت سوالی که مطرح میشه اینه که برای گرفتن آمار کلی در مرکز چطور اطلاعات همه دیتابیسها رو بصورت واحد در نظر بگیریم)
وآیا راه دیگه ای نیست؟؟؟؟؟؟؟؟
ممنون

AminSobati
دوشنبه 31 مرداد 1384, 23:07 عصر
- Filegroup کاربردی در این زمینه نداره.
- SQL Server بوسیله Log File چنین امکانی نمیده مگر اینکه نرم افزارهای جانبی که توسط سایر شرکتها نوشتن شدن چنین استفاده ای از Log File کرده باشند

hmm
سه شنبه 01 شهریور 1384, 07:52 صبح
خیلی ممنون از راهنمایی شما


آیا اگه برای هر شعبه ای یه دیتابیس در مرکز بسازیم و همه transation diffrent log ها رو بفرستند و در مرکز روی دیتابیس مربوطه restore بشه کار تمومه یا نه (در این قسمت سوالی که مطرح میشه اینه که برای گرفتن آمار کلی در مرکز چطور اطلاعات همه دیتابیسها رو بصورت واحد در نظر بگیریم)

????

AminSobati
سه شنبه 01 شهریور 1384, 23:40 عصر
حتما میدونید که برای Restore کردن Log Backup، باید Log قبل از اون رو هم Restore کرد. مثلا اگر هر روز، شعب یک Log Backup بفرستند، بعد از 100 روز، در روز صد و یکم، برای Restore کردن Log Backup، میبایست 100 عدد Backup قبلی رو هم Restore کنین!
موضوع گزارشات یکپارچه هم مسئله ای هست. اگرچه شاید از UNION بشه استفاده کرد ولی در مجموع منطقی به نظر نمیرسه (البته با فرض بر اینکه موضوع 100 بار Restore رو قبول کرده باشیم!)

hmm
چهارشنبه 02 شهریور 1384, 07:55 صبح
نه استاد کی حال داره اینهمه فایل رو restore کنه
نمیدونم چکار کنم؟؟؟
چطوری تفاوتها رو انتقال بدم آخه کم بودن حجم فایلها برام مهمه (سرعت پایین خط تلفن)
شما چی پیشنهاد میدید؟؟

FirstLine
چهارشنبه 02 شهریور 1384, 10:30 صبح
با سلام
من تقریبا در چنین حالتی کار زیر را انجام دادم و جواب گرفتم:
در تمام جدولهایی که قرار بود تغییرات ایجاد شود یک فیلد DateTime اضافه کردم و در صورت هرگونه اضافه یا تغییرات ، مقدار این فیلد به روز شده و در پایان روز از اطلاعات جدید یک فایل XML تهیه شده و مجموع فایلها بصورت کمپرس شده به سرور اصلی فرستاده و اطلاعات به بانک اصلی اضافه و بروز رسانی میشد.
گفتم شاید این بدرد شما هم بخورد.
با تشکر

AminSobati
چهارشنبه 02 شهریور 1384, 10:47 صبح
اشکال XML اینه که فقط INSERT و UPDATE رو منتقل میکنه و اگر رکوردی در شعبه حذف بشه، توسط XML به سرور اصلی سرایت نخواهد کرد. مگر اینکه توسط Trigger رکوردهای حذف شده رو در جایی ثبت کنید... شاید به زحمتش بیارزه؟!

hmm
چهارشنبه 02 شهریور 1384, 12:38 عصر
یعتی هییچ روشی وجود نداره که sqlserver بتونه تو یه بازه زمانی تغییرات رو به فرمت sql بده
مثلا اینطوری
insert into t1 values ....a
delete from t2 where ...b
update t3 set ....c

setarehman
چهارشنبه 02 شهریور 1384, 13:35 عصر
آیا ساختار بانک اطلاعاتی شما روی سرور مناطق با سرور اصلی یکی هست

AminSobati
چهارشنبه 02 شهریور 1384, 20:10 عصر
بهترین راه، استفاده از Transactional Replication بدون Updateable Subscription هستش. هر شعبه میتونه Publisher باشه و مرکز هم Subscriber. این یک مدل شناخته شده و کاملا روتین هستش. به نظر من از هر جهت خوبه.
http://www.replicationanswers.com/CentralSubscriberArticle.asp

hmm
شنبه 05 شهریور 1384, 08:18 صبح
بدون Updateable Subscription

کاربرد این گزینه چیه؟

AminSobati
شنبه 05 شهریور 1384, 09:55 صبح
یعنی تغییرات از سمت Subscriber (در مورد کار شما، یعنی سرور اصلی) به Publisher منتقل نمیشه