17 Şubat 2020 Pazartesi

vSphere Replication ile replike olan olan bir VM 'in CLI ortamında replikasyondan ayrıştırılması.

Merhaba,

Herhangi bir sebepten dolayı vSphere Replication’da resimde görülen hatalar gibi hatalar oluştuysa yada Target DS içinden bir şekilde replike olan VM’in verisini sildiyseniz ve vSphere içinden ilgili VM’I ReConfigure edemiyorsanız aşağıdaki adımları izlemek işinizi çözecektir.

 

 

 

 

 

 

eSXi sunucuya CLI ortamında bağlantı yaparak operasyon yapacağımız sunucun ID sini öğreneceğiz.

 

vim-cmd vmsvc/getallvms |grep "XYZServer"

 

çıktı olarak alttaki gibi bir çıktı elde edeceğiz.

 

295    XYZServer               [AFA_Comp_DS] XYZServer/XYZServer.vmx                           windows7Server64Guest   vmx-11

 

Sunucumuzun ID si çıktıya göre 295 dir. Bu bilgiyi öğrendikten sonra aşağıdaki komutu yazarak replikasyonun Disk statü ve aksiyonlarını görmeyi hedefliyoruz.

 

vim-cmd hbrsvc/vmreplica.getState 295

 

çıktı olarak aşağıdaki gibi bir çıktı elde edilir.

 

 

Retrieve VM running replication state:

        The VM is configured for replication. Current replication state: Group: GID-d8ce20e8-f799-4a79-a1b8-7c9d89b12c01 (generation=7292397286522810)

        Group State: inactive, paused

                DiskID RDID-02f2d250-68b0-48f0-93c7-1c8c93a0afe0 State: inactive, paused

                DiskID RDID-7f406ea4-91a3-4549-95e3-aa61fbc34595 State: inactive, paused

                DiskID RDID-6ba702b4-0ecb-470d-b955-bd5cca6ffbdc State: inactive, paused

                DiskID RDID-f2aee2be-be9a-4829-8805-8a1fa3c920fd State: inactive, paused

                DiskID RDID-5a4545da-b03a-4f85-a071-e34a757a9b7c State: inactive, paused

                DiskID RDID-11fc6b9c-11ab-4927-b5c5-724d5ddfbd0c State: inactive, paused

 

 

Son olarak alttaki komutla replikasyonu Disabled etmeye çalışıyoruz.

 

vim-cmd hbrsvc/vmreplica.disable 295

 

Bu komut sonrası alttaki gibi bir çıktı elde etmeniz gerekiyor.

 

Disable VM Replication:

 

Bu operasyonlar sonra tekrardan GUI ortamına döndüğümüzde ilgili sunucu üzerine sağ tıklarsak önceden Reconfigure aktifken artık Configure nin ektif olduğunu görebilirsiniz.

 

               

 

 

Ümit GÖRÜR

Profesyonel Hizmetler | Professional Services

 

Yıldız Teknik Üniversitesi Davutpaşa Kampüsü Teknoloji Geliştirme Bölgesi Çiftehavuzlar Mahallesi Eski Londra Asfaltı Caddesi No: 151/1E D2 Blok

Ofis No: 1B-10 Esenler - İstanbul, TÜRKİYE

T: +90 (212) 393 00 90 | F: +90 (212) 393 00 91

www.aktekbilisim.com


 

 


16 Şubat 2020 Pazar

vCenter backup & restore script

vCenter Postgre DB yedeğini almak için aşağıdaki adımlar izlenebilir. Script içeriklerinde bir değişiklik yapmanıza gerek yoktur. Sarı alanları kopyalayıp bir editöre yapıştırmanız ve kaydetmeniz yeterli olacaktır.

 

 

backup_lin.py script içeriği

 

#!/usr/bin/env python

 

import argparse

from os import path, remove, close

from subprocess import call, Popen, PIPE

 

POSTG_BIN_DIR  = "/opt/vmware/vpostgres/current/bin/"

PSQL           = path.join(POSTG_BIN_DIR, "psql")

PG_DUMP        = path.join(POSTG_BIN_DIR, "pg_dump")

 

parser = argparse.ArgumentParser()

parser.add_argument('-f',

                    action="store",

                    dest="backup_file",

                    required=True)

results = parser.parse_args()

 

fileOut = open("/tmp/backup_out.log", "a+")

fileError = open("/tmp/backup_err.log", "a+")

 

cmd = [PG_DUMP, "-a", "-Fc", "--disable-triggers", "-b", "-U", "postgres", "-f", results.backup_file, "VCDB"]

ret = call(cmd, stdout=fileOut, stderr=fileError)

fileOut.close()

fileError.close()

 

print ("Backup completed successfully.")

 

 

python script dosyasına yetki veriyoruz. chmod 700 /tmp/backup_lin.py sonrasında python backup_lin.py -f /tmp/vcsa_postgres_VCDB_12022020.bak konutu ile DB yedeklernir. Sarı ile işaretli dizilimde kırmızı puntolar ile yazılan kısım sizin vereceğiniz bir isimlendirme olabilir. Backup completed successfully. Yazısını gördükten sonra yedeğinizin alındığını anlayabilirsiniz.   

 

 

işlerin yolunda gitmediğini düşünerek birde restore için script oluşturulalım. Bu script’in adıda restore_lin.py olsun. Script Içeriği aşağıdaki gibi olmalı.

 

restore_lin.py script içeriği

 

 

#!/usr/bin/env python

 

import argparse

import time

import sys

from os import path, remove, close

from subprocess import call, Popen, PIPE

 

VPOSTGRES_FOLDER  = "/opt/vmware/vpostgres/current/"

PSQL              = path.join(VPOSTGRES_FOLDER, "bin", "psql")

PG_RESTORE        = path.join(VPOSTGRES_FOLDER, "bin", "pg_restore")

 

constrfilename = "create_constr" + time.strftime("%Y%m%d%H%M%S%m") + ".sql"

indexfilename = "create_index" + time.strftime("%Y%m%d%H%M%S%m") + ".sql"

 

CREATE_INDEXES = ("/tmp/" + indexfilename)

CREATE_CONSTRAINTS = ("/tmp/" + constrfilename)

 

def psqlFile(filePath, userName = "postgres", database = "VCDB"):

   return [PSQL, "-U", userName, "-d", database, "-q", "-f", filePath]

 

def psqlQuery(query, userName = "postgres", database = "VCDB"):

   return [PSQL, "-U", userName, "-d", database, "-q", "-t", "-c", query]

 

def execPsqlDynamicSql(sql):

   '''

   Executes dynamic sql query which is generated by the input

 

   @sql: input for dynamic query

   '''

   pipe1 = Popen(psqlQuery(sql), stdout = PIPE)

   cmd2 = [PSQL, "-U", "postgres", "-d", "VCDB"]

   pipe2 = Popen(cmd2, stdin = pipe1.stdout, stdout = PIPE)

   pipe1.stdout.close()

   pipe2.communicate()

   pipe2.stdout.close()

 

def preImportScripts(schemaName):

   '''

   VCDB index and constraint drop and create into files.

   When completed drop all indexes and constraints.

   This step is required for faster import.

 

   @schemaName: vPostgres VCDB schema name

   '''

   sqlTblsp =  """

               CASE

                  WHEN c.relname LIKE 'vpx_alarm%'

                     THEN 'SET default_tablespace = alarm; '

                  WHEN c.relname LIKE 'vpx_event%'

                     THEN 'SET default_tablespace = event; '

                  WHEN c.relname LIKE 'vpx_task%'

                     THEN 'SET default_tablespace = task;'

                  WHEN c.relname LIKE 'vpx_hist_stat1%'

                     THEN 'SET default_tablespace = hs1;'

                  WHEN c.relname LIKE 'vpx_hist_stat2%'

                     THEN 'SET default_tablespace = hs2;'

                  WHEN c.relname LIKE 'vpx_hist_stat3%'

                     THEN 'SET default_tablespace = hs3;'

                  WHEN c.relname LIKE 'vpx_hist_stat4%'

                     THEN 'SET default_tablespace = hs4;'

                  ELSE ''

               END

               """

   sqlResetTblsp = """

                   CASE

                     WHEN c.relname LIKE 'vpx_alarm%'

                       OR c.relname LIKE 'vpx_event%'

                       OR c.relname LIKE 'vpx_task%'

                       OR c.relname LIKE 'vpx_hist_stat%'

                           THEN 'RESET default_tablespace;'

                     ELSE ''

                   END

                   """

   sqlCreateIndex =  """

                     SELECT %s || pg_catalog.pg_get_indexdef(i.indexrelid, 0, true) || ';' || %s

                       FROM pg_class c

                       JOIN pg_index i

                         ON c.oid = i.indrelid

                       JOIN pg_class c2

                         ON i.indexrelid = c2.oid

                       JOIN pg_namespace n

                         ON n.oid=c.relnamespace

                            AND nspname = '%s'

                       LEFT JOIN pg_catalog.pg_constraint con

                         ON con.conrelid = i.indrelid

                            AND con.conindid = i.indexrelid

                            AND con.contype IN ('p','u','x')

                      WHERE NOT EXISTS(SELECT 1

                                         FROM pg_constraint

                                        WHERE  conname = c2.relname)

                     """ % (sqlTblsp, sqlResetTblsp, schemaName)

   sqlCreateConstr = """

                     SELECT 'ALTER TABLE ' || c.relname||

                              ' ADD CONSTRAINT ' || con.conname ||

                                 ' ' || pg_get_constraintdef(con.oid)||';' ||

                                 CASE  WHEN i.indisclustered='t'

                                       THEN ' cluster ' || c.relname|| ' using ' || con.conname || ';'

                                       ELSE ''

                                 END

                       FROM pg_constraint con

                       JOIN pg_class c

                         ON con.conrelid = c.oid

                       JOIN pg_namespace n

                         ON n.oid = c.relnamespace

                       LEFT JOIN pg_index i

                         ON con.conrelid = i.indrelid

                         AND con.conindid = i.indexrelid

                      WHERE n.nspname = '%s'

                      ORDER BY con.contype DESC

                     """ % (schemaName)

   sqlDropIndex = """

                  SELECT 'DROP INDEX IF EXISTS ' || c.relname || ' CASCADE;'

                    FROM pg_class c

                    LEFT JOIN pg_namespace n

                      ON n.oid = c.relnamespace

                   WHERE c.relkind IN ('i','')

                     AND n.nspname = '%s'

                     AND pg_table_is_visible(c.oid)

                     AND NOT EXISTS(SELECT 1

                                      FROM pg_constraint

                                     WHERE conname = c.relname)

                  """ % (schemaName)

   sqlDropConstr =   """

                     SELECT 'ALTER TABLE ' || relname ||

                              ' DROP CONSTRAINT IF EXISTS ' || conname || ' CASCADE;'

                       FROM pg_constraint con

                       JOIN pg_class c

                         ON con.conrelid = c.oid

                       JOIN pg_namespace n

                         ON n.oid = c.relnamespace

                      WHERE n.nspname = '%s'

                     """ % (schemaName)

   sqlTrunc =  """

               SELECT 'TRUNCATE TABLE ' || c.relname || ' CASCADE;'

                 FROM pg_class c

                 JOIN pg_namespace n

                   ON n.oid = c.relnamespace

                WHERE c.relkind = 'r'

                  AND n.nspname = '%s'

                  AND pg_table_is_visible(c.oid)

               """ % (schemaName)

   with open(CREATE_INDEXES, "w") as f:

      ret = call(psqlQuery(sqlCreateIndex), stdout=f, stderr=fileError)

   print ("Saved Indexes from target DB to file %s." % (CREATE_INDEXES))

   with open(CREATE_CONSTRAINTS, "w") as f:

      ret = call(psqlQuery(sqlCreateConstr), stdout=f, stderr=fileError)

   print ("Saved Constraints from target DB to file %s." %(CREATE_CONSTRAINTS))

   execPsqlDynamicSql(sqlDropIndex)

   print ("Dropped Indexes in target DB.")

   execPsqlDynamicSql(sqlDropConstr)

   print ("Dropped Constraints in target DB.")

   execPsqlDynamicSql(sqlTrunc)

   print ("Truncated all tables in target DB.")

def postImportScripts():

   '''

   Recreate indexes and constraints after data import.

   '''

   ret = call(psqlFile(CREATE_INDEXES), stdout=fileOut, stderr=fileError)

   print ("Recreated Indexes back in target DB from file %s." % (CREATE_INDEXES))

   ret = call(psqlFile(CREATE_CONSTRAINTS), stdout=fileOut, stderr=fileError)

   print ("Recreated Constraints back in target DB from file %s." % (CREATE_CONSTRAINTS))

 

print ("Operation not cancellable. Please wait for it to finish...")

 

parser = argparse.ArgumentParser()

parser.add_argument('-f',

                    action="store",

                    dest="backup_file",

                    required=True)

results = parser.parse_args()

 

fileOut = open("/tmp/restore_out.log", "a+")

fileError = open("/tmp/restore_err.log", "a+")

 

sql = """

      SELECT nspname

        FROM pg_namespace

       WHERE nspname in ('vc', 'vpx')

      """

 

pipe = Popen(psqlQuery(sql), stdout = PIPE)

schemaName = pipe.communicate()[0].strip()

pipe.stdout.close()

 

if sys.version_info[0] > 2:

   schemaName=schemaName.decode()

 

fileOut.write("Running pre-import scripts...\n")

preImportScripts(schemaName)

fileOut.write("Pre-import step completed.\n")

 

cmd = [PG_RESTORE, "-a", "-Fc", "--disable-triggers", "-U", "postgres", "-d", "VCDB", results.backup_file]

ret = call(cmd, stdout=fileOut, stderr=fileError)

 

fileOut.write("Running post-import scripts...\n")

postImportScripts()

fileOut.write("Post-import step completed.\n")

fileOut.close()

fileError.close()

 

print ("Restore completed successfully.")

 

 

Bu script ‘e çalışmadan önce chmod 700 /tmp/restore_lin.py diyerek yetki vermeliyiz. Restore parameter dizilimi ise python /tmp/restore_lin.py -f tmp/vcsa_postgres_VCDB_12022020.bak şeklinde olmalı.

 

selamlar,

 

Ümit GÖRÜR

Profesyonel Hizmetler | Professional Services

 

Yıldız Teknik Üniversitesi Davutpaşa Kampüsü Teknoloji Geliştirme Bölgesi Çiftehavuzlar Mahallesi Eski Londra Asfaltı Caddesi No: 151/1E D2 Blok

Ofis No: 1B-10 Esenler - İstanbul, TÜRKİYE

T: +90 (212) 393 00 90 | F: +90 (212) 393 00 91

www.aktekbilisim.com


 

 


Read more...

31 Temmuz 2019 Çarşamba

SCCM 0x00004005 hatası

Merhaba,

Windows 10 1903 version ‘da Sysprep yapamamak ve SCCM Capture Image ISO çalıştırıldığında 0x00004005 hatasının alınması için çözüm tavsiyesi için adımları aşağıdan takip edebilirsiniz.

Windows 10 1903 güncelleştirme sonrasında “Spopk.dll” dosyasında değişiklik oluyor. Dosya boyutu 170 KB seviyesine çıkıyor. Bu dosya Windows 10 1809 version üzerinde 150 KB büyüklüğündedir. Herhangi bir 1809 Version Windows 10 üzerinden ilgili dosyayı 1903 Version ‘a kopyalarak sorunu aşabiliriz.

Kopyalama öncesi Spopk.dll dosyasının sahipliğini almamız gerekecek. Bu işlem için aşağıdaki adımı CMD console yi Administrayor hakkı ile açıp uygulayabiliriz.

takeown /f C:\Windows\System32\spopk.dll

Grant ability to modify file:

icacls C:\Windows\System32\spopk.dll /Grant Administrators:f

Sonrasında System32 altına 1809 version dan aldığımız Spopk.dll dosyasını yapıştırabiliriz. Bu işlemler sonrasında Sysprep ve SCCM Capture Image CD si çalıştırılabilir ve PC den Image alınabilir.

 

 

Ümit GÖRÜR

 


Read more...

4 Mayıs 2018 Cuma

IOPS ve Hesaplamalar

IOPS Hesaplaması nasıl yapılır?

 

 

Formül

IOPS=1000 / (60.000 / Disk Hızı / 2 + Gecikme)

 

Detay

Gecikme (lagency)           =             3ms , 15 ms

Disk Hızı (RPM)                 =             7.200, 10.000, 15.000

 

Örnek

·         60.000 / 7200 (RPM) / 2 + 3 (Gecikme) = 7,1666

·         1000 / 7,1666 = 139,536 IOPS

 

 

Riaid IOPS Hesaplaması nasıl yapılır?

 

IOPS                       =             180

Yazma Oranı       =             %70

Parity                    =             1

 

Formül

 

                                Read %                                                                                                                 Write %

Disk IOPS X --------------------- X Disk Sayısı + Parity Disk       +             Disk IOPS X ---------------------        =             Sonuç

                                100                                                                                                                         100

 

Senaryo

 

Elimizde 4 Adet Raid5 ve %70 Read olarak konfig edilecek diskler mevcuttur. (RAID 5 Minimumda 3 Adet diskle yapılan bir yapıdır bu sebeple hesaplamayı minimum değer üzerinden yapacağız)

 

3 X 180 = 540 IOPS (Parity disk dahil edilmeyecek)

 

                70                                                                           30

540 X ----------- X 4 (Parity disk daihil edildi)+          540 X     ------      =             1674 IOPS           (Okuma IOPS Değeri 1512 Yazma IOPS değeri 162 Toplam IOPS değeri 1674)

                100                                                                         100

 

Alınması gereken Disk sayısı

 

Toplam IOPS miktarı / Disk IOPS Değeri

 

 

1674 / 180 = 9.3                (Bu IOPS değerinin yakalanması için ~- 10 Adet disk gereklidir) Formülde çıkan değer sürekli yukarıya doğru yuvarlanmalıdır.

 

 

Bandwith Hesaplama nasıl yapılır?

 

Bandwith = IOPS x BlockSize

 

 

Senaryo

 

Örneğin bir Oracle DB nin 8 KB lik bir Block Size sı olduğunu ve az önceki toplam IOPS değerimiz olan 1674 üzerinden bir hesaplama yaparsak

 

1674 x 8 = 13.392

 

10 Diskli ve toplamda 1674 IOPS değeri olan bir alt yapının Oracle için toplam BandWith değeri 13.392 olacaktır.

 

 

 

BandWith Nedir?

Verinin anlık yada toplamda kullanabileceği transfer limitine denir.

 

Block Size Nedir?

Veri transferi esnasında verinin belirli bölümlere ayrılma işlemine block denir. Disk yapılarında bilgileri aktarmak için verileri İşletim sistemi yada Storage tarafında sabit uzunluklarda block lara ayırma işleminede block size denir.

 

 

 

Ümit GÖRÜR

Profesyonel Hizmetler | Ekip Lideri

Professional Services | Team Leader

 

Yıldız Teknik Üniversitesi Davutpaşa Kampüsü Teknoloji Geliştirme Bölgesi Çiftehavuzlar Mahallesi Eski Londra Asfaltı Caddesi No: 151/1E D2 Blok

Ofis No: 1B-10 Esenler - İstanbul, TÜRKİYE

T: +90 (212) 393 00 90 • F: +90 (212) 393 00 91

www.aktekbilisim.com


 

 


Read more...